Skip to content

KN-86 Inspiration Synthesis — Learnings + Recommendations

Output gates:

  • A learnings + recommendations corpus a future spec/ADR can cite verbatim.
  • A locked keyboard shape (Ferris Sweep) with a worked-out 34-key layout to take into firmware bring-up.
  • A list of consequences passed to ADR-0031.

Six batches captured the inspiration corpus on 2026-06-06. They are reference material, not engineering spec — promotion to spec / ADR is the work of this document. The set is partitioned across four sibling folders at the repo root:

FolderRoleWhat it tells you
inspiration/What KN-86 should feel likeTUI craft, retro-software touchstones, cyberdeck hardware lineage, sister-product references
prototype/What KN-86 should be built fromTUI tech-stack candidates, hardware build templates, the Ferris Sweep + holykeebs Buyer’s Guide, Sweep case + keycap reinforcement (Batch 6)
research/How to build the pieces in betweenTUI widget libraries, Lisp-implementation blueprints, Emacs-derived keyboard philosophy, retro-effect references, runtime patterns, archived custom-keyboard knowledge
effect/The screen as a first-class capabilityASCII-effect spec (project-wide), libcaca reference engine, react-video-ascii demo
  1. Batch 1 (effcae9, PR #39) — TUI software references: PulseDeck, NetWatch, Gloomberb, Golazo, Perkins, BAE, Cowsay, OpenTUI, Zork, Vehicle TUI Concept.
  2. Batch 2 (670c10f, PR #40) — Hardware/aesthetic: Penkesu Computer, Cyberdeck Cafe, Casio Organizer Retrofit, OS Models; plus Strat-O-Matic CFB as KN-90S Statline research.
  3. Batch 3 (e79c5cb, PR #41) — Contemporary TUI apps (rs-pug, audium, cliamp, AetherTune, octoscope), retro touchstones (l123, VisiCalc, Civilization ‘91, Gorillas QBASIC), retro music hardware (4TRK, x0xb0x), plus the QRPπ / Pelican-1170 cyberdeck build template under prototype/.
  4. Batch 4 (de8b46d, PR #42) — Implementation-technique research under research/: widget catalogs (termui, blessed-contrib), tuibox C core, cl-termbox2, Make-a-Lisp + Build-Your-Own-Lisp, Emacs-derived keyboard philosophy (EXWM, webmacs, xiki, history.el, writeroom-mode, emacs-request, pallet), retro effects (BOOTSTRA.386, NES.css, no-more-secrets, loopy), Game Programming Patterns runtime catalogue, archived custom-keyboard knowledge (GOLEM hub, GOLEM plate manufacturing, KMK firmware, universal60plate).
  5. Batch 5 (f165bd0, PR #43) — The keyboard decision recorded. keyboard-decision.md names Ferris Sweep as the chosen shape, ferris-sweep.md is the product entry, holykeebs-buyers-guide.md is the BOM checklist. Custom-keyboard knowledge archived to research/ background.
  6. Batch 6 (b0ad6f9, PR #44) — ASCII effect spec at effect/ascii-effects.md plus two reinforcement entries for the Sweep build path (Ferris Sweep v2 case, sculpted Choc keycaps).
  7. Batch 7 (2026-06-07) — nine references handled as the §10 addendum below: Sinclair ZX Spectrum keyboard, holykeebs trackpoint module (→ 2× trackpoint commitment), Corne, hot-swap tutorial, Remotion, Fe, Dungeon Master’s Assistant, NFL Challenge, NFL Pro League Football.
  8. Batch 8 (2026-06-12, PRs #61–#72) — the Deckline-core TUI corpus: 49 production-TUI references (data/grid, productivity, readers, editors, games, frameworks, audio) across inspiration/ / research/ / effect/, distilled into two dedicated synthesis docs — synthesis-batch8.md (UI pattern catalog / single-color adaptation / ambient mode / LISP integration) and synthesis-batch8-architecture.md (library shortlist verdict + (draw-keyboard) / (draw-framebuffer) proposals + libuv pattern-only). Canon: 128×75 per ADR-0027. See those two docs for the Batch 8 synthesis — this document’s §§2–9 cover Batches 1–7 and are not rewritten for Batch 8.

2. Key learnings — the seven things the corpus actually argues for

Section titled “2. Key learnings — the seven things the corpus actually argues for”

The corpus is dense. Distilling: seven recurring claims show up across batches with enough evidence to warrant promotion from “reference” to “doctrine.”

L1. Keyboard-first is not a feature; it is the substrate.

Section titled “L1. Keyboard-first is not a feature; it is the substrate.”

Every contemporary TUI in Batches 1 + 3 commits to keys-over-menus. So does every retro touchstone in Batch 3 (l123, VisiCalc, Civilization ‘91, Gorillas QBASIC, Zork). So does every Emacs-derived research entry in Batch 4 (EXWM, webmacs, xiki, history.el, writeroom-mode). KN-86 already commits to this by hardware shape — but the corpus argues for a stronger framing: every surface is a keymap, the keymap is discoverable in-band, and the keymap is a Lisp alist. That last clause comes from the Emacs lineage (Batch 4) and aligns the input model with the cart authoring model already locked in ADR-0001 and ADR-0016. The implication: the keyboard is physical hardware that an alist projects onto, not a fixed grid of labeled functions. That framing is what licenses the Ferris Sweep adoption in §4 — keys move; meanings hold.

L2. Mode is the unit; layout is downstream.

Section titled “L2. Mode is the unit; layout is downstream.”

PulseDeck cycles three layouts on one key. NetWatch tabs by digit. Golazo swaps focus on Tab. l123 carries 13 live modes in its three-line control panel. AetherTune surfaces capability tiers. The pattern is consistent: the device picks a small, fixed set of modes per surface and a single key to cycle them. Modes are named, persisted, and rendered as the first thing the operator sees. KN-86 already has the bones — Row 24 firmware action bar + CIPHER-LINE modeline (ADR-0015, ADR-0016 §3-§4). The corpus argues for a uniform contract across cart surfaces: the current mode is rendered, the mode-cycle key is consistent, the mode persists in nosh-config.toml.

PulseDeck (6 themes), NetWatch (7 themes, cyclable), AetherTune (8 themes), 4TRK (theme editor), rs-pug (5 JSON themes), audium (15 themes with live preview), cliamp (Winamp legacy), octoscope (amber and phosphor themes — the direct amber-CRT lineage citation), OS Models (named palettes as the unit). KN-86 is monochrome amber — locked. The mechanism transfers anyway: a named, cyclable, persisted aesthetic mode setting controls glyph treatment (Press Start 2P 1×2 vs. native 12×24, ADR-0014 F1), CIPHER-LINE animation profile, scanline/ghost overlay strength. The candidate roster — AMBER (default), AMBER (warmer), CIPHER (desaturated for reading) — is set in inspiration/index.md §“Color story and aesthetic-mode direction.” Promote to spec.

NetWatch surfaces capability tiers in-band and never crashes. PulseDeck buffers, fades, undoes, and refuses to draw on a too-small terminal. AetherTune simulates a visualizer when audio capture is absent. KN-86 has analogous states: no cart, no microSD, coprocessor offline, low battery, emulator window below 80×25. The doctrine: show what you have, label what you don’t, never panic. Promote to a runtime-internal rule in software/runtime/orchestration.md.

L5. The cartridge / box / feelies / labels are part of the work.

Section titled “L5. The cartridge / box / feelies / labels are part of the work.”

Zork’s Z-machine + Infocom box stamps (FORMAT / GENRE / DIFFICULTY) are the direct precedent for KN-86’s cart-sled label classification (KIND / TONE / STANDARD LEVEL — already mentioned in Batch 1 synthesis). The 1980 lineage validates the diegetic move: the cart isn’t a delivery mechanism for software; it’s an object the operator handles, reads the label of, and slots in. ADR-0019 (shell + sled + label) and ADR-0006 carry this — the corpus argues for one specific addition: a project-wide cart-label stamp manifest as a sanctioned authoring artifact, modeled on Infocom’s box stamps. Tracked as a follow-up in §5.

L6. ASCII is a first-class rendering capability — not a font.

Section titled “L6. ASCII is a first-class rendering capability — not a font.”

Batch 6’s effect/ascii-effects.md is the strongest single piece of evidence the corpus surfaces for a project-wide doctrine: ASCII art / brightness-mapped rendering is a NoshAPI primitive, not a per-cartridge novelty. react-video-ascii’s prop matrix, distilled into the KN-86 grammar (72-char ramp, charMode = 'shape', three event types — hover/click/reveal), composes with the BOOTSTRA.386 boot animation, AetherTune’s FFT visualizer (CIPHER-LINE), and the no-more-secrets decryption-reveal transition. Adoption requires:

  • A new (reveal …) NoshAPI primitive with a :style flag union (one verb, multiple styles).
  • A libcaca-style on-device implementation path (CPU-only; well-matched to Pi Zero 2 W).
  • A performance budget against the Pi Zero 2 W’s frame envelope.
  • Promotion of “the ASCII visual language” to a single project-wide doctrine — one spec, every cart subscribes.

The full promote-to-spec list lives in inspiration/features-matrix.md §Batch 6, items 58-63. Promote as a Sprint queue item (§6).

L7. The mech-keeb hobbyist ecosystem has already solved every problem in the prior keyboard spec.

Section titled “L7. The mech-keeb hobbyist ecosystem has already solved every problem in the prior keyboard spec.”

Batch 5’s keyboard-decision.md is the most decisive single document the corpus produced. The argument: PCB design, hot-swap switch mounting, QMK / Vial firmware, debounce, USB HID enumeration, layer support, macro recording, keymap authoring, and split-keyboard inter-half sync are all commodity parts and open-source firmware in 2026. The Ferris Sweep specifically delivers a proven 34-key split layout, a hotswap-revision PCB shipping today from holykeebs, an RP2040 controller pair, and an open-hardware lineage (David Barr’s original; holykeebs revisions also open). The custom-31-key path from ADR-0018 carries fab-iteration risk, plate-tolerance bring-up risk, matrix-debouncing firmware authoring risk, and 2–4 months of design time. The Ferris Sweep eliminates all of it. The §4 decision below acts on this learning.


Ten things to land in spec / ADR work over the next 2-3 sprints. Ordered by leverage, not difficulty.

  1. §4 below — Ferris Sweep adoption + 34-key layout. Locked here; cascaded in ADR-0031.
  2. Aesthetic-mode mechanism — named, cyclable, persisted in nosh-config.toml. AMBER (default) / AMBER / CIPHER roster. Picker UI on Bare Deck Terminal SYS tab modeled on os-models-4.png. Land in software/runtime/orchestration.md + a small ADR if the mechanism touches Universal Deck State.
  3. Project-wide ASCII visual-language spec promotion — promote effect/ascii-effects.md from inspiration to canonical. Land a new (reveal …) NoshAPI primitive in ADR-0005. Add a libcaca-engine reference path. Acceptance bar: the boot animation + CIPHER-LINE FFT + decryption-reveal all dispatch through the unified (reveal :style …) surface.
  4. Resilience doctrine — runtime-internal rule for cart-absent / microSD-absent / coprocessor-offline / low-battery / window-too-small. Land in software/runtime/orchestration.md §“Graceful degradation.” Mirror in emulator: refuse to draw below 80×25.
  5. Universal ? help overlay — Perkins / Zork lineage. Runtime-internal feature, key TBD (likely chord on the SHIFT thumb). Land in software/runtime/repl.md or a small ADR.
  6. Numbered-tab navigation on Bare Deck Terminal — NetWatch pattern. Maps to the right-half digits 1-5 on Sweep. Bare Deck tabs already locked (STATUS / CIPHER / LAMBDA / LINK / SYS); the corpus confirms digit-key tab cycling as the canonical entry. Land in software/runtime/bare-deck-terminal.md.
  7. Mnemonic command bar on TERM key — Gloomberb pattern. 3-4-char codes, in-band legend, dispatched through TERM. Pilot in REPL, propagate to cart-side TERM contexts. Land in software/runtime/repl.md.
  8. Big-glyph headline identity object — Golazo pattern. Press Start 2P at native 12×24 (ADR-0014 F1) used as cart-identity glyph on title screens. Land in software/cartridges/authoring/screen-design-rules.md as a sanctioned pattern.
  9. Carousel idle state for Bare Deck Terminal — termui / blessed-contrib pattern. Auto-rotating dashboard views when no operator input. Land in software/runtime/bare-deck-terminal.md.
  10. Cart-label three-stamp manifest — Infocom / Zork lineage. KIND / TONE / STANDARD LEVEL on the cart sled label. Authoring artifact spec. Land in software/cartridges/authoring/ plus the sled mechanical-art spec.

The full features-matrix promote-to-spec list (29+ items across all six batches) lives in inspiration/features-matrix.md. The ten above are the highest-leverage subset.


4. Decision — Ferris Sweep, 34 keys, with a worked-out layout

Section titled “4. Decision — Ferris Sweep, 34 keys, with a worked-out layout”

Batch 5’s keyboard-decision.md recorded the shape decision (Sweep over custom). What that document explicitly left open — “the 14-FN / 16-numpad / 1-TERM canonical functions onto Sweep’s 34 keys + QMK layers” — is the work of this section.

PropertyBefore (canonical)After (Sweep)
Key count3134
Layout topologyUnified keyplate, phone-style numpad + 14-function block + TERMSplit (two halves, TRRS connected). LEFT = function block + EVAL/SHIFT thumbs; RIGHT = numpad + 0/TERM thumbs
Keyboard MCU1× KB2040 (Pro Micro form factor) per ADR-00242× KB2040 (one per half) — master/slave over TRRS in stock QMK split topology
PCBCustom-fab unified 31-key (preferred) per ADR-0018holykeebs Ferris Sweep PCB pair (current hotswap revision), Soldered kit tier
FirmwareQMK on single RP2040, Vial-tunableQMK on split RP2040 (1 keymap, master/slave handoff via TRRS), Vial-tunable
LIS3DH host (ADR-0023)Reflowed on the keyboard PCB next to the single MCUOn the LEFT half’s MCU only (master half — convention from QMK split keyboards)
Shift gestureTBD — long-press / hold-and-tap / chord (deferred in ADR-0022 §Known Unknowns #1)LSHIFT is a physical thumb key (LT1). Hold-modifier semantics in QMK (MO()). The shift-gesture question is closed.
Nokia multi-tapPhone-shape literal 3x4 grid required per ADR-0016 §5Phone spatial relationship preserved within a 3x3 digit cluster (1-2-3 / 4-5-6 / 7-8-9) on the right half; 0 on inner thumb. Letter-to-key mapping unchanged (2=ABC, 3=DEF, …, 9=WXYZ). Nokia identity preserved; literal phone topology relaxed.
Function-block keycap legendLocked per ADR-0022 §1Same 14 Lisp primitives; physical key arrangement reassigned per §4.3 below
Numpad shift secondariesPer ADR-0022 §2 (` ” : + ( ) . on specific keys)Reassigned to the SHIFT layer on Sweep right half; full ASCII printable set delivered (` ” : + ( ) * # ! @ $ % ^ & )
case-toggle / delete in :nemacs-literal/ = case toggle, * = delete per ADR-0022 §7/ = case toggle (unchanged). * (no longer a base primary) → BACK (left half) = delete in :nemacs-literal / :prompt-text — clean semantic match.
Pointing deviceNot addressedDeferred per keyboard-decision.md. v0.1 ships none.
Sweep OLEDN/ASkipped for v0.1. CIPHER-LINE 256×64 (SSD1322, ADR-0015) is the authoritative auxiliary display; adding a third 128×32 SSD1306 on the keyboard creates a confused two-aux-display architecture for no operator gain.
USB topologySingle keyboard USB-HID interface → internal hub IC → Pi (ADR-0018 §5)Same. Master-half USB-C → internal hub IC → Pi. Slave half communicates via TRRS to master only.

Superseded (2026-06-21): the left-half home row was reordered to APPLY · BACK · CDR · CAR · QUOTE (CAR/CDR on the index+middle rest-and-rock pair; each navigation verb on its own finger). The ASCII below is the 2026-06-06 worked-out snapshot, retained as design history — see ADR-0031 §3.1 (and its 2026-06-21 amendment) for the canonical layout.

LEFT HALF (function block) RIGHT HALF (numpad)
Pinky Ring Middle Index InnerIdx InnerIdx Index Middle Ring Pinky
T [ NIL ][INFO ][LAMBDA][CONS ][LINK ] [ 1 ][ 2 ][ 3 ][ / ][ , ] <- top
H [APPLY][QUOTE][ BACK ][CAR ][CDR ] [ 4 ][ 5 ][ 6 ][ ; ][ . ] <- home
B [<v2> ][<v2> ][ SYS ][EQ ][ATOM ] [ 7 ][ 8 ][ 9 ][ - ][ ENT ] <- bottom
Thumbs: [EVAL ][LSHFT] [ 0 ][TERM ]

Legend: <v2> = reserved for v2 / cart-defined verbs. T = top row; H = home row; B = bottom row.

LEFT HALF — function block:

  • EVAL → left inner thumb (LT0). Highest-frequency action. Was a 1.75U bottom-left key in ADR-0022 §1; thumb is the natural Sweep home for the commit verb.
  • LSHIFT → left outer thumb (LT1). Physical modifier key. Resolves the deferred shift-gesture question from ADR-0022 §Known Unknowns #1 — no long-press timing, no chord. Hold LT1 + tap right-half primary = shift secondary.
  • CAR → home row index (L13). Strongest left-hand reach. Most-frequent nEmacs operation (descend) per ADR-0016 §3.
  • CDR → home row inner-index (L14). Second-strongest reach. Second-most-frequent (next-sibling).
  • BACK → home row middle (L12). High-frequency undo / nav-pop. Doubles as the delete binding in :nemacs-literal / :prompt-text scopes — replacing the ADR-0022 §7 *-binding which no longer has a base-layer home.
  • QUOTE → home row ring (L11). Cut/copy mode entry per ADR-0016 §2. Frequent enough for home row.
  • APPLY → home row pinky (L10). Function-call dispatch. Less frequent than CAR/CDR; pinky position is acceptable.
  • CONS → top inner-index (L04). Palette / insertion verb. Common in nEmacs but not as hot as CAR/CDR.
  • LINK → top index (L03). Navigation follow. Distinct from BACK semantically; placed adjacent.
  • LAMBDA / FN → top middle (L02). Function-definition intro. Medium frequency. Note: keycap legend is FN per ADR-0022 §1 cosmetic alias; Lisp slot remains lambda.
  • INFO → top ring (L01). Secondary action key.
  • NIL → top pinky (L00). Lisp constant; low-frequency outright type.
  • ATOM → bottom inner-index (L24). Lisp predicate; placed close to CDR/CAR for finger-family.
  • EQ → bottom index (L23). Lisp predicate; placed next to ATOM.
  • SYS → bottom middle (L22). System / easter-egg key. Note: the SYS+INFO×4 easter egg (ADR-0021) still works — both keys remain on the left half within easy two-finger reach.
  • L20, L21 (bottom pinky / ring) → spare. Reserved for v2 cart-defined verbs or a future cart-binding mechanism. Pinky-bottom is the weakest reach; ideal parking for not-yet-allocated functions.

RIGHT HALF — numpad:

  • 1-2-3 / 4-5-6 / 7-8-9 → 3×3 on the inner three columns (R04/R03/R02 + R14/R13/R12 + R24/R23/R22). Phone spatial relationship preserved within the 3×3 (1-2-3 top, 4-5-6 mid, 7-8-9 bot — reading left-to-right toward the body center, which is how the right hand experiences the inner columns). Nokia multi-tap letters travel unchanged: 2=ABC … 9=WXYZ per ADR-0022 §2 / ADR-0016 §6.
  • / → top ring (R01). Lisp punctuation primary; doubles as case-toggle in :nemacs-literal per ADR-0022 §7 (unchanged).
  • ; → home ring (R11). Statement separator; common Lisp idiom.
  • - → bottom ring (R21). Arithmetic / kebab-case.
  • , → top pinky (R00). Quasiquote-unquote glyph; macro templating.
  • . → home pinky (R10). Decimal point + Lisp member access.
  • ENT → bottom pinky (R20). Commit / newline. Bottom-right is the conventional Sweep ENT position.
  • 0 → right inner thumb (RT0). High-frequency digit; thumb position is the conventional Sweep home for SPC/0. Doubles as space in Nokia multi-tap per ADR-0016 §6 (unchanged).
  • TERM → right outer thumb (RT1). Context-sensitive dispatch key per CLAUDE.md Canonical Hardware Specification Keys row. Outer-thumb position is natural for a frequent context-switch key.

QMK MO(SHIFT) — momentary layer activation while LT1 is held. Right-half primaries yield secondary glyphs; left-half keys are unaffected (or could carry secondary Lisp verbs in v2).

BaseShift secondaryRationale
1` (backtick)Quasiquote — high Lisp frequency per ADR-0022 §5. Unchanged.
2!Lisp set! / boolean-not idiom.
3@Splice-unquote ,@. Demoted from ADR-0022 §5 (not the 1-shift anymore — backtick wins that slot) but recovered here.
4$Common scripting glyph; cart-author affordance.
5%Modulo / format-string.
6^Power / exponent.
7*Recovered from ADR-0022 §4 base position. Multiplication / special-variable convention.
8&Optional-arg convention; &rest, &optional.
9#Recovered from ADR-0022 §4 base position. Reader-macro prefix.
0.Recovers the ADR-0022 §4 secondary; redundant with the base-layer . on R10 but harmless. Optional remap if a more useful secondary surfaces.
/"String-quote. Unchanged from ADR-0022 §2.
;:Keyword qualifier. Unchanged.
-+Arithmetic pair. Unchanged.
,)Repaired from ADR-0022 §4 (was on #-shift). Adjacent-to-. placement matches paren-pair muscle memory.
.(Repaired from ADR-0022 §4 (was on *-shift). Pairs with ,) shift. Highest-frequency Lisp shift secondary.
ENT\Backslash — escape character. Low-frequency overall, but the only natural home left.

4.5 Nokia multi-tap in :nemacs-literal / :prompt-text (unchanged semantics)

Section titled “4.5 Nokia multi-tap in :nemacs-literal / :prompt-text (unchanged semantics)”

Letter mapping survives the Sweep adoption unchanged. The key→letter group association from ADR-0022 §2 / ADR-0016 §6 is intact:

Sweep positionDigitLetters
R041(punctuation cycle: . , ' " : ; !)
R032A B C
R023D E F
R144G H I
R135J K L
R126M N O
R247P Q R S
R238T U V
R229W X Y Z
RT00(space)

Behavior contract changes from ADR-0022:

  • * = delete → BACK (left half, home middle) = delete in :nemacs-literal / :prompt-text. Reason: * is no longer a base-layer primary on Sweep; BACK is on the left hand opposite the multi-tap right hand, ergonomically clean for a “back up one character” operation.
  • / = case toggle in :nemacs-literal / :prompt-textunchanged. / survives as a base primary on R01.

Two costs worth naming:

  1. Phone-shape authenticity relaxes. ADR-0016 §5 frames phone layout as “a prerequisite for Nokia multi-tap” because letters attach to phone-position muscle memory. The Sweep can’t physically host the 16-key 3×4-plus-arithmetic phone shape. The relaxation: spatial relationship within the 1-9 digit 3×3 is preserved (top row = 1-2-3, mid = 4-5-6, bot = 7-8-9, reading inner-to-outer on the right half); 0 moves to the thumb; the * and # outer-corner phone glyphs move to the SHIFT layer. Nokia muscle memory survives because the digit-to-letter binding is what carries the muscle memory, and that binding is preserved. The cost is the marketing / fiction line — “phone-style numpad” is no longer literally true. Replace in copy with “phone-style digit-to-letter mapping” or “Nokia-style literal entry.”

  2. The case-toggle / delete keycap legend changes. ADR-0022 §7 closed those placeholders by binding them to / and * because those keys had base-layer homes on the prior spec. On Sweep, * is a shift secondary, not a base primary. Rebinding delete to BACK (left-half home-middle) is the clean semantic fix — the operator already reads BACK as “go back,” and “back up one character” is a natural meaning inside a literal-entry buffer. The cost is one ADR-0022-§7 paragraph that needs to track this rebind.


5. Cascade — what changes in the canonical corpus

Section titled “5. Cascade — what changes in the canonical corpus”

The §4 decision invalidates several existing specs and requires explicit updates. Full enumeration lives in ADR-0031 Documentation Updates section; the high-level list:

  • CLAUDE.md Canonical Hardware Specification Keys row — 31 → 34, custom unified PCB → Ferris Sweep, single MCU → dual MCU split.
  • ADR-0018 — preferred custom-PCB path superseded; Option C (split-reconnected) was the fallback and is now the only path with the further specification that the split is Ferris Sweep specifically.
  • ADR-0022 — partially superseded. Function-block legend manifest preserved logically; physical positions reassigned per §4.3. Shift-gesture question (Known Unknowns #1) closed by LSHIFT-as-thumb. delete binding moved from * to BACK.
  • ADR-0024 — KB2040 selection preserved; quantity 1 → 2 (one per half). Pin map §3 is for the single-MCU prior design; split topology pin map is recomputed in ADR-0031 §3 (master + slave halves, TRRS GPIO for inter-half UART per QMK split convention).
  • ADR-0023 — LIS3DH host clarified to left (master) half MCU only. Single sensor; slave half has no LIS3DH.
  • ADR-0016 §5 — phone-shape framing relaxed. §6 letter mapping unchanged. §7 case-toggle / delete: delete rebound to BACK in ADR-0031.
  • docs/plans/2026-04-27-keyboard-prototype-build-guide.md — hand-wired 31-key prototype guide is now invalid as an end-to-end build path. Recast as “skip if Sweep PCB arrives in time; use as parallel bring-up if not.”
  • firmware/kn86-keyboard/ — QMK keymap retargets from custom handwired keyboards/handwired/kn86 to the QMK community keyboards/ferris/sweep directory tree. The 31-key keymap.c is largely throwaway; a fresh 34-key keymap.c lands as part of ADR-0031 §F3.
  • docs/device/hardware/keyboard.md — full rewrite; product entry replaced with Sweep specifics.
  • docs/device/hardware/build-specification.md — keyboard subsystem section reframed around Sweep.
  • docs/device/hardware/keyboard-electrical-spec.txt — superseded; the Sweep PCB is fabricated by holykeebs, not us.
  • Marketing copy that says “phone-style numpad” — rephrase per §4.6 note 1.

Per CLAUDE.md Spec Hygiene Rule 3, the grep sweep is a hard requirement on the ADR-0031 PR.


Beyond the ADR-0031 cascade, these items are the next-most-leveraged outputs from this synthesis:

#TaskOwnerPriorityDepends on
1Land ADR-0031 — Sweep adoption + consequencesPM (draft); Josh (accept)P0This doc
2Order Ferris Sweep Soldered kit from holykeebs per holykeebs-buyers-guide.mdJoshP0ADR-0031 accepted
3Rewrite docs/device/hardware/keyboard.md with Sweep specificsHardware agentP0ADR-0031 accepted
4Recast docs/plans/2026-04-27-keyboard-prototype-build-guide.md as “parallel bring-up if Sweep PCB delayed”Platform EngineeringP1ADR-0031 accepted
5QMK keymap retarget (keyboards/handwired/kn86keyboards/ferris/sweep); land 34-key keymap.cPlatform EngineeringP0ADR-0031 accepted
6Land aesthetic-mode mechanism spec (AMBER/AMBER/CIPHER picker on SYS tab)Gameplay Design + Platform EngineeringP1None (independent)
7Promote effect/ascii-effects.md to canonical + ADR for (reveal …) NoshAPI primitiveGameplay DesignP1None
8Land resilience-as-doctrine subsection in software/runtime/orchestration.mdPlatform EngineeringP1None
9Universal ? help overlay specPlatform EngineeringP2Aesthetic mode work helpful but not blocking
10Cart-label three-stamp manifest specGameplay DesignP2None
11Carousel idle state spec for Bare Deck TerminalPlatform EngineeringP2None
12Big-glyph headline-object pattern in screen-design-rules.mdGameplay DesignP2None

Items 1-5 are this sprint. Items 6-12 are queued for subsequent sprints.


Per inspiration/index.md §“North stars” — the 18 projects closest in spirit to where KN-86 should land. Worth re-stating here as the canonical reference the rest of the project should orient toward:

Architectural archetype: Zork + Z-machine (inspiration/zork.md) — the 1980 precedent for Lisp-authored carts on a portable, memory-disciplined runtime (KN-86 tree-walks Lisp source; AOT bytecode deferred) with cartridge / box / feelies as part of the work.

Single strongest interaction-model reference: l123 (inspiration/l123.md) — keyboard-first slash-menu + three-line control panel + first-character input rule + F-key verb workflow.

Single strongest runtime-architecture reference: AetherTune (inspiration/aethertune.md) — FFT visualizer + CRT boot animation + remappable keybindings + graceful degradation.

Single strongest aesthetic match: 4TRK (inspiration/4trk.md) — Deckline identity, dual screen modes, deep CRT effects, theme editor.

The keyboard: Ferris Sweep (prototype/ferris-sweep.md) — locked by §4 of this doc.

The chassis: QRPπ (prototype/qrp-pi.md) — the Pelican 1170 + 3D-printed inset panel template.

The ASCII visual language: effect/ascii-effects.md — the unified (reveal …) doctrine.

The full 18 are in inspiration/index.md. Reference list, not a re-derivation.


For clarity:

  • No pointing-device commitment. Trackpoint / TPS43 / Pimoroni trackball / none — deferred per keyboard-decision.md, unchanged here.
  • No Sweep-OLED commitment. v0.1 ships without the 128×32 SSD1306 on the Sweep half; CIPHER-LINE 256×64 SSD1322 remains the authoritative auxiliary display per ADR-0015.
  • No specific Choc switch family commitment. Hotswap PCB defers this. Initial bring-up suggestion (per Buyer’s Guide) is Choc v1 brown to validate the layout.
  • No top-plate material commitment. Slim low-profile direction is the goal; FR4 vs PC vs aluminum decided at order time per Buyer’s Guide.
  • No Sweep 3D-printed case-vs-bezel decision. The Sweep’s own case prints sit inside the Pelican 1170 on the inset-panel insert. The integration between Sweep case and Pelican bezel is its own mechanical-design follow-up. Out of scope here.

9. Appendix — index of source documents cited

Section titled “9. Appendix — index of source documents cited”

10. Addendum — Batch 7 + the 2× trackpoint commitment (2026-06-07)

Section titled “10. Addendum — Batch 7 + the 2× trackpoint commitment (2026-06-07)”

Date: 2026-06-07 (one day after the original synthesis). Status: Appended without rewriting earlier sections. New findings sit here; original decisions in §§1-9 stand unless explicitly amended below. Formal ADR for the changes below: ADR-0032 (Sweep peripheral commitment — 2× trackpoint adoption + LIS3DH I²C re-pinning).

Nine new inspiration items came in 2026-06-07. Of those, the Sinclair ZX Spectrum keyboard is the single highest-leverage addition (historical precedent for KN-86’s keycap-as-domain-vocabulary doctrine), and the holykeebs trackpoint module turns into a concrete BOM change (2× trackpoints on the Sweep, one per index finger, decided by Josh). The trackpoint commitment cascades into a small but consequential LIS3DH pin re-allocation that touches ADR-0023, ADR-0024, ADR-0031, and CLAUDE.md Keys/Accelerometer rows.

Nine new reference files added to the corpus on 2026-06-07:

FileFolderOne-lineBucket
prototype/sinclair-zx-spectrum.mdprototype/1982 Sinclair ZX Spectrum keyboard — 5 meanings per key (letter / BASIC keyword / extended / symbol-shift / color). The direct historical precedent for the KN-86 keycap-as-domain-vocabulary doctrine.Keyboard idiom
prototype/trackpoint-module.mdprototype/holykeebs trackpoint module — Sprintek SK8707-01 + adapter PCB + red rubber cap. Decided: 2× on the Sweep, one per index.Hardware addition
prototype/corne-crkbd.mdprototype/Corne (foostan/crkbd) — 42-key split, the not-chosen close-cousin reference. Cross-check + community build-knowledge source.Keyboard reference
prototype/keyboard-hotswap-howto.mdprototype/YouTube hot-swap socket tutorial — build-skill reference + future operator-manual “how to swap switches” citation.Build skill
research/remotion.mdresearch/Remotion (4.0.448) — practice reference. Already in use in ~/src/kinoshita/kn86-attract/ for KN-86 attract-mode marketing videos.Asset pipeline
research/fe.mdresearch/Fe (rxi) — the adopted Lisp VM. Reference entry for the runtime substrate from ADR-0001 / ADR-0004.Runtime substrate
inspiration/dungeon-masters-assistant.mdinspiration/Dungeon Master’s Assistant Vol I (SSI/TSR, 1988) — menu-driven database UX archetype. Also a candidate KN-9x “DM Sidearm” sister-product concept.UI archetype + sister-product candidate
inspiration/nfl-pro-league-1991.mdinspiration/NFL Pro League Football (Micro Sports, 1991) — refined tactical OODA-loop UX. Cluster reference for KN-90S Statline sister-product.Tactical UX reference + KN-90S input
inspiration/nfl-challenge.mdinspiration/NFL Challenge (Xor, 1985) — earliest mature tactical OODA football sim. Editable plain-text data files. Historical anchor of the tactical-sports-sim UX cluster.Tactical UX reference + KN-90S input

§4’s table line for Pointing device previously read:

| Pointing device | Not addressed | Deferred per keyboard-decision.md. v0.1 ships none. |

Amended 2026-06-07:

| Pointing device | Not addressed | Decided 2026-06-07: 2× trackpoint (one per index finger). holykeebs Sprintek SK8707-01 modules on both halves; OLED skip confirmed permanent (mutually exclusive with trackpoint on the same half). See prototype/trackpoint-module.md, ADR-0032. |

What 2× trackpoints buy is documented in prototype/trackpoint-module.md §“Why 2× (one per index finger)”: two-handed pointing, dual-axis decomposition potential (v2 cart-FFI), symmetry with the Lisp-authoring left/right split, accessibility hedge. What they cost: the OLED option on both halves (already skipped in v0.1), the pin conflict with the LIS3DH on master half (resolved below), the soldering complexity (delicate one-shot — order one spare KB2040 per half), and the click-binding question (resolution: tap-vs-drag threshold in QMK PS/2-mouse driver; final gesture deferred to bring-up).

10.3 New consequence — LIS3DH I²C re-pinning

Section titled “10.3 New consequence — LIS3DH I²C re-pinning”

The 2× trackpoint commitment conflicts with the LIS3DH pin assignment from ADR-0031 §3 / ADR-0024 §3. The trackpoint on the master half uses I²C0 pins (D4/D5 = GP4/GP5 — PS/2 protocol on the holykeebs adapter). The LIS3DH was also pinned to I²C0 (D4/D5). Two devices, one pin pair, two incompatible protocols (I²C vs PS/2). Resolution: move the master-half LIS3DH to I²C1 (D6/D7 = GP6/GP7), the second I²C peripheral broken out on the KB2040. The originally-reserved INT1 line on D6 (ADR-0024 §3) is sacrificed — v1 LIS3DH is polling-only at 25 Hz per ADR-0023 §5, so losing the interrupt line costs nothing in v1. Full pin map in ADR-0032 §3.

10.4 Cascade update — what §5 needs to extend

Section titled “10.4 Cascade update — what §5 needs to extend”

§5’s cascade list (CLAUDE.md / ADR-0018 / ADR-0022 / ADR-0024 / ADR-0023 / ADR-0016) is extended by ADR-0032:

  • CLAUDE.md Keys row — gains a “2× trackpoint (Sprintek SK8707-01 modules on both halves, one per index)” clause.
  • CLAUDE.md Accelerometer row — LIS3DH I²C peripheral changes from I²C0 (D4/D5) to I²C1 (D6/D7).
  • ADR-0023 §5 + §6 — pin map updated; INT1 reservation released.
  • ADR-0024 §3 — second amendment footnote for the I²C-bus change on the master.
  • ADR-0031 §3 + §5 + §6 + §7 — pin map updated; LIS3DH I²C bus changed; pointing device deferred → 2× trackpoint decided; OLED skip reinforced as permanent.
  • prototype/keyboard-decision.md — “What this leaves open” item on pointing device closed.
  • prototype/holykeebs-buyers-guide.md — BOM checklist gains the trackpoint line; OLED line confirmed as skip; “Open question” on pointing device closed.

The grep sweep on the ADR-0032 PR should additionally chase “pointing device deferred” / “trackpoint TBD” / any LIS3DH I²C0 pin claim in newly-merged files.

10.5 Sprint queue update — what §6 needs to add

Section titled “10.5 Sprint queue update — what §6 needs to add”

Three new sprint items beyond the original §6 list:

#TaskOwnerPriorityDepends on
13Land ADR-0032 — 2× trackpoint adoption + LIS3DH I²C re-pinningPM (draft); Josh (accept)P0This addendum
14Order 2× trackpoint modules from holykeebs alongside Sweep Soldered kit (per BOM checklist amendment)JoshP0ADR-0032 accepted
15Click-gesture finalization for trackpoint (tap-vs-drag threshold in QMK PS/2-mouse driver vs SHIFT-chord vs dedicated chord)Platform EngineeringP1Trackpoint hardware in hand

Items 1-12 from the original §6 list are unchanged.

Per §7 of the original synthesis — sixteen north stars. Batch 7 adds two to the list:

  • 17. Sinclair ZX Spectrum keyboard (Batch 7, prototype/sinclair-zx-spectrum.md)the keycap-as-domain-vocabulary historical anchor. Five meanings per key in 1982; Sinclair sold 5 million units on a keyboard that was a BASIC reference card. KN-86 inherits the idiom: each function-block keycap is a tiny KEC Lisp reference card. Cite as prior art in ADR-0022 and ADR-0031 on the next footnote cleanup pass.
  • 18. holykeebs trackpoint module (Batch 7, prototype/trackpoint-module.md)the pointing-device commitment. 2× Sprintek SK8707-01 modules, one per index. Adds a cursor without losing the keyboard-first identity; anchors the deck firmly in the cyberdeck / ThinkPad-trackpoint aesthetic family.

The “Tertiary but specific” sub-list grows by four:

10.7 Doctrine updates — what changes in §2 (the seven recurring claims)

Section titled “10.7 Doctrine updates — what changes in §2 (the seven recurring claims)”

None of the seven doctrines from §2 are overturned. Two get reinforced:

  • L1 (Keyboard-first is the substrate) gains the Sinclair ZX Spectrum as its single strongest 1982-vintage proof point. The “keycap = language token” idiom is forty-four years old and still works.
  • L7 (Mech-keeb ecosystem has already solved every problem in the prior keyboard spec) gains the holykeebs trackpoint module as evidence: even the pointing device problem has a commodity-part shipping-today answer when you adopt the community’s ecosystem rather than rolling your own.

No new top-level doctrines from Batch 7 — the existing seven already cover what Batch 7 adds.