Skip to content

CIPHER Voice Style Guide


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

  1. 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 .kn86 header 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. (See CLAUDE.md Spec Hygiene Rule 6.)
  2. 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.)
  3. 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.
  4. Silence is a first-class register. The silent mode 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.
  5. 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.
  6. 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.

DimensionWhat variesBounded by
Vocabulary pool contentsDomain nouns, verbs, affect wordsVoice heuristic (§2.3) — pool words must read as observational fragments, not chat
Production fragment shapesWhich slot non-terminals each cart’s productions assembleEngine merge rules (cipher-voice.md §10)
Mode-weight biasesPer-beat additive deltas across the five modes±0.20 per mode per beat (engine-clamped)
Style deltasPer-beat terseness / certainty / temporal-blur adjustments±64 per param per beat (engine-clamped)
Cart-scoped non-terminalsDomain-specific sub-productions (e.g., :ice-breaker/ice-class)Must be prefixed with cart tag; only callable from that cart’s productions
Event-type registrationsNew :type symbols and their default affectOnce 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:

  1. Under eight words in a single clause unit.
  2. Drops articles (the, a, an) where they would be natural in prose.
  3. Drops connectives (and, but, because).
  4. Uses present or past-participle verbs rather than complete indicative clauses.
  5. 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).


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 color

Per-cart pool sizing (calibrated from the four launch carts):

PoolFloorCeilingNotes
:subject814The cart’s domain depends on a strong subject pool; thin pools produce repetition
:object610Smaller; objects are usually receivers, not focal
:location510Geography of the cart’s domain
:verb-present610Tight verb pools keep cadence consistent
:verb-past-participle58For memory recall
:memory-keyword612These also seed nEmacs T9 prediction — pick the words you want operators to type
:affect-word58Adjectives. 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.

The merge gate rejects cart vocabulary containing any of the following at the lexical level:

RestrictedWhyUse instead
please, please., thank you, thanksPoliteness signals chat partnerdrop the politeness
i think, i believe, i feel, let me, would you like, do you wantFirst-person volition / second-person solicitationobservational fragment
you should, you must, you need to, please do, try toImperative coachingdrop the directive — let the operator decide
hello, hi, welcome, goodbyeGreetings imply dialoguesilent tick; or domain-relevant arrival fragment
okay, alright, got it, sure, rightConversational acksdrop
lol, haha, nice, cool, wow, amazingCasual registerthe deck does not have this register
error, success, failed, complete (as bare status nouns)Reads as a system message, not a voiceuse the affect / annotate forms — clean., burned., missed something.
processing, loading, please waitUI chatter, not narrationsilent 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. you referring to the operator. CIPHER does not narrate at the operator. (Memory fragments may use we for 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 :phosphor mode 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-mode FFI 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.


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.

The merge gate enforces these per-mode worst-case budgets:

ModeHard capRecommended medianNotes
observe24 chars12–18Single beat. If you’re at 24 you’re being verbose.
annotate24 chars8–14Editorial. The shorter the harder it lands.
reflect32 chars20–28Allowed to chain present + past. The full row budget.
drift32 chars18–28Memory-only. Often the longest fragments.
silent0 chars0No 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.

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:

BeatSilence floor (post-bias)Rationale
:bare-deck0.10Bare deck has texture but should never feel chatty
:mission-brief0.05Briefing is observation-heavy; some silence still
:active-hack0.10Active play needs breathing room
:high-tense0.20Tense beats — silence does the work
:phase-transition0.05Reflective moment, mostly speaking
:cart-swap-lull0.05Drift-heavy, but still some silence
:debrief0.05Voice earns its editorial here
:idle0.30Idle 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.)

  • No you referring 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.)
  • we is 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 say I noticed; it says noticed.

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.

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-hack of 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.

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. or round-trip.

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

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 by something 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).


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

Every non-silent emission:

  1. The current Row 2 contents shift down to Row 3 (overwriting whatever was on Row 3).
  2. 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.

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.


Each block is 4–6 sample fragments. These are merge-gate golden-pass examples for each cart. New cart authors should produce equivalent sets.

#BeatModeFragmentNotes
1First node entry, low repobservenode. north.12 chars, two clauses, drops articles — voice heuristic 1/2/4/5
2TRACE crosses 30annotateperimeter. awake.tense affect, no full sentence — heuristic 1/2/4
3MIRROR succeeds on BLACK ICEobservemirror. clean.succinct success — heuristic 1/2/4/5
4Capability gap (3 turns out)annotategap. not this one.warning without coaching — heuristic 1/2/3/4
5Mid-run reflectreflectsame node. black ice. sector 7.31 chars, present + memory — heuristic 1/2/3/4/5
6Cart-swap-lull (post-pull)driftlast relay. three decks ago.memory only, no anchor to now — heuristic 1/2/3/4
#BeatModeFragmentNotes
1First checkpoint reachedobservecheckpoint. keep going.observation + light affect, no you — heuristic 1/2/3/4
2Sentry line-of-sightannotateseen. corner.tense, two-word call — heuristic 1/2/3/4/5
3Packet collectedobservepacket.one word; the affirm beat — heuristic 1/2/3/4/5
4Clean grid debriefannotateclean. no corrections.confident, debrief register — heuristic 1/2/3/5
5Idle in corridordriftthree loops in that ring.memory of past run — heuristic 1/2/3/4
6Packet drop eventobservepacket drop. recovered.event-bound observation — heuristic 1/2/3/4
#BeatModeFragmentNotes
1Anomalous transaction foundannotatepaper trail. paper-thin.dry repetition, anomalous affect — heuristic 1/2/3/4
2Round-trip discoveredannotateround-trip.the observation lands in one word — heuristic 1/2/3/4/5
3Evidence chain closesobservechain closes.declarative, certain — heuristic 1/2/3/4/5
4Verdict correctannotatecalled it. paid.debrief beat, certain voice — heuristic 1/2/3/4
5Reflect on prior casereflectsame shell. like the q3 filing.31 chars, cross-case memory — heuristic 1/2/3/4
6Hot-swap to ICE Breakerannotateledger'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.)

#BeatModeFragmentNotes
1Sonar contact, classification uncertainobservebearing. uncertain.low certainty — heuristic 1/2/3/4
2Predator-warning eventsilent(rows hold)the loudest fragment Depthcharge can produce is silence — heuristic n/a, intentional
3Depth change crossing thermoclinereflectsame pressure. wreck at 350.28 chars, memory hook — heuristic 1/2/3/4
4Hull breachobservebreached. climbing.tense + significant; brief — heuristic 1/2/3/4/5
5Cart-swap-lull after Depthcharge pulldriftwhale. sector nine.drift about memory — heuristic 1/2/3/4/5
6Surface reachedobservesurface. 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.

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.

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.

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

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.

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.

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.

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.

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.

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.

  • Tool location: tools/cipher-grammar-lint/ (new — to be implemented).
  • Invocation: ./tools/cipher-grammar-lint/lint.sh <cart-source-dir> locally; cipher-grammar-lint GitHub Action job in CI.
  • Trigger: any PR that modifies files matching docs/software/cartridges/modules/*.md, **/*.kn86, **/cipher-grammar.lsp, or docs/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.

A cart’s CIPHER contribution lives in two places, both checked:

  1. Authoring spec — the ## CIPHER-LINE Contributions section of the cart’s module spec under docs/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.
  2. Container source — the cipher-grammar Lisp block in the cart’s .kn86 source (per ADR-0006 §CIPHER_GRAMMAR named 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).

Each check runs on every cart’s grammar block. Failure mode is in the rightmost column.

#CheckRule referenceOn failure
1Restricted-word lexical scan. No production string contains any token in §3.2’s restricted list.§3.2Hard fail
2Voice-heuristic statistical scan. ≥80% of expanded productions (sampled 100× per production with LFSR seed 0) meet ≥3 of the 5 heuristic rules.§2.3Hard fail
3Worst-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.2Hard fail
4Cart-tag prefix on cart-scoped non-terminals. Every non-terminal not in the runtime baseline must be prefixed :<cart-tag>/.§3.5Hard fail
5Vocabulary-pool sizing. Each pool’s word count is within §3.1’s floor/ceiling bounds.§3.1Warn (not fail)
6Forbidden-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.3Hard fail
7No second-person address. No production string contains you, your, yourself (case-insensitive). we and us are allowed.§4.4Hard fail
8No first-person I. No production string contains the standalone token I.§4.4Hard fail
9Silence-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.3Hard fail
10Mode-bias clamp. No declared bias delta exceeds ±0.20 per mode per beat. (Engine clamps anyway, but the lint catches author intent.)engineHard fail
11Style-delta clamp. No declared style delta exceeds ±64 per param per beat.engineHard fail
12Capability 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 §3aHard fail
13Tone-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).§5Warn (not fail)
14Spec/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.2Hard fail
15Memory-keyword diegesis check. :memory-keyword pool entries match a regex of diegetic word patterns (no underscores-with-mode-suffixes, no meta-language tokens).§8.10Warn (not fail)
16Worked-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.”§7Hard fail
17Aesthetic-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 §6Hard fail (when implemented)

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.

A hard failure can be overridden in extraordinary cases (e.g., a Null-style sanctioned exception we haven’t yet codified) by:

  1. Gameplay Design agent attests to the override in the PR thread, naming the rule and the rationale.
  2. Josh approves the override explicitly in the PR thread.
  3. 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.

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.

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.