decisions/spine/RATE_MISMATCH_ANALYSIS.md
An adversarial re-test of this document's own framing (prompted by the region-page lane, which had hit a
structurally identical unauthored-number problem and found "the map is a judgment, not a lookup") **refuted
§5's central move.** Three of its findings were independently re-verified by the orchestrator before being
recorded here. §1-§4 stand; §5 and §6 do not.
THE LOGICAL DEFECT AT THIS DOCUMENT'S CENTRE. §5 correctly disowns the per-beat accumulator as the
brief's non-canon construction — and then, one paragraph later, promotes **that disowned model's free
parameter** to a cardinal question for Josh. If the accumulator is not the model, its rate is not a
question. This document argued itself out of its own conclusion and did not notice.
THE FRAMING IS DEAD — canon does not use an accumulator at all. The ratified runtime architecture moves
the bond via a ±-clamped relationship_delta at ~0.03 Hz [SRC: docs/RUNTIME_GENERATIVE_LAYER.md # L113-114,
L143], and the persona doc states disposition is "generated fresh each encounter from the current state"
[SRC: docs/proposals/ENTITY_PERSONA_SYSTEM.md # L137]. That is a STATE FUNCTION, not an accumulator.
There is no running total for a per-beat rate to feed. The ladder bands a STATE, and a state bands
identically at any event count — so the ruled shared shape has NO hole, and the companion event rate is
UNCOUNTABLE too, exactly like the faction rate. §2's "the spine gives companions more relational surface"
comparison was measuring actor-presence, not accrual events.
VERIFIED BY THE ORCHESTRATOR, not taken on report:
and **348 of 348 ws.integrity_score writes in the executed spine are qualitative; ZERO carry a point
value** (+accumulative-generative, +initialized_at_zero_pre_divergence). Authoring a rate
demonstrably changes nothing about how the corpus writes.
one enrich.py hit is mastery_tier_threshold — the script-mastery column, an unrelated field.)
recommendation. Ruling 3's inertia is loyalty_score / 10, bonus capped at +15**. That cap requires
loyalty_score = 150. The domain is −100..+100 [SRC: docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md
# L150], so the maximum reachable bonus is 10.0 and the +15 cap can never bind. The 90-cap invariant
itself still holds (opposition 100 > any reachable trigger), so the ratified guarantee survives — but one
of its stated numbers is inert. Additionally, complete_opposition and invested_sticky — the very
thresholds that invariant is ABOUT — have zero live rows.
TWO INDEPENDENT RUNS CONVERGED ON THIS KILL. A separate workflow, briefed to treat the rate as
authorable, refused the lead sentence it was given: "I did not write the lead sentence I was given — I
measured it and it is false." Both runs re-derived the corpus with their own parsers and both reproduce the
HONEST numbers exactly (891 beats / 79 nodes; Ntala 191/55; Ana 44/22; ws.loyalty_score 0; ws.bond_state
0; familiar 99/38). They agree on every refutation below. Convergence from two independently-framed runs is
the strongest evidence this lane has produced.
**THE CONFLATION AT THE ROOT: this document counted a companion's PRESENCE IN A SCENE as MOVEMENT OF THE
BOND.** Those are different things, and the 20x swing is an artifact of the conflation, not a property of
the ladder. The real denominator is brutal: Ntala has ~2 authored bond-movement events per playthrough —
5 authored relational fork rows total, of which 4 are the mutually-exclusive options of a single fork
[SRC: docs/spine/CH_16.md # L167, L173-176] plus 1 at [SRC: docs/spine/CH_44.md # L158, L164]. Not 191. Not
106. Two. Every "saturation" and "unreachability" claim in §3 and §5 was computed over the wrong set.
THE RATE IS NOT CANON'S TO WRITE — it is a runtime clamp that already exists.
docs/RUNTIME_GENERATIVE_LAYER.md (ACTIVE) declares the mechanism at L113-116 and L143: a ~0.03 Hz
relationship tick emitting a ±-clamped relationship_delta, with the deterministic state machine owning the
thresholds. The "rate" IS that clamp — a runtime dial, not a magnitude class. Asking Josh to author it
is asking him to set a tuning value in someone else's subsystem.
TWO NUMBERS IN THIS DOCUMENT ARE RETRACTED:
runs caught it independently and showed the arithmetic: 191 × 0.5 = 95.5, not 53.0 (53/0.5 implies an
undisclosed denominator of 106); 44 × 3 = 132, not 87 (87/3 implies an **undisclosed denominator of
29**). Neither 106 nor 29 is reproducible by any filter over any structural field; neighbouring filters
give Ana 96 (clears +90) or 72 (misses by 18). Worse: "bond-moving" is defined NOWHERE in canon
— a repo-wide grep returns 4 hits, ALL inside this lane's own two documents, all rhetorical. This lane
invented a filter, never disclosed it, and published its output as measurement. The two most rhetorically
powerful numbers in this document were the two least real.
Tunde is carried across Ch 39-42 in companion_roster_state, with an authored fork and a Ch-75 payoff. The
defect is CLASS, not beat count. And the decisive point: **his loyalty row is an ILLUSTRATIVE SCHEMA
SEED that WS7 L158 expressly forbids reading as canon** — the spine names him in the same sentence as
Amboko (CHAR_0126) and Oupa Gert (CHAR_0125), *neither of whom carries a loyalty row*, nor does Wenceslao
(CHAR_0148). Independent corroboration of the seed signature: WS7's two seed blocks name DIFFERENT triples
(attackability seeds CHAR_0002/0003/0109 at L169-171; companion-loyalty seeds CHAR_0002/0017/0127 at
L144-146), yet the registry carries BOTH column families on the UNION of all five — so Ana's and Tunde's
attackability_tier were never seeded by WS7 at all. They are scatter inference.
THIS LANE MADE THE SAME MISTAKE TWICE. Ruling 1 established that the six-tier ladder was an author's
shorthand mistaken for Josh's canon. Tunde's loyalty row is the *identical provenance shape* — an
illustrative seed read as a cast — and this lane built a cardinal on it without checking. The lesson from
Ruling 1 was available and was not applied.
L151 pointer for the brief's relational-reuse construction is stale — the claim lives atL170. Both docs and the task brief inherited the wrong line.
THE DISPOSITION, replacing §5 and §6:
different question either.** Author the rate WHEN THE FIRST CONSUMER EXISTS — at the WS_027 wiring commit
— as a class-and-direction taxonomy per the §5.1 precedent. Not before.
intended; 3 are rowed. ~~The spine travels with four characters carrying NO loyalty_model at all
(CHAR_0140 / CHAR_0144 / CHAR_0145 / CHAR_0146) while rowing Tunde, who never travels.~~ **[STRUCK — R2
correction, 2026-07-17: measured refutation. CHAR_0140/0144/0145/0146 EACH appear in exactly ONE node
(their home chapter) — stationary single-region heritage-keeper NPCs, not travellers; lacking a
loyalty_model is unremarkable (121 of 128 acting CHAR_ids are single-node). A filter artifact, not a
finding. What stands: Tunde is rowed yet barely present.]** It is genuinely
Josh's per WS7 L158 — but it is NOT a ruling slot yet: "who are the ~30?" is a bare question, and the
standing decision protocol forbids those. Claude authors the roster brief from the spine's own evidence
first, then Josh rules it.
⚠ A SECOND DEFECT IN RULING 3, from the parallel run — RESOLVED by Josh 2026-07-17. Ruling 3 states
"Only loyalty_model = for_life is exempt" from departure. As measured this looked refuted by the live
spine: CH_65 L146 stages Ntala's departure ONLY on the EVIL path (path-differentiated — she continues on
TG/GE), and Ntala is rowed for_life / never, so the exempt companion appeared to leave on one band.
✅ RULED (Josh, 2026-07-17 — new cardinal): for_life INVERTS, it never breaks. On TG/GE Ntala travels for
life; on the EVIL path the bond does not depart the story — it INVERTS: she leaves the player's SIDE and
becomes an additional endgame OPPOSITION encounter, the arc's moral anchor standing against what the player
has become. So CH_65's Evil-path staging is **the inversion beginning, not a departure-per-the-departure-
rule**, and the "only for_life is exempt" clause is now CONSISTENT with it (a for_life companion never
departs via the loyalty mechanic; on Evil she turns to oppose).
The 90-cap INVARIANT is untouched and still holds — this was the exemption clause, not the cap. It needs
no new ruling, only alignment at the §9 wiring commit. FOLLOW-ON (design, not ruled here): the endgame
opposition-encounter seating / chapter / mechanics / spare-kill semantics (per the F1 Vritra precedent) and
the grief-never-triumph care register. (Note also: D-23 is therefore already RULED, not pending — recorded
in the queue sweep.)
✅ THE TARGET IS RULED (Josh, 2026-07-19): on a sustained best-play generative run, Ntala reaches
Family (+90) at ~the Ch-65 path-lock; Ana peaks at Trusted; a merely-good run misses Family. Recorded
in the D-REL-BANDS queue record; consumed at the WS_027-consumer authoring commit.
Where the two runs DIVERGE, and the disposition that takes both: the no-correct-value run says retire
outright and replace with nothing; the parallel run says rule the calibration TARGET rather than the rate
(Ntala → Family at ~Ch 65 path-lock; Ana never; a merely-good run misses it). These are compatible and both
are taken: the RATE question retires, and the TARGET — a statement of design intent, not a number — is
the cheap, genuinely-Josh thing that would guide the later authoring when a consumer exists. A refinement
that matters for that authoring: integrity's writes are classed but never numeric (`+accumulative-
generative`), and 0 of 696 relational writes carry a class at all against 182 classed integrity deltas
adjacent. So the §5.1 precedent to follow is a class-and-direction taxonomy, never a point value.
Citations: the re-test checked 23 (21 resolved, 2 corrected); the parallel run checked 24 (22 resolved, 1
the propagating L151→L170 defect, 1 superseded) and re-derived every number with its own parsers.
Status: the carried risk is DISCHARGED as stated and REPLACED by a different, better-shaped one. Josh's
four D-REL-BANDS rulings (2026-07-16) all STAND UNAMENDED on the measured numbers. Nothing here re-opens
them. One genuinely new cardinal question is surfaced at §5 and one roster call at §6.
Method: a read-only parser over all 79 executed docs/spine/CH_*.md nodes, reading the v3.1 typed beat
rows' structural actors: field (891 beats parsed; 891 carry actors:; zero parse failures). Counts are
measured, not estimated. The faction half is explicitly UNCOUNTABLE and is marked so rather than guessed.
The brief §8 supposed: "a companion realistically only ever encounters a dozen bond-moving beats across
the arc while a faction sees hundreds of transactions", so +90 would be "an unreachable companion
ceiling" making the top tier dead content.
Measured, per the structural actors: field:
The premise is off by roughly 9-16x for the primary companion. Family is not dead content for Ntala.
Exactly 5 of 162 Character_Index rows carry any loyalty value, matching the brief's own §3 count
[SRC: registries/T0_Character_Index [ACTIVE v1.1]/T0_Character_Index DRAFT v1.1.csv # cols 14-19].
The faction side is UNCOUNTABLE from this corpus. ws.faction_standing_per_faction carries 50 writes
across 16 of 79 nodes, every payload qualitative (temple_household +, court −, +small); only two
payloads contain a digit at all. The "hundreds of transactions" §8 posits live in an ambient runtime
sandbox layer that no spine node enumerates.
So §8 compared one quantity that is now measured against one the corpus cannot supply. On the surface the
spine actually gives companions FAR MORE relational surface than factions (191 actor-beats / 55 nodes
versus 50 standing-writes / 16 nodes) — the inverse of the assumption the risk rested on.
If a bond beat is Substantial, Ntala crosses +90 at the Substantial FLOOR by Ch 24 — roughly 30% into the
arc — and then plays ~53 more nodes of bond-moving beats with no headroom at all. At Substantial-mid she
pins Family by Ch 17. The top rung is not unreachable; it arrives so early that the ladder stops
expressing anything for two-thirds of the story. That is a real failure and it is the opposite of the one
that was carried.
Measured across all 79 nodes: ws.loyalty_score — ZERO writes. ws.bond_state — ZERO writes. Every
existing relational write is qualitative ("records no transition at Ch 23 … non-gating on every band";
"ana_drawn_deeper"). No beat anywhere carries a point value. This is consistent with the brief's own
"NOT YET WIRED" status and with tier_thresholds staying empty.
Note for the wiring commit: ws.familiar_bond_state (WS_012, the FAMILIAR axis) is a different variable
and is heavily written — 99 writes across 38 nodes. Do not confuse a bond_state grep with the familiar
axis; the NPC bond_state (WS_008) is genuinely unwritten.
This is the deepest finding and it re-aims the whole question.
Ntala's best-case total swings from 53 to 1060 — a 20x range — purely on which magnitude class a bond beat
belongs to. At the Accumulative floor (0.5) she totals 53.0 and NEVER reaches +90; at Substantial-mid she
reaches it by Ch 17. Nothing in canon assigns a class.
The apparent authority does not survive reading. T1_Integrity §5.1 L167 reads: "Substantial choices are
mid-magnitude INTEGRITY shifts tied to per-chapter primary boss encounters, trade master encounters, and
named-NPC relationship beats. They may shift INTEGRITY by three to ten points." That clause governs
INTEGRITY movement, not RELATIONAL movement
[SRC: _source/01_Tier_1_Foundation/T1_Integrity_Paths_Worldstates_Master [ACTIVE v2.1].md # L167 §5.1].
The claim that relational movement reuses those classes is the BRIEF'S OWN CONSTRUCTION at its L151
("Relational movement reuses the §5.1 magnitude classes rather than inventing a second set"), presented
there as substrate "not in contention" — it was never ratified and it is not canon.
The threshold was never the binding constraint. The unauthored per-beat rate is. Every option that
adjusts thresholds is aimed at the wrong variable: it treats a RATE problem as a THRESHOLD problem.
Ana is the proof that this is not academic: at the Substantial floor she tops out at 87 — three points
short of +90. One rung of the ratified ladder is decided by a number nobody has written, and that is her
BEST case; any non-maximal or negative beat puts Family out of reach entirely.
No threshold on any ladder makes a one-beat entity climb nine rungs. The brief's mitigation actively
backfires here: lowering his Family threshold so a single beat could reach it would mean the top
companion tier is earned in one conversation — that does not fix dead content, it cheapens the label the
naming method just ratified. Per WS7: "Per-companion loyalty ASSIGNMENTS are characterization canon" —
which companion gets which loyalty_model / belief_axis / departure_threshold / join_trigger is Josh's call
[SRC: docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md # L158]. Either Tunde gets more beats, or his
drawn_conditional model is wrong for a one-node presence. Not a tuning pass.
Ruling 4's aggravation is confirmed as a mechanism but it bites HERE, not on the axis: per-axis labels do
hide the failure (Family never firing for Tunde says nothing about why), but that is one roster row, not
the companion axis as such.
the numbers. Rulings 2, 3 and 4 all stand unamended. Canon cost: none.
measured beneficiaries and two measured victims: Ntala and Ana already clear +90, so lowering their
ceiling makes Family cheaper for the two companions who never had the problem, while Tunde still
cannot reach even +60 (his ceiling is one beat). It re-imports Scheme A's verbatim rejected defect (the
brief killed A because "Exalted at +60 … destroys the completionist grind") onto the companion axis. And
the conditional it rides on — Ruling 2's "if the companion-beat count proves too thin for +90" — is
measurably NOT triggered.
a spend limit. Both are subsumed by §5 anyway: once the rate class is authored, the rate question IS the
magnitude question.
The brief and the queue both carry this sentence: "tier_thresholds is a per-row column, so a per-axis or
per-faction threshold override is ALREADY schema-supported and needs no ladder fork." It is TRUE about the
SCHEMA and MISLEADING about the AUTHORITY. Schema support is not ratification, and "needs no ladder fork"
does rhetorical work it has not earned — Ruling 2 was not about whether a fork was mechanically cheap, it
was about which variant is canon.
The distinction no doc in this lane drew, and which the registry CANNOT enforce (both moves look identical
in a per-row cell, so it has to be held in doctrine):
creative-within-vision, and may be applied showing the path. It varies a row WITHIN the ruled scheme.
wearing a schema hat. Josh ruled the PLAIN Scheme C explicitly over the per-axis-thresholds variant, so
applying this as "tuning" would be re-litigating Ruling 2 by exploiting a column. It requires a NEW
RULING and must be brought as one.
Note the asymmetry that makes the "tuning" framing tempting and wrong: Ruling 3's magnitudes were
expressly ratified as AUTHORED STARTING VALUES that playtest may move without a re-ruling. Ruling 2's
bands got no such clause — it demoted per-axis override to "a later tuning move, not a founding
assumption", which authorizes revisiting the QUESTION later, not pre-approving the ANSWER.
This authority note belongs in the §9 wiring commit.
tier_thresholds keepsthe ratified nine bands as the GLOBAL DEFAULT with no per-axis override row.
L151 relational-reuse claim is marked as the brief's own construction rather than canon.
and Tunde's roster assignment (§6).