Skip to content

Bare Deck Content Brief — Per-Tab Design

Supersedes for content scope: N/A — companion to bare-deck-terminal.md, which owns the tab framework.

  • 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.

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:

TabOne-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.

  • Not a re-spec of the framework. Tab cycling, hot-swap, boot, key map — all owned by bare-deck-terminal.md and 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.

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.


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.

Row 1: └─ tab-strip divider ────────────────────────────────────────┘
Row 2: OPERATOR: GHOSTWIRE UPTIME 00:14:32
Row 3: REPUTATION: ████████░░ 47 CREDITS: 2,840 ¤
Row 4: ────────────────────────────────────────────────────────────
Row 5: REGISTERED CAPABILITIES:
Row 6: [■] ICE BREAKER Network Intrusion Module 0x01
Row 7: [■] NEONGRID Grid Traversal Module 0x02
Row 8: [■] BLACK LEDGER Forensic Audit Module 0x03
Row 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: AVAILABLE
Row 22: ────────────────────────────────────────────────────────────
Row 23: RUNTIME nOSh v2.4 | CIPHER ONLINE | SLOT EMPTY

Row 24 (firmware action bar): INFO details · EVAL refresh · CAR drill · LAMBDA inspect-cell · BACK ↑

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.

  1. CIPHER-LINE Row 4 prints: name a cell. operator. credits. reputation. phase. seed.
  2. Main grid pops a 1-line modal at Row 21: INSPECT WHICH CELL?
  3. Operator presses one of: CAR (= operator-handle), CDR (= credit-balance), INFO (= reputation), QUOTE (= phase-chain), EQ (= cipher-seed).
  4. The runtime prints the cell name and value at Row 21: (operator-handle "GHOSTWIRE") or (credit-balance 2840) etc.
  5. EVAL confirms; +3 ¤; modal clears; bounty marks COMPLETED (next reset on power-cycle).
  6. Any other key cancels.

Inputs accepted on STATUS (full list).

KeyBehavior
CDRCycle to CIPHER tab.
CARDrill into highlighted capability slot — open contract history (cumulative contracts, credits, rep). BACK returns.
INFOToggle summary ↔ detail view (RAM usage, SRAM CRC, cartridge-history bitfield in binary). Double-tap = deep diagnostics.
EVALRe-read SRAM and refresh display.
LAMBDAStart INSPECT-CELL bounty (above).
BACKNo-op (already at tab level).
QUOTESave 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 LAMBDA on the same boot shows BOUNTY COMPLETED at Row 20 with the reward greyed out.

CIPHER-LINE contextual content (Row 4) when STATUS focused.

Deck stateRow 4 content (8×8, ≤32 chars)
Fresh deck (Rep 0, no carts)clean slate. inspect cells.
Mid-bountyname a cell. CAR CDR INFO QUOTE EQ.
Bounty completed this bootcells named. operator known.
Mid-phase chainphase 2 of 3. extraction held.
Veteran (Rep 35+)47 reputation. board waits.
(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.

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:

  1. CIPHER is a persistent voice, not a flicker — it has history, a seed, a vocabulary.
  2. The operator can capture fragments to quote slots (the bookmark grammar QUOTE).
  3. 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.
Row 1: └─ tab-strip divider ────────────────────────────────────────┘
Row 2: CIPHER VOICE — META + LOG (live voice on CIPHER-LINE)
Row 3: ────────────────────────────────────────────────────────────
Row 4: ENGINE STATE
Row 5: Seed 0xA7F3 Tier 1 (10–34 rep)
Row 6: Mode AMBIENT Domain VOCAB: 142 tokens
Row 7: Last fragment timestamp T-00:00:14
Row 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 captured

Row 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.

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.

  1. CIPHER engine generates a fragment on CIPHER-LINE rows 2–3 every 8–20 seconds (ambient cadence, owned by cipher-voice.md).
  2. While the fragment is on screen (≤6 seconds), the operator presses QUOTE.
  3. 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.
  4. Row 22 increments the streak counter (Status: N/3 captured).
  5. After 3 successful captures within a single tab focus session, +4 ¤; streak resets.
  6. A capture during fragment-stale window (>6 s) prints MISSED — fragment stale on Row 22 and does not consume a slot.

Inputs accepted on CIPHER.

KeyBehavior
CDRCycle to LAMBDA tab.
CARHighlight a captured fragment row (10–14); BACK to clear.
QUOTECapture current CIPHER-LINE fragment (bounty step).
EVALRe-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.
EQCompare current seed with last-link partner’s seed (placeholder when no link history; shows ).
NILFree a quote slot — modal asks which (q1–q8); EVAL confirms.
INFOToggle TIER tooltip on Row 5.
BACKNo-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.

StateRow 4
Empty quote slots, no captures yetquote slots empty. press QUOTE.
Mid-streak (1/3 or 2/3)streak 1 of 3. press QUOTE. (or 2)
All slots fullslots full. NIL to free.
Just re-seededseed 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.

(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."

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.

Row 1: └─ tab-strip divider ────────────────────────────────────────┘
Row 2: LAMBDA EDITOR MODE: VIEW
Row 3: ────────────────────────────────────────────────────────────
Row 4: λ1 TAB-WALK ████████████████░░░░░░░░ 14/32 steps
Row 5: 01:INFO 02:CDR 03:CDR 04:CAR 05:EVAL 06:BACK 07:CDR
Row 6: 08:CAR 09:APPLY 10:EVAL 11:BACK 12:BACK 13:QUOTE 14:EVAL
Row 7: ────────────────────────────────────────────────────────────
Row 8: λ2 EXTRACT-PREP ████████░░░░░░░░░░░░░░░░ 8/32 steps
Row 9: 01:CDR 02:CDR 03:CDR 04:CDR 05:CDR 06:CAR 07:INFO 08:BACK
Row 10: ────────────────────────────────────────────────────────────
Row 11: λ3 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ empty
Row 12: λ4 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ empty
Row 13: λ5 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ empty
Row 14: λ6 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ empty
Row 15: λ7 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ empty
Row 16: λ8 (unnamed) ░░░░░░░░░░░░░░░░░░░░░░░░ empty
Row 17: ────────────────────────────────────────────────────────────
Row 18: SELECTED: λ3 RECORDING: OFF
Row 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 a bare_deck_runtime block, since they are advisory and need not survive cartridge sessions. Engineering: add char lambda_names[8][8]; to BareDeckState. Do not widen DeckState to absorb names without an ADR.

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.

StepOperator actionRuntime response
1Press LAMBDA once on a slot.Enters RECORDING. Row 18: RECORDING: ON · steps 0/32.
2Press 4 keys (any keys; BACK aborts).Steps populate Row 5/etc. live.
3Press LAMBDA again.Stops recording. Modal at Row 22: NAME THIS LAMBDA: ___ (3–8 chars).
4Multi-tap alpha entry on numpad (per ADR-0016 §6). EVAL confirms.Slot label populates. Bounty advances to Step 3/3.
5Press EVAL on the named slot.Macro plays back at 200ms/step.
6Playback 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.

KeyView modeEdit mode (after CAR)Recording mode
CDRCycle slot 1→8→1Step cursor → next(recorded as step)
CAREnter edit on selected slot(recorded as step)(recorded as step)
LAMBDAStart recordingExit editStop recording
EVALPlayback selected slotToggle step delete(recorded as step)
CONSMerge two slots — see below(recorded as step)(recorded as step)
EQDiff two slots — see below(recorded as step)(recorded as step)
ATOMTest selected slot empty/non-empty (visual flash)(recorded as step)(recorded as step)
NILClear selected slot (EVAL to confirm)Delete current step(recorded as step)
BACKNo-opExit editAbort recording
INFOShow slot metadata (length, last edit)(recorded as step)(recorded as step)
QUOTESave selected slot’s name to a quote slot(recorded as step)(recorded as step)
APPLYNo-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) or BACK (abort). This matches the existing implementation in bare_deck.c and is restated here for the engineer building the bounty.

CONS — merge two slots.

  1. In View mode, operator highlights slot A and presses CONS. Row 18: CONS: pick second slot.
  2. Operator presses CDR to highlight slot B, then CONS again.
  3. Runtime concatenates A + B (truncated to 32 steps). Result writes to next free unnamed slot. If all slots are full → ALL SLOTS FULL on Row 18; merge fails.

EQ — diff two slots.

  1. Highlight slot A, press EQ. Row 18: EQ: pick second slot.
  2. Highlight slot B, press EQ again.
  3. Replace Rows 4–16 with side-by-side step-by-step diff: matching steps shown in normal amber, divergent steps shown inverted. BACK exits diff view.

Success criteria.

  • NAME-A-LAMBDA completes once per deck (tracked in DeckState — uses 1 bit of cartridge_history reserved range or a dedicated bd_bounties_completed byte; engineering decides at implementation).
  • Operator who completes NAME-A-LAMBDA has demonstrably exercised: LAMBDA (record), Nokia multi-tap on numpad, EVAL (play). They’ve seen CONS/EQ/ATOM in 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.

StateRow 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 slotsslots are yours. cons merges.
In CONS pickuppick second slot.
In EQ pickupcompare. amber matches.
(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."

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.

Row 1: └─ tab-strip divider ────────────────────────────────────────┘
Row 2: LINK PROTOCOL v1 · 9600 baud
Row 3: ────────────────────────────────────────────────────────────
Row 4: STATUS: NO CONNECTION
Row 5: PORT: 3.5mm TRRS LAST PING: never this session
Row 6: ────────────────────────────────────────────────────────────
Row 7: HISTORY
Row 8: Last partner SIGNAL 2 days ago
Row 9: Total links 14 Unique partners 3
Row 10: ────────────────────────────────────────────────────────────
Row 11: SOLO BOUNTIES
Row 12: [!] DIAGNOSTIC (5¤ · once per boot) ready
Row 13: [!] LFSR-EXERCISE (5¤ · repeatable · cap 25¤/boot) ready
Row 14: [!] LINK-PROBE (3¤ · once per boot) ready
Row 15: ────────────────────────────────────────────────────────────
Row 16: COOPERATIVE BOUNTIES (require linked partner)
Row 17: [ ] LFSR-SYNC (10¤ each) offline
Row 18: [ ] ECHO-TEST (5¤ winner) offline
Row 19: [ ] DECK-COMPARE (0¤ diag) offline
Row 20: ────────────────────────────────────────────────────────────
Row 21: SOLO BOUNTY POOL: 13¤ available this boot
Row 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.

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.

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.

  1. Runtime sends a probe packet on the TRRS port.
  2. Tab displays a 5-second listen window: Row 21: LISTENING ... ▓▓▓▓▓░░░░░ 50% (animated bar).
  3. During the window, the operator presses LINK again exactly once when the bar is at 100% (the bar fills smoothly over 5 s).
  4. Hit window: 4.7–5.2 s (±150 ms). Hit → +3 ¤. Miss → no payout, message Row 21: PROBE TIMING OFF — try again next boot.
  5. Whether hit or miss, the bounty marks COMPLETED for 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.

KeyNo connectionConnected
CDRCycle to SYS tab.Cycle to SYS tab.
LINKSend probe (LINK-PROBE bounty).Keepalive ping.
CARHighlight a bounty in rows 12–14 / 17–19 → INFO opens detail.Same.
EVALAccept highlighted solo bounty (e.g., LFSR-EXERCISE).Accept solo or cooperative bounty.
EQNo-op (greyed in action bar).DECK-COMPARE diagnostic.
INFOShow rules for highlighted bounty.Same; partner state shown if available.
BACKNo-op.Same.

CIPHER-LINE Row 4 when LINK focused.

StateRow 4
No connection, idleport quiet. press LINK to probe.
Probe in flightlistening. tap LINK at full.
Connected, idlepartner signal online.
Bounty in progress (LFSR-SYNC)align. press eval together.
Bounty in progress (ECHO-TEST)wait for the tone.
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.

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.

Row 1: └─ tab-strip divider ────────────────────────────────────────┘
Row 2: SYSTEM v2.4
Row 3: ────────────────────────────────────────────────────────────
Row 4: DISPLAY
Row 5: (setting contrast 80%) [+ / − to adjust]
Row 6: (setting backlight on) [EVAL toggle]
Row 7: ────────────────────────────────────────────────────────────
Row 8: AUDIO
Row 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: OPERATOR
Row 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 & DIAGNOSTICS
Row 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: AVAILABLE

Row 24 (action bar): CDR section CAR edit +/- adjust EVAL test/toggle BACK ↑

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.

  1. Row 22 prompts: Adjust contrast or volume by ±10, then toggle backlight or key-click.
  2. Operator navigates with CDR (section), highlights a slider field, presses + ≥1 time → progress 1/2 done.
  3. Operator highlights a toggle, presses EVAL → progress 2/2 done.
  4. +2 ¤; bounty marks COMPLETED (one-time).

Inputs accepted on SYS.

KeyBehavior
CDRCycle 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.)
CAREnter edit on selected field (e.g., handle).
+ / Adjust slider.
EVALToggle / 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.
INFOShow help for the highlighted field.
BACKNo-op (already at tab level) — except when in handle-edit, where it cancels the edit.
NILCombined 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.

StateRow 4
Bounty available, on slidernudge contrast or volume.
Bounty step 1 donenow toggle a switch.
Bounty donesettings answer to keys.
Hovering factory-resethold NIL EVAL SYS three seconds.
(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.

BountyTabRewardCapTriggerTeaches
INSPECT-CELLSTATUS3 ¤once / bootLAMBDA pressDeck state is named cells
ECHO-CAPTURECIPHER4 ¤ per 3-streakstreak only; re-seed costs 1 ¤auto on focusQUOTE bookmark grammar; CIPHER permanence
NAME-A-LAMBDALAMBDA8 ¤one-time per deckauto on first focusLAMBDA / EVAL / Nokia multi-tap; named composition
LINK-PROBELINK3 ¤once / bootLINK press, no partnerLatency budgeting; transfers to ECHO-TEST
DIAGNOSTICLINK5 ¤once / bootEVAL on bountyHardware verification; full key sweep
LFSR-EXERCISELINK5 ¤ × 5 = 25 ¤5 attempts / bootEVAL on bountyLFSR literacy → CIPHER seed observability
LFSR-SYNCLINK (coop)10 ¤ eachper pairingEVAL on bounty when linkedCooperative timing
ECHO-TESTLINK (coop)5 ¤ winnerper pairingEVAL on bounty when linkedAudio reflex
DECK-COMPARELINK (coop)0 ¤per pairingEQ when linkedComparative state literacy
SET-A-SETTINGSYS2 ¤one-time per deckauto on first focusSettings 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:

SurfaceRoleLisp 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.


Engineering implements the bounties from this brief in this order. Each line item is a discrete sub-task:

  1. STATUS — INSPECT-CELL. Add LAMBDA handler to bd_handle_status_input; render Row 20–21 modal.
  2. 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.
  3. CIPHER — ECHO-CAPTURE. Wire QUOTE to write a 4-byte fragment ref + 56-byte ASCII echo into the next free quote slot, with the 6-second staleness window.
  4. LAMBDA — slot names. Add char lambda_names[8][8] to BareDeckState. Render names in Rows 4/8/etc.
  5. LAMBDA — Nokia multi-tap entry. Wire to ADR-0016 §6 implementation. Reuse the handle-entry multi-tap if available.
  6. LAMBDA — NAME-A-LAMBDA. State machine for the 3-step bounty.
  7. LINK — LINK-PROBE. 5-second listen window with timing-hit detection.
  8. LINK — LFSR-EXERCISE cap. Enforce 5-attempt-per-boot ceiling.
  9. SYS — SET-A-SETTING. State machine for the 2-step bounty.
  10. SYS — settings-as-cells rendering. Update Rows 4–17 to the (setting <name> <value>) format from §7.
  11. SYS — disabled rebind row. Render rebind-keys greyed; EVAL prints tooltip.
  12. Cross-cut: bounty completion ledger. Add uint16_t bd_bounties_completed bitfield to bare-deck state (one bit per bounty × per-boot vs one-time semantics tracked separately in code).
  13. 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-escape capability 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.

VersionDateNotes
1.02026-04-27Initial brief. Five-tab content scope; six new/locked bounties; gate doc for GWP-317.