Bare Deck Content Brief — Per-Tab Design
Supersedes for content scope: N/A — companion to bare-deck-terminal.md, which owns the tab framework.
Related
Section titled “Related”bare-deck-terminal.md— bare deck HUD framework, tab navigation, hot-swap, sound design.cipher-voice.md— CIPHER-LINE engine; this brief never duplicates voice content, only references it.input-dispatch.md— 31-key event model.deck-state.md— Universal Deck State schema.docs/marketing/pr-faq.md— five-tab launch promise (STATUS / CIPHER / LAMBDA / LINK / SYS) and the runtime-bounty pledge.- ADR-0002 — REPL is a separate runtime utility, not a bare-deck tab.
- ADR-0008 — nEmacs structural-editor UX and palette model.
- ADR-0015 — CIPHER is OLED-exclusive; the main 80×25 grid carries no live CIPHER glyphs.
- ADR-0016 — context-polymorphic key dispatch and Nokia multi-tap.
CLAUDE.md— Canonical Hardware Specification (sole source of truth for grid, font, color, key map). Never restated here.
1. Purpose of this brief
Section titled “1. Purpose of this brief”The PR-FAQ commits the launch deck to five nOSh-runtime tabs that teach the Lisp grammar through small runtime bounties before any cartridge is inserted. This brief specifies the player-facing content of each of those tabs:
| Tab | One-line teach |
|---|---|
| STATUS | ”This is who you are on this deck.” Identity + universal state at a glance. |
| CIPHER | ”The voice on the strip is real, persistent, and yours.” Metadata, history, vocabulary captured from CIPHER-LINE. |
| LAMBDA | ”Keys can be composed into named sequences.” Macro recorder + the first deliberately Lisp-shaped exercise. |
| LINK | ”The deck talks to other decks.” Solo + cooperative bounties; the proving ground for runtime economy. |
| SYS | ”The system has knobs, and they answer to the same grammar.” Settings as Lisp cells the operator manipulates. |
Engineering scope (GWP-317) implements the bounties exactly as specified below. Do not invent additional bounties; do not skip specified ones.
What this brief is NOT
Section titled “What this brief is NOT”- Not a re-spec of the framework. Tab cycling, hot-swap, boot, key map — all owned by
bare-deck-terminal.mdand CLAUDE.md. - Not a replacement for the REPL. The REPL (ADR-0002) and nEmacs (ADR-0008, ADR-0016) are separate runtime utilities reachable from the deck home, not bare-deck tabs. The bare deck TEACHES Lisp grammar via small bounded exercises; the REPL EXECUTES arbitrary Lisp. A bounty here that “feels Lispy” must remain a 1–3 minute exercise, not a free-form code task.
- Not CIPHER content. Live CIPHER fragments render on CIPHER-LINE only (ADR-0015). The CIPHER tab on the main grid is a log + meta view; it never paints CIPHER glyphs on the 80×25.
2. Layout contract recap
Section titled “2. Layout contract recap”Per CLAUDE.md Canonical Hardware Specification:
- Row 0 — firmware status bar (battery / mode / clock / TERM hint). Owned by nOSh runtime; tabs do not draw here except via the tab-strip widget which is part of the framework.
- Row 24 — firmware action bar. Each tab supplies its own action-bar legend ≤80 chars.
- Rows 1–23 — content area. Every layout below uses row indices 1–23 inclusive. Row 1 is the bottom edge of the tab-strip divider.
When this brief shows a layout, line numbers are RowN: and any glyph counts assume the 80-column grid.
The CIPHER-LINE 4-row layout (ADR-0015) is referenced only as context. Row 1 (status strip) is owned by firmware. Row 4 (contextual) is what each bare-deck tab influences. Rows 2–3 (CIPHER scrollback) are owned by the CIPHER engine and are never scripted by tab code; tabs only suggest generation triggers to the engine.
3. STATUS tab
Section titled “3. STATUS tab”Purpose
Section titled “Purpose”Teach the operator: this device knows who I am, and that knowledge is durable. STATUS is the lobby and the trophy case. It is also the first surface where the operator sees the Lisp grammar at work — the state is presented as labelled cells the operator can inspect.
Existing copy in bare-deck-terminal.md §“TAB 1: STATUS” remains the layout baseline. This brief locks the bounty surface STATUS exposes.
Layout (Rows 1–23)
Section titled “Layout (Rows 1–23)”Row 1: └─ tab-strip divider ────────────────────────────────────────┘Row 2: OPERATOR: GHOSTWIRE UPTIME 00:14:32Row 3: REPUTATION: ████████░░ 47 CREDITS: 2,840 ¤Row 4: ────────────────────────────────────────────────────────────Row 5: REGISTERED CAPABILITIES:Row 6: [■] ICE BREAKER Network Intrusion Module 0x01Row 7: [■] NEONGRID Grid Traversal Module 0x02Row 8: [■] BLACK LEDGER Forensic Audit Module 0x03Row 9: [ ] DEPTHCHARGE (not registered)Row 10: [ ] ──────── (slot empty)Row 11: [ ] ──────── (slot empty)Row 12: ────────────────────────────────────────────────────────────Row 13: PHASE CHAIN:Row 14: Phase 2/3: EXTRACTION → AUDIT (awaiting BLACK LEDGER)Row 15: ────────────────────────────────────────────────────────────Row 16: LAMBDA SLOTS (summary):Row 17: λ1 [■■■■░░░░] 14 λ3 [░░░░░░░░] — λ5 [░░░░░░░░] — λ7 [░░░░░░░░] —Row 18: λ2 [■■░░░░░░] 8 λ4 [░░░░░░░░] — λ6 [░░░░░░░░] — λ8 [░░░░░░░░] —Row 19: ────────────────────────────────────────────────────────────Row 20: BOUNTY: INSPECT-CELL — call out a deck-state field by name.Row 21: Reward: 3 ¤ (once per boot) Status: AVAILABLERow 22: ────────────────────────────────────────────────────────────Row 23: RUNTIME nOSh v2.4 | CIPHER ONLINE | SLOT EMPTYRow 24 (firmware action bar): INFO details · EVAL refresh · CAR drill · LAMBDA inspect-cell · BACK ↑
Runtime bounty: INSPECT-CELL
Section titled “Runtime bounty: INSPECT-CELL”A 60–90 second exercise that introduces the metaphor deck state is a list; every field is a cell with a name.
Trigger. Operator presses LAMBDA on the STATUS tab.
Flow.
- CIPHER-LINE Row 4 prints:
name a cell. operator. credits. reputation. phase. seed. - Main grid pops a 1-line modal at Row 21:
INSPECT WHICH CELL? - Operator presses one of:
CAR(=operator-handle),CDR(=credit-balance),INFO(=reputation),QUOTE(=phase-chain),EQ(=cipher-seed). - The runtime prints the cell name and value at Row 21:
(operator-handle "GHOSTWIRE")or(credit-balance 2840)etc. - EVAL confirms; +3 ¤; modal clears; bounty marks
COMPLETED (next reset on power-cycle). - Any other key cancels.
Inputs accepted on STATUS (full list).
| Key | Behavior |
|---|---|
CDR | Cycle to CIPHER tab. |
CAR | Drill into highlighted capability slot — open contract history (cumulative contracts, credits, rep). BACK returns. |
INFO | Toggle summary ↔ detail view (RAM usage, SRAM CRC, cartridge-history bitfield in binary). Double-tap = deep diagnostics. |
EVAL | Re-read SRAM and refresh display. |
LAMBDA | Start INSPECT-CELL bounty (above). |
BACK | No-op (already at tab level). |
QUOTE | Save a STATUS snapshot to the next free quote slot (4-byte deck-state digest; consumed in CIPHER tab history). |
Success criteria.
- The operator names ≥1 cell correctly, presses EVAL, and the runtime credits 3 ¤ once per boot cycle.
- Re-triggering
LAMBDAon the same boot showsBOUNTY COMPLETEDat Row 20 with the reward greyed out.
CIPHER-LINE contextual content (Row 4) when STATUS focused.
| Deck state | Row 4 content (8×8, ≤32 chars) |
|---|---|
| Fresh deck (Rep 0, no carts) | clean slate. inspect cells. |
| Mid-bounty | name a cell. CAR CDR INFO QUOTE EQ. |
| Bounty completed this boot | cells named. operator known. |
| Mid-phase chain | phase 2 of 3. extraction held. |
| Veteran (Rep 35+) | 47 reputation. board waits. |
Sample interaction transcript (STATUS)
Section titled “Sample interaction transcript (STATUS)”(turn 1) Operator presses LAMBDA. Main grid Row 21: "INSPECT WHICH CELL?" CIPHER-LINE Row 4: "name a cell. CAR CDR INFO QUOTE EQ."(turn 2) Operator presses INFO. Main grid Row 21: "(reputation 47)" PSG voice 1 plays a short ascending blip.(turn 3) Operator presses EVAL. Main grid Row 21: "INSPECT-CELL +3¤ total 2843¤" Row 20 strikes through; reward = COMPLETED. CIPHER-LINE Row 4: "cells named. operator known."(turn 4) Operator presses CDR. Tab cycles to CIPHER.4. CIPHER tab
Section titled “4. CIPHER tab”Purpose
Section titled “Purpose”Teach the operator: the voice on the strip above the keyboard is a system you can read, capture, and tune. The CIPHER tab on the main grid is explicitly a meta-view over the CIPHER engine — never a place where live CIPHER fragments render. Per ADR-0015, CIPHER glyphs on the 80×25 are reserved for the Null cartridge.
The tab teaches three things:
- CIPHER is a persistent voice, not a flicker — it has history, a seed, a vocabulary.
- The operator can capture fragments to quote slots (the bookmark grammar QUOTE).
- The operator can inspect the seed — making the LFSR observable, which is foundational for downstream LFSR bounties on the LINK tab and for Cipher Domain vocabulary on cartridges.
Layout (Rows 1–23)
Section titled “Layout (Rows 1–23)”Row 1: └─ tab-strip divider ────────────────────────────────────────┘Row 2: CIPHER VOICE — META + LOG (live voice on CIPHER-LINE)Row 3: ────────────────────────────────────────────────────────────Row 4: ENGINE STATERow 5: Seed 0xA7F3 Tier 1 (10–34 rep)Row 6: Mode AMBIENT Domain VOCAB: 142 tokensRow 7: Last fragment timestamp T-00:00:14Row 8: ────────────────────────────────────────────────────────────Row 9: RECENT FRAGMENTS (captured echoes — NOT live)Row 10: t-00:00:14 "the lfsr never repeats." [ ]Row 11: t-00:01:02 "phase chain holds." [Q]Row 12: t-00:03:40 "operator known." [Q]Row 13: t-00:08:15 "circuits warm. quiet noise floor." [ ]Row 14: t-00:14:01 "operator clean." [ ]Row 15: ────────────────────────────────────────────────────────────Row 16: QUOTE SLOTS (8 × 4-byte fragment refs)Row 17: q1 [■] phase-chain q5 [░] —Row 18: q2 [■] operator-known q6 [░] —Row 19: q3 [░] — q7 [░] —Row 20: q4 [░] — q8 [░] —Row 21: ────────────────────────────────────────────────────────────Row 22: BOUNTY: ECHO-CAPTURE — capture a fragment as it lands.Row 23: Reward: 4 ¤ (3-fragment streak) Status: 1/3 capturedRow 24 (action bar): QUOTE capture CAR drill EVAL re-seed EQ compare-seed BACK ↑
Note. Column 60 of Rows 10–14 carries [Q] if the corresponding fragment is currently held in a quote slot, [ ] if not. This is a glyph indicator only — the fragment text printed on Rows 10–14 is the captured echo string, not a live re-render. Captured echoes are 7-bit ASCII fragments stored alongside the quote slot’s 4-byte reference; they do not draw with the CIPHER amber-on-black palette differently from any other text.
Runtime bounty: ECHO-CAPTURE
Section titled “Runtime bounty: ECHO-CAPTURE”A 90–180 second exercise teaching the QUOTE bookmark grammar.
Trigger. Auto-active whenever the CIPHER tab is focused and at least one quote slot is empty. No explicit “start” press.
Flow.
- CIPHER engine generates a fragment on CIPHER-LINE rows 2–3 every 8–20 seconds (ambient cadence, owned by
cipher-voice.md). - While the fragment is on screen (≤6 seconds), the operator presses
QUOTE. - The bare-deck tab inspects the engine’s “current-fragment” pointer; if non-stale (timestamp < 6 s), it writes a 4-byte fragment ref + a 56-byte ASCII echo string to the next free quote slot.
- Row 22 increments the streak counter (
Status: N/3 captured). - After 3 successful captures within a single tab focus session, +4 ¤; streak resets.
- A capture during fragment-stale window (>6 s) prints
MISSED — fragment staleon Row 22 and does not consume a slot.
Inputs accepted on CIPHER.
| Key | Behavior |
|---|---|
CDR | Cycle to LAMBDA tab. |
CAR | Highlight a captured fragment row (10–14); BACK to clear. |
QUOTE | Capture current CIPHER-LINE fragment (bounty step). |
EVAL | Re-seed the engine — pops a confirm-modal: “RE-SEED CIPHER? +1 ¤ cost.” Re-seed cycles the LFSR and clears recent-fragments display (does NOT clear quote slots). The 1¤ cost is a sink that prevents grinding ECHO-CAPTURE infinitely. |
EQ | Compare current seed with last-link partner’s seed (placeholder when no link history; shows —). |
NIL | Free a quote slot — modal asks which (q1–q8); EVAL confirms. |
INFO | Toggle TIER tooltip on Row 5. |
BACK | No-op. |
Success criteria.
- Operator captures 3 fragments before slots fill or before changing tabs → +4 ¤.
- Operator captures 1 fragment ever → bounty marks “FIRST CAPTURE” and unlocks the LFSR EXERCISE on the LINK tab (gate condition for the LINK exercise’s Tier 1 difficulty).
CIPHER-LINE Row 4 contextual content when CIPHER tab focused.
| State | Row 4 |
|---|---|
| Empty quote slots, no captures yet | quote slots empty. press QUOTE. |
| Mid-streak (1/3 or 2/3) | streak 1 of 3. press QUOTE. (or 2) |
| All slots full | slots full. NIL to free. |
| Just re-seeded | seed cycled. listen. |
Important. Row 4 prompts above are suggestions to the CIPHER engine. The engine may substitute equivalent fragments from its grammar when its mode-selector is in a non-instructional mode (per
cipher-voice.md). The bare-deck tab never blits Row 4 directly.
Sample interaction transcript (CIPHER)
Section titled “Sample interaction transcript (CIPHER)”(turn 1) Operator focuses CIPHER tab. CIPHER-LINE Rows 2–3: "the lfsr never repeats. neither should you." CIPHER-LINE Row 4: "quote slots empty. press QUOTE." Main grid Row 22: "Status: 0/3 captured"(turn 2) Operator presses QUOTE. Main grid Row 11 updated: "[Q]" appears in column 60. Row 22: "Status: 1/3 captured" PSG resolution chord (200ms).(turn 3) ~12 seconds later, new fragment lands on CIPHER-LINE. Operator presses QUOTE again. Row 22: "Status: 2/3 captured"(turn 4) Operator waits. Fragment goes stale (8s). Operator presses QUOTE. Main grid Row 22: "MISSED — fragment stale. Status: 2/3"(turn 5) New fragment. QUOTE in time. Row 22: "ECHO-CAPTURE +4¤ streak reset 0/3" CIPHER-LINE Row 4: "echoes held."5. LAMBDA tab
Section titled “5. LAMBDA tab”Purpose
Section titled “Purpose”Teach the operator: named sequences are first-class — record once, replay anywhere. The LAMBDA tab is the bare deck’s most overtly Lisp-shaped surface. The operator records keypresses into named slots, plays them back, merges them with CONS, tests them with ATOM, compares them with EQ. By the time they leave, they have used six Lisp operators in concrete physical motion.
This is the surface that gates whether a player feels the grammar is real. If LAMBDA fails, the launch fails (per PR-FAQ “biggest risk”).
The existing layout in bare-deck-terminal.md §“TAB 2: LAMBDA” remains the baseline. This brief locks the bounty surface and the NAME-A-LAMBDA exercise, which is new.
Layout (Rows 1–23)
Section titled “Layout (Rows 1–23)”Row 1: └─ tab-strip divider ────────────────────────────────────────┘Row 2: LAMBDA EDITOR MODE: VIEWRow 3: ────────────────────────────────────────────────────────────Row 4: λ1 TAB-WALK ████████████████░░░░░░░░ 14/32 stepsRow 5: 01:INFO 02:CDR 03:CDR 04:CAR 05:EVAL 06:BACK 07:CDRRow 6: 08:CAR 09:APPLY 10:EVAL 11:BACK 12:BACK 13:QUOTE 14:EVALRow 7: ────────────────────────────────────────────────────────────Row 8: λ2 EXTRACT-PREP ████████░░░░░░░░░░░░░░░░ 8/32 stepsRow 9: 01:CDR 02:CDR 03:CDR 04:CDR 05:CDR 06:CAR 07:INFO 08:BACKRow 10: ────────────────────────────────────────────────────────────Row 11: λ3 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ emptyRow 12: λ4 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ emptyRow 13: λ5 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ emptyRow 14: λ6 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ emptyRow 15: λ7 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ emptyRow 16: λ8 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ emptyRow 17: ────────────────────────────────────────────────────────────Row 18: SELECTED: λ3 RECORDING: OFFRow 19: ────────────────────────────────────────────────────────────Row 20: BOUNTY: NAME-A-LAMBDA — record 4 steps, name it, play it back.Row 21: Step 1/3: record 4 keys after pressing LAMBDA.Row 22: Step 2/3: name it (3–8 char alpha; uses Nokia multi-tap).Row 23: Step 3/3: play back with EVAL. Reward: 8 ¤ (one-time)Row 24 (action bar): LAMBDA rec EVAL play CONS merge EQ diff ATOM test NIL clear CAR edit CDR slot+
Slot names. Each lambda slot now carries an 8-byte ASCII name (in addition to its existing 32-step buffer). Empty slots show (unnamed). Names are alphanumeric, ≤8 chars, entered via Nokia multi-tap on the numpad per ADR-0016 §6. The default slot label (e.g., λ3) is the slot index; the name is what the operator assigns.
Schema implication. This adds 64 bytes (8 × 8) to bare-deck state. It does not modify the Universal Deck State
lambda_slots[256](deck-state.md §1) — names live alongside the runtime macro buffers in abare_deck_runtimeblock, since they are advisory and need not survive cartridge sessions. Engineering: addchar lambda_names[8][8];toBareDeckState. Do not widen DeckState to absorb names without an ADR.
Runtime bounty: NAME-A-LAMBDA
Section titled “Runtime bounty: NAME-A-LAMBDA”A 2–3 minute exercise that exercises six Lisp keys in one continuous flow.
Trigger. Auto-active on first focus of LAMBDA tab when all eight slots are unnamed and empty. Once completed, never re-triggers automatically.
Flow.
| Step | Operator action | Runtime response |
|---|---|---|
| 1 | Press LAMBDA once on a slot. | Enters RECORDING. Row 18: RECORDING: ON · steps 0/32. |
| 2 | Press 4 keys (any keys; BACK aborts). | Steps populate Row 5/etc. live. |
| 3 | Press LAMBDA again. | Stops recording. Modal at Row 22: NAME THIS LAMBDA: ___ (3–8 chars). |
| 4 | Multi-tap alpha entry on numpad (per ADR-0016 §6). EVAL confirms. | Slot label populates. Bounty advances to Step 3/3. |
| 5 | Press EVAL on the named slot. | Macro plays back at 200ms/step. |
| 6 | Playback completes without operator pressing BACK. | +8 ¤. Bounty marks NAME-A-LAMBDA — COMPLETED (one-time). |
Failure modes.
- Recording aborted with
BACK→ bounty resets to Step 1/3, no penalty. - Name entered with non-alpha chars → modal repaints
name must be A–Z, 3–8 chars. - Playback interrupted with
BACK→ bounty stays at Step 3/3 (operator can re-trigger EVAL).
Inputs accepted on LAMBDA.
| Key | View mode | Edit mode (after CAR) | Recording mode |
|---|---|---|---|
CDR | Cycle slot 1→8→1 | Step cursor → next | (recorded as step) |
CAR | Enter edit on selected slot | (recorded as step) | (recorded as step) |
LAMBDA | Start recording | Exit edit | Stop recording |
EVAL | Playback selected slot | Toggle step delete | (recorded as step) |
CONS | Merge two slots — see below | (recorded as step) | (recorded as step) |
EQ | Diff two slots — see below | (recorded as step) | (recorded as step) |
ATOM | Test selected slot empty/non-empty (visual flash) | (recorded as step) | (recorded as step) |
NIL | Clear selected slot (EVAL to confirm) | Delete current step | (recorded as step) |
BACK | No-op | Exit edit | Abort recording |
INFO | Show slot metadata (length, last edit) | (recorded as step) | (recorded as step) |
QUOTE | Save selected slot’s name to a quote slot | (recorded as step) | (recorded as step) |
APPLY | No-op (see CLAUDE.md §“APPLY meaningfully absent”) | (recorded as step) | (recorded as step) |
Note on the function-key dual semantics. In View mode keys carry their tab semantics. In Recording mode, the operator’s intent is to capture the key as a step, so the keys do nothing else — the only escape from Recording is
LAMBDA(commit) orBACK(abort). This matches the existing implementation inbare_deck.cand is restated here for the engineer building the bounty.
CONS — merge two slots.
- In View mode, operator highlights slot A and presses
CONS. Row 18:CONS: pick second slot. - Operator presses
CDRto highlight slot B, thenCONSagain. - Runtime concatenates A + B (truncated to 32 steps). Result writes to next free unnamed slot. If all slots are full →
ALL SLOTS FULLon Row 18; merge fails.
EQ — diff two slots.
- Highlight slot A, press
EQ. Row 18:EQ: pick second slot. - Highlight slot B, press
EQagain. - Replace Rows 4–16 with side-by-side step-by-step diff: matching steps shown in normal amber, divergent steps shown inverted.
BACKexits diff view.
Success criteria.
- NAME-A-LAMBDA completes once per deck (tracked in DeckState — uses 1 bit of
cartridge_historyreserved range or a dedicatedbd_bounties_completedbyte; engineering decides at implementation). - Operator who completes NAME-A-LAMBDA has demonstrably exercised:
LAMBDA(record), Nokia multi-tap on numpad,EVAL(play). They’ve seenCONS/EQ/ATOMin the action bar. The PR-FAQ promise — “reaching for CAR and CDR the way it used to reach for Ctrl-F” — is structurally supported here.
CIPHER-LINE Row 4 when LAMBDA focused.
| State | Row 4 |
|---|---|
| Bounty step 1 (recording) | recording. press 4 keys. |
| Bounty step 2 (naming) | name it. multi-tap. |
| Bounty step 3 (playback) | eval to play. |
| Bounty done, viewing slots | slots are yours. cons merges. |
| In CONS pickup | pick second slot. |
| In EQ pickup | compare. amber matches. |
Sample interaction transcript (LAMBDA)
Section titled “Sample interaction transcript (LAMBDA)”(turn 1) Operator on λ3 (empty). Presses LAMBDA. Row 18: "RECORDING: ON · steps 0/32" CIPHER-LINE Row 4: "recording. press 4 keys."(turn 2) Operator presses CDR, CDR, CAR, EVAL. Row 11 fills: "01:CDR 02:CDR 03:CAR 04:EVAL"(turn 3) Operator presses LAMBDA. Modal Row 22: "NAME THIS LAMBDA: ___ (3–8 chars)" CIPHER-LINE Row 4: "name it. multi-tap."(turn 4) Operator multi-taps "WALK" on the numpad (9-9 = W, 2 = A, 5-5-5 = L, 5-5 = K). EVAL. Row 11 header: "λ3 WALK ████░░░░░░ 4/32 steps"(turn 5) Operator presses EVAL on λ3 WALK. Macro plays: CDR (200ms), CDR (200ms), CAR (200ms), EVAL (200ms). Tab cycles per the recorded keys. Row 22: "NAME-A-LAMBDA +8¤ total 2851¤" CIPHER-LINE Row 4: "slots are yours. cons merges."6. LINK tab
Section titled “6. LINK tab”Purpose
Section titled “Purpose”Teach the operator: the deck speaks to other decks, and that conversation has a protocol you can observe. LINK is the runtime-economy proving ground — the only tab where bounties can repeat for credit (subject to caps), where solo and cooperative play coexist, and where the LFSR (the bedrock of Cipher domain vocabulary) becomes a thing the operator actively predicts.
LINK has two solo bounties (DIAGNOSTIC, LFSR-EXERCISE) and one new exercise specified here (LINK-PROBE) plus the cooperative bounties already specified in bare-deck-terminal.md §“TAB 3: LINK” (LFSR SYNC, ECHO TEST, DECK COMPARE). This brief consolidates them and adds LINK-PROBE.
Layout (Rows 1–23, no connection)
Section titled “Layout (Rows 1–23, no connection)”Row 1: └─ tab-strip divider ────────────────────────────────────────┘Row 2: LINK PROTOCOL v1 · 9600 baudRow 3: ────────────────────────────────────────────────────────────Row 4: STATUS: NO CONNECTIONRow 5: PORT: 3.5mm TRRS LAST PING: never this sessionRow 6: ────────────────────────────────────────────────────────────Row 7: HISTORYRow 8: Last partner SIGNAL 2 days agoRow 9: Total links 14 Unique partners 3Row 10: ────────────────────────────────────────────────────────────Row 11: SOLO BOUNTIESRow 12: [!] DIAGNOSTIC (5¤ · once per boot) readyRow 13: [!] LFSR-EXERCISE (5¤ · repeatable · cap 25¤/boot) readyRow 14: [!] LINK-PROBE (3¤ · once per boot) readyRow 15: ────────────────────────────────────────────────────────────Row 16: COOPERATIVE BOUNTIES (require linked partner)Row 17: [ ] LFSR-SYNC (10¤ each) offlineRow 18: [ ] ECHO-TEST (5¤ winner) offlineRow 19: [ ] DECK-COMPARE (0¤ diag) offlineRow 20: ────────────────────────────────────────────────────────────Row 21: SOLO BOUNTY POOL: 13¤ available this bootRow 22: Highlight bounty with CDR. EVAL accepts. INFO shows rules.Row 23: ────────────────────────────────────────────────────────────Row 24 (action bar): LINK ping EVAL accept INFO rules EQ deck-cmp CDR pick BACK ↑
When connected, Row 4 changes to STATUS: CONNECTED · partner SIGNAL · latency 12ms, Rows 17–19 cooperative bounties switch to ready, and the deck-compare option becomes available via EQ.
Solo bounty: DIAGNOSTIC (existing)
Section titled “Solo bounty: DIAGNOSTIC (existing)”Already specified in bare-deck-terminal.md §“Solo nOSh Runtime Bounties — DIAGNOSTIC”. This brief locks: 5 ¤, once per boot, 31-key sweep, audio + display + SRAM verification.
Solo bounty: LFSR-EXERCISE (existing, scope locked here)
Section titled “Solo bounty: LFSR-EXERCISE (existing, scope locked here)”Already specified in bare-deck-terminal.md §“Solo nOSh Runtime Bounties — LFSR EXERCISE”. This brief locks the cap: 5 attempts × 5 ¤ = 25 ¤ max per boot to prevent grinding. Tier scaling per existing spec.
Solo bounty: LINK-PROBE (new — this brief)
Section titled “Solo bounty: LINK-PROBE (new — this brief)”A 30–60 second exercise teaching the operator that LINK is a listening port even without a partner. Builds reflex for the cooperative bounties.
Trigger. Operator presses LINK while no partner is connected.
Flow.
- Runtime sends a probe packet on the TRRS port.
- Tab displays a 5-second listen window:
Row 21: LISTENING ... ▓▓▓▓▓░░░░░ 50%(animated bar). - During the window, the operator presses
LINKagain exactly once when the bar is at 100% (the bar fills smoothly over 5 s). - Hit window: 4.7–5.2 s (±150 ms). Hit → +3 ¤. Miss → no payout, message
Row 21: PROBE TIMING OFF — try again next boot. - Whether hit or miss, the bounty marks
COMPLETEDfor this boot cycle.
This exercise teaches latency-budgeting (operator learns what a ~150 ms window feels like) which directly transfers to ECHO-TEST.
Inputs accepted on LINK.
| Key | No connection | Connected |
|---|---|---|
CDR | Cycle to SYS tab. | Cycle to SYS tab. |
LINK | Send probe (LINK-PROBE bounty). | Keepalive ping. |
CAR | Highlight a bounty in rows 12–14 / 17–19 → INFO opens detail. | Same. |
EVAL | Accept highlighted solo bounty (e.g., LFSR-EXERCISE). | Accept solo or cooperative bounty. |
EQ | No-op (greyed in action bar). | DECK-COMPARE diagnostic. |
INFO | Show rules for highlighted bounty. | Same; partner state shown if available. |
BACK | No-op. | Same. |
CIPHER-LINE Row 4 when LINK focused.
| State | Row 4 |
|---|---|
| No connection, idle | port quiet. press LINK to probe. |
| Probe in flight | listening. tap LINK at full. |
| Connected, idle | partner signal online. |
| Bounty in progress (LFSR-SYNC) | align. press eval together. |
| Bounty in progress (ECHO-TEST) | wait for the tone. |
Sample interaction transcript (LINK, solo)
Section titled “Sample interaction transcript (LINK, solo)”(turn 1) Operator presses LINK. Row 21: "LISTENING ... ░░░░░░░░░░ 0%" CIPHER-LINE Row 4: "listening. tap LINK at full."(turn 2) ~5 s later, bar at "▓▓▓▓▓▓▓▓▓▓ 100%". Operator presses LINK. Row 21: "LINK-PROBE +3¤ total 2854¤"(turn 3) Operator highlights LFSR-EXERCISE with CDR; presses EVAL. Row 2 area shows: "SEQUENCE: 42 → 17 → 68 → 34 → ?" Operator types "017" on numpad, EVAL. Row 21: "+5¤ pool remaining 20¤"(turn 4) Operator presses CDR. Tab cycles to SYS.7. SYS tab
Section titled “7. SYS tab”Purpose
Section titled “Purpose”Teach the operator: the system is just more cells to inspect and set. SYS is presented as a Lisp-shaped settings tree — each setting is a (setting <name> <value>) cell that the operator selects with CAR/CDR and modifies with the same grammar used everywhere else. This is the surface where operator-handle editing, factory reset, and runtime diagnostics live.
The existing layout in bare-deck-terminal.md §“TAB 4: SYS” is the baseline. This brief adds the SET-A-SETTING bounty and locks the contract for restart-tutorial / key-test / rebind entry points.
Layout (Rows 1–23)
Section titled “Layout (Rows 1–23)”Row 1: └─ tab-strip divider ────────────────────────────────────────┘Row 2: SYSTEM v2.4Row 3: ────────────────────────────────────────────────────────────Row 4: DISPLAYRow 5: (setting contrast 80%) [+ / − to adjust]Row 6: (setting backlight on) [EVAL toggle]Row 7: ────────────────────────────────────────────────────────────Row 8: AUDIORow 9: (setting volume 60%) [+ / − to adjust]Row 10: (setting psg-test ready) [EVAL test tone]Row 11: (setting key-click on) [EVAL toggle]Row 12: ────────────────────────────────────────────────────────────Row 13: OPERATORRow 14: (setting handle "GHOSTWIRE") [CAR edit]Row 15: (setting first-boot 2026-03-15) [info only]Row 16: (setting sessions 47) [info only]Row 17: ────────────────────────────────────────────────────────────Row 18: TUTORIAL & DIAGNOSTICSRow 19: restart-tutorial [EVAL] key-test [EVAL]Row 20: rebind-keys [EVAL] factory-reset [hold NIL+EVAL+SYS 3s]Row 21: ────────────────────────────────────────────────────────────Row 22: BOUNTY: SET-A-SETTING — flip a toggle, adjust a slider.Row 23: Reward: 2 ¤ (one-time) Status: AVAILABLERow 24 (action bar): CDR section CAR edit +/- adjust EVAL test/toggle BACK ↑
Runtime bounty: SET-A-SETTING
Section titled “Runtime bounty: SET-A-SETTING”A 30-second exercise that confirms the operator can navigate the settings tree and that two of the three modification grammars (toggle, slider, edit-field) work.
Trigger. Auto-active on first focus of SYS tab.
Flow.
- Row 22 prompts:
Adjust contrast or volume by ±10, then toggle backlight or key-click. - Operator navigates with
CDR(section), highlights a slider field, presses+≥1 time → progress1/2 done. - Operator highlights a toggle, presses
EVAL→ progress2/2 done. - +2 ¤; bounty marks
COMPLETED (one-time).
Inputs accepted on SYS.
| Key | Behavior |
|---|---|
CDR | Cycle through sections (DISPLAY → AUDIO → OPERATOR → TUTORIAL → DISPLAY) AND tab-cycle when at the last section + held → wraps. (Standard tab-cycle on single tap from anywhere.) |
CAR | Enter edit on selected field (e.g., handle). |
+ / − | Adjust slider. |
EVAL | Toggle / test / activate. For tutorial entry: replays first-boot tutorial via tutorial_wiring.h (existing). For key-test: enters the SYS key-test mode (key-test-utility.md). For rebind-keys: enters keymap editor (gated behind ADR-0016 §3). For factory-reset: see hold gesture below. |
INFO | Show help for the highlighted field. |
BACK | No-op (already at tab level) — except when in handle-edit, where it cancels the edit. |
NIL | Combined with EVAL+SYS for 3 s → factory reset. Standalone NIL is a no-op on SYS. |
Factory reset gesture. Per existing bare-deck-terminal.md §“Factory Reset”. This brief restates the modal copy: main grid prints THIS WILL ERASE YOUR IDENTITY. ARE YOU CERTAIN? and CIPHER-LINE Row 4 prints erase. are you sure.. EVAL within 5 s confirms; any other key cancels.
Tutorial restart. Wired through tutorial_wiring.h::kn86_main_restart_tutorial() per the existing implementation. No bounty payout — restarts the first-boot tutorial directly.
Key-test entry. Wired through key_test_utility.md (existing nOSh runtime SYS-mode screen, BD_MODE_SYS_KEY_TEST).
Rebind-keys entry. Per ADR-0016 §3, the keymap is a Lisp alist that is mode-scoped and not user-rebindable for v1. This row is rendered greyed-out with the legend (disabled v1 — see ADR-0016). Engineering note: wire the row but disable the EVAL handler with a tooltip explaining this. Do not silently omit the row — its presence advertises the future capability.
CIPHER-LINE Row 4 when SYS focused.
| State | Row 4 |
|---|---|
| Bounty available, on slider | nudge contrast or volume. |
| Bounty step 1 done | now toggle a switch. |
| Bounty done | settings answer to keys. |
| Hovering factory-reset | hold NIL EVAL SYS three seconds. |
Sample interaction transcript (SYS)
Section titled “Sample interaction transcript (SYS)”(turn 1) Operator focuses SYS. Lands on contrast slider. CIPHER-LINE Row 4: "nudge contrast or volume."(turn 2) Operator presses + twice. Row 5 reads "(setting contrast 100%)". Row 22: "Status: 1/2 done"(turn 3) Operator presses CDR to AUDIO section, then CDR to key-click. Presses EVAL. Row 11: "(setting key-click off)". Row 22: "SET-A-SETTING +2¤ total 2856¤" CIPHER-LINE Row 4: "settings answer to keys."(turn 4) Operator CDRs to TUTORIAL section, highlights restart-tutorial, presses EVAL. Bare deck reboots into first-boot tutorial.8. Cross-tab summary — bounty inventory
Section titled “8. Cross-tab summary — bounty inventory”| Bounty | Tab | Reward | Cap | Trigger | Teaches |
|---|---|---|---|---|---|
| INSPECT-CELL | STATUS | 3 ¤ | once / boot | LAMBDA press | Deck state is named cells |
| ECHO-CAPTURE | CIPHER | 4 ¤ per 3-streak | streak only; re-seed costs 1 ¤ | auto on focus | QUOTE bookmark grammar; CIPHER permanence |
| NAME-A-LAMBDA | LAMBDA | 8 ¤ | one-time per deck | auto on first focus | LAMBDA / EVAL / Nokia multi-tap; named composition |
| LINK-PROBE | LINK | 3 ¤ | once / boot | LINK press, no partner | Latency budgeting; transfers to ECHO-TEST |
| DIAGNOSTIC | LINK | 5 ¤ | once / boot | EVAL on bounty | Hardware verification; full key sweep |
| LFSR-EXERCISE | LINK | 5 ¤ × 5 = 25 ¤ | 5 attempts / boot | EVAL on bounty | LFSR literacy → CIPHER seed observability |
| LFSR-SYNC | LINK (coop) | 10 ¤ each | per pairing | EVAL on bounty when linked | Cooperative timing |
| ECHO-TEST | LINK (coop) | 5 ¤ winner | per pairing | EVAL on bounty when linked | Audio reflex |
| DECK-COMPARE | LINK (coop) | 0 ¤ | per pairing | EQ when linked | Comparative state literacy |
| SET-A-SETTING | SYS | 2 ¤ | one-time per deck | auto on first focus | Settings as cells; +/- and EVAL grammar |
Floor for a complete first-boot session (cartridge-less): an operator who completes every once-per-boot or one-time solo bounty and one LFSR-EXERCISE attempt earns 3 + 4 + 8 + 3 + 5 + 5 + 2 = 30 ¤ in approximately 10–12 minutes. This is intentionally the same order of magnitude as a single-phase ICE Breaker contract reward, so a cartridge-less operator can reach ~5,000 ¤ across 100 sessions and feel the economy works without ever inserting a cartridge — closing the PR-FAQ promise “An operator who has never loaded a cartridge can still… earn credits through runtime bounties.”
9. Boundary with the REPL and nEmacs (ADR-0002 / ADR-0008 / ADR-0016)
Section titled “9. Boundary with the REPL and nEmacs (ADR-0002 / ADR-0008 / ADR-0016)”The REPL and nEmacs are not bare-deck tabs. They are runtime utilities reachable from the deck home (alongside the bare deck and the mission board). Per ADR-0002:
- The REPL has its own 24 KB SRAM arena and is mutually exclusive with an active cartridge.
- nEmacs has its own 16 KB editor arena and CIPHER-LINE-driven palette modeline.
- First-boot tutorial walks through CAR/CDR/EVAL/QUOTE in the REPL — not on the bare deck.
This brief preserves a clean teach/execute split:
| Surface | Role | Lisp depth |
|---|---|---|
| Bare deck (this brief) | TEACH the grammar via small, bounded, sub-3-minute exercises. | Keys and named cells; never free-form code. |
| REPL (ADR-0002) | EXECUTE arbitrary Lisp; tutorial mode walks the operator through it. | Full read-eval-print on the Fe VM. |
| nEmacs (ADR-0008, ADR-0016) | AUTHOR scripts via a structural editor with a predictive palette. | Full structural editing of s-expressions. |
A bare-deck bounty must therefore:
- Resolve in 30–180 seconds.
- Use only physical keys + Nokia multi-tap; no s-expression editing.
- Frame state inspection / mutation as named cells (
(operator-handle …),(setting volume …)) — establishing the Lisp metaphor without requiring the operator to write Lisp. - Hand off to the REPL / nEmacs only via explicit operator action (e.g., from the SYS tutorial-restart row, not from a bounty completion).
If a bounty proposal cannot satisfy these constraints, it does not belong on the bare deck — it belongs in the REPL tutorial or in cartridge content.
10. Implementation gates for GWP-317
Section titled “10. Implementation gates for GWP-317”Engineering implements the bounties from this brief in this order. Each line item is a discrete sub-task:
- STATUS — INSPECT-CELL. Add
LAMBDAhandler tobd_handle_status_input; render Row 20–21 modal. - CIPHER — refactor render. Remove main-grid passage rendering from
render_cipher; replace with metadata + captured-echo log per §4 layout. Verify ADR-0015 compliance — no live CIPHER fragments paint to the main grid. Captured echoes are stored ASCII strings, not live CIPHER-engine reads. - CIPHER — ECHO-CAPTURE. Wire
QUOTEto write a 4-byte fragment ref + 56-byte ASCII echo into the next free quote slot, with the 6-second staleness window. - LAMBDA — slot names. Add
char lambda_names[8][8]toBareDeckState. Render names in Rows 4/8/etc. - LAMBDA — Nokia multi-tap entry. Wire to ADR-0016 §6 implementation. Reuse the handle-entry multi-tap if available.
- LAMBDA — NAME-A-LAMBDA. State machine for the 3-step bounty.
- LINK — LINK-PROBE. 5-second listen window with timing-hit detection.
- LINK — LFSR-EXERCISE cap. Enforce 5-attempt-per-boot ceiling.
- SYS — SET-A-SETTING. State machine for the 2-step bounty.
- SYS — settings-as-cells rendering. Update Rows 4–17 to the
(setting <name> <value>)format from §7. - SYS — disabled rebind row. Render
rebind-keysgreyed; EVAL prints tooltip. - Cross-cut: bounty completion ledger. Add
uint16_t bd_bounties_completedbitfield to bare-deck state (one bit per bounty × per-boot vs one-time semantics tracked separately in code). - Acceptance test. Wire each bounty to the existing test harness so a regression in any single bounty is caught by
ctest.
The brief is the acceptance contract. Engineering deviation requires a written delta back to this doc and a Notion comment on GWP-322.
11. Open questions deferred from this brief
Section titled “11. Open questions deferred from this brief”- Does the Null cartridge’s
cipher-main-grid-escapecapability override the CIPHER tab layout when Null is loaded? Probably not — Null’s escape is a cartridge-side capability, not a bare-deck rewrite. Confirm with Null cartridge spec when it lands. - Should NAME-A-LAMBDA be re-triggerable after factory reset? Yes (factory reset wipes
bd_bounties_completed). Out of scope to enforce here; covered by SRAM-wipe semantics. - Should LFSR-EXERCISE difficulty scale also when no cartridge is loaded? Yes per existing spec (scales by reputation only). No change here.
- Cooperative bounty content is locked in
bare-deck-terminal.md§“Cooperative Link Bounties” and not duplicated here. If those bounties need revision, open a separate ADR / brief.
Version history
Section titled “Version history”| Version | Date | Notes |
|---|---|---|
| 1.0 | 2026-04-27 | Initial brief. Five-tab content scope; six new/locked bounties; gate doc for GWP-317. |