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.
1. What was in front of us
Section titled “1. What was in front of us”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:
| Folder | Role | What it tells you |
|---|---|---|
inspiration/ | What KN-86 should feel like | TUI craft, retro-software touchstones, cyberdeck hardware lineage, sister-product references |
prototype/ | What KN-86 should be built from | TUI 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 between | TUI 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 capability | ASCII-effect spec (project-wide), libcaca reference engine, react-video-ascii demo |
The batches in one line each
Section titled “The batches in one line each”- Batch 1 (
effcae9, PR #39) — TUI software references: PulseDeck, NetWatch, Gloomberb, Golazo, Perkins, BAE, Cowsay, OpenTUI, Zork, Vehicle TUI Concept. - 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. - 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 underprototype/. - Batch 4 (
de8b46d, PR #42) — Implementation-technique research underresearch/: 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). - Batch 5 (
f165bd0, PR #43) — The keyboard decision recorded.keyboard-decision.mdnames Ferris Sweep as the chosen shape,ferris-sweep.mdis the product entry,holykeebs-buyers-guide.mdis the BOM checklist. Custom-keyboard knowledge archived toresearch/background. - Batch 6 (
b0ad6f9, PR #44) — ASCII effect spec ateffect/ascii-effects.mdplus two reinforcement entries for the Sweep build path (Ferris Sweep v2 case, sculpted Choc keycaps). - 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.
- 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) andsynthesis-batch8-architecture.md(library shortlist verdict +(draw-keyboard)/(draw-framebuffer)proposals + libuv pattern-only). Canon: 128×75 perADR-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.
L3. Theme = aesthetic mode, not palette.
Section titled “L3. Theme = aesthetic mode, not palette.”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.
L4. Resilience as doctrine, not feature.
Section titled “L4. Resilience as doctrine, not feature.”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:styleflag 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.
3. Recommendations — promote to spec
Section titled “3. Recommendations — promote to spec”Ten things to land in spec / ADR work over the next 2-3 sprints. Ordered by leverage, not difficulty.
- §4 below — Ferris Sweep adoption + 34-key layout. Locked here; cascaded in
ADR-0031. - Aesthetic-mode mechanism — named, cyclable, persisted in
nosh-config.toml. AMBER (default) / AMBER / CIPHER roster. Picker UI on Bare Deck Terminal SYS tab modeled onos-models-4.png. Land insoftware/runtime/orchestration.md+ a small ADR if the mechanism touches Universal Deck State. - Project-wide ASCII visual-language spec promotion — promote
effect/ascii-effects.mdfrom inspiration to canonical. Land a new(reveal …)NoshAPI primitive inADR-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. - 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. - Universal
?help overlay — Perkins / Zork lineage. Runtime-internal feature, key TBD (likely chord on the SHIFT thumb). Land insoftware/runtime/repl.mdor a small ADR. - 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. - 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. - Big-glyph headline identity object — Golazo pattern. Press Start 2P at native 12×24 (
ADR-0014F1) used as cart-identity glyph on title screens. Land insoftware/cartridges/authoring/screen-design-rules.mdas a sanctioned pattern. - 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. - Cart-label three-stamp manifest — Infocom / Zork lineage.
KIND/TONE/STANDARD LEVELon the cart sled label. Authoring artifact spec. Land insoftware/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.
4.1 What changes
Section titled “4.1 What changes”| Property | Before (canonical) | After (Sweep) |
|---|---|---|
| Key count | 31 | 34 |
| Layout topology | Unified keyplate, phone-style numpad + 14-function block + TERM | Split (two halves, TRRS connected). LEFT = function block + EVAL/SHIFT thumbs; RIGHT = numpad + 0/TERM thumbs |
| Keyboard MCU | 1× KB2040 (Pro Micro form factor) per ADR-0024 | 2× KB2040 (one per half) — master/slave over TRRS in stock QMK split topology |
| PCB | Custom-fab unified 31-key (preferred) per ADR-0018 | holykeebs Ferris Sweep PCB pair (current hotswap revision), Soldered kit tier |
| Firmware | QMK on single RP2040, Vial-tunable | QMK 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 MCU | On the LEFT half’s MCU only (master half — convention from QMK split keyboards) |
| Shift gesture | TBD — 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-tap | Phone-shape literal 3x4 grid required per ADR-0016 §5 | Phone 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 legend | Locked per ADR-0022 §1 | Same 14 Lisp primitives; physical key arrangement reassigned per §4.3 below |
| Numpad shift secondaries | Per 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 device | Not addressed | Deferred per keyboard-decision.md. v0.1 ships none. |
| Sweep OLED | N/A | Skipped 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 topology | Single 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. |
4.2 Layout — base layer
Section titled “4.2 Layout — base layer”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 — seeADR-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 PinkyT [ NIL ][INFO ][LAMBDA][CONS ][LINK ] [ 1 ][ 2 ][ 3 ][ / ][ , ] <- topH [APPLY][QUOTE][ BACK ][CAR ][CDR ] [ 4 ][ 5 ][ 6 ][ ; ][ . ] <- homeB [<v2> ][<v2> ][ SYS ][EQ ][ATOM ] [ 7 ][ 8 ][ 9 ][ - ][ ENT ] <- bottomThumbs: [EVAL ][LSHFT] [ 0 ][TERM ]Legend: <v2> = reserved for v2 / cart-defined verbs. T = top row; H = home row; B = bottom row.
4.3 Placement rationale (per key)
Section titled “4.3 Placement rationale (per key)”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
deletebinding in:nemacs-literal/:prompt-textscopes — replacing theADR-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 isFNperADR-0022§1 cosmetic alias; Lisp slot remainslambda. - 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-literalperADR-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
spacein Nokia multi-tap perADR-0016§6 (unchanged). - TERM → right outer thumb (RT1). Context-sensitive dispatch key per
CLAUDE.mdCanonical Hardware Specification Keys row. Outer-thumb position is natural for a frequent context-switch key.
4.4 SHIFT layer (LT1 held)
Section titled “4.4 SHIFT layer (LT1 held)”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).
| Base | Shift secondary | Rationale |
|---|---|---|
| 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 position | Digit | Letters |
|---|---|---|
| R04 | 1 | (punctuation cycle: . , ' " : ; !) |
| R03 | 2 | A B C |
| R02 | 3 | D E F |
| R14 | 4 | G H I |
| R13 | 5 | J K L |
| R12 | 6 | M N O |
| R24 | 7 | P Q R S |
| R23 | 8 | T U V |
| R22 | 9 | W X Y Z |
| RT0 | 0 | (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-text— unchanged./survives as a base primary on R01.
4.6 What the new layout costs us
Section titled “4.6 What the new layout costs us”Two costs worth naming:
-
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.” -
The
case-toggle/deletekeycap 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. Rebindingdeleteto 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.mdCanonical 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.deletebinding 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 inADR-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:deleterebound to BACK inADR-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 handwiredkeyboards/handwired/kn86to the QMK communitykeyboards/ferris/sweepdirectory tree. The 31-key keymap.c is largely throwaway; a fresh 34-key keymap.c lands as part ofADR-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.
6. Follow-up work — sprint queue
Section titled “6. Follow-up work — sprint queue”Beyond the ADR-0031 cascade, these items are the next-most-leveraged outputs from this synthesis:
| # | Task | Owner | Priority | Depends on |
|---|---|---|---|---|
| 1 | Land ADR-0031 — Sweep adoption + consequences | PM (draft); Josh (accept) | P0 | This doc |
| 2 | Order Ferris Sweep Soldered kit from holykeebs per holykeebs-buyers-guide.md | Josh | P0 | ADR-0031 accepted |
| 3 | Rewrite docs/device/hardware/keyboard.md with Sweep specifics | Hardware agent | P0 | ADR-0031 accepted |
| 4 | Recast docs/plans/2026-04-27-keyboard-prototype-build-guide.md as “parallel bring-up if Sweep PCB delayed” | Platform Engineering | P1 | ADR-0031 accepted |
| 5 | QMK keymap retarget (keyboards/handwired/kn86 → keyboards/ferris/sweep); land 34-key keymap.c | Platform Engineering | P0 | ADR-0031 accepted |
| 6 | Land aesthetic-mode mechanism spec (AMBER/AMBER/CIPHER picker on SYS tab) | Gameplay Design + Platform Engineering | P1 | None (independent) |
| 7 | Promote effect/ascii-effects.md to canonical + ADR for (reveal …) NoshAPI primitive | Gameplay Design | P1 | None |
| 8 | Land resilience-as-doctrine subsection in software/runtime/orchestration.md | Platform Engineering | P1 | None |
| 9 | Universal ? help overlay spec | Platform Engineering | P2 | Aesthetic mode work helpful but not blocking |
| 10 | Cart-label three-stamp manifest spec | Gameplay Design | P2 | None |
| 11 | Carousel idle state spec for Bare Deck Terminal | Platform Engineering | P2 | None |
| 12 | Big-glyph headline-object pattern in screen-design-rules.md | Gameplay Design | P2 | None |
Items 1-5 are this sprint. Items 6-12 are queued for subsequent sprints.
7. North stars (re-stated)
Section titled “7. North stars (re-stated)”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.
8. What this doc does not commit
Section titled “8. What this doc does not commit”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”inspiration/index.md— synthesis hub.inspiration/features-matrix.md— the cross-reference matrix + promote-to-spec list.prototype/keyboard-decision.md— Batch 5 keyboard decision (Sweep over custom).prototype/ferris-sweep.md— Sweep product entry.prototype/holykeebs-buyers-guide.md— BOM checklist.prototype/ferris-sweep-v2-case.md+prototype/choc-sculpted-keycaps.md— Batch 6 case + keycap reinforcement.prototype/qrp-pi.md— Pelican 1170 chassis template.effect/ascii-effects.md— project-wide ASCII visual language doctrine.effect/libcaca.md— C library reference engine for on-device ASCII.effect/react-video-ascii.md— prop matrix source.research/golem-hub.md+research/golem-plate-manufacturing.md+research/golem-kmk-firmware.md+research/kmk-firmware.md+research/universal60plate.md— archived custom-keyboard knowledge.docs/adr/ADR-0014-display-profile-redesign.md— Press Start 2P 12×24 native glyph table.docs/adr/ADR-0015-cipher-line-auxiliary-display.md— CIPHER-LINE OLED.docs/adr/ADR-0016-nemacs-repl-input-model.md— nEmacs / REPL / Nokia multi-tap input model.docs/adr/ADR-0018-custom-mechanical-keyboard-build.md— original custom-keyboard ADR (about to be partially superseded).docs/adr/ADR-0022-keyboard-layout-finalization.md— keycap legend manifest (about to be partially superseded).docs/adr/ADR-0023-accelerometer-ambient-glitch.md— LIS3DH on the keyboard MCU.docs/adr/ADR-0024-keyboard-mcu-rp2040-selection.md— KB2040 selection.docs/plans/2026-04-24-nemacs-repl-input-design.md— the design brief behind ADR-0016.docs/plans/2026-04-27-keyboard-prototype-build-guide.md— hand-wired prototype (about to be recast).CLAUDE.mdCanonical Hardware Specification — Keys row (about to be amended).
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.
10.1 Batch 7 entries
Section titled “10.1 Batch 7 entries”Nine new reference files added to the corpus on 2026-06-07:
| File | Folder | One-line | Bucket |
|---|---|---|---|
prototype/sinclair-zx-spectrum.md | prototype/ | 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.md | prototype/ | holykeebs trackpoint module — Sprintek SK8707-01 + adapter PCB + red rubber cap. Decided: 2× on the Sweep, one per index. | Hardware addition |
prototype/corne-crkbd.md | prototype/ | Corne (foostan/crkbd) — 42-key split, the not-chosen close-cousin reference. Cross-check + community build-knowledge source. | Keyboard reference |
prototype/keyboard-hotswap-howto.md | prototype/ | YouTube hot-swap socket tutorial — build-skill reference + future operator-manual “how to swap switches” citation. | Build skill |
research/remotion.md | research/ | 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.md | research/ | Fe (rxi) — the adopted Lisp VM. Reference entry for the runtime substrate from ADR-0001 / ADR-0004. | Runtime substrate |
inspiration/dungeon-masters-assistant.md | inspiration/ | 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.md | inspiration/ | 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.md | inspiration/ | 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 |
10.2 Revised decision — pointing device
Section titled “10.2 Revised decision — pointing device”§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.mdKeys row — gains a “2× trackpoint (Sprintek SK8707-01 modules on both halves, one per index)” clause.CLAUDE.mdAccelerometer 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:
| # | Task | Owner | Priority | Depends on |
|---|---|---|---|---|
| 13 | Land ADR-0032 — 2× trackpoint adoption + LIS3DH I²C re-pinning | PM (draft); Josh (accept) | P0 | This addendum |
| 14 | Order 2× trackpoint modules from holykeebs alongside Sweep Soldered kit (per BOM checklist amendment) | Josh | P0 | ADR-0032 accepted |
| 15 | Click-gesture finalization for trackpoint (tap-vs-drag threshold in QMK PS/2-mouse driver vs SHIFT-chord vs dedicated chord) | Platform Engineering | P1 | Trackpoint hardware in hand |
Items 1-12 from the original §6 list are unchanged.
10.6 Updated north-star list
Section titled “10.6 Updated north-star list”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 inADR-0022andADR-0031on 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:
- Corne (crkbd) (Batch 7,
prototype/corne-crkbd.md) — the not-chosen close-cousin reference; community build-knowledge and trackpoint-on-split community precedent. - Keyboard hot-swap socket tutorial (Batch 7,
prototype/keyboard-hotswap-howto.md) — build-skill reference + future owner-manual citation. - Dungeon Master’s Assistant Vol I (Batch 7,
inspiration/dungeon-masters-assistant.md) — menu-driven database UX archetype; candidate KN-9x “DM Sidearm” sister-product concept. - NFL Challenge / NFL Pro League Football (Batch 7,
inspiration/nfl-challenge.md+inspiration/nfl-pro-league-1991.md) — tactical OODA-loop sports-sim cluster; KN-90S Statline sister-product inputs (alongsideinspiration/strat-o-matic-college-football.md). - Remotion + Fe (Batch 7,
research/remotion.md+research/fe.md) — practice-reference entries for two pieces of tech already in active use across the project (Remotion inkn86-attract; Fe inkn86-emulator). Documenting them in the corpus closes the loop on “what we’ve adopted that the research/ folder didn’t yet name.”
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.