LENS_knowledge-progression-decipherment_DRAFT.md

pipelines/LENS_knowledge-progression-decipherment_DRAFT.md

Comparator lens audit — KNOWLEDGE-PROGRESSION / DECIPHERMENT

Lens id: knowledge-progression-decipherment (WAVE P1-C, contract-critical)

Title sets: Outer Wilds + Return of the Obra Dinn (knowledge-as-progression; reveal ordering; journal

information architecture; markerless discovery; deduction-as-gate; link graph; + the REALM WIDEN aspect:

per-planet ruleset / Quantum Moon as a shipped anthology of distinct-ruleset worlds) · **Heaven's Vault +

Chants of Sennaar + Tunic** (translation-as-play; inscription/language lane; never-unsolvable clues;

L2/L3 decode completionism; teaching without markers).

Read-only audit of C:\dev\humanity-forgotten (canon) and C:\dev\Humanity\Humanity (game repo).

Method law held: cited current-state per finding; positive-controlled zeros; DESIGNED-UNBUILT never

reported MISSING; reuse-first recommendations; pre-registered divergences checked against

docs/DESIGN_GAP_REGISTER.md before minting.

STATUS: DRAFT IN PROGRESS (write-early rule). Findings appended as verified.

---

SURFACE INVENTORY (verified current state — the base every finding cites)

SurfaceWhereLive state
Inscription spineregistries/T0_Inscription_Spine [ACTIVE v0.1]/Sheet1.csv98 data rows, 16 cols (spine_type, fragment_index, script_ids_referenced, trade_9_tier_gate, layer_classification, fragment_assembly_role, companion_modality, payoff_chapter)
Language/script registryregistries/T0_Language_Script_Registry [ACTIVE v0.1]/Sheet1.csv84 data rows, 19 cols (system_type, parent_script, descendant_scripts, inscription_application_class, decipherment_status, mastery_tier_threshold, layer_1_mechanic/layer_2_substrate/layer_3_anchor)
Cross-cultural link graphregistries/T0_Cross_Cultural_Link_Graph [DRAFT v0.1]/Sheet1.csv184 data rows, 22 cols (link_type, link_strength, evidence_basis, integrity_visibility, reward_class, lore_pointer, evidence_tier)
Clue lane (engine)C:\dev\Humanity\Humanity\Source\Humanity\Public\Discovery\HumanityClueSubsystem.hBUILT: 16-slot ring buffer ("field-sense"), overlay reads last 5, OnSenseUpdated pulse, FireClue, greybox seed. Explicitly NOT a journal
Clue rows (canon)build/spine_rows/*/clues.csv (79 files)10 rows total, ALL in CH_02; 78 files header-only
DT_Clue importSource/Humanity/Public/Data/ClueRow.h L6"The clues lane has no SPINE_TABLES row yet -- DT_Clue is still unimported (TODO_CANON)"
Journal worldstateregistries/T0_Worldstate_Variables [ACTIVE v0.1]/Sheet1.csv L11WS_010 journal_entries_unlocked array, default [], consumers journal_renderer, save_state_system
Journal open pointClueRow.h L12 + HumanityClueSubsystem.h L3-4journal "does not open until Ch 13" (HL_0070/HL_0096)

---

FINDINGS

KPD-1 — The journal has three authorities, no information architecture, and it opens at the slice's LAST chapter

Class: DESIGNED-UNBUILT (the spec half is genuinely absent — see the boundary note) · Priority: HIGH ·

Owner: spec-doc (T1_UI_UX_Spec) → P1/W10 UI wave · Wave: slice-critical

What the titles prove. Obra Dinn's journal *is* the game. It is not a log of what happened; it is the

deduction workspace — a fixed roster of 60 unknowns, a portrait grid, a fill-in-the-blank sentence per

person, cross-referenced back to the scene that produced the evidence, and a validation rule (three correct

at once) that converts private suspicion into public progress. Outer Wilds' Ship Log does the same job in a

different grammar: a node graph where "there is more to explore here" is a first-class state, and *rumor

edges* (what you heard about a place you have not been) are drawn distinctly from *fact edges*. Both prove

the same lesson: **when knowledge is the progression currency, the journal's information architecture IS the

progression UI, and it must be designed as a system, not authored as prose.**

Current state (cited).

"Journal voice not the healer's child = pillar violation. Path-variable texture absent = pillar violation.

Canonical beats Ch 13/38/57 missing = pillar violation" [_source/01_Tier_1_Foundation/T1_CVD_Creative_Vision_Document [ACTIVE v1.4].md L203-208].

begins … Ch 38 Azores — journal transferred … Ch 56 … Ch 57 … Ch 77 Epilogue"

[T1_Integrity_Paths_Worldstates_Master [ACTIVE v2.1].md §8.4 L380-390], plus §8.5 path-variable voice

(L392-400).

[T1_Build_Pipeline_Contracts [ACTIVE v1.0].md §1.9 L222].

and by cat (output: the H1 line and one blank). T1_Audio_Spec [DRAFT v0.1].md is likewise 2 lines. The

repo already knows: "Empty-stub state notes (labels honest, no action): T5_Grimoire_Link, … T1_Audio_Spec,

T1_UI_UX_Spec, T1_Personal_Dimension_Spec" [docs/CORPUS_SWEEP.md L278].

journal_entry_id strings,[],"journal_renderer, save_state_system"`

[registries/T0_Worldstate_Variables [ACTIVE v0.1]/Sheet1.csv L11]. The named consumer journal_renderer

has no spec and no code.

row-level journal template access, T0\_Journal\_Entry\_Template\_Registry promotes to registry. Pipeline-driven

schema principle holds — registry creation deferred until consumer demand demonstrates need"

[Pipeline Contracts §1.9 L224].

HumanityDebugHUD.h, HumanityHudReveal.h, HumanityPauseMenuWidget.h, HumanityPlayerHUDWidget.h.

The shipped discovery surface is deliberately NOT the journal: "The field-sense is a lightweight re-read of

the last N in-place SENSATIONS -- NOT a journal (HL_0070/HL_0096: the journal does not open until Ch 13)"

[C:\dev\Humanity\Humanity\Source\Humanity\Public\Discovery\HumanityClueSubsystem.h L3-4].

Positive control on the zeros. grep -rn "journal" Source/Humanity/Public/UI/*.h Source/Humanity/Public/WorldState/*.h

returns 0; the SAME command shape for FieldSense over the same files returns 10 hits (HumanityDebugHUD.h L32-33,

HumanityPlayerHUDWidget.h L42-44/69/114-117) — the search can match. Registry zero: `ls registries/ | grep -i

"journal\|grimoire" returns nothing while ls registries/ | grep -i inscription` returns

T0_Inscription_Spine [ACTIVE v0.1] — the search can match. Escaped-markdown trap avoided: the repo-wide grep

for the literal T0_Journal_Entry_Template_Registry returns zero because the CVD writes it

T0\_Journal\_Entry\_Template\_Registry; the tolerant pattern Journal.{0,3}_.{0,3}Entry finds both real

references (CVD L208, Pipeline Contracts L224). This is exactly the "a search that CANNOT match reports zero"

failure mode — logged here so the critic does not re-derive it.

Why this is slice-critical, not post-slice. THE JOSH GATE slice is PROLOGUE→CH 13 and **Ch 13 is the

journal's activation beat** (§8.4 L384; Languages §2.2 "Ch 13 South Africa … Healer's child joins, journal

initiates"). The slice therefore cannot close on its designed note without a journal surface. The

field-sense ring buffer is explicitly scoped as the pre-Ch-13 stand-in and caps at 16 entries

(RingCap = 16, HumanityClueSubsystem.h L78) — it is not a journal and was never meant to become one.

Self-refutation attempted. (a) *"DESIGNED-UNBUILT — the beats and the voice rules are specced, so this is

just build work."* Half true, and that is why the class is DESIGNED-UNBUILT rather than MISSING. But the

designed half is content (which entries exist, in whose voice, at which integrity band). The structure

half — how entries are indexed, what a player does IN the journal, whether entries carry back-links to their

evidence, whether an entry can be in a partial/unknown state — has one designated home and that home is an

empty file. Building from §8.4 alone yields a scrolling text log, which is the default the two comparator

titles specifically beat. (b) *"The registry deferral is a deliberate pipeline rule, so nothing is wrong."*

The rule's own trigger condition has now fired: journal_renderer is a declared consumer in a live ACTIVE

registry and Ch 13 is in the slice. The deferral was correct in Phase 6; it is stale now. (c) *"UI is a

post-5090 wave."* The information architecture is a DESIGN artifact, not an art artifact — it costs a spec

section, not GPU hours, and it constrains what the Ch 13 spine entry can even ask for.

Reuse-first recommendation. Do not mint a journal system. Three moves on existing homes:

1. Author T1_UI_UX_Spec §1 Journal Information Architecture into the existing empty ACTIVE-routed stub

(Pipeline Contracts §1.9 already points display there — no new authority is created). It needs exactly

four things the comparator titles isolate: an entry index axis (chapter × thread — both already exist

as T0_Chapter_Index and the 22-thread roster), an entry state enum (heard-of / witnessed / connected

— the Outer Wilds rumor-vs-fact distinction, which our evidence_tier column already gestures at), a

back-link from every entry to the clue/link row that produced it (ClueRow.clue_id and

Cross_Cultural_Link_Graph.link_id are both stable keys today), and a "more here" flag per node.

2. Trip the Pipeline-Contracts §1.9 promotion clause and stand T0_Journal_Entry_Template_Registry up from

the columns §8.4/§8.5 already imply (beat_id, chapter, trigger_type, path_variant, voice_register,

source_row_ref). This is a schema-data commit, not a canon ruling.

3. In the engine, extend the existing UHumanityClueSubsystem rather than writing a second lane: it

already owns FireClue / fired-set / the OnSenseUpdated pulse. A journal is that map without the ring

cap plus the state enum. HumanityPlayerHUDWidget already hosts a held-key overlay pattern to copy.

Boundary stated explicitly: the ENTRY CONTENT is DESIGNED-UNBUILT; the ENTRY ARCHITECTURE is genuinely

absent (empty file), and that is what this finding asks for.

---

KPD-2 — The link action has a reward table but no WRONG-ANSWER design: Pillar 5 degenerates to pairwise brute force

Class: WEAKER (the ratified mechanic is under-specified at its load-bearing joint) · Priority: HIGH ·

Owner: spec-doc (CVD Pillar 5 is locked; this lands in the Q3.8 build spec) · Wave: pre-Q3.8-build

What the titles prove. Obra Dinn lets the player be wrong — that is the entire design. You may assign any

name to any corpse at any time, and the game says nothing. Progress is granted only when THREE fates are

simultaneously correct, and then all three lock at once. That single rule does three jobs: it permits

hypothesis (the player can hold a guess without penalty), it forbids brute force (a 60×60 space where only

triples pay cannot be enumerated), and it produces the game's signature feeling — the triple-chime that

converts private suspicion into certainty. Outer Wilds solves the same problem the opposite way: the player

can never be wrong because the Ship Log records only observed facts, and the *deduction* happens in the

player's head, gated by physical access. **Both prove that a knowledge mechanic is defined by what happens on

a WRONG attempt, not by what it pays on a right one.**

Current state (cited). Pillar 5 is locked and explicit about the verb: "Encountering related material in

another culture enables a *link* action. Linking earns lore reward + mechanical reward (cross-cultural weapon

abilities, school technique hybrids, intuition tier gains). Scholarly basis required per link"

[T1_CVD_Creative_Vision_Document [ACTIVE v1.4].md L196, Pillar 5]. The build spec is queued and named:

"Q3.8 | Grimoire / cross-cultural link graph + 22-thread system | BUILD-NOW | `GrimoireGraph {nodes on

discovery, link-action requiring a scholarly-basis ref, reward on valid link} over Cross_Cultural_Link_Graph`

(184 edges) + Thread_Grid(664)/Thread_Registry(22). Pillar 5, the 'highest-leverage innovation.'"

[docs/PRE_5090_BUILD_PLAN.md L1795]; the slice stub is scoped at

docs/PRE_5090_BUILD_PLAN_VOL2.md L727 (U11.19).

The gap, precisely. Every clause in that spec describes the *success* path — "reward on valid link." No

artifact in either repo says what happens when the player proposes a link that is not an edge in the graph.

Positive-controlled: a case-insensitive Grep over docs/ for `invalid link|wrong link|failed link|link

attempt|incorrect link|link fail returns No matches found; the same tool, same corpus, for link.action`

returns 6 hits (PRE_5090 L1795, VOL2 L727, DECISION_DOSSIER L171/173/190/769) — the search can match. So the

zero is real.

Why it is decision-grade rather than an implementation detail. With a free, penalty-free, unbounded link

action over a graph of 184 canonical edges, the dominant player strategy is enumeration: select every node

pair in the Grimoire until something pays. That strategy is *available today* on the spec as written, and it

would silently delete Pillar 5's stated purpose ("the thesis becomes gameplay loop") — the player would be

farming a UI, not recognising a pattern. This is the exact failure Obra Dinn's confirm-in-threes rule exists

to prevent.

Interaction with ruled doctrine (checked, not assumed). A punishment-on-wrong-guess design would collide

with the natural-voice ruling — "puzzles too difficult or time-consuming must NEVER gate progression"

[docs/NATURAL_VOICE_DOCTRINE.md L8, §4 L41-46] — and with the no-dead-end canon. So the fix must bound

brute force WITHOUT punishing. Obra Dinn's rule does exactly that: no penalty, but no partial payout either.

This finding is therefore compatible with the ruling, not a re-litigation of it.

Reuse-first recommendation. Adopt a confirmation-quorum rule on the existing registry columns; add no

new system and no new penalty.

weaving-progression, 29 parallel-independent, 22 sets-up, 14 continuity, 13 catalog-convergence, 12

reception-transmission, 12 knowledge-transmission, 9 catalog-membership …). Group edges into **convergence

sets** by link_type + thread, and pay the mechanical reward when the player has proposed the set's

minimum quorum correctly (LINK_0001's own note already imagines this: "the fifteen-parallel

catalog-convergence at Ch 38 Azores (LINK_0014) where independent vril-parallel terms are recognized as one

phenomenon — an intuition-tier gate the player is being set up to trip"

[registries/T0_Cross_Cultural_Link_Graph [DRAFT v0.1]/Sheet1.csv LINK_0001 lore_pointer]).

from KPD-1 rather than being rejected with a buzzer. That is the no-punishment / no-brute-force pair.

demand the player has ACQUIRED the citing source-node before the proposal is even offerable, which bounds

the pair space by knowledge rather than by penalty.

---

KPD-3 — 122 of 184 Grimoire edges carry no reward, and 16 already fail Pillar 5's own executable test — with no gate watching

Class: WEAKER (live registry data below the pillar's own stated bar) · Priority: HIGH ·

Owner: schema-data (registry apply) + QA loop (a gate) · Wave: pre-Q3.8-build

What the titles prove. Obra Dinn ships 60 fates and every single one is solvable from evidence placed in

the world — the completeness of the evidence set is the product. A knowledge game with a 66%-empty reward

table is not a knowledge game with some TODOs; it is a loop that pays out one time in three.

Current state (cited, computed from the live CSV). registries/T0_Cross_Cultural_Link_Graph [DRAFT v0.1]/Sheet1.csv,

184 data rows:

8, LORE 7, SCHOOL_TECHNIQUE 5, WEAPON_ABILITY 1. The blanks are scattered across the id range

(LINK_0003, 0004, 0005, 0007, 0008 … 0144, 0145, 0152, 0155, 0165), so this is a partial apply, not an

un-processed tail append.

blank on 10.

evidence_tier != primary** (LINK_0001, 0002, 0006, 0009, 0010, 0011, 0012, 0013, 0030, 0039, …), and

all 16 carry a MECHANICAL reward class, not LORE.

Why the 16 matter. Pillar 5's executable test is written as a violation condition, not a warning:

"Link-action without scholarly basis = pillar violation. **Cross-cultural reward without primary-source

documentation = pillar violation.**" [CVD L197]. Those 16 rows are cross-cultural mechanical rewards with no

primary-source documentation. On the pillar's own wording they are violations *today*.

Positive control / no-gate claim. harness/gates_config.json declares 30 gates (stress, fidelity,

scan, topography, layer_register, lint, anchors, graph, no_dead_end, boss_axes, spine_graph, lifecycle,

reveal_discipline, registry_extensions, index_freshness, store_integrity, region_pages, ws_value_form,

slice_coherence, seed_housing, build_readiness, entity_taxonomy, care_scope, grand_sage_silence,

weave_lifecycle, build_space, rarity_firewall, counter_class_coverage, ally_build, factory_contract). None

targets the link graph's reward/primary-source coverage: check_source_anchors.py proves [SRC: …] anchors

*resolve* (its docstring: "proves each anchor resolves, deterministically"), not that a reward row has a

primary source; check_weave_lifecycle.py is scoped to story_seed_tags on T0_Source_Material_Registry

and is WARN-tier by design. The gate list is enumerated from the config itself (30 names read

programmatically), so this is not a grep that could have missed a gate.

Reuse-first recommendation. One new gate file, zero new systems, modelled on the two that already exist

in this exact shape:

FAIL on any row where reward_class is a mechanical class and primary_source is blank and `evidence_tier

!= primary (today: 16); WARN-tier count on reward_class` blanks (today: 122) so the coverage trend is on

the scorecard the way weave_lifecycle surfaces its blind-tag population. Copy check_weave_lifecycle.py's

self-testing-classifier pattern so the ruler itself has teeth.

L534-547 ratified Option A — "Every link earns LORE … a deterministic rule maps the link_type/thread domain

to the mechanical class." The rule exists and the apply is only 34% landed. This is a deterministic-transform

commit (the proven O-1 method), not an authoring wave.

Contested note for the director. I did not verify WHY the Option-A apply stopped at 62 rows; it may have

been deliberately scoped to the rows whose mechanical class was unambiguous, with the ambiguous remainder

intentionally left for Josh per that dossier's own flag-the-ambiguous clause. If so the correct verdict on

the 122 softens to DESIGNED-UNBUILT and only the 16-row exposure stands as WEAKER. Flagging rather than

guessing.

---

KPD-4 — The clue lane is built and empty: 10 authored clues exist, all in Ch 2, across a 79-node arc

Class: DESIGNED-UNBUILT (the lane, the schema, the validator and the runtime all exist; the content is

1/79 authored) · Priority: HIGH · Owner: P5-factory (per-chapter authoring) · Wave: slice

What the titles prove. Outer Wilds' whole map is clue density — every location holds text that changes

what another location means, and the game is unplayable at low density because the player has nothing to

connect. Chants of Sennaar likewise cannot function below a threshold of glyph occurrences per chapter: you

need repeated, varied encounters with the same sign before a hypothesis is even formable. **Clue density is

not polish; it is the minimum viable substrate of a knowledge loop.**

Current state (cited). The lane is real and validated:

and README.md.**

R3.1): authored discovery data emitted as a pass-through table. A clue with no legal in-world source is

REJECTED at emit time ('how would they have gotten a clue?' is enforced here)" with hard sys.exit on

illegal source_kind, illegal status, or a missing clue_id/player_text/src.

by iterating all 79 with csv.DictReader (not by grep). CH_03, CH_09, CH_13 are header-only; sample of a

live row: `CLUE_CH02_GA,guardian_withdraw,observed_behavior,CH02_B03,…,"The two guardians move to one

rhythm. Their strikes fall only when it breaks."`

the import is still pending: "The clues lane has no SPINE_TABLES row yet -- DT_Clue is still unimported

(TODO_CANON)" [Source/Humanity/Public/Data/ClueRow.h L6].

Why DESIGNED-UNBUILT and not MISSING. Everything except the rows exists — schema, reject-gate, emitter,

subsystem, HUD overlay, greybox seed. This is an authoring backlog on a working lane, and the wave rule

forbids calling that MISSING.

The lens's actual contribution. Not "author more clues" (the factory knows). It is that **the clue schema

has no chain-completeness concept**, and a knowledge loop needs one. CLUE_FIELDS are `chapter_id, clue_id,

chain, source_kind, beat_scope, trigger_context, player_text, status, srcchain` groups clues

(guardian_withdraw), but nothing declares *how many members a chain needs before it is solvable*, and

nothing declares *which puzzle/gate the chain answers*. The natural-voice ruling requires exactly that

property to be testable: "The QA loop tests solvability: a puzzle station that cannot be completed from its

own clues within a sane attempt budget is a defect" [docs/NATURAL_VOICE_DOCTRINE.md L38-39] and "the clue

chains OR together" (L36). With no answers_gate / chain_min columns, that test cannot be mechanised — a

QA agent can only judge it by playing, and the JOSH GATE makes the QA loop the only player.

Reuse-first recommendation. Two columns on the existing CLUE_FIELDS list (a one-line change in

extract_spine_rows.py plus the same two in FClueRow), not a new registry:

states in prose).

Then the solvability check becomes deterministic and joins the 30-gate suite: for every gate with a

puzzle/clue-routed resolution, at least one chain with `count(chain members reachable in-chapter) >=

chain_min must exist. That is the same shape as the existing check_no_dead_end.py` gate, which is why no new

machinery is needed.

AMENDMENT after reading the lane's own README (self-correction, kept visible for the critic). The

sufficiency rule IS already declared: "Clues in one chain OR together: any one earns the read, none gates —

clue = LEGIBILITY, NEVER a gate" [docs/spine/clues/README.md], so chain_min is doctrinally always 1 and my

first draft of this recommendation was wrong. The chain value also already names the read it makes legible.

What survives is narrower and still real: there is no coverage assertion that every chapter's

puzzle-routed / clue-routed reads HAVE a chain. The obligation is on the books but deliberately unarmed —

`FR-037 | canon-author | all | PARTIAL | Author this chapter's discovery clue rows per encounter from the

legal-source enum — a clue is legibility, never a gate. | path:build/spine_rows/CH_*/clues.csv | NONE(the

clue surface has no registry home until rank 29 re-homes it into DT_Clue) [docs/FACTORY_CONTRACT.md` L151].

So the honest verdict is DESIGNED-UNBUILT with a declared-not-armed tooth, and the reuse-first ask is

just: when rank 29 re-homes DT_Clue, arm FR-037 with a per-chapter presence count rather than leaving it

NONE. Drop the chain_min column; keep only the answers pointer if the objective-id join is wanted.

---

KPD-5 — The slice's flagship mystery is a 10-chapter clue chain, and the only shipped surface that could hold it is a 16-slot ring buffer

Class: WEAKER (a BUILT design decision that cannot carry the authored content) · Priority: HIGH ·

Owner: W10 display + WS-C runtime clue-state · Wave: slice

What the titles prove. Obra Dinn's memories are permanently re-enterable; Outer Wilds' Ship Log never

forgets and never scrolls off. Both are knowledge games and both refuse to let evidence expire, because the

Ch-N-recontextualises-Ch-3 move is the whole payoff and it requires the Ch-3 evidence to still be in the

player's hands. A knowledge game's evidence store must be append-only for the life of the arc.

Current state (cited). The mystery is fully authored and it spans the whole slice:

protagonist sleeps. The protagonist does not know who wrote them. **The game's first extended mystery about

a human character.** … The arc is the chapter-level backdrop for every Ch 04-12 quest where the protagonist

finds something they did not place. The Ch 13 revelation retroactively contextualizes every note."

[_source/03_Tier_3_Characters/T3_Core_Characters [ACTIVE v1.0].md §3.3, L188-193].

[journal:healers_child_unsigned_marks]out: {… ws.journal_status:

+healers_child_unsigned_record_begun …} [docs/spine/CH_03.md` L160-161]; the watcher is re-asserted at

CH_11 L201/L283 and CH_12 L217/L286.

"the held-key HUD overlay lists the last 5" [HumanityClueSubsystem.h L3-4, L78].

Source/Humanity/Private/Discovery/HumanityClueSubsystem.cpp returns only CluePlayerTextById.Reset() (L22)

and Out.Reset() (L92); grep -rn "clue" Source/Humanity/Public/WorldState/*.h returns nothing (control:

the same grep for FieldSense over the UI headers returns 10 hits). The owner is named and queued —

"WS-C runtime clue-state + W10 (display)" [docs/PRE_5090_BUILD_PLAN_VOL2.md L1553] — so the

persistence half is DESIGNED-UNBUILT, not missing.

The design-level defect (this is the part that is not just build backlog). A 16-slot ring with a 5-line

window is the correct shape for a *recent-sensations* affordance and the wrong shape for the *only* evidence

store the player has for Ch 3-12. Ten chapters of unsigned notes cannot be held in 16 slots alongside every

other chapter sensation, and even if they could, a five-line newest-first window cannot present a

chronological mystery. The consequence is exact: at Ch 13 the game says "this recontextualises every note"

to a player who can see the last five things that happened. The reveal lands on nothing.

Reuse-first recommendation. Do not build a second lane; do the two moves already implied by the plan, in

the slice rather than after it.

1. Give the ring an exempt class. FireClue already keeps a FiredClues TSet that is uncapped — the

fired set, not the ring, is the natural evidence store. Add a pinned bit (or reuse chain) so

chain-bearing clues render from the fired set rather than the ring; the ring stays exactly as-is for

ambient sensations. That is a small change inside the existing subsystem and it costs no new UI until the

journal lands.

2. Pull the WS-C clue-state persistence forward to slice scope, since the slice's own closing beat depends on

it. It is already the declared owner (VOL2 L1553).

3. When KPD-1's journal architecture lands, the healers_child_unsigned_marks chain is its **first and best

fixture** — a ten-entry chronological chain whose entries flip from unattributed to attributed at

Ch 13. That single chain exercises the entry-state enum, the back-link and the retroactive-update path in

one authored artifact, which is why it should drive the spec rather than follow it.

---

KPD-6 — Retroactive legibility is canon in four places and has no surfacing mechanic anywhere

Class: MISSING (as a mechanic; the canon promises are ratified, the delivery vehicle is absent from

every plan I could find) · Priority: MEDIUM-HIGH · Owner: spec-doc (T1_UI_UX_Spec §journal) + Q3.7 ·

Wave: post-slice design, pre-Q3.7 build

What the titles prove. Heaven's Vault's dictionary improves, and the game's central pleasure is going

back to a sentence you mistranslated in hour two and reading it correctly in hour twenty — so the game keeps

every inscription you have ever seen in a re-openable list. Outer Wilds marks a node "there is more to

explore here" precisely so knowledge gained elsewhere sends you back with a target. **In a mastery-gated

reading system, the mechanic that matters is the one that tells you what just became readable.**

Current state (cited). We have promised retroactive legibility at least four times, at increasing scale:

(ADEPTUS_MINOR 22, PHILOSOPHUS 16, ADEPTUS_EXEMPTUS 16, PRACTICUS 13, ADEPTUS_MAJOR 12, THEORICUS 7) and

payoff_chapter, with spine_type = HIDDEN_INSCRIPTION_77 ×77 [live CSV]. Row 2 is the pattern:

INSC_77H_CH01_FRAGMENT, chapter 1.0, payoff_chapter 76.0.

reading**" and "Ch 65 … inscriptions encountered on apparatus and Vimana facility surfaces at this revisit

have grown clearer since Ch 58" [T1_Languages_and_Script_Master [ACTIVE v2.1].md §2.2 L79, L89].

readable**, unlocking hidden historical layers in every site" [ibid. §7.3 Tier 9 Magister Templi, L261; also

§5.1 L199].

68 chapters of human-world inscriptional context" [§6.2/§6.4/§6.5].

The zero, positive-controlled. A case-insensitive Grep over the whole repo for `now readable|becomes

readable|re-read|reread|retroactive|grown clearer|revisit.{0,30}inscription` returns 25 hits — and every one

is either (a) a canon STATEMENT of the promise (the four above), (b) the T99 spine-authoring process's own

"retroactive alignment at Final Consolidation" (an authoring workflow, not a player mechanic), or (c) the

reveal-discipline rule forbidding framing that "would retroactively make sense only after the reveal"

[T3_Core_Characters L855]. Zero hits describe a player-facing surfacing of newly-readable content. The

search demonstrably matches the canon text, so the zero is on the mechanic, not on the search. I also

checked the queued build spec: `Q3.7 | Language-decode / inscription system | BUILD-NOW | InscriptionDecoder:

puzzle per script, auto-decode speed scaling with Trade-9 tier, unlock payload on solve …`

[docs/PRE_5090_BUILD_PLAN.md L1794] — it covers decode-on-encounter, not decode-what-you-already-passed.

Why MISSING rather than DESIGNED-UNBUILT. DESIGNED-UNBUILT requires a spec/ruling/registry row for the

thing itself. There are rows for *which fragment* and *at what tier*, and there is a build item for *the

decoder*. There is nothing anywhere — canon, plan, registry or code — that specifies how the player learns a

previously-illegible thing has become legible, or how they read it without physically returning. The

Magister Templi promise ("every palimpsest in every visited location") is unsatisfiable by return-travel

across 79 nodes and therefore *requires* a remote surface that no document names.

Reuse-first recommendation. This is one field and one screen, both on homes that KPD-1 is already

standing up.

journal entry in state seen-illegible; when player_trade9_tier >= trade_9_tier_gate the entry flips to

readable and raises the existing OnSenseUpdated-style pulse. That is exactly the Outer Wilds "more here"

flag, built from columns that already exist (trade_9_tier_gate is populated on all 98 rows — 0 blanks in

the tier histogram above).

re-read (Ch 41 /Xam, Ch 65 Antarctica) so the world-side return has a target row; everything else reads

remotely.

threshold set to Tier 9, applied across the accumulated entry set. Cap it honestly in the spec — "every

visited location" means every location with an inscription-spine row, which is a bounded 98.

---

KPD-7 — Decipherment is modelled entirely as world-truth and character-tier; the player's own (wrong) model has no state

Class: WEAKER (a ratified system missing the axis its own comparator genre is built on) ·

Priority: MEDIUM · Owner: spec-doc (Q3.7 InscriptionDecoder design) · Wave: pre-Q3.7 build

What the titles prove. Chants of Sennaar's notebook holds the PLAYER's guess for each glyph, and the game

never marks a single guess right or wrong — it validates a whole page at once, so a wrong hypothesis is a

legal, persistent, revisable state you live inside for hours. Heaven's Vault offers four candidate readings,

lets you commit to one, and lets later evidence contradict you; you can go back and change your past

translations, and the game tracks your accuracy silently. Tunic goes further: the manual is written in a

script you never learn, and the *player* — not the character — assembles the mechanics from diagrams.

In all three, the object the game simulates is the player's model, not the world's truth.

Current state (cited). Our model is world-truth plus character tier, both excellently populated:

ORAL_NOT_SCRIPT 13, PHONETIC_ONLY_NO_SEMANTICS 9, FULLY_UNDECIPHERED 3, FAIRY_REALM_NATIVE 1,

FULLY_UNDECIPHERED_GENEALOGICALLY 1, SONGLINE_NOT_SCRIPT 1 [live

T0_Language_Script_Registry [ACTIVE v0.1]/Sheet1.csv].

ADEPTUS_MINOR 11, ZELATOR 6, PHILOSOPHUS 6, ADEPTUS_EXEMPTUS 5 [ibid.].

(protagonist) and scholarship (healer's child) [T1_Languages_and_Script_Master §2.1 L19-27].

approximates meaning via bilingual inscription cross-reference, material-culture context, and parallel-text

comparison without a decoder-ring" and "Intelligence + Intuition + Humility determine productive

engagement at Inscription Limit encounters" [§3.1, §3.4 L129-131]. This is the right idea and it is a stat

check, not a workspace — there is no artifact where the player's approximation is recorded.

What this costs. CVD Pillar 7's own gameplay product is "Player target: finish arc knowing real fragments

of ~15 documented languages through gameplay" [CVD L213]. A player learns a fragment by forming and testing a

hypothesis; if the character auto-decodes at tier and the player only reads the result, the pillar's stated

player-outcome is not produced by the mechanic that is supposed to produce it. The gap is not decorative — it

is the difference between Pillar 7 shipping and Pillar 7 being a lore delivery pipe.

Divergence check (done, not skipped). Auto-decode is deliberate: "Inscription trade tier gates automatic

decoding depth (higher tier = faster auto-decode; puzzle engagement always available)" [CVD L213]. So the

CVD already reserves the player-engagement half — the clause "puzzle engagement always available" is a

ratified promise with, positive-controlled, exactly ONE downstream implementation reference in the entire

repo: Q3.7's "puzzle per script" [PRE_5090 L1794]. (Grep for `auto-decode|auto_decode|automatic decoding|

puzzle engagement` across both repos returns 2 hits: CVD L213 and PRE_5090 L1794.) This finding is therefore

*inside* the ruling, filling its unimplemented half — not a proposal to make decoding mandatory.

Reuse-first recommendation. Give the optional puzzle a hypothesis state rather than a pass/fail, on

existing columns:

translation, free text or a pick-from-candidates, editable at any time, never validated on entry. This is

Chants of Sennaar's notebook and Heaven's Vault's revisable commit in one field.

fragment_index + fragment_assembly_role + the 77-fragment spine whose "complete text, assembled from

all 77 fragments, is the House of Velheim's most ancient document" [§5 L191]. Assembly IS Obra Dinn's

confirm-in-threes: a page of the document resolves when its fragments are consistent, and a wrong gloss

simply leaves the page unresolved.

and Harappan (Ch 16) the canon *guarantees* the player's model can never be confirmed, and §3.4's Humility

stat is already the designed response. A recorded, never-validated player_gloss at exactly those rows is

the cognitive-dissonance-productive experience §3.1 asks for, delivered as a mechanic instead of a stat

roll. inscription_limit_zone = True on 10 of 84 rows is the ready-made target list.

---

KPD-8 — The natural-voice solvability test is a SEED rider with no arming data, and it is the QA loop's only knowledge tooth

Class: DESIGNED-UNBUILT (declared-not-armed, honestly recorded) · Priority: MEDIUM-HIGH ·

Owner: QA loop + schema-data · Wave: slice (the QA loop is the only player)

What the titles prove. Obra Dinn is verifiable by construction: every fate is derivable from placed

evidence, and the designer can enumerate the derivation. Outer Wilds' Ship Log doubles as the designers'

own completeness audit. **A knowledge game needs a machine-readable derivation claim or it cannot be QA'd at

all — and under THE JOSH GATE, the QA loop is the only player.**

Current state (cited). Josh ruled the test into existence: "The QA loop tests solvability: a puzzle

station that cannot be completed from its own clues within a sane attempt budget is a defect"

[docs/NATURAL_VOICE_DOCTRINE.md §3 L38-39]. It is on the factory contract as FR-026 — obligation "Make

every progression-path puzzle in this chapter solvable by an attentive player in reasonable time from

in-world information — mysterious is allowed, unfun is not", lane canon-author, scope all, **status

SEED**, ruling_src docs/NATURAL_VOICE_DOCTRINE.md#3-clues-mysterious-is-allowed-unfun-is-not

[docs/factory_contract.json]. And SEED means advisory: "34 SEED riders are ADVISORY by design: they surface

in every checklist and never fail this gate" [harness/factory_contract_scorecard.md, gate 30 PASS with

0 FAIL / 7 WARN].

Its two sibling natural-voice lenses are already WARNing for the analogous reason: "(R2) FR-024: critic lens

'does a person say this' appears on NO declared critic surface — a lens that lives only in a doctrine file is

run by whichever agent happens to know it" [ibid.]. FR-026 does not even get that WARN, because it has no

declared critic surface to be absent from.

Why the lens raises it. The other 29 gates protect against LEAKS — check_reveal_discipline.py is

excellent at it, codifying three leak classes with a hard/advisory split and an explicit note that

\bCorr\b does not match Vellmark-CROFT [gate docstring L1-30], and check_grand_sage_silence.py ships

alongside. We have a rigorous negative theory of knowledge (nothing arrives early) and no positive theory

(everything intended is reachable). Those are different properties and only one is armed.

Reuse-first recommendation. Arm FR-026 from data the lane already emits, not from a new authoring pass.

FR-037's tooth is NONE today), the same commit can promote FR-026 from SEED to a real check: for every

beat whose resolution is puzzle- or clue-routed, assert ≥1 active clue row in the chapter whose chain

matches. That is a presence assertion, not a solvability proof, and it is exactly what catches the actual

failure mode (a puzzle authored with no clue at all).

the same critic surface FR-024/025 are being wired to (.claude/skills/normalize-doc/SKILL.md), so the

gate's existing R3 rule ("the consumption point exists but does not pick this rider up") starts watching it.

transfer to game #2; the chains are CANON.

---

KPD-9 — REALM WIDEN: the ruleset schema teaches its laws but has no state for a law the player has FIGURED OUT

Class: DESIGNED-UNBUILT (schema is proposal-tier and strong; this is one field to add before it mints) ·

Priority: MEDIUM (HIGH on timing — it must land before the Wave-2 schema mint) · Owner: realm program

(Wave 2 schema mint) · Wave: realm doctrine wave, pre-mint

What Outer Wilds proves. The Quantum Moon is the purest knowledge-gate ever shipped: the rule (quantum

objects move only when unobserved) is discoverable in three separate places, and once the player *understands*

it, six previously-impossible traversals become trivial — with no item, no unlock flag, no stat. The

per-planet rulesets exist so that each world teaches one law, and the anthology structure means the player

carries laws between worlds. The unit of progression is a law the player has internalised.

Current state (cited). The realm program has already designed most of this, and better than I expected:

grounds: "Extending T0_Environment_Grammar_Registry was considered and rejected — that registry is

PER-FEATURE (a lava vent, a waterfall) and this is PER-WORLD" [docs/proposals/REALM_DESIGN_PROGRAM.md §2.3].

— this is the "a search that cannot match reports zero" discipline applied to a design schema, and it is

the strongest thing I read in either repo this wave [§2.3].

**`EXPLOIT, how a clever player turns the law into a tool rather than only suffering it, which is what keeps

the realms from reading as corridors of rules`** [§2.3]. That IS the Quantum Moon insight, already ratified.

mastery gate) [§2.3] — both correct and both consistent with the natural-voice non-gating ruling.

T0_Inscription_Spine does). Proposal-tier by the doc's own words: "Proposal-tier concept, not a mint."

The one gap. taught_at records where the game teaches the law. EXPLOIT records what a clever player

can do with it. Nothing records whether the player has learned it — there is no player-knowledge state, so

the exploit can only be authored as an always-available affordance. That is the difference between "the realm

has a clever trick in it" and "the realm rewards understanding," and only the second is what the comparator

title is famous for. It also interacts with the *anthology escalation* aspect: without a learned-laws set, a

later realm cannot build on a law taught by an earlier one, and the Realm Road cannot compound.

Divergence guard checked. A knowledge-gate on the critical path would collide with the natural-voice

ruling (hard puzzles never gate progression) — so this must NOT be proposed for progression. But that ruling

also names exactly where such content belongs: "Genuinely hard / time-consuming / obscure puzzles and

challenges route to: the completionist tier …, Layer-3 connection content, the strictly-no-kill path's special

rewards, and easter-egg achievements. They are PRIZES for the players who want them — never walls"

[docs/NATURAL_VOICE_DOCTRINE.md §4 L41-46]. A Quantum-Moon-class knowledge lock is precisely a prize. The

recommendation is therefore doctrine-compliant and does not re-litigate anything.

Reuse-first recommendation (must land before the Wave-2 mint, per the charter's own freeze rule).

are already implied by taught_at; the third is the new one and it is the anthology hinge.

EXPLOIT column can carry a prize-tier lock without any risk of a gating law. This mirrors the taboo

sub-row's existing layer (L1 action, L2 completionist, L3 connection) field — same vocabulary, no new

enum to ratify.

realms; declare that a reprise may assume law_state = exploited on its antecedent. That is the anthology

escalation aspect (R-A13) landing on a field that exists.

---

KPD-10 — The 22-thread ladder tracks what the STORY has done, never what the PLAYER can conclude

Class: WEAKER (a strong, fully-populated ladder missing the axis a knowledge game needs) ·

Priority: MEDIUM · Owner: schema-data + QA loop · Wave: post-slice, pairs with KPD-8

What the titles prove. Obra Dinn's designers can state, for any point in the game, exactly which fates are

already derivable — that is how they order the ship's memories so difficulty ramps. Outer Wilds' Ship Log

graph *is* that statement, made visible. Reveal ordering in a knowledge game is a claim about the PLAYER's

reachable conclusions, and it has to be written down to be checked.

Current state (cited). Our ladder is real, populated, and good:

columns `thread_id, chapter_id, progression_stage, content_summary, authoritative_paragraph_anchor,

extensions, with progression_stage` distributed ANCHOR 443 / ESCALATION 106 / NOT_PRESENT 49 /

CONFRONTATION 45 / RESOLUTION_FINAL 15 / RESOLUTION_PARTIAL 4 / CONVERGENCE 2 / CONFRONTATION_DIRECT 1 /

CAPSTONE 1.

resolution_chapter, anchor_count, weaving_count, chapter_anchor_set, primary_source_array`.

(name-before-reveal, the unattributed-Corr rule, the who-frame single-agent leak) with a hard/advisory split

and an explicit false-positive guard, and check_grand_sage_silence.py runs alongside — both in the 30-gate

config.

The gap. progression_stage is authored from the STORY's point of view: what this chapter does to this

thread. Nothing states what the player is expected to be able to CONCLUDE by that point. So the two halves of

reveal ordering are asymmetric: we can prove nothing arrives early (leak gates), and we cannot prove anything

arrives at all. A thread sitting at CONFRONTATION at Ch N with its ANCHOR rows unclued in Ch N-20 is invisible

to every gate we run — and given KPD-4's finding (10 authored clues, all in Ch 2), that state is the current

default across 78 nodes.

Reuse-first recommendation. Do not add a new ladder. progression_stage already implies the derivability

claim; make it explicit and cheap:

RESOLUTION_* in chapter N asserts that its ANCHOR chapters < N each carry at least one clue chain or

link-graph edge naming that thread. That is checkable today from three tables that all exist

(Thread_Grid × clues.csv × Cross_Cultural_Link_Graph) with no schema change at all, and it is the

positive twin of the reveal gate.

(CONFRONTATION/RESOLUTION/CONVERGENCE/CAPSTONE = 68 rows total) — a one-line statement of what the attentive

player should now be able to say. That is a small authoring job, not a 666-row pass, because ANCHOR rows do

not need one.

home since it already owns the reveal axis and already distinguishes hard from advisory findings.

---

COVERED — what the lens found genuinely strong (stated so this audit is not read as "everything is missing")

T0_Language_Script_Registry carries 84 rows × 19 columns with every taxonomy column fully populated and

no blanks in the histograms I ran (system_type, inscription_application_class, decipherment_status,

mastery_tier_threshold, inscription_limit_zone), plus per-row layer_1_mechanic / layer_2_substrate /

layer_3_anchor prose keyed to the layer model. T0_Inscription_Spine carries 98 rows with

trade_9_tier_gate populated across all six tier values and payoff_chapter set. Compared to what Heaven's

Vault or Chants of Sennaar ship, our *content* substrate is larger and better sourced. The gaps in this

audit are all about surfacing, never about substance.

game models knowledge that is *canonically and permanently gone*. Ours does, deliberately, with an escalating

ladder (phonetic-without-semantic at Meroitic Ch 14 → fully undeciphered at Harappan Ch 16 → oral-not-script

at Sámi Ch 29 → songline-not-script at Australia Ch 57), an explicit anti-decoder-ring rule ("No

invented-semantic-content … Cultural-sensitivity violation. Faction penalty"), an anti-skill-failure framing

("The limit is the knowledge's absence"), and a stat — Humility — whose whole function is measuring the

player's willingness to accept it [T1_Languages_and_Script_Master §3.1-§3.4]. Chants of Sennaar always

yields; Heaven's Vault always converges. This does not, and that is a genuine design achievement worth

protecting in any later simplification pass.

culture that does not write, framed as paradox-completion — "the joik holds the substrate the runic mark

would otherwise hold" [§2.3] — is a stronger statement about what writing IS than any of the five comparator

titles makes.

30-gate config, with documented false-positive guards. Nothing in the comparator set has an equivalent.

probe that tests whether the vocabulary is wide enough, *before* ratifying the vocabulary, is the correct

and rare answer to the repo's own recurring failure class. Called out here as exemplary.

('how would they have gotten a clue?' is enforced here)" [harness/extract_spine_rows.py L53-55, with hard

sys.exit on enum violations]. This is the single most important invariant in a knowledge game and it is

already machine-enforced.

Ch 13, carried in the spine with worldstate hooks. As a *reveal-ordering structure* it is exactly what the

lens looks for; KPD-5 is about its surface, not its design.

DIVERGENT-BY-DESIGN — pre-registered here so no later wave re-litigates them

finish in twenty minutes if they already knew everything — physical access is never gated, only

understanding. Humanity is a locked 79-node ordered spine (77 chapters + Prologue + Epilogue, cardinal

canon). Chapter order is not a gap; it is the vision. The lens's transferable half is *within-chapter* and

*within-realm* knowledge locks at the prize tier (KPD-9), never arc topology.

NEVER gate progression" and "clue = LEGIBILITY, NEVER a gate"

[docs/NATURAL_VOICE_DOCTRINE.md L8/§4; docs/spine/clues/README.md]. Obra Dinn's deduction-as-gate is

therefore explicitly NOT adopted for the critical path. Every recommendation above routes knowledge locks to

the completionist / L3 / no-kill / easter-egg tier the same ruling names as their home.

does not have to decipher. KPD-7 fills the ruling's own reserved "puzzle engagement always available"

half; it does not propose making decipherment mandatory.

not re-litigated here; the comparator titles agree with our existing position.

REFUTED AND DROPPED (attacked before writing; recorded so the critic does not re-derive them)

a stated rule [T1_Build_Pipeline_Contracts §1.9 L224]. Re-cast inside KPD-1 as "the deferral's own trigger

condition has now fired," which is a much narrower and defensible claim.

seed all exist; only rows are absent. DESIGNED-UNBUILT per the wave rule.

docs/spine/clues/README.md: the OR-together rule IS the sufficiency rule and chain_min is doctrinally 1.

The amendment is recorded in-place under KPD-4 rather than hidden, because the first draft was wrong.

[PRE_5090_BUILD_PLAN.md L1795, VOL2 L727]. The surviving finding (KPD-2) is narrower: the spec has no

wrong-attempt design.

encode the Quantum Moon insight [REALM_DESIGN_PROGRAM.md §2.3]. KPD-9 survives only as the missing

player-side law_state.

KPD-10 survives as the asymmetry between the leak direction and the derivability direction.

real (2 lines) but it is already claimed by presentation-craft-anim-audio per

REALM_DESIGN_PROGRAM.md §4.3 (R-A16). Not re-reported here.

METHOD NOTES / TRAPS HIT (for the critic and for the next lens)

returns ZERO because the CVD writes T0\_Journal\_Entry\_Template\_Registry. The tolerant pattern

Journal.{0,3}_.{0,3}Entry finds both real references. Any lens searching for a T-doc or registry name in

the _source tier docs must assume backslash-escaped underscores.

header-only; a naive line count reports 79 "rows."

run_gates.py names no gate literally (it iterates the config).

COUNTS

MISSING ×1 (KPD-6) · WEAKER ×5 (KPD-2, KPD-3, KPD-5, KPD-7, KPD-10) · DESIGNED-UNBUILT ×3 (KPD-1, KPD-4,

KPD-8) · DESIGNED-UNBUILT/timing ×1 (KPD-9) · COVERED ×7 (listed above) · DIVERGENT-BY-DESIGN ×4

(pre-registered above) · REFUTED-AND-DROPPED ×7.

Matrix cells claimed by this run: cell 1 (Pillars 5/6/7 knowledge-as-progression) and cell 2

(translation/decipherment-as-play), plus the realm widen (per-planet ruleset / Quantum Moon → KPD-9).

Generated by harness/site/structure_site.py — the URL path is the repo path. review root