Skip to content

Keyboard layer model (2026-07-30, settled 2026-07-31)

Josh’s selections on the text-entry candidates add a QWERTY layer to the deck. That did not fit the layout ADR-0031 §3.1 and ADR-0044 describe, so the layer model was re-opened. The decision is in §0; the rest records why, and what was rejected.

Josh’s rules:

  1. QWERTY is an alternate layer. Never the base, never the default, never the printed primary. The Lisp keycaps stay on the front of the board.
  2. The Ferris Sweep shape does not change.
  3. QWERTY stays real QWERTY. No letter moves out of its position.
  4. T9 survives. The digits stay on the base.
  5. Three layers, printed on custom keycaps: base large and centred, layer 2 in one top corner, layer 3 in the other.
  6. Keep it simple. This is a gaming device, and the layers need not be full.

The T-34 is the same 34-key Ferris. Its structural lesson: a real QWERTY consumes all 30 main keys, so every layer key and modifier has to live on the four thumbs. Nothing on the letter layer can be anything but a letter, so nothing displaces one. That is what keeps z at home.

The consequence is good news: the base layer needs no rearrangement, and no verb has to be dropped. The left half already holds 13 verbs in 15 slots and the right half already holds the digits and the five punctuation primaries. Everything Josh listed is already there.

Dropping verbs is also expensive, which the base fitting removes the need for. Each of the droppable candidates is referenced across the module specs: INFO and QUOTE in 20 each, APPLY in 18, LINK in 16, NIL in 14, ATOM in 13.

LayerReached byLeft halfRight half
1 · BASEdefaultthe 13 verbs, unchangeddigits 1-9, / ; - . ,, ENT
2 · NAV + SYMBOLShold the left outer thumbnavigation: ESC TAB, arrows, HOME END PGUP PGDN DEL, and abcthe ADR-0044 §2 symbol manifest, unchanged
3 · QWERTYpress abc on layer 2qwert asdfg zxcvbyuiop hjkl; nm,./

Thumbs: base keeps EVAL · LAYER · 0 · TERM exactly as committed, with LT1 renamed from SHIFT (it never shifted) to LAYER. Inside layer 3 the same four thumbs become SHIFT · NUM · SPACE · abc, where SHIFT is tapped once and the next letter is a capital, NUM is held for a number row across both halves, and abc leaves.

Cost: zero new keys, zero base changes, both blank keys still free.

Measured in the workbench simulator: kx-04.hab is 14 presses, a capital is 2, leaving is 1.

Both were found by typing rather than by reading, and both are fixed in the layout above:

  • Zero was unreachable inside the letters. The base keeps 0 on the right inner thumb, and that thumb is SPACE while letters are live. Layer 3 now carries its own number row across both halves rather than borrowing the base map.
  • The abc key collided with z. Putting the letter-layer toggle on a main key means that key cannot also be a letter. abc is therefore live on layer 2 only; leaving is a thumb. Every activation is scoped to the layers it appears on.

A toggled layer is a state the hands cannot feel: press CAR with letters on and the deck types f. Row 0 has to carry the indicator, which makes it a ui/ kit requirement.

VerdictCandidates
PickedQMK-ALPHA (a QWERTY layer, firmware), MT-COMMIT (multi-tap without a timeout, runtime), PALETTE-1ST (narrow), PICK-GRID, PREFIX-ESC, HIST-1ST (modifier), HYBRID
RejectedMT-DWELL, MT-STRICT, PICK-2KEY, QMK-CHORD, TRACK-WHEEL
UnmarkedT9-WORD, T9-KEC

The shape is a HYBRID composition: a QWERTY layer for free typing, MT-COMMIT as the runtime spelling path that needs no firmware, PALETTE-1ST for the narrowing surfaces, PICK-GRID as the escape hatch for a glyph no layer carries, and PREFIX-ESC and HIST-1ST as modifiers.

Both rejected multi-tap variants carried a clock or ceremony that MT-COMMIT does without, and both rejected pickers and the chord model carried a learning cost with no offsetting speed. The through-line in every rejection is that the deck refuses to pay in timing or in memorised gestures.

The two predictive models are unmarked. A ranked dictionary earns its keep when a letter is expensive; once a letter is one press, T9 over a word list mostly competes with typing. The one part that survives on its own merit is the reflective half of T9-KEC: ranking the symbols actually bound is completion, and PALETTE-1ST already carries completion.

2. The defect the QWERTY commitment exposes

Section titled “2. The defect the QWERTY commitment exposes”

The committed layout has no case modifier. LT1 is named LSHIFT and is bound MO(L1) (ADR-0031 §3.1 per-key table, LT1 row), which is a momentary layer switch. The per-key table’s own Notes column says so: “Momentary SHIFT layer activation.” ADR-0031 §“LSHIFT-as-thumb” closes the shift gesture question by making it a thumb hold, and what that hold selects is the L1 punctuation layer. Nothing anywhere in L0, L1, or L2 produces an uppercase letter.

The gap was invisible until now because no committed layer carried letters. Case in literal entry came from the multi-tap machine instead: / toggles case in :nemacs-literal and :prompt-text scope (ADR-0022 §7, carried into ADR-0031 §3.3), handled by nokia.c’s NokiaCaseMode in the runtime rather than by the keyboard. A QWERTY layer moves letters into firmware and leaves that mechanism behind, so the deck acquires letters and loses their case in the same move.

Two further consequences of the same commitment:

  • No activation is free for an alpha layer. ADR-0044 §1 binds L0, L1 (hold LT1), and L2 (the LSHIFT+TERM tri-layer). A fourth layer needs a fourth activation.
  • Punctuation has to be reachable from inside the letters. The ADR-0044 §2 SHIFT manifest puts the KEC punctuation on the right half of the digit base. Typing Lisp on an alpha layer needs ( and ) without leaving the letters, and the committed manifest cannot supply them there.

More room exists than the layer count suggests.

ResourceState
L20, L21 (left pinky and ring, bottom row)KC_NO, reserved v2 spares (ADR-0031 §3.1). The only unbound positions on the board.
LT0 hold (EVAL)unused
RT0 hold (0)unused
RT1 hold (TERM)partly spent: participates in the L2 tri-layer, and ADR-0016 §9 gives TERM a long-press context binding
LT1 holdspent on MO(L1)
The four thumb tapslocked. ADR-0032 §4 forbids reassigning any of them to a mouse click; ADR-0044 §3 generalises that to no thumb tap being sacrificed.

The lock is on taps, so a thumb hold is available currency and a v2 spare is scarce currency. A candidate that spends a hold costs less than one that spends a spare.

4. The four candidate stacks (all rejected; kept as the record of why)

Section titled “4. The four candidate stacks (all rejected; kept as the record of why)”

Staged in the workbench with a layer simulator over the real 34-key positions: each stack is typeable, layer keys hold and latch, and the buffer shows what a press produces. Press counts below come from that simulator as measurements.

StackWhere letters liveNew keysLayersSpares leftHello
ST-GUESTa latched guest layer over today’s base2507
ST-INVERTthe base itself; the deck block becomes a layer0326
ST-TWOBASEa co-equal second base, toggled, Row 0 shows the mode1617
ST-HOLDa momentary layer held on a thumb1418

ST-INVERT measured cheapest, and Josh rejected it along with ST-TWOBASE on rule 1: the Lisp keycaps stay on the front of the board, so a stack that makes letters the base or a co-equal base is out regardless of press counts. ST-GUEST and ST-HOLD were superseded by the §0 layout, which does the same job for one key instead of two and puts Shift on a thumb instead of a corner.

Orthogonal to the stack, and staged separately so it can be judged on its own.

MechanismCostObjection
Dedicated Shift on a v2 spareone sparethe weakest position on the board, held while the other hand types
One-shot (sticky)one spare or one holda state that persists between two keypresses; needs an on-glass tell
Home-row modsnothingreintroduces tap-hold timing, in firmware, where ctest cannot reach it
LT1 becomes a real Shift where letters are livenothingone key with two meanings, decided by the live layer

The home-row option is the standard answer on a 34-key board and the one that fits this deck worst: the timing term is the same dependency the dwell model was rejected for, relocated somewhere harder to test. The last option is free and retires a misnomer, and it reads cleanly only where letters are the base.

  • The Row 0 indicator. A toggled layer needs an on-glass tell, and that is a ui/ kit component rather than a keymap change.
  • What MT-COMMIT is for once the letter layer ships. It keeps working, because it runs in the runtime and needs no firmware, so it is the path that exists before the keymap retarget lands. Whether it stays afterwards is a later call.
  • The two unmarked predictive candidates, T9-WORD and T9-KEC.
  • The QMK keymap retarget, still pre-ADR-0031 (the 31-key matrix, one _BASE layer). It is the dependency for shipping any of this to hardware.