pipelines/LENS_BG3_2026-07-27.md
Read-only design audit. Lens aspects: reactivity depth · companion personal-quest arcs · inter-companion
banter webs · emergent-solution tolerance · origin-character replayability · camp/rest as narrative venue ·
consequence permanence.
Method law held: every candidate pattern was checked against the repos before judging; every zero below is
positive-controlled; every finding was attacked before it was written and the ones that died were dropped
(recorded in §"Refuted and dropped"). Dedupe baseline read in full and respected: docs/DESIGN_GAP_REGISTER.md
(19 entries incl. the 10 recovered rows), the ledger 2026-07-26g residue list (docs/PRE_5090_BUILD_PLAN.md
L133-150) + the handoff residue batch (docs/archive/SESSION_HANDOFF_2026-07-26_ACCOUNT_SWITCH.md L42-70),
docs/COMBAT_PROGRAM_ADDENDUM.md §§1-12 (via the T1 fold at T1_Integrity_Paths §8.11.6-8.11.9 and
T1_Combat_System_Spec §267/§605), docs/NATURAL_VOICE_DOCTRINE.md, and
docs/proposals/COMPARATOR_LENS_PROGRAM.md's 24 matrix cells.
Verdict classes per the standing wave rule. DESIGNED-UNBUILT is never reported as MISSING; where a thing is
designed at recommendation-tier but has no home in the ratified architecture, it is reported WEAKER and the
boundary is stated explicitly.
---
loyalty_belief_axis has no computational surface: companion reactivity collapses onto one scalarClass: WEAKER (structural under-specification of a ratified formula) · Priority: HIGH ·
Workable tag: SPEC-SMALL (one mapping table + a formula clause; no ruling reopened)
What BG3 proves. Its reactivity depth is not that companions react — it is that they react *differently to
the same act*. Astarion approves what Karlach condemns. Differentiation is per-companion value, not per-companion
threshold.
Current state (cited). The departure rule is ruled and canonical: "A 0 to 100 belief-distance scalar is
computed from the player's integrity band — never from observed deeds, because integrity is a real property per
§2.2" [_source/01_Tier_1_Foundation/T1_Integrity_Paths_Worldstates_Master [ACTIVE v2.1].md §8.11.2, L543-549].
The same formula is restated at docs/spine/companion_cast_designs/COMPANION_MECHANICS_CONTRACT.md §4
(Interface 4). The per-companion value pole is a real column — loyalty_belief_axis, "the companion's own
integrity/value POLE, e.g. truth_witness_mercy | freedom_from_bondage_redemption | caci_honor_community |
craft_and_lineage — compared against the player integrity band (WS_001/WS_002)"
[docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md L140]. **But WS_001 is integrity_score and WS_002 is
integrity_level — a single signed scalar and its five bands** [docs/proposals/ENTITY_PERSONA_SYSTEM.md
L121]. Nothing anywhere defines how a pole *token* maps onto that scalar to yield a distance. Consequence as
specced: opposition is a monotone function of one player number, identical for every companion; the only
per-companion differentiators left are loyalty_departure_threshold (4 live values: 85/60/35/never) and the
loyalty_score/10 inertia. Every companion therefore wavers and departs in a fixed threshold order on any
given run, and two companions on opposite poles cannot disagree about the same act. DRAWN inherits the same
hole — it fires when the band "aligns with their belief pole at magnitude ≥ 60"
[COMPANION_MECHANICS_CONTRACT §5] with alignment likewise undefined.
Positive control. grep -rin "loyalty_belief_axis|belief_axis|belief pole|belief-distance" over docs/ +
_source/ returns 14 hits and every one is a declaration, a seed, or a recommendation — WS7 L140 (the column
spec), L144-146 (the three illustrative seeds Ntala/Ana/Tunde), L159 (the vocabulary flagged as naming-canon
awaiting Josh), and the per-companion cast briefs proposing poles (COMPANION_CAST_BRIEF.md L119/L138/L150/L179,
COMPANION_AMBOKO-GERT-BINTI.md L90). Zero hits define a computation. Control that the search can match: the
same grep pattern returns the WS7 seed lines verbatim, and grep -rin "companion" over docs/**.md hits 248
files, so the corpus is reachable.
Self-refutation attempted. (a) *"Per-deed companion reactivity re-litigates Josh's ruling and the
no-scoreboard doctrine."* — Not proposed here. The ruled formula is a belief-distance, which presupposes the
pole enters the computation; the defect is that the pole's entry point is undefined, so the ratified formula
degenerates to a threshold sort. The fix lives *inside* the ruling. (b) *"The vocabulary is naming-canon awaiting
Josh (WS7 L159), so this is queued."* — The token *set* is Josh's; the mapping function is system design and
is absent no matter which tokens he ratifies. (c) *"Divergent — integrity is a real property, so one scalar is
the point."* — The one-scalar read of the *player* is the ruling; a one-dimensional read of the *companions* is
not ruled anywhere and is what collapses differentiation. Survives.
Reuse-first recommendation. Do not add an approval accumulator and do not touch the 90-cap invariant. Declare
a pole→band-position mapping on the existing controlled vocabulary: each loyalty_belief_axis token gets a
declared home band (or band-range) on the already-canonical five-band integrity ladder (§4 L73-77) plus an
optional per-pole sensitivity weight, and belief-distance becomes `|player_band_position − pole_band_position| ×
weight, normalised 0-100. That is one small table on the existing enum, it makes caci_honor_community` and
freedom_from_bondage_redemption genuinely diverge (a pole seated mid-band tolerates grey play but breaks on
either extreme; a pole seated at L1 breaks early on any drift), and it costs no new worldstate row. Land it in the
same wiring commit that ratifies the vocabulary.
Owner suggestion. companion-loyalty (the WS7 wiring commit) + the §8.11 T1 authority; brief rides the
canon-residue batch since the vocabulary ratification is already queued there.
---
Class: MISSING (schema) · Priority: HIGH · Workable tag: SCHEMA-TINY (one enum value + one event
value + a contract clause)
What BG3 proves. Consequence permanence: a companion can die, the story absorbs it, and their content closes
without the run breaking.
Current state (cited). Our attackability model is explicit that this is *supported play*: "Tier 3 —
COMPANIONS / BONDED (attackable, bond-mediated, maximal weight)… Turning on them is a real dark beat, but the
consequence is maximal — they leave, die, or become an enemy; their questlines close; a permanent mark lands.
Not god-moded" [docs/proposals/systems/attackability-and-consequence-model.md, "The five attackability tiers"].
Recovered register row 13 ruled the permanence: named/persona'd NPCs stay permanently dead. **But the ratified
companion schema cannot represent it.** loyalty_state is a 7-value enum — `unmet | recruitable | traveling |
wavering | departed | estranged | bonded_locked [WS7_WIRING_BUILD_PLAN.md` L139; live on
registries/T0_Character_Index [ACTIVE v1.1] as a column, 6 of 163 rows populated] — with no death value. The
WS_028 companion_loyalty_transition_events event enum is DRAWN|WAVERING|DEPARTED|REBONDED [WS7 L152, L154],
with no KILLED/DIED. And the two contracts that make a companion's exit safe are both bolted to DEPARTED
specifically: the non-empty rerouted_paths[] no-dead-end contract enforced by harness/check_no_dead_end.py,
and the §8.11.6 investment return ("every DEPARTED event carries the investment return… the DEPARTED event is not
complete until both the reroute set and the return are resolved" [T1_Integrity_Paths §8.11.2]). A killed
companion therefore (i) has no state, (ii) fires no event, (iii) triggers no reroute — the exact condition the
no-dead-end gate exists to prevent — and (iv) sits under an investment-return clause a corpse cannot satisfy.
Positive control. Enumerated the live loyalty_state column values directly out of
registries/T0_Character_Index [ACTIVE v1.1]/T0_Character_Index DRAFT v1.1.csv (recruitable ×3, unmet ×2,
traveling ×1, blank ×157) — the read works and returns real values, and no death token appears. Grepped
loyalty_state|WS_028|companion_loyalty_transition across docs/ + _source/: 20 hits, all reciting the same
two enums. estranged was checked as a candidate cover and is a relational state (bond severed, person alive),
not death — it does not discharge the reroute or the return.
Self-refutation attempted. (a) *"is_load_bearing shields the companions who matter."* — Only 2 of 163 rows
carry true, and the attackability doctrine bans exactly this reading ("Not god-moded, not invisible-walled";
"Progression-critical roles are shielded by ALTERNATE ROUTES, NOT by god-mode"). (b) *"estranged covers a
turned-on companion."* — Covers betrayal-without-death; the "or die" branch of the same canonical sentence is the
one with no home. (c) *"Designed-unbuilt."* — No: the design *names the outcome* and the schema *forbids
recording it*; the two contradict. Survives.
Reuse-first recommendation. Add dead to loyalty_state and a KILLED value to the WS_028 event enum, and
extend the §8.11.2 sentence so the DEPARTED obligations become exit obligations: any exit event (DEPARTED or
KILLED) carries a non-empty rerouted_paths[], and the §8.11.6 investment return resolves to the estate/effects
route on KILLED (the gear comes back off the body; the intrinsic spread leaves with the person, exactly as the
ruling already splits it). No new variable, no new gate — check_no_dead_end.py just widens its trigger set. This
also gives the R-17 sandbox its honest teeth: the register's ruling that named NPCs stay permanently dead becomes
representable for the cast it costs most to lose.
Owner suggestion. companion-loyalty + attackability (the two column families already co-located on
Character_Index) at the WS7 wiring commit; gate work is one predicate in harness/check_no_dead_end.py.
---
Class: WEAKER · Priority: HIGH · Workable tag: SPEC + AUTHORING (a quest_type + an FK; content rides
the existing beat/fork spine)
What BG3 proves. Each companion carries a multi-act personal questline the *player serves* — content about
the companion's own goal, gated on the relationship, resolving in their own crisis.
Current state (cited). Our own foundation docs name this as a Tier-1 requirement: a core-crew companion
"gets a loyalty arc (ME2 loyalty-mission shape, run through THE BOND ladder + the integrity-driven departure
rule)" [docs/spine/companion_cast_designs/PARTY_STRUCTURE.md §3 Tier 1, L104-108], the ME2 row rules "Adopt
loyalty-mission-per-core" [ibid. §2 L90], the BG2/DAO row rules "Reject the roster SIZE; **keep the approval
depth**" [ibid. L91], and the cast brief carries it forward as a Tier-1 column value [COMPANION_CAST_BRIEF.md
L296, L301]. The quest architecture has no slot for it. CVD §11.1's 22 buckets are Main Story (1) + Trade
questlines (10) + twelve *thematic* side questlines SQ1 Fairy Tale and Folklore … SQ12 Secret Societies
[_source/.../T1_CVD_Creative_Vision_Document [ACTIVE v1.4].md §11.1, L544-570] — none is companion-personal, and
22 is locked numerical canon. registries/T0_Questline_Index [DRAFT v0.1]/Sheet1.csv is populated at 23 rows
(SQ1-12 + TRADE_01-10 + LEG_WPN_036) with questline_class ∈ {side, trade, legendary} — **zero companion rows,
no companion class**. registries/T0_Quest_Definition_Registry [ACTIVE v1.0] is 16 rows with `quest_type ∈
{canonical_hard_line ×12, epilogue_resolution ×3, prologue_baseline ×1} — no companion type, and trigger_type`
/ reward_class are empty on all 16. The only *paid* loyalty arc in the corpus is CL-01, the childhood-familiar
loss→reunion [docs/proposals/WHOLE_ARC_CONNECTIVE_WEB.md L24, L74] — which is the familiar axis, explicitly
firewalled from the companion axis [COMPANION_MECHANICS_CONTRACT §10]. The human-companion equivalent has zero
exemplars.
Positive control. grep -rin "loyalty arc|loyalty mission|personal quest|companion questline" over docs/ +
_source/01_Tier_1_Foundation/: every hit is inside PARTY_STRUCTURE / COMPANION_CAST_BRIEF /
WHOLE_ARC_CONNECTIVE_WEB — i.e. the recommendation tier and the familiar-axis exemplar, never a bucket, a row, or
a schema. The searches demonstrably match (they return the PARTY_STRUCTURE genre table verbatim). Questline and
quest-definition vocabularies were enumerated from the CSVs directly rather than grepped.
Self-refutation attempted. (a) *"Covered — companion arcs already ride the staged chapter forks."* — Real and
cited (COMPANION_ANA.md L231, COMPANION_ANCIENT-GUEST-1.md L210-211, COMPANION_AMBOKO-GERT-BINTI.md L96-98
all map DRAWN/WAVERING to specific forks) — but those stage the companion reacting to the player's choices,
which is the departure system's own surface. A loyalty mission is the inverse: the player serving the companion's
goal. Our own PARTY_STRUCTURE lists both and only the first has a home. Survives, narrowed to the inverse
direction. (b) *"DESIGNED-UNBUILT — PARTY_STRUCTURE designs it."* — PARTY_STRUCTURE is explicitly
Status: RECOMMENDATION for Josh, and it names the arc as a *requirement* without specifying its container. No
bucket, no class, no FK, no rows. WEAKER, not MISSING, and not designed-unbuilt. (c) *"Adding it breaks the
locked 22."* — Correct, which is why the recommendation below does not add a bucket.
Reuse-first recommendation. Do not mint a 23rd bucket (22 is locked). Route loyalty arcs as
chapter-attached quest definitions on the machinery that already exists: add a companion_arc value to
T0_Quest_Definition_Registry.quest_type plus a companion_ref FK to T0_Character_Index, and let the arcs ride
the DT_Beat/DT_Fork spine the main path already runs on (UQuestSubsystem). Gate availability on the BOND
band that already exists (Warm/Trusted) rather than a new counter, and make the resolution write the same
WS_027/WS_028 rows the departure system reads — so a completed loyalty arc *is* the inertia the departure rule
already models. Cadence rides the ratified funnel: recruit in-homeland across Ch 2-38, arcs mature Ch 39-65, the
Ch-65 lock is the crucible (PARTY_STRUCTURE §4). Sequence it behind Josh's core-size ratification (§6 flag 1) so
the arc count is known before authoring starts.
Owner suggestion. the quest lane (P1 / P5-factory) for the schema + routing; companion-loyalty for the BOND
gating; content authoring waits on the core-size ruling.
---
Class: WEAKER · Priority: MEDIUM-HIGH · Workable tag: SCHEMA-SMALL + AUTHORING (one nested block on an
existing worldstate row; one scene_type on an existing registry)
What BG3 proves. The party is a *web*, not a hub-and-spokes: companions form opinions of each other, argue,
banter on the road, and pair off. Camp is the venue that stages it, and it is where most of the game's
characterisation is actually delivered.
Current state (cited). Our relational architecture is entirely player-centric by construction. THE BOND is
loyalty_score *of a companion toward the player*; WS_027 companion_roster_state is a per-member ledger keyed
to the player's integrity signature; WS_008 relationship_history is a per-NPC-to-player ledger; WS_021 is
faction standing [COMPANION_MECHANICS_CONTRACT §3, §5, §10; T1_Integrity_Paths §8.11.1]. The persona spine's
web_position does carry kin/teacher/rivalry edges, but they "resolve to another persona/registry row"
[COMPANION_MECHANICS_CONTRACT §1] — static graph data with no runtime state and no ladder. **There is no
companion→companion relation anywhere in the schema.** Our own whole-arc prose review found the same hole from
the content side and rated it MAJOR: "The family is repeatedly asserted… but almost never staged: no meals, no
arguments, no jokes, no care shown between companions (it always flows to/from the protagonist). For a named
through-line, the family needs perhaps five ensemble beats across the arc; it currently has approximately one"
[docs/review/FINDINGS.md L160]; and "no exchange between companions rendered as talk" [ibid. L135]. The
venue is asserted as tone with no consumer: "the ship is where the 'fun AARPG, a pleasure to travel with' tone
lives — banter, galley scenes, festivals aboard" [docs/proposals/systems/vehicles-fleets.md L103, echoed at
COMPANION_MOTHERSHIP-CREW.md L36]. But registries/T0_Scene_Spec_Registry [ACTIVE v0.1] is 16 rows with
`scene_type ∈ {canonical_set_piece ×6, boss_encounter_resolution ×4, epilogue_cinematic ×3,
boss_encounter_intro ×1, boss_encounter_phase_transition ×1, prologue_cinematic ×1}` — **no downtime, crew, or
companion-scene class exists**. The one banter that *is* specced is player-directed: the runtime Class-4 tick
emits "banter phrasing" and a relationship_delta toward the player [docs/RUNTIME_GENERATIVE_LAYER.md L67,
L113-116, L143].
Positive control. `grep -rin "inter-companion|companion-to-companion|between companions|party banter|
cross-talk|companion rivalry" over docs/ + _source/01_Tier_1_Foundation/` returns exactly two hits, both
in FINDINGS.md, both *reporting the absence*. The pattern demonstrably matches text (it returns those two).
grep -rin "banter" returns 18 in-corpus hits, all player-axis runtime or tone assertions — so "banter" as a word
is richly present while the companion↔companion sense is a true zero. Scene classes were enumerated from the CSV,
not grepped.
Self-refutation attempted. (a) *"Dedupe — register entry 9 (rest / safe-site session-anchor loop) already
lists 'companion talk'."* — Entry 9 is a session-pacing gap owned by P2/W-SPACE: make the safe site a readable
anchor (save, restock, talk, recharge) at region hubs. It creates no companion↔companion state and no scene class,
and the core of this finding — that no relation between two companions can be represented at all — is untouched by
it. Kept, with the venue half scoped narrowly to the delivery class and cross-referenced to entry 9 so the two do
not collide. (b) *"Dedupe — register entry 7 (synergy companion assist)."* — That is a combat two-actor move
keyed off ally mode; different surface, different owner. (c) *"FINDINGS.md already logged it, so it is known."* —
FINDINGS.md is a prose review with no owner, no system, and no register row; it is evidence *for* this gap, and it
appears in none of the dedupe baselines. (d) *"Divergent — walked geography means no camp."* — The mothership from
Ch 8 with named crew stations (helm; lookout; gunner; engineer; cook; menagerie; rigger
[COMPANION_MECHANICS_CONTRACT §8]) is the venue and is already canon; the divergence bites fast-travel, not
downtime. Survives.
Reuse-first recommendation. Two small moves, both on existing rails. (1) Edges: the nine-band ladder is
already declared "one numeric ladder spans every relational axis" [T1_Integrity_Paths §8.11.1] — reuse it for a
sparse crew_relations block nested inside the existing WS_027 object (pairs of character_id + a −100..+100
score + the same nine bands), seeded from the personas' existing web_position edges. Do not mint a new
worldstate row and do not give it a per-axis label list (§8.11.4 makes a per-axis override a re-ruling). Only
Tier-1 core members need edges — at a ratified core of 6-8 that is at most ~28 pairs, and most stay unset. (2)
Venue: add a crew_downtime value to the existing T0_Scene_Spec_Registry.scene_type, keyed to the
mothership stations already enumerated, with participant_entity_refs carrying the pair — the registry already
has every other column such a scene needs (scene_beat_structure, voice_refs, dialogue_dataset_ref,
path_bucket). Target FINDINGS.md's own bar: ~5 authored ensemble beats across the arc, plus a runtime pairwise
banter class hanging off the Class-4 tick that already exists. This is the cheapest available fix for the
review's MAJOR finding and it makes the ship's asserted tone into content.
Owner suggestion. companion-loyalty for the edges; W-SPACE/P2 + the persona lane for the scene class; the
authored beats ride the prose lane that already owns the WS8 warmth seams.
---
Class: WEAKER · Priority: MEDIUM · Workable tag: SPEC + CARE-GATED AUTHORING
What BG3 proves. Romance is one of its two largest replay drivers and the payoff rung of the approval ladder —
the reason players run it four times.
Current state (cited). THE BOND's ladder tops out at Family, and the naming is deliberate: "Family (not
Kin) — 'kin' is reserved for the Ch-66 origin-lineage recognition" [COMPANION_MECHANICS_CONTRACT §3;
T1_Integrity_Paths §8.11.1]. Nine bands, no partner rung, no partner state, no orthogonal intimacy axis.
Meanwhile Josh authored the system already and it is sitting unhoused in the pre-Claude GDD recovery:
"Marriage & Partnership system (solo/equal/primary-secondary/overlap/sequential-memory) + **breakup
negotiation (3 restoration options); best-friends get identical system | RECOVERED-NEW** |
Personal_Dimension_Spec is a DRAFT stub — zero marriage/partnership content. **Strongest recovery; natural home =
T1_Personal_Dimension_Spec" [docs/original_predclaude/INGEST_GDD.md L122], ranked #1** of the recoverable
set: "Marriage & Partnership + breakup-negotiation → author into T1_Personal_Dimension_Spec (currently a stub).
Highest single-system value" [ibid. L183]. The named home is still empty:
_source/01_Tier_1_Foundation/T1_Personal_Dimension_Spec [DRAFT v0.1].md is 48 bytes. Nothing has landed
since: the companion mechanics contract, the cast designs, the party structure, and §8.11.1-8.11.9 contain no
partner concept.
Positive control. grep -rin "romance|romantic" over docs/ + _source/ + registries/ returns 220 hits
and every single one is either the literary genre (Morris/Grail/chivalric romance in the book-pipeline and
spine docs) or the verb "romanticized" in care-doctrine language — zero mechanical hits. Follow-ups:
"love interest" = 0, "romanceable" = 0, "courtship" = 3 (two quest seeds + one book note), "intimacy" = 5
(all prose-register or base-building metaphor), "marriage" = 7 (six are book substrate or the Earth-Water
"marriage" ability metaphor; the seventh is the INGEST_GDD row above). The greps demonstrably match (they return
220 rows of the homonym). Ledger 26g and the handoff residue batch were read line by line: the INGEST_GDD
recoveries that have landed are the 4-team World Boss architecture (via addendum §12); **marriage/partnership is
not on either residue list**.
Self-refutation attempted. (a) *"Deliberately out of scope — the protagonist is a child through much of the
ancient arc."* — Real constraint, not a refutation: the two-clock age model stages Childhood → Adolescence at the
Ch 13/14 boundary and runs adult stages thereafter, and any partner track is **age-stage gated to the adult
stage** as a §17 floor obligation (no child harm), exactly as the recommendation below states. The constraint
shapes the design; it does not delete it. (b) *"Divergent-by-design."* — Nothing declares it. A divergence is a
declared design choice; this is an unhoused recovery item ranked #1 by our own ingest, on an R-17 title, in a
system whose top band is "Family". (c) *"It is already queued."* — Checked both residue lists; it is not.
(d) *"It re-litigates the nine-band lock."* — Only if implemented as a tenth band, which the recommendation
explicitly avoids. Survives.
Reuse-first recommendation. Do not add a band (the nine are ruled, and a per-axis override is a re-ruling
per §8.11.4). Add a partner flag as a state, not a rung: a boolean/enum on the existing WS_027 per-member
object, reachable only from the Trusted/Family bands and only in the adult age stage, so the existing ladder
remains the gate and the flag is its outcome. House the GDD's own model (solo / equal / primary-secondary /
overlap / sequential-memory + the three-option breakup negotiation) in
T1_Personal_Dimension_Spec per INGEST_GDD's named home, with a pointer from §8.11 so the companion axis and the
personal-dimension home are wired rather than orphaned (anti-orphan doctrine). Reuse three things already built:
the six_option_register for voice, the assimilation_stance witness beat for the intimacy hinge, and the
§8.11.6 investment-protection doctrine for the breakup transaction (a partner departure returns gear exactly as a
companion departure does — the moral weight stays on the relationship). Care framing is the standing doctrine's:
adult-stage gate, rename/reframe over removal, R-17 bar honoured, per-culture register from the persona's
voice_register.
Owner suggestion. the canon-residue batch (it is an unhoused INGEST_GDD recovery with a named home) +
companion-loyalty for the WS_027 state; content authoring is post-slice.
---
Class: WEAKER · Priority: LOW-MEDIUM · Workable tag: SPEC-SMALL (extend an existing resolver's input
set)
What BG3 proves. Its most-felt reactivity is the tagged dialogue option — [BARBARIAN], [HISTORY],
[ROGUE] — where who you built changes which routes exist through a scene.
Current state (cited). The canonical dialogue system is the six options (Truly Good, Truly Bad, +
Sympathetic / Detached / Curious / Defiant), integrity- and biography-shaped [T1_Integrity_Paths §6, §1 L21;
HL_0039/HL_0040], with each companion colouring them via six_option_register [COMPANION_MECHANICS_CONTRACT §1.1].
Reactivity to integrity and biography is genuinely covered. The *capability* channel is asserted but never
built: "Intelligence… Unlocks vril capacity, puzzle-solve rate, and dialogue option breadth"
[_source/01_Tier_1_Foundation/T1_Ability_Tree [ACTIVE v1.4].md L120] — one sentence, no mechanism, no schema,
no consumer. The only detailed design is likewise unhoused and explicitly not ratified: the biography × ability
passive matrix ending in "Neutral+Faction+Wealth → 'Grand Negotiator' hidden 5th dialogue option.
RECOVERED-NEW… Candidate for Josh, not an ability-count change"
[docs/original_predclaude/INGEST_ABILITIES_WEAPONS.md §2b] — and as written it also collides with the ruled
six-option lock. By contrast the faction channel *is* specced: faction standing "modifies NPC reactions
covering greeting, dialogue option availability, quest availability, pricing" [T1_Integrity_Paths §8.7, per
docs/proposals/canon_correction/cc5_tier_world.md L73-74]. So a resolver for state-gated option availability is
already canonical — it simply reads only one state.
Positive control. grep -rin "dialogue option" over docs/ + _source/01_Tier_1_Foundation/ returns 12 hits:
the six-option canon and its per-companion registers, the §8.7 faction-availability clause (twice), HL_0067
(silence is a valid option), the Ability_Tree assertion, and the INGEST recovery. Zero specify an ability-, trade-,
or knowledge-gated option. "skill check" returns one hit and it is the Ability_Tree changelog phrase
"Inscription trade-skill checks", not a dialogue mechanic; "dialogue check" = 0. The greps match (they return
the twelve).
Self-refutation attempted. (a) *"Dedupe — COMPARATOR_LENS_PROGRAM cell 19 covers 6-option dialogue."* — Cell
19 is prose-as-the-primary-play-surface / voice-as-system / failure-as-content, teacher Disco Elysium. This is a
schema link between capability state and option availability. Adjacent, flagged, not duplicate. (b) *"Covered —
faction standing already gates option availability."* — Partly true and it materially narrows this finding, which
is why it is scoped down to the ability/trade/knowledge channel and priced LOW-MEDIUM. The narrowed claim still
holds: canon asserts the link and nothing realises it. (c) *"Divergent — six options are locked."* — The lock is
on the option *count*, not on what a given option's content and outcome may be; the recommendation respects it.
Survives, narrowed.
Reuse-first recommendation. Keep six. Express capability-gating as variant content on an existing option
rather than an extra option: when the player holds the relevant trade tier, ability, inscription reading, or
learned knowledge, the matching option's text and outcome upgrade (the Curious option becomes the one that reads
the inscription; the Defiant option becomes the one that names the forge-technique). Mechanically this is one
extra input to the option-availability resolver §8.7 already defines for faction standing — same resolver, wider
input set — plus an optional capability_ref on the dialogue row. It satisfies the Ability_Tree assertion,
delivers the BG3 tagged-option feel, honours the six-option lock, and stays inside the no-scoreboard doctrine
because the gate is diegetic knowledge rather than a number. Fold into the natural-voice rewrite pass, which is
already re-authoring player strings and is the cheapest moment to mark which options are capability variants.
Owner suggestion. the dialogue/six-option resolver lane (six_option_dispatcher, already named as a WS_027
consumer) + the natural-voice rewrite wave.
---
1. Consequence permanence for ordinary NPCs — attackability Tier-2 witness/memory/reputation ripple, persona
loss reroutes content, register row 13 rules named NPCs permanently dead
[attackability-and-consequence-model.md; DESIGN_GAP_REGISTER row 13].
2. Kill-anyone tolerance without god-mode — "invisible god-mode shields break immersion and are banned";
protection is consequence and alternate routes, never a can't-target flag [ibid.].
3. No-fail-state / multi-solution obstacle design — the three playstyle through-lines (participate /
subvert-from-inside / honorable-open), non-blocking multi-path, opportunity conservation, and the
check_no_dead_end.py gate [COMPANION_MECHANICS_CONTRACT §9; ENTITY_PERSONA_SYSTEM §3.4-3.5].
4. Talk / pacify / non-lethal boss resolution as a first-class route — win_condition includes PACIFY (8) and
FREE (19 across two combos), has_nonkill_path is a live column (16 TRUE), primary_verb spans
expose/refute/decode/attune/infiltrate/evade beside strike, character_engagement_node carries
verb=declare|weigh|witness|spare-or-kill, and CVD §12.2 names "puzzle-routed combat (boss encounters with
non-combat resolution components)" [registries/T0_Boss_Encounter_Registry, 281 rows].
5. Failure as content — the win-AND-death economy: death_reward is a first-class boss column, "no fail-wall
— the encounter deepens" [BOSS_PERSONAS Ch 76; DESIGN_GAP_REGISTER entry 6 §7].
6. Companions leave over your morality, with a warning window — the ratified opposition-magnitude departure
rule, the 90-cap invariant, two-node sustain, and WAVERING *staged per companion* against real forks
[T1_Integrity_Paths §8.11.2; COMPANION_ANA.md L231; COMPANION_ANCIENT-GUEST-1.md L210-211;
COMPANION_AMBOKO-GERT-BINTI.md L96-98].
7. The for-life inversion — an Evil path turns the anchor companion into an endgame opposition encounter
rather than a departure; BG3 has no equivalent of this beat [T1_Integrity_Paths §8.11.3].
8. Dialogue that reflects who you are — the canonical six-option biography+integrity system with per-companion
cultural registers [§6; COMPANION_MECHANICS_CONTRACT §1.1].
9. World-scale reactivity and memory — five world states × 79 nodes, persistent faction standing, witness
memory, the journal as the player-facing artifact [§4, §8.7, §8.9].
10. Companion combat identity as a distinct kit — mode/verb contribution against named Composure sub-nodes,
plus player-shaped ally stat spreads and INT-as-AI-quality [COMPANION_MECHANICS_CONTRACT §7;
T1_Integrity_Paths §8.11.7-8.11.8].
11. Party composition as real content — "the player's viable specifications therefore depend on who travels
with them, which is why team composition is content rather than a menu"
[T1_Ability_Tree L1270; T1_Combat_System_Spec L267, L605].
12. Companion gear and investment — loadout parity plus the investment-protection rule returning gear on
departure [T1_Integrity_Paths §8.11.6].
1. Origin characters / custom protagonist — a fixed protagonist under the close-third narrative lock
(HL_0038); replayability rides three paths × five bands × NG+ and the Ch-1 best-friend seed instead.
2. Turn-based tactical layer with visible dice — real-time blended-mode combat over seven modes; difficulty is
world vril-density, never stat inflation.
3. Per-choice approval scoreboard ("X disapproves") — THE BOND is a state function generated fresh each
encounter, not an accumulator; integrity is a real property read directly, never a deed ledger; the
no-scoreboard doctrine is explicit [COMPANION_MECHANICS_CONTRACT §3; DESIGN_GAP_REGISTER entry 8 constraint].
*(BG3-1 above does not re-litigate this — it asks the ruled belief-distance formula to actually use its own
inputs.)*
4. Recruit-by-player-choice + bench management — recruitment is integrity-computed (DRAWN) and there is no
stronghold to bench at on a moving mothership [PARTY_STRUCTURE §1.2].
5. A large recruitable roster (BG2/DAO ~16) — explicitly rejected: a permanent traveller is an outsider to 25
of 26 cultures, so breadth lives in the local-contact tier [PARTY_STRUCTURE §1.1, §2].
6. Act structure with a portable camp and free fast-travel between hubs — walked geography, continuous
pilgrimage, mothership from Ch 8, no flight pre-Ch-55, Hearthway return-only.
7. Respec-anywhere / multiclass identity churn — twelve-tier mastery with 120 quest gates; progression is
becoming a practitioner, not re-rolling a stat block [CVD §12.1].
per-companion designs (Ana's Ch-55 corrosive read; Amboko's cargo-discovery hinge; the ancient guest's Ch-8
sealed hold). Dropped.
conditions already carry it (finding-free, listed COVERED #4). What remains is population (has_nonkill_path
TRUE on 16/281), which is DESIGNED-UNBUILT and not reportable.
affordances) plus the environmental mode and real-physics doctrine. Dedupe.
is_load_bearing." Tested against the live column (2 of 163 rows true)and against the attackability doctrine's explicit ban on god-mode — this is why BG3-2 stands rather than dying.
become a per-deed approval accumulator; BG3-5 must not become a tenth BOND band and is adult-age-stage gated
(§17 floor); BG3-6 must not add a seventh dialogue option. BG3-3 and BG3-5 both *depend on* rulings already
queued elsewhere (the core-size ratification; the belief-axis vocabulary), and neither adds a new question.
companion-loyalty / the WS7 wiring commit ×4 (lead or shared) · the quest lane (P1/P5-factory)×1 · W-SPACE + persona lane ×1 (shared) · the canon-residue batch ×1 (shared) · the natural-voice / dialogue
resolver lane ×1.
BG3-1 (one mapping table on an enum being ratified anyway), BG3-4 part 2 (one scene_type value).