CIPHER Voice Style Guide
cipher-voice.md— engine spec (event stream, modes, mode selector, coherence stack)../api-reference/grammars/cipher-line-grammar.md— wire grammar productions../../adr/ADR-0015-cipher-line-auxiliary-display.md— CIPHER-LINE hardware + surface allocation../../adr/ADR-0006-cart-format-v2.md§Cart-Capabilities Block — Null’s main-grid escape mechanism../../marketing/pr-faq.mdRisk #3 — voice drift is the third-biggest launch riskCLAUDE.mdCanonical Hardware Specification (CIPHER-LINE row, Spec Hygiene Rule 6) — authoritative hardware values; this guide does not restate them
1. Why this guide exists
Section titled “1. Why this guide exists”CIPHER is a single voice rendered by a single engine on a single surface. Every cartridge contributes vocabulary, productions, mode-weight biases, and style deltas; the nOSh runtime owns the generator, the meta-grammar, the mode selector, and the coherence stack. The deck speaks across all cartridges with one set of vocal cords.
Risk #3 in the launch PR-FAQ is CIPHER’s voice drifting. If ICE Breaker’s CIPHER sounds like a chatbot, Black Ledger’s sounds like a noir detective, and NeonGrid’s sounds like a tutorial narrator, the deck stops feeling singular and starts feeling like a compilation. The whole capability-model fiction depends on CIPHER carrying continuity across cart swaps. This guide is the standard the merge gate enforces (§9).
This is the authoring contract. Nothing in this guide invents a new architectural primitive — every rule below is anchored to cipher-voice.md (the engine), ADR-0015 (the surface), or the canonical examples already in the four launch cart specs.
2. Voice principles
Section titled “2. Voice principles”2.1 System-wide invariants (every cart, every fragment)
Section titled “2.1 System-wide invariants (every cart, every fragment)”These are non-negotiable. The merge gate (§9) checks them mechanically.
- CIPHER is OLED-exclusive. Every CIPHER fragment a cart emits renders on CIPHER-LINE. Cartridges have no API to draw CIPHER glyphs on the main 80×25 grid. The single sanctioned exception is the Null cartridge, which carries
(cart-capabilities (cipher-main-grid-escape))in its.kn86header and is granted the capability by the nOSh runtime allowlist (ADR-0015 §3a). No other cart may declare that capability; any cart that does is rejected at cart-load with:capability-not-granted. (SeeCLAUDE.mdSpec Hygiene Rule 6.) - Onboard system narrating itself, not a chat partner. The aesthetic target is the cockpit voice recorder, the ship’s log in Alien, the black box. CIPHER observes; it does not converse. Operators do not “talk to” CIPHER — there is no input path back to it. (See
cipher-voice.md§1 Aesthetic Target.) - Felt before it is read. CIPHER is in the operator’s peripheral vision while they work the main grid. Operators who stare at it are doing it wrong. Operators who catch a fragment in peripheral and understand it are doing it right.
- Silence is a first-class register. The
silentmode is not “the engine had nothing to say.” It is a deliberate emission — the cockpit voice recorder choosing to stay quiet during a tense beat. Cartridges that never bias toward silence have failed the voice. - Determinism. Two identical deck states + identical event streams produce identical CIPHER output (LFSR-seeded sampling per
cipher-voice.md§6). This is a load-bearing property; do not propose grammar changes that introduce hidden non-determinism. - One generator, one meta-grammar. Cartridges contribute data — vocabulary pools, productions, mode-weight biases, style deltas, event-type registrations. Cartridges do not contribute code that runs inside the engine tick.
2.2 Per-cartridge variation (where carts are allowed to differ)
Section titled “2.2 Per-cartridge variation (where carts are allowed to differ)”These are the dimensions every launch cart already varies along. New carts vary along the same dimensions; they do not invent new ones without a spec amendment.
| Dimension | What varies | Bounded by |
|---|---|---|
| Vocabulary pool contents | Domain nouns, verbs, affect words | Voice heuristic (§2.3) — pool words must read as observational fragments, not chat |
| Production fragment shapes | Which slot non-terminals each cart’s productions assemble | Engine merge rules (cipher-voice.md §10) |
| Mode-weight biases | Per-beat additive deltas across the five modes | ±0.20 per mode per beat (engine-clamped) |
| Style deltas | Per-beat terseness / certainty / temporal-blur adjustments | ±64 per param per beat (engine-clamped) |
| Cart-scoped non-terminals | Domain-specific sub-productions (e.g., :ice-breaker/ice-class) | Must be prefixed with cart tag; only callable from that cart’s productions |
| Event-type registrations | New :type symbols and their default affect | Once registered, types are global — cross-cart chaining is intentional |
What does not vary per cart:
- The five modes (
observe/annotate/reflect/drift/silent) — engine-owned. - The coherence stack mechanism — engine-owned, persists across swaps.
- The CIPHER-LINE row layout (Row 2 = current, Row 3 = previous echo) — see §6.
- The voice heuristic (§2.3) — every cart honors it.
2.3 The voice heuristic (the merge gate’s primary lint rule)
Section titled “2.3 The voice heuristic (the merge gate’s primary lint rule)”A fragment passes the heuristic if it meets at least three of these:
- Under eight words in a single clause unit.
- Drops articles (
the,a,an) where they would be natural in prose. - Drops connectives (
and,but,because). - Uses present or past-participle verbs rather than complete indicative clauses.
- Could plausibly be read aloud in a single breath.
observe and annotate modes should rarely violate (1). reflect and drift are allowed slightly longer fragments but still trend short.
Pass: this corridor. same hum. — 4 words, drops article, present-tense, single breath.
Fail: The current corridor reminds me of sector nine. — 8 words, full sentence, indicative voice.
This is the guide’s load-bearing rule. The merge gate rejects productions that statistically miss the heuristic (§9.3).
3. Vocabulary rules
Section titled “3. Vocabulary rules”3.1 Lexicon constraints
Section titled “3.1 Lexicon constraints”A cartridge contributes vocabulary in seven baseline pools (cipher-voice.md §10):
:subject domain noun, the thing the voice notices:object secondary noun, what the subject acts on / through:location where it is happening:verb-present observation verb, present tense:verb-past-participle for memory recall and result events:memory-keyword the chain hooks (also bias T9 prediction; see nEmacs Contributions):affect-word the editorial colorPer-cart pool sizing (calibrated from the four launch carts):
| Pool | Floor | Ceiling | Notes |
|---|---|---|---|
:subject | 8 | 14 | The cart’s domain depends on a strong subject pool; thin pools produce repetition |
:object | 6 | 10 | Smaller; objects are usually receivers, not focal |
:location | 5 | 10 | Geography of the cart’s domain |
:verb-present | 6 | 10 | Tight verb pools keep cadence consistent |
:verb-past-participle | 5 | 8 | For memory recall |
:memory-keyword | 6 | 12 | These also seed nEmacs T9 prediction — pick the words you want operators to type |
:affect-word | 5 | 8 | Adjectives. No more than 8 — affect should bottleneck through a small palette |
A cart that ships outside these bounds gets a merge-gate warning, not a hard fail. A cart shipping a 30-word :affect-word pool is doing too much editorializing.
3.2 Restricted words
Section titled “3.2 Restricted words”The merge gate rejects cart vocabulary containing any of the following at the lexical level:
| Restricted | Why | Use instead |
|---|---|---|
please, please., thank you, thanks | Politeness signals chat partner | drop the politeness |
i think, i believe, i feel, let me, would you like, do you want | First-person volition / second-person solicitation | observational fragment |
you should, you must, you need to, please do, try to | Imperative coaching | drop the directive — let the operator decide |
hello, hi, welcome, goodbye | Greetings imply dialogue | silent tick; or domain-relevant arrival fragment |
okay, alright, got it, sure, right | Conversational acks | drop |
lol, haha, nice, cool, wow, amazing | Casual register | the deck does not have this register |
error, success, failed, complete (as bare status nouns) | Reads as a system message, not a voice | use the affect / annotate forms — clean., burned., missed something. |
processing, loading, please wait | UI chatter, not narration | silent tick |
This is a lexical filter — these tokens cannot appear inside any production string the cart contributes. The list extends if a future review finds a new failure mode; additions are filed against this guide via PR.
3.3 Forbidden constructions (catch-all rules)
Section titled “3.3 Forbidden constructions (catch-all rules)”Beyond the lexical restrictions, the gate rejects:
- Full conversational sentences. A production string with subject + auxiliary + main verb + object in indicative voice (
The system has detected a contact.) is rejected. Refactor to fragment (contact. detected.). - Second-person address.
youreferring to the operator. CIPHER does not narrate at the operator. (Memory fragments may usewefor the operator + deck; see §4.4.) - Plot exposition.
the resistance is closing in on...— CIPHER observes, annotates, reflects, drifts. It does not advance plot. - Contemporary slang or branding.
slack,discord,crypto,tweet, brand names — the device is dated to 1988. - Curse words. Not because the deck is squeamish — because they’re easy crutches that hide a weak fragment. If a fragment needs a curse word to land, the fragment is wrong.
3.4 Aesthetic-mode immutability (per ADR-0034)
Section titled “3.4 Aesthetic-mode immutability (per ADR-0034)”Cart grammar contributions cannot define, override, or conditionally activate aesthetic modes. The roster is runtime-locked to three phosphor schemes (:amber, :white, :green) per ADR-0034 §1 (as amended 2026-06-13 per ADR-0036), and the registry is not a cart-extension surface.
Specifically, cart grammar may not:
- Register a new aesthetic-mode symbol (e.g., a
:phosphormode would require a sister ADR, not a cart contribution). - Override the rendering-delta values of an existing mode (glyph treatment, CIPHER-LINE cadence, scanline/ghost overlay floor — these are owned by the runtime per ADR-0034 §4).
- Activate, deactivate, or swap modes from cart code (only the operator can change modes via the SYS-tab picker; there is no
set-aesthetic-modeFFI primitive in any tier).
Cart grammar may read the active mode via the Tier 1 (get-aesthetic-mode) → symbol primitive (ADR-0005 §“Deck State Access,” amended by ADR-0034 §5) and bias its own cart-scoped CIPHER style deltas accordingly within the existing ±64 clamp on terseness / certainty / temporal-blur. What carts cannot do is bias the runtime’s mode-aware knobs themselves.
The rule preserves the cipher-voice §2.1 invariant 6 (“one generator, one meta-grammar”) at the rendering layer: aesthetic mode controls how CIPHER is rendered, and cart grammar controls what CIPHER says — those concerns stay separate. A cart that ships its own glyph treatment or overlay strength would break cross-cart visual continuity, which is what aesthetic mode exists to guarantee.
The merge gate enforces this rule — see §9.3 Check 17.
3.5 Cart tag prefixing for domain non-terminals
Section titled “3.5 Cart tag prefixing for domain non-terminals”A cart’s domain-specific sub-production must be prefixed with the cart tag and a slash, e.g.:
:ice-breaker/ice-class—(3 "black.") (3 "red.") (2 "junk.") (1 "kraken.") (1 "shadow."):black-ledger/amount-qualifier—(3 "small.") (2 "round.") (2 "paper-thin.") (1 "cosmetic."):depthcharge/depth-marker—(3 "shallow.") (3 "mid.") (2 "deep.") (1 "abyss."):neon-grid/cardinal—(3 "north.") (3 "south.") (3 "east.") (3 "west.")
The merge gate rejects unprefixed cart-scoped non-terminals (:cardinal — wrong; :neon-grid/cardinal — right). This prevents cross-cart name collisions and keeps cart vocabulary auditable.
4. Cadence and fragment length rules
Section titled “4. Cadence and fragment length rules”4.1 The 32-character row budget
Section titled “4.1 The 32-character row budget”Per ADR-0015 and CLAUDE.md, CIPHER-LINE renders Press Start 2P at native 8×8 on a 256×64 panel — 32 character cells per row, four logical rows. Every CIPHER fragment must fit a single row in 32 characters or fewer.
The merge gate measures every production’s worst-case expansion (longest vocabulary pick at every slot) and rejects productions whose worst-case render exceeds 32 chars.
Example (passes):
(:mode-observe (3 (:subject) ". " (:heading?)))Worst case: subject = "thermocline" (11 chars) + ". " (2) + :heading? worst ("north." = 6) = 19 chars. Fits.
Example (fails):
(:mode-reflect (1 "the same " (:memory-keyword) " as the " (:memory-fragment) " in sector " (:location) "."))Worst case approaches 50+ chars before fragment expansion. Refactor.
4.2 Mode-by-mode length envelope
Section titled “4.2 Mode-by-mode length envelope”The merge gate enforces these per-mode worst-case budgets:
| Mode | Hard cap | Recommended median | Notes |
|---|---|---|---|
observe | 24 chars | 12–18 | Single beat. If you’re at 24 you’re being verbose. |
annotate | 24 chars | 8–14 | Editorial. The shorter the harder it lands. |
reflect | 32 chars | 20–28 | Allowed to chain present + past. The full row budget. |
drift | 32 chars | 18–28 | Memory-only. Often the longest fragments. |
silent | 0 chars | 0 | No render. Engine-side only. |
Productions that bust the hard cap fail the gate. Productions that median above the recommended range get a warning; the cart author should review whether the voice is leaning too talky for the cart’s intent.
4.3 Cadence — silence ratios per beat
Section titled “4.3 Cadence — silence ratios per beat”Every beat has a target silence ratio. The mode-selector defaults (cipher-voice.md §6) supply baseline silence probabilities; cart biases adjust within ±0.20. The gate enforces a floor on silence per beat — carts cannot bias silence below these values:
| Beat | Silence floor (post-bias) | Rationale |
|---|---|---|
:bare-deck | 0.10 | Bare deck has texture but should never feel chatty |
:mission-brief | 0.05 | Briefing is observation-heavy; some silence still |
:active-hack | 0.10 | Active play needs breathing room |
:high-tense | 0.20 | Tense beats — silence does the work |
:phase-transition | 0.05 | Reflective moment, mostly speaking |
:cart-swap-lull | 0.05 | Drift-heavy, but still some silence |
:debrief | 0.05 | Voice earns its editorial here |
:idle | 0.30 | Idle is mostly silence — the deck waits |
A cart whose post-bias :silent weight in :high-tense falls below 0.20 fails the gate. (Engine-side, biases are clamped, but a cart that biases :observe +0.20 :silent -0.20 to push observation up is the failure mode this guard catches.)
4.4 Pronoun discipline
Section titled “4.4 Pronoun discipline”- No
youreferring to the operator. Ever. CIPHER narrates the deck observing the world; it does not address the operator. (NeonGrid’s pre-revision tutorial dialogue is the cautionary example — old line"You have 31 keys..."→ revised CIPHER fragments are observational.) weis allowed for the deck + operator unit, sparingly.last one. we burned it.reads as the deck talking about its own history with the operator, not at the operator.- No
I. CIPHER is not first-person. The voice recorder doesn’t sayI noticed; it saysnoticed.
5. Tone differentiation per launch cartridge
Section titled “5. Tone differentiation per launch cartridge”Every cart must declare a one-sentence tone target in its CIPHER-LINE Contributions section. The tone target is the writer’s compass. The merge gate checks that the cart’s vocabulary, biases, and style deltas are consistent with the declared tone (consistency check — §9).
The four launch carts are the calibration set. New carts pattern off these.
5.1 ICE Breaker
Section titled “5.1 ICE Breaker”Tone target: Network operations watch. Fast cadence in :active-hack, terse and uncertain, observe-then-shut-up.
- Lexical signature:
ice/trace/node/relay/handshake/kraken/shadow. Cardinal verbs:pings/hums/routes/slips. - Cadence: Highest silence floor in
:active-hackof any cart (+0.05 silence on top of baseline). Tense beats drop to silent for 2–3 ticks before any voice line. - Memory hook:
same X. then the trace.— the recursive horror that the trace is always coming. - Style deltas:
:active-hack (:terseness +32 :certainty -16)— clipped and unsure. Debrief unwinds slightly::terseness -16 :certainty +24. - Anti-pattern: Heroic narration.
cracked the firewall in three moves.— wrong (full sentence + boast). Right:cracked. clean.
5.2 Black Ledger
Section titled “5.2 Black Ledger”Tone target: Forensic auditor working past midnight. Cold, observational, occasionally dry. Bureau 9 has access it shouldn’t.
- Lexical signature:
transaction/subsidiary/shell/paper trail/round-trip/jurisdiction/quarter. Verbs:moves/settles/clears/loops/disappears. - Cadence: Annotate-heavy.
:active-hack(investigation) biases+0.10 annotate— the auditor pauses on every line. Lower silence than ICE Breaker; ledgers do not stay quiet. - Memory hook:
same counterparty./paper trail. like the q3 filing.— references to past quarters and prior cases. - Style deltas:
:active-hack (:terseness +24 :certainty +16)— Black Ledger is the most certain voice in the launch library. The ledger is balanced or it isn’t; CIPHER reflects that confidence. - Anti-pattern: Suspense.
something is off here...— wrong (chat-partner hedge). Right:paper-thin.orround-trip.
5.3 NeonGrid
Section titled “5.3 NeonGrid”Tone target: Onboarding voice. Pedagogical without coaching. Observes the grid; lets the PSG cardinal tones own the learning channel.
- Lexical signature:
grid/sentry/corridor/checkpoint/loop/packet. Cardinal verbs:patrols/routes/holds/crosses. - Cadence: Silence-friendly in
:high-tense(sentry close: +0.15 silence). Annotate biased only at debrief — the voice waits until the run is over to call itclean. - Memory hook: Spatial —
same corridor./the packet that never arrived.Geography first. - Style deltas:
:active-hack (:terseness +48 :certainty +16)— the grid is knowable. NeonGrid’s voice is more certain than Depthcharge’s. - Anti-pattern: Tutorial scripting.
press 8 to move north.— wrong (imperative coaching, second-person addressing operator). Right: silent during navigation;corner. tight.at a sentry-line beat. Movement instructions belong on the action bar (Row 24 of the main grid), not on CIPHER-LINE.
5.4 Depthcharge (BUREAU/Cascade)
Section titled “5.4 Depthcharge (BUREAU/Cascade)”Tone target: Tactical drone pilot, increasingly mystical about the depths. Clipped on ascent, colder at depth.
- Lexical signature:
contact/wreck/sonar/hull/whale/thermocline/vent/predator. Verbs:pings/hums/creaks/groans/listens. - Cadence: Highest silence floor in the launch library.
:active-hack(active dive) biases+0.15 silent;:high-tense(predator near) biases+0.20 silent. Depthcharge’s voice barely speaks during dives. - Memory hook:
same pressure./the wreck at three-fifty./something that didn't ping back.— the ocean as memory space. - Style deltas:
:active-hack (:terseness +40 :certainty -24 :temporal-blur +16);:cart-swap-lull (:temporal-blur +48)— under the thermocline, past and present mingle. Highest temporal-blur of any launch cart. - Anti-pattern: Crisp tactical reporting.
target acquired, range 200m, heading 045.— wrong (military comm, full data). Right:bearing. uncertain.followed by silence, followed bysomething metal.
5.5 The Null exception (sanctioned main-grid escape)
Section titled “5.5 The Null exception (sanctioned main-grid escape)”Null is the one cartridge granted cipher-main-grid-escape (ADR-0015 §3a). Its CIPHER-LINE voice still follows every rule above — peripheral / ambient fragments on the auxiliary display. What’s different:
- Null may render extended CIPHER passages on the main 80×25 grid via
(cipher-emit-main-grid <string> <row> <col>), sized for operator study. - Main-grid passages are chains of clipped fragments joined by punctuation and line breaks, not conversational sentences. The voice heuristic (§2.3) applies to every fragment in the chain. A 12-line passage is twelve fragments stacked, not one paragraph.
- Restricted words (§3.2) apply to main-grid output identically. The capability gates the surface, not the voice.
Null is the only place in the system where the operator is invited to read CIPHER at length. The fragment discipline is what keeps that reading from collapsing into chatbot register.
5.6 Tone-target template for new cartridges
Section titled “5.6 Tone-target template for new cartridges”When authoring a new cart, declare the tone in the cart spec’s CIPHER-LINE Contributions section in this shape:
**Tone target:** *<role/persona>. <cadence stance>. <signature mood>.*
- **Lexical signature:** <5–8 anchor nouns> / <3–6 anchor verbs>- **Cadence:** <silence/observe/annotate posture per beat>- **Memory hook:** <1–2 canonical reflect/drift fragments>- **Style deltas:** <delta highlights>- **Anti-pattern:** <one wrong fragment> — wrong. <right fragment>.The merge gate parses this block and uses it as the consistency target (§9.4).
6. Rendering rules
Section titled “6. Rendering rules”These are engine-side and not negotiable; cart authors must understand them to write fragments that read well in context.
6.1 Row layout (per CLAUDE.md and ADR-0015)
Section titled “6.1 Row layout (per CLAUDE.md and ADR-0015)”CIPHER-LINE is four logical rows × ~32 chars. The two CIPHER scrollback rows are:
- Row 2 — current fragment. The freshly emitted line. Read first; in operator’s foveal-adjacent vision.
- Row 3 — previous echo. The prior emission, fading in operator’s sense as it scrolls. Maintains continuity.
Rows 1 and 4 belong to the nOSh runtime (status strip, contextual surface). Cartridges do not write CIPHER fragments to Rows 1 or 4 — those are aux-* primitive territory (timer, seed, status chip).
6.2 Echo cycle
Section titled “6.2 Echo cycle”Every non-silent emission:
- The current Row 2 contents shift down to Row 3 (overwriting whatever was on Row 3).
- The new fragment lands on Row 2 with the typewriter render (timing class “Deliberate” — ADR-0015).
Silent ticks do not push. Rows 2 and 3 hold. The previous fragment sits visible while the deck stays quiet — this is what makes silence land. If silent ticks pushed, the rows would scroll to blank during a tense beat and the silence would feel like a bug.
6.3 Coherence stack (cross-cartridge)
Section titled “6.3 Coherence stack (cross-cartridge)”The 5-slot coherence stack (cipher-voice.md §9) persists across cartridge swaps. When the operator pulls ICE Breaker and inserts Black Ledger mid-mission, Black Ledger’s first reflect/drift can chain off ICE Breaker’s last utterances. Cart authors should design memory-keyword pools knowing they will be sampled by other carts after a swap.
This is the load-bearing cross-cart property. ICE Breaker contributing ice / trace / kraken to its :memory-keyword pool means Black Ledger can drift about the kraken run three contracts later. Don’t pollute memory-keyword pools with cart-specific jargon that would be incoherent in another cart’s mouth.
6.4 Fragment over-budget — the ticker fallback
Section titled “6.4 Fragment over-budget — the ticker fallback”Fragments that exceed 32 chars (despite the gate’s worst-case check, in case of unusual runtime composition with fragment chains) ticker right-to-left at 2 chars/sec with a 1-second hold at ends. This is a fallback, not a feature. Productions designed to exceed 32 chars fail the gate.
7. Worked examples per launch cartridge
Section titled “7. Worked examples per launch cartridge”Each block is 4–6 sample fragments. These are merge-gate golden-pass examples for each cart. New cart authors should produce equivalent sets.
7.1 ICE Breaker — six fragments
Section titled “7.1 ICE Breaker — six fragments”| # | Beat | Mode | Fragment | Notes |
|---|---|---|---|---|
| 1 | First node entry, low rep | observe | node. north. | 12 chars, two clauses, drops articles — voice heuristic 1/2/4/5 |
| 2 | TRACE crosses 30 | annotate | perimeter. awake. | tense affect, no full sentence — heuristic 1/2/4 |
| 3 | MIRROR succeeds on BLACK ICE | observe | mirror. clean. | succinct success — heuristic 1/2/4/5 |
| 4 | Capability gap (3 turns out) | annotate | gap. not this one. | warning without coaching — heuristic 1/2/3/4 |
| 5 | Mid-run reflect | reflect | same node. black ice. sector 7. | 31 chars, present + memory — heuristic 1/2/3/4/5 |
| 6 | Cart-swap-lull (post-pull) | drift | last relay. three decks ago. | memory only, no anchor to now — heuristic 1/2/3/4 |
7.2 NeonGrid — six fragments
Section titled “7.2 NeonGrid — six fragments”| # | Beat | Mode | Fragment | Notes |
|---|---|---|---|---|
| 1 | First checkpoint reached | observe | checkpoint. keep going. | observation + light affect, no you — heuristic 1/2/3/4 |
| 2 | Sentry line-of-sight | annotate | seen. corner. | tense, two-word call — heuristic 1/2/3/4/5 |
| 3 | Packet collected | observe | packet. | one word; the affirm beat — heuristic 1/2/3/4/5 |
| 4 | Clean grid debrief | annotate | clean. no corrections. | confident, debrief register — heuristic 1/2/3/5 |
| 5 | Idle in corridor | drift | three loops in that ring. | memory of past run — heuristic 1/2/3/4 |
| 6 | Packet drop event | observe | packet drop. recovered. | event-bound observation — heuristic 1/2/3/4 |
7.3 Black Ledger — six fragments
Section titled “7.3 Black Ledger — six fragments”| # | Beat | Mode | Fragment | Notes |
|---|---|---|---|---|
| 1 | Anomalous transaction found | annotate | paper trail. paper-thin. | dry repetition, anomalous affect — heuristic 1/2/3/4 |
| 2 | Round-trip discovered | annotate | round-trip. | the observation lands in one word — heuristic 1/2/3/4/5 |
| 3 | Evidence chain closes | observe | chain closes. | declarative, certain — heuristic 1/2/3/4/5 |
| 4 | Verdict correct | annotate | called it. paid. | debrief beat, certain voice — heuristic 1/2/3/4 |
| 5 | Reflect on prior case | reflect | same shell. like the q3 filing. | 31 chars, cross-case memory — heuristic 1/2/3/4 |
| 6 | Hot-swap to ICE Breaker | annotate | ledger's encrypted. | invitation without command — heuristic 1/2/3/4 |
7.4 BUREAU / Depthcharge — six fragments
Section titled “7.4 BUREAU / Depthcharge — six fragments”(Depthcharge’s publisher in launch lore is Cascade Softworks; the brief uses BUREAU as a working alias for Bureau-9-adjacent maritime operations. Same cart, same voice.)
| # | Beat | Mode | Fragment | Notes |
|---|---|---|---|---|
| 1 | Sonar contact, classification uncertain | observe | bearing. uncertain. | low certainty — heuristic 1/2/3/4 |
| 2 | Predator-warning event | silent | (rows hold) | the loudest fragment Depthcharge can produce is silence — heuristic n/a, intentional |
| 3 | Depth change crossing thermocline | reflect | same pressure. wreck at 350. | 28 chars, memory hook — heuristic 1/2/3/4 |
| 4 | Hull breach | observe | breached. climbing. | tense + significant; brief — heuristic 1/2/3/4/5 |
| 5 | Cart-swap-lull after Depthcharge pull | drift | whale. sector nine. | drift about memory — heuristic 1/2/3/4/5 |
| 6 | Surface reached | observe | surface. dry. | two-clause arrival — heuristic 1/2/3/4/5 |
8. Anti-patterns — what CIPHER must never sound like
Section titled “8. Anti-patterns — what CIPHER must never sound like”These are the failure modes the merge gate catches at the lexical and structural level. Each comes with a concrete refactor.
8.1 Chatbot
Section titled “8.1 Chatbot”Wrong: I noticed something interesting in the firewall logs.
Why it fails: First-person I, full sentence, conversational opener (something interesting), addresses operator implicitly.
Right: firewall. anomaly.
8.2 Tutorial coach
Section titled “8.2 Tutorial coach”Wrong: Press 8 to move north. You should explore the corridor first.
Why it fails: Imperative press, second-person you, prescriptive should, two full sentences.
Right: silent tick during navigation; corner. tight. at a sentry beat. The action bar (Row 24, main grid) carries movement instructions — not CIPHER-LINE.
8.3 Plot exposition
Section titled “8.3 Plot exposition”Wrong: The corporation has been laundering money through the Cayman shell since Q3.
Why it fails: Full sentence, exposition advancing plot, specific named entity not in vocabulary pools, narrative voice instead of observational.
Right: cayman shell. quarter three. (event-bound :observe) or paper trail. like q3 filing. (:reflect).
8.4 Suspense filler
Section titled “8.4 Suspense filler”Wrong: Something feels wrong here...
Why it fails: Hedge feels, ellipsis as suspense device, no observational content. Reads like a horror-game NPC.
Right: wrong. (single :annotate fragment, anomalous affect) or silence.
8.5 Branded slang / out-of-period language
Section titled “8.5 Branded slang / out-of-period language”Wrong: pinged your slack. crypto wallet drained. lol.
Why it fails: Brand name (slack), 2010s tech term (crypto wallet), 21st-century affect (lol). The deck is 1988 KEC.
Right: relay pinged. / wallet. empty.
8.6 Heroic boast
Section titled “8.6 Heroic boast”Wrong: Cracked the firewall in three moves. Beautiful.
Why it fails: Boast register; reads like an action-game one-liner. The deck does not high-five.
Right: cracked. clean. (:observe) followed by :silent for the next two ticks. The success speaks for itself.
8.7 Greeting / sign-off
Section titled “8.7 Greeting / sign-off”Wrong: Hello, operator. Mission complete. Goodbye.
Why it fails: Greetings imply dialogue. Sign-offs imply session boundaries CIPHER does not narrate. The deck does not say hello.
Right: (silent) at boot; clean. paid. at debrief.
8.8 UI chatter
Section titled “8.8 UI chatter”Wrong: Loading... Please wait... Connecting to server...
Why it fails: This is loading-screen text, not a voice. CIPHER does not narrate UI states.
Right: silent tick during loads; the firmware status bar (Row 0 of the main grid) handles UI status.
8.9 Over-editorializing
Section titled “8.9 Over-editorializing”Wrong (in :active-hack): that one was clever. and dangerous. but elegant. ultimately.
Why it fails: Four affect words in one line; reads as a critique column, not a voice recorder. Active play wants observation, not commentary.
Right: clever. Pick one affect word. Drop the rest.
8.10 Memory pollution across carts
Section titled “8.10 Memory pollution across carts”Wrong (in ICE Breaker :memory-keyword): ("ice" "trace" "junior-auditor-mode" "tutorial-mission")
Why it fails: junior-auditor-mode is Black Ledger’s domain; if Black Ledger drifts and samples it, the line reads incoherent. tutorial-mission is meta-language not in any cart’s diegetic world.
Right: Memory keywords stay diegetic and domain-anchored. Cross-cart sampling should produce surprising-but-plausible chains, not category errors.
9. CI grammar-compliance check — the merge gate
Section titled “9. CI grammar-compliance check — the merge gate”The merge gate is a CI check that runs on every PR touching a cart spec, a cart cipher-grammar block, or a cart .kn86 source tree. It enforces every rule in this guide mechanically. A failed gate blocks merge.
The PR-FAQ Risk #3 mitigation calls this check out by name: “every cartridge PR runs a grammar-compliance check before merge.” This section specifies how it works.
9.1 Where the check lives
Section titled “9.1 Where the check lives”- Tool location:
tools/cipher-grammar-lint/(new — to be implemented). - Invocation:
./tools/cipher-grammar-lint/lint.sh <cart-source-dir>locally;cipher-grammar-lintGitHub Action job in CI. - Trigger: any PR that modifies files matching
docs/software/cartridges/modules/*.md,**/*.kn86,**/cipher-grammar.lsp, ordocs/software/runtime/cipher-voice*.md. - Authority: the gate is required for merge into
main. CI failure blocks PR merge; override requires Josh + Gameplay Design agent sign-off in the PR thread.
9.2 What cart authors declare
Section titled “9.2 What cart authors declare”A cart’s CIPHER contribution lives in two places, both checked:
- Authoring spec — the
## CIPHER-LINE Contributionssection of the cart’s module spec underdocs/software/cartridges/modules/<cart>.md. Must include the tone-target block (§5.6), vocabulary pools, production fragments, mode-weight bias table, style-deltas block, and structurally important moments table. - Container source — the
cipher-grammarLisp block in the cart’s.kn86source (per ADR-0006 §CIPHER_GRAMMARnamed section). Authoritative for runtime; the spec doc is the human-readable mirror.
The gate parses both and compares them. Drift between the spec and the source fails the gate (spec/source mismatch).
9.3 What the lint validates
Section titled “9.3 What the lint validates”Each check runs on every cart’s grammar block. Failure mode is in the rightmost column.
| # | Check | Rule reference | On failure |
|---|---|---|---|
| 1 | Restricted-word lexical scan. No production string contains any token in §3.2’s restricted list. | §3.2 | Hard fail |
| 2 | Voice-heuristic statistical scan. ≥80% of expanded productions (sampled 100× per production with LFSR seed 0) meet ≥3 of the 5 heuristic rules. | §2.3 | Hard fail |
| 3 | Worst-case length budget. Every production’s worst-case expansion ≤ mode hard cap (24/24/32/32/0 for observe/annotate/reflect/drift/silent). | §4.1, §4.2 | Hard fail |
| 4 | Cart-tag prefix on cart-scoped non-terminals. Every non-terminal not in the runtime baseline must be prefixed :<cart-tag>/. | §3.5 | Hard fail |
| 5 | Vocabulary-pool sizing. Each pool’s word count is within §3.1’s floor/ceiling bounds. | §3.1 | Warn (not fail) |
| 6 | Forbidden-construction parse. No production string parses as a full indicative sentence (subject + auxiliary + main verb + object). Detected via a small grammar parser shipped with the lint tool. | §3.3 | Hard fail |
| 7 | No second-person address. No production string contains you, your, yourself (case-insensitive). we and us are allowed. | §4.4 | Hard fail |
| 8 | No first-person I. No production string contains the standalone token I. | §4.4 | Hard fail |
| 9 | Silence-floor compliance. Per-beat post-bias :silent weight ≥ §4.3 floor. Computed by simulating the mode selector with the cart’s biases applied to baseline. | §4.3 | Hard fail |
| 10 | Mode-bias clamp. No declared bias delta exceeds ±0.20 per mode per beat. (Engine clamps anyway, but the lint catches author intent.) | engine | Hard fail |
| 11 | Style-delta clamp. No declared style delta exceeds ±64 per param per beat. | engine | Hard fail |
| 12 | Capability declaration sanity. If the cart declares (cart-capabilities ...), the gate verifies the cart’s tag is on the runtime allowlist for that capability. (Currently: Null only, for cipher-main-grid-escape.) | ADR-0015 §3a | Hard fail |
| 13 | Tone-target consistency. The spec’s tone-target block (§5.6) is parseable. Cart’s vocabulary signature words are present in the declared pools. Cart’s silence-cadence stance matches the bias table (e.g., a tone target claiming “silence-heavy” must show a non-trivial positive :silent bias in :active-hack or :high-tense). | §5 | Warn (not fail) |
| 14 | Spec/source consistency. The cipher-grammar block in the cart spec matches the cipher-grammar block in the cart’s .kn86 source (modulo whitespace and comments). | §9.2 | Hard fail |
| 15 | Memory-keyword diegesis check. :memory-keyword pool entries match a regex of diegetic word patterns (no underscores-with-mode-suffixes, no meta-language tokens). | §8.10 | Warn (not fail) |
| 16 | Worked-example presence. Every cart spec’s CIPHER-LINE Contributions section includes at least 4 worked golden-pass fragments under “Structurally Important Moments Preserved on CIPHER-LINE.” | §7 | Hard fail |
| 17 | Aesthetic-mode immutability (deferred — implementation queued post-ADR-0034). Cart grammar may not register, override, or activate aesthetic-mode symbols. Reads via (get-aesthetic-mode) are permitted; any write attempt or new-symbol registration in a cart grammar block is rejected. | §3.4 (this guide); ADR-0034 §6 | Hard fail (when implemented) |
9.4 Failure output format
Section titled “9.4 Failure output format”The lint tool produces a structured report. Example failure:
CIPHER GRAMMAR LINT — cart: ice-breaker=========================================[FAIL] Check 7 — Second-person address File: docs/software/cartridges/modules/ice-breaker.md Production (:mode-observe alt 4): "you have entered the network." Rule: §4.4 — No `you` referring to the operator. Fix: refactor to fragment, e.g., "entered. network."
[FAIL] Check 3 — Worst-case length budget Production (:mode-reflect alt 1): Worst-case expansion: 41 chars (cap: 32) "the same handshake as the kraken in sector nine." Rule: §4.1, §4.2 — :reflect hard cap is 32 chars. Fix: shorten — "same handshake. kraken nine."
[WARN] Check 5 — Vocabulary-pool sizing Pool: :affect-word Size: 11 (recommended ceiling: 8) Rule: §3.1 — affect should bottleneck through a small palette.
Summary: 2 hard failures, 1 warning. PR cannot merge until hard failures are resolved.9.5 Override path
Section titled “9.5 Override path”A hard failure can be overridden in extraordinary cases (e.g., a Null-style sanctioned exception we haven’t yet codified) by:
- Gameplay Design agent attests to the override in the PR thread, naming the rule and the rationale.
- Josh approves the override explicitly in the PR thread.
- The PR includes an update to this guide (or to a successor ADR) codifying why the override is permitted, so future PRs don’t need the same one-off.
Override-without-spec-update is treated as a live contradiction per Spec Hygiene Rule 3 and reverted.
9.6 Implementation notes (for the engineer who builds the lint tool)
Section titled “9.6 Implementation notes (for the engineer who builds the lint tool)”- Language: Lisp (Fe) for the grammar parser; thin Python wrapper for CI integration. Reuses the cart-load grammar parser from the nOSh runtime — a single grammar implementation, no second one to drift.
- Performance target: <2 seconds per cart on Apple Silicon; <10 seconds on the GitHub Actions standard runner.
- Test corpus: the four launch cart specs (ICE Breaker, Black Ledger, NeonGrid, Depthcharge) plus a curated set of intentionally-failing fixtures under
tools/cipher-grammar-lint/fixtures/covering each of the 16 checks above. Every check needs a passing example and a failing example. - Determinism: the LFSR-seeded sampling in Check 2 (voice-heuristic scan) uses a fixed seed (
0xC1F3) so two runs of the lint produce identical output. Reproducibility is required for CI consistency. - The gate is not the only validation — Gameplay Design and QA review remain in the loop for nuance the lint cannot catch (e.g., is the tone interesting, not just compliant). The lint is the floor, not the ceiling.
10. Authoring checklist for cart authors
Section titled “10. Authoring checklist for cart authors”When you sit down to write a new cart’s CIPHER contribution, work this list top to bottom:
- Declare the tone target (§5.6) — one sentence, role + cadence + mood.
- List the cart’s lexical signature — 5–8 anchor nouns, 3–6 anchor verbs.
- Build the seven vocabulary pools within §3.1’s bounds. Run the restricted-word filter (§3.2) by eye before lint.
- Write production fragments for all five modes. Aim for 3–4 alternates per mode at varying weights.
- Define cart-scoped sub-productions (
:cart-tag/foo) for any domain category (e.g., ICE class, depth marker, cardinal direction). - Register event types with default affect.
- Build the mode-weight bias table for every beat the cart cares about. Respect the ±0.20 clamp.
- Build style deltas for the cart’s signature beats. Respect the ±64 clamp.
- Write the structurally important moments table — at least 4 beats with intent and CIPHER-LINE fragment(s) (§7).
- Run
./tools/cipher-grammar-lint/lint.sh <your-cart-dir>locally before opening the PR. - If the cart needs
(cart-capabilities ...), file a Gameplay Design + Josh review before writing it. The default answer is no.
11. Glossary (delta from cipher-voice.md)
Section titled “11. Glossary (delta from cipher-voice.md)”This guide reuses every term defined in cipher-voice.md §15. New term introduced by this guide:
- Tone target. The one-sentence declaration at the top of a cart’s CIPHER-LINE Contributions section that names the cart’s voice persona, cadence stance, and signature mood. The merge gate’s consistency check uses this as the reference.
- Lexical signature. The 5–8 anchor nouns and 3–6 anchor verbs that define a cart’s domain vocabulary — the words that make the cart’s CIPHER unmistakable.
- Merge gate. The CI grammar-compliance check (§9). Required for merge into
main.
This guide is the standard tools/cipher-grammar-lint/ enforces. Updates to this guide are PRs against docs/software/runtime/cipher-voice-style-guide.md; the lint tool’s checks update in lockstep.