COMPANION_PERSONA_FINDINGS_CLOSURE.md

npcs/COMPANION_PERSONA_FINDINGS_CLOSURE.md

Companion persona findings closure — the owner-lane disposition of F-1, F-3, F-4 and F-5

CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
The canon: the CVD · the T1 foundation docs · the T0 registries (registries/) · the spine
(docs/spine/CH_*.md) · the region pages (_source/02_Tier_2_Region_Pages/). Authority order: docs/DOC_MAP.md § 0.
Canon served (scanned from this document's own citations):
T1_Integrity_Paths_Worldstates_Master §8.11 · T3_Core_Characters · T0_Hard_Lines ·
T0_Ally_Behavior_Policy · T0_Worldstate_Variables · T0_Role_Axis_Registry ·
T0_Character_Index · docs/spine/CH_03.md · docs/spine/CH_13.md ·
docs/spine/DECISIONS_PENDING_JOSH.md · docs/CONDITION_EXPRESSION_GRAMMAR.md.
READ THAT CANON FIRST — open it and derive from it before you build anything from this document.
If this document disagrees with canon, CANON WINS and this document is the defect — fix the
document, never the canon. Nothing here is applied until it is ratified into canon.

This document mints no registry row, edits no canon file, and changes no numerical, naming,

hard-line or §17 content.

Honest tier: DESIGN CLOSURE — ROW SHAPES AND SCHEMA SPECS, NOTHING APPLIED. Every fix designed

below lands as a proposal-tier row shape or a column contract with its apply vector named as OWED.

This wave edits no registry: the fidelity baseline is another live seat's claimed surface today, so

a row shape that is correct and unapplied is the deliverable, and an applied row would be the defect.

Citation form, declared on the face. Every citation here is either an insertion-invariant

doc-and-heading-fragment anchor or a registry row-key anchor, in the two SRC forms

harness/check_source_anchors.py proves. This document carries ZERO line-range citations, because a

new line-range pointer hard-fails gate 46 line_citations tooth C5 unless the shared

docs/line_citation_baseline.json is re-emitted in the same commit, and that file is not this lane's

to touch. Where a claim rests on a build/ file the path and section are named in plain prose.

Pronoun convention, inherited and restated. This document says "she" for CHAR_0002 as a

DESIGNER-SIDE READING CONVENIENCE ONLY, exactly as the exemplar declares it. Her gender is inherited

from the player's Ch-1 best-friend selection and is not authored

[SRC: T3_Core_Characters # Identity Parameters], and her registry row encodes the same at

voice_signature_notes [SRC: T0_Character_Index @ CHAR_0002]. Nothing here is a player-facing line;

any consumer strips the convention before authoring one.

A NUMBERING WARNING THE DIRECTOR'S LEDGER NEEDS BEFORE ANYTHING ELSE. The finding labels in this

lane's mandate are not the exemplar's labels for two of the four items, and keying them together

would lose a finding. The cross-key is stated once, here, and this document uses the MANDATE labels

throughout.

this closure's labelthe exemplar's labelthe item
F-1F-1the unwarded companion at three combat beats
F-3F-3the stat-spread collision
F-4F-4the daily-rhythm schema cannot express a traveller
F-5F-10the out-of-domain WS_009 journal token
not owned hereF-5 and F-11the CHAR_0056 registry-versus-spine conflict

0. DERIVATION

DERIVED FROM:

actor sets, mode fields and state chains; the §10 Beat graph addendum CH13_B14-B16 and its

opt-in/non-gating clause; the Continuity anchor; the Body prose; the Boss structure; the

Protected-chapter combat framing; the Mechanical anchors, including the ally_ward_terms paragraph;

the Seam state-diffs; the Decisions surfaced block, including the O-5 enum-domain adjudication and

the ward-scoping resolution.

out: set and its reveal field.

all fourteen rows AP_0001 through AP_0014, including AP_0009's long note (the ward-rule mechanism,

the never-a-meter rule, the enum-fit flag on domain, and the deliberate gear_imprint choice

against ally_spread).

full: §8.11.1 The Nine Shared Bands, §8.11.2 The Departure Rule, §8.11.3 The For-Life Inversion,

§8.11.4 Override Authority and Write Discipline, §8.11.5 The Familiar Axis Is Separate, §8.11.6

Companion Loadout Parity and Investment Protection, §8.11.7 Player-Shaped Ally Stat Spreads,

§8.11.8 The Intelligence Axis and Ally Behavior Quality, §8.11.9 Allies as Build Components,

§8.11.10 Direct Ally Control and the Character-Not-Unit Law.

HL_0095 read as their cross-referenced neighbours.

extended to time and the what-lands-with-the-mint clause; §6's honest-current-state read.

WS_040, each read whole including its type, domain, default and notes cells.

vocabulary.

and its PHYSICAL REALISM HALF; the 2026-07-27 second sitting J-2, J-3 and J-6; the third sitting

amulet provenance.

composition and precedence, §4 the ws.key operator and domain rules.

guard and the ruled statement that the player's only two inputs are int_tier and role_tag.

at source. It is the starting pointer and never the evidence; where its reading and the source

diverge, the divergence is stated on the finding.

NOT DERIVED (authored judgment, and why it had no canon home):

corpus covers a present non-combatant on a live field without the ward, which is the finding

itself; the verbs are authored against the existing column schema, the closed domain triad and

the J-2 downed-versus-dead boundary, and each names its derivation inline.

values and neither is honest for a staging law; the mint is a registry owner's call and is

proposed, never taken.

aboard). §5.2.1 authors two prefixes and no traveller case; the third prefix follows the

polymorphic-reference precedent §5.2.1 itself names, and the anchor vocabulary is authored.

device; §5.2.1 has no frame concept.

state vocabulary at four values and says nothing about a traveller's home state; binding rather

than extending is this document's choice, and it supersedes a proposal-tier cell in the exemplar's

§8, never a canon cell.

argued from the two sources; the ruling is Josh's and is not taken here.

ROUTING NOTE (contract clause 2). persona is not a listed work kind in harness/route.py, and

neither is a findings-closure kind, so no route read-set exists to run — the same gap the exemplar

carries as its F-8. The canon nodes read in place of one are docs/spine/CH_13.md in full and

docs/spine/CH_03.md at the CH03_B12 beat, then the T1 §8.11 authority, then the four registries

named above. No proposal was substituted for a node: the exemplar was read as a pointer set and

every one of its four findings was re-opened at its source before it was accepted, and two of them

came back changed.

F-1 — the unwarded companion: a companion-safety policy class

EVIDENCE RE-VERIFIED

REPRODUCED, and the exemplar's reading is confirmed and strengthened at one load-bearing point.

The hard line, quoted whole because both halves of it bind this design: "Healer's child carries the

journal physically at all times. NO combat abilities — informational and social capability only.

Mama Klara is the Ch 03 healer-elder; healer's child is Mama Klara's child. Two different people

canonical lock — Mama Klara stationary at Ch 03; healer's child travels from Ch 13 onward." Severity

canonical; applies_to_chapter_range Ch3,Ch13-77 [SRC: T0_Hard_Lines @ HL_0096].

The three beats. Reading every beat's own mode and actors fields, CH_13 stages seven combat-mode

beats — CH13_B04, CH13_B09, CH13_B10, CH13_B11, CH13_B14, CH13_B15 and CH13_B16 — and CHAR_0002 is

in the actor set of exactly three of them.

{local.vimana_seed_felt: true} → out: {local.cliff_gained: true}` [SRC: CH_13 # Beat graph].

out: {local.valley_yard_finished: true}` [SRC: CH_13 # Beat graph addendum].

out: {local.blombos_record_held: true}` [SRC: CH_13 # Beat graph addendum].

The ward reaches her only at CH13_B13, the chapter's exit beat, whose out-set writes

ws.companion_roster_state: +ntala_bears_the_realm_ward [SRC: CH_13 # Beat graph]. All six rowed

policies that name her gate on flag(local.ward_borne_and_holding)

[SRC: T0_Ally_Behavior_Policy @ AP_0009] [SRC: T0_Ally_Behavior_Policy @ AP_0010]

[SRC: T0_Ally_Behavior_Policy @ AP_0011] [SRC: T0_Ally_Behavior_Policy @ AP_0012]

[SRC: T0_Ally_Behavior_Policy @ AP_0013] [SRC: T0_Ally_Behavior_Policy @ AP_0014]. So no rowed

policy of hers is live at any of the three beats.

THE STRENGTHENING, and it is what makes this finding urgent rather than notional. The exemplar reads

all three beats as equivalent instances. They are not. CH13_B15 and CH13_B16 are declared OPT-IN and

non-gating by the addendum's own words — "All three are OPT-IN and non-gating. Nothing downstream

consumes their out-keys" [SRC: CH_13 # Beat graph addendum] — so a player may never enter either,

and their seat relative to CH13_B13 is under-determined by their state chains. CH13_B04 is neither.

Its out-key local.cliff_gained is CH13_B05's sole in-key, CH13_B05's out-key local.panel_steadied

is CH13_B06's sole in-key, and the chain runs unbroken to CH13_B13 [SRC: CH_13 # Beat graph]. CH13_B04

is therefore MANDATORY, strictly before the gift in state order, and unavoidable on every path. The

exposure is not an edge case a player might reach; it is on the critical path of the slice's terminal

chapter, and it is the first combat beat of Ntala's life as a companion.

THE SECOND STRENGTHENING, previously unnamed anywhere. The exposure does not end at CH13_B13. HL_0096

binds Ch13-77, and the ward rows are the only companion policy in the corpus, so the same hole

opens at every later chapter for any present non-combatant who is not Ntala and at every moment the

ward's own flag(local.ward_borne_and_holding) is false. This is a class hole, and the standing law

that a Josh comment encodes a principle rather than an instance is why it is designed as a class

below rather than as three patches.

The no-dead-end floor, verified rather than assumed. No beat in CH_13 reads a companion state in its

in: set, and the addendum asserts in terms that "the departure at CH13_B13 is reachable at every

value of every key below" [SRC: CH_13 # Beat graph addendum]. So the chapter is non-gating on her

today, and the design's first obligation is to not break that.

THE DESIGN — the companion-safety policy class

The column schema, quoted verbatim from the table's own header row, because every proposed cell

below is authored against it:

policy_id,ally_ref,ally_kind,role_tag,int_tier,domain,condition_expr,action_ref,priority,autonomy_band,policy_source,unlock_int_min,disposition_legal_set,display_intent_text,string_status,voice_register_ref,power_source,lifecycle,superseded_by,source_ref,notes

The class is authored as SIX rows, ally_ref * and ally_kind companion — a class, not a

person. The ward rows are correctly scoped to one bearer on a named provenance; a safety floor for a

present non-combatant is the opposite kind of rule and must not be re-scoped to Ntala, or the next

non-combatant companion re-opens the same hole. Every row is gated on one positively-stated local

flag, local.noncombatant_ally_on_live_field, produced by the encounter setup, and the reason it is

positive rather than a negation of the ward flag is a grammar fact: the condition grammar's predicate

set is has, flag, at, read and a ws.key comparison, its boolean composition is & and |

only, and it carries NO negation operator [SRC: CONDITION_EXPRESSION_GRAMMAR # The five predicate surfaces]

[SRC: CONDITION_EXPRESSION_GRAMMAR # Boolean composition and precedence]. "Fires only when the ward

row does not" is inexpressible today, so the flag carries the exclusion instead.

The six proposed rows, all int_tier 1 and unlock_int_min 1 (the BASE band every ally runs, per

the existing rows' own note), autonomy_band autonomous, policy_source canon_seed,

disposition_legal_set protective;cautious, role_tag ROLE_SINGLE_SUPPORT, power_source

encounter_staging (proposed value; see the schema flags), lifecycle active, string_status

placeholder, voice_register_ref blank, superseded_by blank. Ids AP_0015 through AP_0020 are

proposed as the next free block after AP_0014; the id space is the registry owner's to set.

policy_iddomaincondition_expraction_refwhat it does, and what it is derived from
AP_0015proactivityflag(local.noncombatant_ally_on_live_field)take_standoff_positionAt engagement start she moves off the engagement line to the nearest declared standoff volume and holds a minimum distance from the nearest hostile. Derived from HL_0096's informational-and-social-only lock read positively: a person with no combat verbs still has a body with somewhere to put it, and the completeness law requires natural movement before aggro rather than a frozen prop [SRC: DECISIONS_PENDING_JOSH # THE CREATURE/NPC BEHAVIORAL COMPLETENESS LAW].
AP_0016proactivityflag(local.noncombatant_ally_on_live_field) & flag(local.hostile_within_standoff_radius)break_line_of_engagementWhen the standoff distance is closed she withdraws further, using cover and terrain, at her own mass and gait. Derived from the physical-realism half: locomotion derives from the body's actual mass and limb structure, and a thirteen-year-old carrying a book runs like one [SRC: DECISIONS_PENDING_JOSH # THE PHYSICAL REALISM HALF OF THE COMPLETENESS LAW].
AP_0017awarenessflag(local.noncombatant_ally_on_live_field) & flag(local.armed_target_available)deprioritize_noncombatant_targetThe hostile layer's own target selection ranks an unarmed non-combatant LAST while any armed target is available. This is deliberately a de-prioritization and not the ward's suppression: a foe that would rather kill the armed child is behaving, not being nerfed, and the difference is what leaves the ward something real to buy at CH13_B13. Derived from HL_0096 plus the ward rows' own scoping, which the chapter states is "the hostile encounter layer's own target selection" and nothing wider [SRC: CH_13 # Mechanical anchors].
AP_0018awarenessflag(local.noncombatant_ally_on_live_field) & flag(local.no_armed_target_available)yield_to_last_target_standingWhen no armed target remains — the player downed, the party scattered — she becomes selectable. This is the honest seam, the pre-ward twin of AP_0014's non-perceptual carve-out, and it is what keeps the class from being invulnerability under another name. Derived from AP_0014's own stated principle, that the ward "has nothing to say to area effects, collapsing terrain, or a foe that strikes ground rather than targets", so that bosses keep their teeth [SRC: T0_Ally_Behavior_Policy @ AP_0014].
AP_0019proactivityflag(local.noncombatant_ally_imperilled)withdraw_off_field_imperilledAt the imperilled threshold she routes off-field to the encounter's declared safe anchor and rejoins at encounter close. She is NOT downed and NOT killed: J-2 rules that "DOWNED is a symmetric combat state; DEAD is a permanent story event; permanent death is never a raw combat outcome for a persona'd character" [SRC: DECISIONS_PENDING_JOSH # RULED 2026-07-27 (second sitting)], and a non-combatant carries neither state, because both are combat outcomes and she has no combat. This is the row that makes an escort-fail structurally unauthorable.
AP_0020proactivityflag(local.noncombatant_ally_on_live_field) & flag(local.player_downed)hold_position_no_live_field_crossingWhile unwarded she does NOT cross a live field to reach a downed player. Derived by exclusion from AP_0012, whose rescuer licence is explicitly ward-gated and is "exactly the license the J-3 rescuer role requires" [SRC: T0_Ally_Behavior_Policy @ AP_0012]. Pre-ward, that licence does not exist, so the row states the absence rather than leaving an engine to guess it.

WHAT THE PLAYER EXPERIENCES, which is the half a row table cannot carry. At CH13_B04 she is on the

cliff with the protagonist and she is visibly, competently frightened: she gets off the line, she

puts stone between herself and the works, and the enemies go past her toward the armed child because

that is who is hurting them. She keeps counting. When the fight ends she writes it down, and what she

writes is what she saw the protagonist do, per her own register. And when the protagonist goes down,

she is close enough to see it and cannot come — AP_0020 is a design decision about an ache, and it is

the ache the gift at CH13_B13 answers. The player is not told any of this; AP_0012 simply becomes

true nine beats later, and the first time she crosses a field to reach them, the object at her throat

has a meaning nobody narrated.

THE BAND INTERACTION WITH §8.11, stated as four invariants because each one is a way this class could

go wrong.

exactly as protected as a Ntala at Family. The alternative converts the relational ladder into an

ally-survivability resource and re-imports, on the safety axis, precisely the immunity §8.11.2

rules out: "opposition tops out at 100 and the effective trigger caps at 90, so complete opposition

always forces departure and investment can never buy immunity"

[SRC: T1_Integrity_Paths_Worldstates_Master # The Departure Rule].

for_life [SRC: T0_Character_Index @ CHAR_0002], and §8.11.3 rules that "a for_life companion

never departs via the loyalty mechanic"

[SRC: T1_Integrity_Paths_Worldstates_Master # The For-Life Inversion]. No safety row writes a

WS_028 event, and AP_0019's imperilled withdrawal is an encounter state and never a DEPARTED.

class-and-direction tokens per the §5.1 integrity precedent — never point values" and that per-beat

numeric rates are runtime clamps rather than canon magnitudes

[SRC: T1_Integrity_Paths_Worldstates_Master # Override Authority and Write Discipline]. Taking harm

in a fight is not an authored bond-movement event, and a row that moved the bond on it would

manufacture exactly the per-beat accumulator the corpus does not have.

gates progression" and that intelligence buys pattern detection, proactivity and awareness

[SRC: T1_Integrity_Paths_Worldstates_Master # The Intelligence Axis and Ally Behavior Quality], and

the table's own extension note records the ruled player-input boundary: the player's only two

inputs are int_tier, which rows unlock, and role_tag, which rows apply. So a higher-Intelligence

Ntala picks better cover sooner — the factory's int_tier expansion of AP_0015 and AP_0016 — and

is never harder to kill. Survivability is flat; competence bands. That split is what keeps this

class out of the selectable bonus pools, where AP_0009's own note warns the build-space sweeps

"would correctly grade an ally-invulnerability option a meta-collapse"

[SRC: T0_Ally_Behavior_Policy @ AP_0009].

THE SCHEMA FLAGS, stated rather than smoothed, in the same register AP_0009's note uses for its own.

[SRC: T1_Integrity_Paths_Worldstates_Master # The Intelligence Axis and Ally Behavior Quality], and

a staging-and-targeting law is none of the three. awareness and proactivity are the nearest

members, chosen on the same reasoning AP_0009 records for itself; if the schema gains a targeting

or staging domain these six rows re-key with the ward six.

here: this class comes from neither the ally's build nor a carried object. ally_spread is

affirmatively wrong and would corrupt the D8 source_dominance defect the ward rows were

deliberately kept out of [SRC: T0_Ally_Behavior_Policy @ AP_0009]. encounter_staging is the

proposed third value. If the registry owner declines the mint, the interim value is BLANK — never

ally_spread.

support, heal, damage and terrain across seven rows, and a non-combatant fits none of them

[SRC: T0_Role_Axis_Registry @ ROLE_SINGLE_SUPPORT]. ROLE_SINGLE_SUPPORT is used for consistency with

her six existing rows, and the gap is the exemplar's F-12 re-hit from a second direction, not

answered here.

order and nothing states whether a lower number wins. Combined with the grammar's missing negation,

this means the table cannot today express "this row applies unless that one does", which is why the

exclusion rides a positive flag. Both gaps are owed to the schema owner.

THE ALTERNATIVE THAT WAS REJECTED, with its reasoning, so it is not re-proposed. The mandate names

two possible shapes: a policy class or an authored staging rule. An authored staging rule — removing

CHAR_0002 from CH13_B04's actor set, or writing her out of the beat's live phase — is rejected on

three grounds. It is a spine edit, which this lane may not make and which the director would have to

buy for a symptom. It costs the chapter its best staging: her presence on the cliff at the moment the

sacred range is scaled toward the shaft is thematically exact, and removing a non-combatant from

danger to solve a schema hole is the omission the care doctrine forbids, not the care it asks for.

And it does not scale: HL_0096 binds Ch 13 through Ch 77, so a per-beat staging rule is sixty-five

chapters of the same decision made one beat at a time.

APPLY VECTOR

OWED, and to three owners.

owed to the ally-behavior registry owner, with the docs/fidelity_baseline.json refresh by

--emit-baseline in the same commit per the standing declare-in-the-same-commit rule. Not taken

here: this wave edits no registry.

alongside the identical flag AP_0009 already carries.

docs/CONDITION_EXPRESSION_GRAMMAR.md's owner. The grammar already carries a precedence

recommendation to Josh for & and |; this is the adjacent open item on the same surface.

RESIDUAL RISK

the Evil path the for-life bond inverts and Ntala "becomes an additional endgame opposition

encounter" [SRC: T1_Integrity_Paths_Worldstates_Master # The For-Life Inversion], and CH_13's own

Decisions block records that on the Evil band "she departs at the Ch-65 threshold still wearing it,

so 'while it holds' does not self-resolve" [SRC: CH_13 # Decisions surfaced]. AP_0009 through

AP_0014 are keyed on ally_ref CHAR_0002 with no lifecycle terminus. Read literally, an inverted

Ntala at Ch 75 is still not aggro-eligible, still not target-selectable and still not downable —

an unfightable opposition encounter. The chapter's scoping resolution answers the FORK_CH75_D KILL

branch, because that is a scripted player-directed fork outside encounter targeting, and it does

not answer the opposition ENCOUNTER §8.11.3 names. The lifecycle and superseded_by columns

exist for exactly this. Named, not repaired: it is a ward-row question and a §8.11.3 follow-on

ratification question, and it belongs to the director, not to this class.

manually by switching to them"

[SRC: T1_Integrity_Paths_Worldstates_Master # Direct Ally Control and the Character-Not-Unit Law].

Switching to Ntala hands the player a body with no combat verbs; switching to her while the ward

holds hands the player an untargetable body that can walk a live field, and whether player-driven

movement trips AP_0013's flag(local.bearer_acts) is unstated

[SRC: T0_Ally_Behavior_Policy @ AP_0013]. Owed to the same ratification as the inversion leak.

because magnitudes defer to Phase 5M calibration per §8.11.7's own closing clause

[SRC: T1_Integrity_Paths_Worldstates_Master # Player-Shaped Ally Stat Spreads]. A tuner who reads

the absence as a licence to make it a visible bar has re-created the meter AP_0009 forbids.

any beat in the corpus. The condition grammar's produce-before-consume doctrine applies, and the

encounter-setup layer that produces them is build-lane engineering scope, not canon.

F-3 — the stat-spread collision: a decision brief, not an edit

EVIDENCE RE-VERIFIED

PARTIALLY REPRODUCED. The collision is real, and it is not where the exemplar puts it. Saying so is

the result.

§8.11.7 in its own words: "Companions and familiars carry stat spreads the player builds. The player

makes the stat choices at each ally level-up, and equipment influence shifts the resulting profile

further. The spread drives the ally's specialties and preferred combat styles: how an ally fights

emerges from how the player built them, not from a fixed authored archetype." Its attribute substrate

is named and closed: "the canonical six-attribute roster owned by T1_Ability_Tree — Strength,

Dexterity, Constitution, Agility, Accuracy, Intelligence"

[SRC: T1_Integrity_Paths_Worldstates_Master # Player-Shaped Ally Stat Spreads].

HL_0096 in its own words: "NO combat abilities — informational and social capability only." Severity

canonical [SRC: T0_Hard_Lines @ HL_0096].

WHAT DOES NOT COLLIDE. A stat spread is not an ability. §8.11.7 grants six ATTRIBUTES from the

Ability Tree's attribute roster; HL_0096 forbids ABILITIES. The two terms are distinct throughout the

corpus — §8.11.6 lists "gear slots, an ability loadout, the selectable minor and major bonus picks"

as a set the attributes are not a member of

[SRC: T1_Integrity_Paths_Worldstates_Master # Companion Loadout Parity and Investment Protection] —

and a character with a Constitution value and zero abilities is a coherent object. The one clause of

§8.11.7 that touches the hard line is the derivation output "preferred combat styles", and a

derivation whose input set is empty of combat abilities simply yields none. So the collision as the

exemplar states it — spread versus no-combat-abilities — does not reproduce at source.

WHAT DOES COLLIDE, and these three are genuine.

major bonus picks drawn from each proficiency tier's pool, and the purchasable second and third

loadout sets" [SRC: T1_Integrity_Paths_Worldstates_Master # Companion Loadout Parity and Investment Protection].

Every item on that list is combat apparatus, and HL_0096 forbids her the whole list. The

investment-protection contract that rides it — the DEPARTED event returning gear and imprint runes

— is also inert on a never-threshold for-life companion who holds no gear.

spec viable; a tank companion is what frees the protagonist to build support. The party is a build

surface" [SRC: T1_Integrity_Paths_Worldstates_Master # Allies as Build Components and Team Composition as Content].

Ntala serves no role axis, and the same section rules that "a role axis that only one ally build

can serve is a defect" — a metric she cannot enter.

A COLLISION NEITHER SOURCE STATES, found by reading the registry against the T1 doc. Every one of

Ntala's six rowed policies reads power_source gear_imprint, and AP_0009's note says the choice is

deliberate: "attributing the ward's protection to the ally's own stat spread would corrupt defect D8

source_dominance, which exists to see exactly this" [SRC: T0_Ally_Behavior_Policy @ AP_0009]. But the

exemplar's §4.2 asserts that she may legally hold AP_0006, and AP_0006's own power_source is

ally_spread [SRC: T0_Ally_Behavior_Policy @ AP_0006]. That claim therefore PRESUPPOSES that she has

a spread. F-3's resolution is not an abstract tidy-up: it decides whether the exemplar's behavioral

section stands.

THE DESIGN — the decision brief

ALTERNATIVE 1, THE STATUS QUO. Nothing is declared. §8.11.7 reads as universal, HL_0096 reads as

universal, and the contradiction sits where it is.

AP_0006 legality claim above is already load-bearing and already unresolved. The exemplar filed

this finding precisely because the status quo is a live ambiguity in a shipped-tier document.

ALTERNATIVE 2, INTELLIGENCE-ONLY (the exemplar's proposed reading). Her spread carries Intelligence

and nothing else, buying §8.11.8 behavior quality alone.

output, and int_tier is already the table's ruled unlock axis.

the axis — Intelligence competes with the combat attributes on the same spread, so an ally cannot

be both maximally capable and maximally clever"

[SRC: T1_Integrity_Paths_Worldstates_Master # The Intelligence Axis and Ally Behavior Quality]. An

ally with no combat attributes has nothing for Intelligence to compete against, so she is a free

maximum-Intelligence ally. The reading reaches the exact outcome the ruled tradeoff exists to

forbid, arriving from the other side of it.

ALTERNATIVE 3, ATTRIBUTES-NOT-ABILITIES (RECOMMENDED). She carries the full six-attribute spread

§8.11.7 grants every companion. Its combat-facing derivation output is empty, because she has no

combat abilities for a style to be derived over. She is the declared exception to §8.11.6's loadout

apparatus, to §8.11.9's build-component reading, and to §8.11.10's direct-control mode, on all three

of which the hard line wins under the authority hierarchy.

scoped to the three clauses that genuinely cannot apply. It preserves §8.11.8's mandatory tradeoff

intact, because Intelligence now competes with Constitution and Agility, which for her are survival

attributes feeding AP_0015 and AP_0016's banding quality: the player's choice is clever versus

durable, which is a real tradeoff with a real cost. It keeps the AP_0006 claim legal. And it gives

the player one honest investment surface in the arc's moral anchor without giving her a weapon,

which is what the standing expand-and-enhance law asks for over the timid option.

only", and capability is a broader word than ability. A player-built Constitution spread that lets

her walk out of an area effect is arguably a physical capability, so Alternative 3 reads a

canonical-severity hard line narrowly in order to save a T1 clause — which is the authority

hierarchy running backwards.

half of the completeness law already rules that every body carries "real mass values", declared

range of motion, and a damage-type response

[SRC: DECISIONS_PENDING_JOSH # THE PHYSICAL REALISM HALF OF THE COMPLETENESS LAW], so she has a

body's properties whether or not a player shapes them, and denying her one would be the omission

the care doctrine forbids. She never acts, and AP_0013's acts-and-is-perceived boundary is the

corpus's own statement that carrying and acting are different things

[SRC: T0_Ally_Behavior_Policy @ AP_0013].

ALTERNATIVE 4, NO SPREAD AT ALL. She carries no attributes; her behavior quality is authored at a

fixed band.

rather than ally_spread — and it is the most conservative reading of HL_0096.

makes AP_0006 unholdable by her and so retracts the exemplar's §4.2; and it removes the player's

only investment surface in her, which is a live loss for no gain the hard line requires.

RECOMMENDATION: ALTERNATIVE 3, with the exception declared in three named clauses (§8.11.6 apparatus,

§8.11.9 build-component, §8.11.10 direct control) rather than as a blanket carve-out from §8.11.7.

The fallback if Josh reads "capability" inclusively is ALTERNATIVE 2, in which case the tradeoff

objection has to be answered separately, and the honest answer available there is that she occupies

no bench slot at all — her presence is narrative and her presence_nongating_class is

always_present, so she never competes for a fieldable position and the sweeps never score her.

This is a finding and never an edit. §8.11.7 and HL_0096 both stand exactly as written. Nothing in

this section is applied, and no hard-line row, T1 paragraph or registry cell is touched by it.

APPLY VECTOR

OWED to the director, for a Josh ruling under the decision protocol — this is system canon, so it

goes as a brief and never as a bare question. On ratification the edits would be: one paragraph in

§8.11.7 or §8.11.6 declaring the non-combatant companion exception and naming its three clauses, in

_source/01_Tier_1_Foundation/T1_Integrity_Paths_Worldstates_Master [ACTIVE v2.1].md; no change to

HL_0096, which is already correct; and a notes line on AP_0006 recording that a non-combatant

holding it draws on the Intelligence half of the spread only. None of the three is taken here.

RESIDUAL RISK

focuses from the best-friend selection, flagged at build/art/characters/CHAR_0002_CANON_SHEET.md

§7. This closure did not re-open CH_01 and does not claim that half is resolved.

attributes. That is a build-lane presentation question and it is real; a UI that shows Strength on

Ntala teaches the player she might one day fight.

be authored as a class rule, not as a Ntala clause.

F-4 — the travelling-companion rhythm: the schema extension

EVIDENCE RE-VERIFIED

REPRODUCED, and the collision is wider than one column pair.

§5.2.1 in its own words: "home_site_ref and work_site_ref — where the persona sleeps and where the

persona works, each a prefix-typed site reference: interior:INT_NNNN resolving to

T0_Interior_Space_Registry.interior_id, or zone:<zone_id> resolving to a Zone Catalog row on the

persona's own region page" [SRC: ENTITY_PERSONA_SYSTEM # The daily-rhythm axis]. Two prefixes, both

place-anchored, no third.

Three collisions, not one.

party stands, and neither is an interior nor a zone. The exemplar's proposed row correctly reads

both cells UNREPRESENTABLE rather than inventing a value, which is the right refusal.

them from Ch 13 to Ch 77 [SRC: T0_Character_Index @ CHAR_0002]. The zone half of the prefix

therefore has no home rail for her even if a zone could be named.

own calendar term (the Ch-4 Pawukon day names being the canonical hard case)"

[SRC: ENTITY_PERSONA_SYSTEM # The daily-rhythm axis]. A traveller has no single region calendar,

and a Pawukon day name means nothing at Great Zimbabwe.

The second instance is real and is named in canon rather than inferred: CHAR_0056, Nakhoda Binti

Hassan, is the ship-keeper the registry encodes as aboard, and the exemplar names her as the one

companion-to-companion edge inside the slice [SRC: T0_Character_Index @ CHAR_0056]. Her rhythm is

aboard-anchored, which is a third thing again — not a place, not the party's camp, but a vessel that

moves.

THE DESIGN — the schema extension, in four parts, backward-compatible by construction

PART 1, a new column rhythm_frame on T0_Persona_Index. Closed two-value vocabulary,

place_anchored and party_relative, DEFAULT place_anchored. This is the whole

backward-compatibility guarantee: it is a default-valued column addition, so every place-anchored

persona ever authored — which is nearly all of them — reads correctly with the cell blank and needs

no edit, and no existing column changes meaning.

PART 2, a third site-reference prefix party: on home_site_ref, work_site_ref and

T0_Persona_Schedule.site_ref, taking a closed four-value anchor vocabulary. It is legal only where

rhythm_frame is party_relative, and an interior: or zone: value on a party_relative row is

equally illegal — the mutual exclusion is what keeps the two frames from blurring into a

half-anchored third thing. The prefix follows the polymorphic-reference precedent §5.2.1 already

names at T0_Dialogue_Line.speaker_ref, T0_Bonus_Pool_Registry.capability_ref and

T0_RNG_Drop_Table.linked_entity_id [SRC: ENTITY_PERSONA_SYSTEM # The daily-rhythm axis], so it adds

no new mechanism to the schema, only a new member to an existing one.

PART 3, the schedule-state vocabulary is NOT extended. §5.2.1 closes it at four values, home, work,

social and sleep, with the stated reason that there is "one shared vocabulary for every class and

every culture ... the cultural specificity lives in the sites, the hours and the prose, never in a

bespoke per-NPC state machine" [SRC: ENTITY_PERSONA_SYSTEM # The daily-rhythm axis]. Under

party_relative the state home BINDS to party:camp. A traveller does have a home state; her home

is the camp, and the specificity lives in the site reference exactly as the section requires. This

supersedes one proposal-tier cell in the exemplar's §8, whose schedule_state_set reads

work;social;sleep with the note "no home state: she has no home site after Ch 3" — a

proposal-tier correction to a proposal-tier cell, touching no canon.

PART 4, the travel-mode selector needs NO new table. T0_Persona_Schedule already carries

window_ordinal, site_ref in the same prefix-typed form, and condition_expression, "validated by

docs/CONDITION_EXPRESSION_GRAMMAR.md and harness/condition_expr.py rather than by this spec, for a

window that only exists in some world states"

[SRC: ENTITY_PERSONA_SYSTEM # The daily-rhythm axis]. Travel, camp, settlement and aboard modes are

therefore four child rows on the existing table, each keyed on a positive travel-state flag. They

must be mutually-exclusive POSITIVES rather than one flag and its complement, because the condition

grammar carries no negation operator

[SRC: CONDITION_EXPRESSION_GRAMMAR # Boolean composition and precedence]. day_class reads

every_day on every party-relative row, which is the honest value for a traveller and is the column's

own default.

THE PROPOSED CHAR_0002 RHYTHM CELLS, superseding the two UNREPRESENTABLE cells in the exemplar's §8

and leaving its other cells standing.

columnPROPOSED valuenote
rhythm_frameparty_relativethe new column; every other persona reads place_anchored by default
home_site_refparty:campshe sleeps where the party sleeps, which is what the beat set stages
work_site_refparty:columnthe route is the work site; the settlement and aboard modes ride child rows
schedule_state_sethome;work;social;sleepcorrected from the exemplar's three-state cell per Part 3
presence_windowwork:06-20;social:20-22;sleep:22-05unchanged from the exemplar; the entry is written in the social window's tail
presence_nongating_classalways_presentunchanged; and see the invariant note below

THE PROPOSED CHAR_0056 SHAPE, named as the second instance and authored so it presupposes nothing.

rhythm_frame party_relative, home_site_ref party:aboard, work_site_ref party:aboard, with

a party:billet child row for time ashore. The shape describes an aboard-mode rhythm and asserts no

join chapter and no loyalty model, so it holds whichever way the CHAR_0056 registry-versus-spine

conflict the exemplar carries is reconciled. That reconciliation is not this lane's and is not

touched here.

THE NON-GATING INVARIANT GETS EASIER, NOT HARDER, and this is worth stating because the reflex is the

opposite. §5.2.1 extends the no-dead-end rule into time: "a required teacher asleep behind a locked

door at the hour the player arrives is a dead end that no authored decision chose", and every

schedule-bounded progression-critical persona must read always_present or

alternate_reach_declared [SRC: ENTITY_PERSONA_SYSTEM # The daily-rhythm axis]. A party-relative

persona is trivially always_present, because she is definitionally wherever the player is; the

frame cannot put her behind a door. The reachability gate at harness/check_no_dead_end.py gets a

class of rows it can pass by construction.

APPLY VECTOR

OWED to the ENTITY_PERSONA_SYSTEM owner, and it must land BEFORE rank 11 mints. §5.2.1's own

what-lands-with-the-mint clause names the commit shape: the foreign keys enrolled in

docs/fk_spec.json, "the prefix-typed site references, presence_nongating_class, day_class and the

two population bands as id-formats over their closed vocabularies", the extension columns declared in

docs/registry_extensions.json under the persona-rhythm owner, and the fidelity baseline refreshed by

re-emission in the same commit [SRC: ENTITY_PERSONA_SYSTEM # The daily-rhythm axis]. Because the

three tables do not exist yet, this extension costs ZERO registry edits today — it is a column

contract amendment only, which is exactly why it is cheap now and expensive after the mint.

RESIDUAL RISK

companion left at a home base for a chapter, a companion aboard a caravan rather than a vessel —

it is a vocabulary extension and not a schema change, but it is a ruling on a closed list.

carries a moving local clock, which is coherent but means a party-relative window is relative to

wherever the party stands, not to a region. Stated so no consumer resolves it against a fixed

region.

does not vary. Under Part 4 it does vary, by travel mode, so the child table is no longer empty for

her. That is an increase in authoring cost per travelling persona and it should be seen before rank

11 sizes the work.

F-5 — the WS_009 out-of-domain token: two tokens, three write sites, one of them unrecorded

EVIDENCE RE-VERIFIED

REPRODUCED AND WIDENED. The exemplar found one out-of-domain token in the slice. There are two, on

three write sites, and one of the two is recorded nowhere — not in the registry row's own observed-enum

pin and not in the exemplar.

The variable, quoted whole. WS_009, journal_status, type enum, default NOT_BEGUN, domain:

"NOT_BEGUN, ACTIVE_HEALERS_CHILD, TRANSFERRED_TO_PROTAGONIST, DECISION_TO_PUBLISH, PUBLIC_TRULY_GOOD,

PUBLIC_HEDGED_GOOD_ENOUGH, SUPPRESSED, NEVER_COMPLETED, SHARED_POST_CH58". Nine members. Its own D-1

note records that "all nine in-domain values are attested in use ... the domain string is complete

against the corpus", and that exactly two out-of-domain free-text tokens are known and were

"deliberately NOT typed into the domain (do-not-invent)": record_released_public at CH_57, reserved

to Josh at O-5, and financial_entry_complete at CH_42

[SRC: T0_Worldstate_Variables @ WS_009].

The sweep, CH_02 through CH_13, every journal_status and WS_009 occurrence classified.

sitethe writeverdict
CH_03, CH03_B12 out:ws.journal_status: +healers_child_unsigned_record_begunOUT OF DOMAIN, and unrecorded anywhere
CH_13, CH13_B01 out:ws.journal_status: ACTIVE_HEALERS_CHILDIN DOMAIN and correctly formed — the control case
CH_13, BE_0013 win-writews.journal_status: +evidence_loop_active_on_hard_recordOUT OF DOMAIN
CH_13, CH13_B11 out:ws.journal_status: +evidence_loop_active_on_hard_recordOUT OF DOMAIN, same token, second site
CH_13, both seam blocks and the Decisions blockprose references, no token writtenin-domain by description; not defects

THE DEFECT IS SHARPER THAN AN ENUM MISS, and the sharper statement is what makes the repair obvious.

Both out-of-domain writes carry the + prefix, and in this corpus + means APPEND. CH_13's own

Decisions block says of the companion token that "the token is append-legal on WS_027"

[SRC: CH_13 # Decisions surfaced], and WS_027 is type object

[SRC: T0_Worldstate_Variables @ WS_027] while WS_009 is type enum

[SRC: T0_Worldstate_Variables @ WS_009]. An enum holds one member and has nothing to append to. Both

writes are therefore ILL-FORMED BY TYPE, independently of what their token says — which is precisely

why "add the token to the enum domain" is the wrong repair and would leave the malformed write

standing. The corpus supplies its own control: CH13_B01 writes ACTIVE_HEALERS_CHILD with no +,

and that write is correct in both respects [SRC: CH_13 # Beat graph].

THE CH_03 WRITE IS THE MORE SERIOUS OF THE TWO, and it is a hard-line contradiction rather than only

a schema defect. HL_0070 rules the anchor set in terms: "Journal status canonical anchors: Ch 13

South Africa healer's child joins, journal begins", severity canonical

[SRC: T0_Hard_Lines @ HL_0070]. A journal_status write at CH03_B12 asserts a journal status ten

chapters before the journal exists. CH_13's own seam block asserts the opposite in machine-checkable

form — "ws.journal_status: none at entry → this node writes the evidence-journal begun in the

healer's child's hand (HL_0070)" [SRC: CH_13 # Seam state-diffs] — so the CH_03 write also

contradicts a live seam assertion, and it undercuts the band law the exemplar builds its whole Band A

on, in which the pre-join watching is unsigned residue and not a journal.

THE DESIGN — the disposition, with the exact repair named

REPAIR 1, CH_03 CH03_B12. Strike the ws.journal_status: +healers_child_unsigned_record_begun clause

from the beat's out: set. The other two out-keys, `ws.identity_hiding_status:

+active_concealment_strategic_discipline and local.departure_bali: true`, are untouched. NOTHING IS

LOST: the beat already carries systems: [journal:healers_child_unsigned_marks], its objective already

states that "the healer's child has begun leaving unsigned marks where the protagonist sleeps", and

its reveal field already carries "the watching unsigned — the healer's-child mystery held open toward

the Ch-13 join" [SRC: CH_03 # Beat graph]. This is the identical argument CH_13's own O-5 adjudication

made when it re-keyed its free-text token — "the healer's-child-hand texture is already carried by the

beat's objective and reveal note, so nothing is lost" [SRC: CH_13 # Decisions surfaced]. After the

strike, WS_009 holds its declared default NOT_BEGUN from the Prologue to CH13_B01, which is what the

row, HL_0070 and CH_13's seam all independently require.

REPAIR 2, CH_13, both sites. Strike the ws.journal_status: +evidence_loop_active_on_hard_record

clause from CH13_B11's out: set and the identical clause from the BE_0013 win-condition line.

CH13_B11's other out-key local.steenberg_faced: true is untouched, and it is the key CH13_B12 and

CH13_B15 both consume, so the chapter's state chain is unaffected. NOTHING IS LOST: the beat already

carries systems: [boss:BE_0013.P3, antagonist:NW_0011, decode:journal_evidence_activation] and its

objective already states the loop closing in terms [SRC: CH_13 # Beat graph]. After the strike, WS_009

holds ACTIVE_HEALERS_CHILD from CH13_B01 to the Ch-38 TRANSFERRED_TO_PROTAGONIST anchor, which is

what HL_0070's anchor list requires.

WHAT IS DELIBERATELY NOT PROPOSED. Neither token is proposed for the WS_009 domain. The row's own D-1

note records the standing discipline for exactly this class: the two known out-of-domain tokens are

"deliberately NOT typed into the domain (do-not-invent)", and one of them is reserved to Josh

[SRC: T0_Worldstate_Variables @ WS_009]. Minting an enum member is a registry act and a domain-canon

act, and this closure mints nothing. Semantically the refusal is also correct: all nine in-domain

values are CUSTODY-AND-PUBLICATION states of the journal, and "the evidence loop is active on a hard

record" is a capability of the journal, not a custody state — it does not belong in this domain at any

count.

IF A DURABLE CONSUMER GENUINELY NEEDS THE EVIDENCE-LOOP STATE, rather than the systems token, that is

a variable-mint question and the new variable belongs BESIDE WS_009, not inside it — the corpus

already carries ws.journal_voice_texture as a separate journal axis on the same object, which is the

precedent for splitting a journal property out rather than overloading the custody enum. Named as the

shape of the question, not answered: a variable mint is the worldstate owner's act.

APPLY VECTOR

OWED, and to two owners.

CH13_B11 and at the BE_0013 boss line — owed to the spine owner. These are canon edits and this

lane may not make them (contract clause 6). Each is a clause strike inside a line, not a line move,

so no line-cited pointer shifts and the CH_13 addendum's append-only discipline is not disturbed.

in the Ch 2-13 slice and repaired at source rather than typed into the domain, owed to the

worldstate registry seat with the docs/fidelity_baseline.json re-emission in the same commit.

Optional, and worth doing: the D-1 pin currently reads as a complete census and is not one.

RESIDUAL RISK

through CH_13, and that is what was swept. CH_14 through CH_77, the Prologue and the Epilogue were

NOT swept, and the WS_009 row's own two known tokens sit at CH_42 and CH_57 — outside the slice —

which is direct evidence that the class extends past it. A full corpus sweep for +-prefixed

writes on every ENUM-typed worldstate variable is owed, and it is larger than WS_009: the type

argument above applies to every enum row in the table, and nobody has run it. This is the gap-hunter

finding of this closure and it should be boarded as its own work item.

CH_13's append-legal statement, and the condition grammar governs conditions rather than writes, so

there is no write-side grammar to check it against

[SRC: CONDITION_EXPRESSION_GRAMMAR # The five predicate surfaces]. A write-side grammar is the

structural fix behind all of it, and it does not exist.

consumer somewhere reads a journal status to know the watching is live, it will read NOT_BEGUN

after the repair. Nothing in the executed corpus was found doing so, but the sweep for consumers

was not exhaustive, and the honest form of this is a caution rather than a clean bill.

What this closure does not cover

The exemplar files twelve findings, of which eleven are distinct. This closure owns four. The other

seven are named here with what they are and who holds them, so none of them rots on the assumption

that the owner lane took everything.

of any CHAR_0002 row in T0_Voice_Registry, while HL_0071 makes her journal voice canonical and

path-variable — "Truly Good rich warm attentive; Good Enough middle register; Evil sparse cold

clipped ... Journal voice is the healer's child throughout" [SRC: T0_Hard_Lines @ HL_0071] — and

the registry's two adjacent rows are cultural registers rather than a per-character one. It belongs

to the voice-registry seat and it is a registry mint, which this wave forbids in any case.

above names an aboard-mode rhythm shape that is deliberately neutral on that reconciliation and

does not pre-empt it.

absence from docs/canon_derivation.json; and F-8, persona missing as a work kind in

harness/route.py. All three are schema-and-tooling items for the persona-system owner. F-8 bit

this lane too, and the routing note at §0 records it.

the exemplar itself declines to fill the blank nodes; nothing here touches it.

F-10 count does not include and re-grounds both on a type argument rather than an enum-domain one.

The director's ledger should retire F-10 into this closure's F-5 rather than tracking both.

F-1 above hits the same gap from a second direction — T0_Role_Axis_Registry's function_class

vocabulary has no non-combat member for a whole class of policy rows — and does not answer it. It

is a registry question and it is now carried by two findings, which is an argument for ruling it

rather than for splitting it.

and build/art/characters/CHAR_0002_EXEMPLAR_PREP.md. Nothing here touches it.

And what this document itself does not do. It mints no registry row, edits no canon file, applies no

ally-behavior policy, changes no spine clause, and touches no shared file — not docs/DOC_MAP.md,

not docs/fidelity_baseline.json, not docs/line_citation_baseline.json, not

docs/PIPELINE_LEDGER.md, not any registry CSV. It sets no numeric value, mints no enum member, and

reopens none of the ruled matters it stands on: the ward's concealment reading, the J-2 story-death

lane, the J-3 rescuer role, the gift at the Ch-13 departure, the for-life model, or the Evil-band

inversion.

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