RATE_NO_CORRECT_VALUE_TEST.md

decisions/spine/RATE_NO_CORRECT_VALUE_TEST.md

Testing H — "the per-beat relational rate has no correct value, so it is the wrong question"

Read-only adversarial test, 2026-07-17. Nothing applied. All counts re-derived by my own parser over the

live tree; the concurrent lane's worktree (.claude/worktrees/clever-robinson-1527c2/) was excluded.

---

VERDICT ON H: TRUE — and the sibling lane reached the right answer by the weakest of the four available routes.

H is correct that no canon assigns a relational magnitude class, and correct that a ruling slot spent on

"what is the rate?" is wasted. But "it's a judgment, not a lookup" is the *softest* argument for that

conclusion and the one most easily answered with "fine — judgment is what a ruling IS." Measurement

supplies three harder ones. (1) Nothing consumes the number. loyalty_score is not declared in any live

registry, has zero writes across all 79 nodes, is referenced by zero lines of harness code, and its five

declared consumers exist only inside a plan document. **(2) Its one ratified consumer is arithmetically

insensitive to it** — under the ratified departure rule, the entire "Ana is three points short of Family"

question moves her effective trigger from 68.7 to 69.0, i.e. 0.3 points on a 100-point opposition scale.

(3) The integrity axis is a controlled experiment that already ran: integrity *has* an authored per-beat

rate in canon (§5.1), and all 406 ws.integrity_score writes in the spine are still qualitative

(+substantial-generative), zero carrying a point value — so authoring a rate demonstrably does not change

what the spine records. And (4) the deepest defect is a logical one: RATE_MISMATCH_ANALYSIS.md §5

correctly disowns the per-beat accumulator model as the brief's own non-canon construction, and then in the

same section promotes *that disowned model's free parameter* to a cardinal. You cannot disown a model and

keep its parameter as a canon question. One correction to H: it implies the rate is unanswerable in

principle. It is not — it is answerable exactly the way §5.1 answered it for integrity, as a

class-and-direction taxonomy, and that authoring is Fable-5 tuning, not a Josh cardinal. The rate is not

un-authorable; it is un-ruling-worthy.

---

1. What I reproduced, and what I could not

The RATE_MISMATCH parser is honest about its stated method and I reproduce it exactly:

ClaimSourceMy re-derivationStatus
891 beats parsed, all carry actors:RATE_MISMATCH L8-9891 across 79 nodes✅ exact
Ntala CHAR_0002 — 191 beats / 55 nodesL19191 / 55✅ exact
Ana CHAR_0017 — 44 beats / 22 nodesL2044 / 22✅ exact
ws.loyalty_score / ws.bond_state — zero writesL490 and 0✅ exact
ws.familiar_bond_state — 99 writes / 38 nodesL54-5699 / 38✅ exact
Faction rate UNCOUNTABLE — 50 writes / 16 nodes, qualitativeL30-3250 / 16; 0 payloads carry a signed point value✅ (stronger than stated)
Tunde CHAR_0127 — 1 actor-beat, 1 node (Ch 39)L210 actor-beats, 0 nodesovercounted

Tunde has ZERO actor-beats. His single appearance in the entire spine is a prose cast line under the

## Key ally NPCs heading — not a typed beat row: "Tunde (the freed fixer, CHAR_0127) — the NDA'd local

collaborator…" [SRC: docs/spine/CH_39.md # L228, heading at L222]. The correction runs *against* the

counting lane's interest and *strengthens* its §6 conclusion: the roster defect is worse than reported.

The 87 is not reproducible — and this is the finding that breaks the cardinal

RATE_MISMATCH's arithmetic runs off a "bond-moving" subset — "~106 bond-moving" for Ntala (106 × 0.5 =

53.0, 106 × 10 = 1060, matching L63-64 exactly) and, implied, 29 for Ana (29 × 3 = 87, matching L78-79).

That subset is not the actors: field the method section claims to parse [SRC:

docs/spine/RATE_MISMATCH_ANALYSIS.md # L8-9], and no filter over any structural field in the v3.1 beat row

reproduces 106 or 29. I tried nine:

filterNtala×0.5×10Ana×3 (Substantial floor)
all actor-beats19195.5191044132 — clears +90
role core+climax+hook14773.514703296 — clears +90
role core+climax11457.011402472 — misses by 18
role core only9949.59901957
mode = character/dialogue6633.06601339
the doc's figure~10653.010602987 — "three short"

Ana's headline number lands between two adjacent filters that disagree qualitatively: at 32

bond-moving beats she *clears* +90 with room; at 24 she misses by 18, not 3. "Three points short of +90" is

not a measurement — it is the output of one unstated filter selected from a family whose members give

"clears," "misses narrowly," and "misses badly." The near-miss that makes the rate feel urgent is an

artifact of the filter, and the filter is itself an unauthored judgment sitting *underneath* the unauthored

rate. Two stacked judgments, presented as an arithmetic near-miss.

---

2. TEST 1 — Is the rate even well-defined? No. Neither axis has a countable denominator.

The premise of the whole rate question is that companions are countable and factions are not. **The

measurement inverts on inspection.** The ratified runtime architecture says the companion bond does not

move per authored beat at all:

reaction, a banter line, or a shifted disposition" [SRC: docs/RUNTIME_GENERATIVE_LAYER.md # L113 §A.4].

[SRC: same # L115]. The summary table repeats it: "personality ~0.03 Hz | … relationship-delta | …

relationship SM" [SRC: same # L143].

Relational movement is a ±-clamped delta emitted at runtime on a wall-clock tick, driven by play time

and emergent interaction. The 191 authored spine beats are the *skeleton*, not the event set. At ~0.03 Hz

across a 30M-word game the emission count is **UNCOUNTABLE from this corpus — exactly as uncountable as the

faction rate.**

So RATE_MISMATCH §2's finding — "the spine actually gives companions FAR MORE relational surface than

factions (191 actor-beats / 55 nodes versus 50 standing-writes / 16 nodes)" [SRC: same # L36-37] — compares

the *authored surface* of both axes. Neither is the runtime event set. It is an apples-to-apples comparison

of the wrong quantity, twice.

Does the ruled shape have a hole? No — and I decline to smuggle per-axis thresholds back in. Ruling 2's

shared ladder is a ladder over a state, not over an event count, and a state bands identically whether

it is fed by 100 or 100,000 events. The ladder is untouched by any of this. **The hole is in the per-beat

accumulator model, which is not the ladder and was never ruled.** The persona doc says so directly:

movement is "driven by three inputs read together: the protagonist's integrity band …, the specific

decisions the player has made toward this entity and its group …, and the mark the protagonist has left on

the entity's community" [SRC: docs/proposals/ENTITY_PERSONA_SYSTEM.md # L135] — and, decisively, "the

disposition is generated fresh each encounter from the current state" [SRC: same # L137]. That is a

state function, not an accumulator. There is no running total for a per-beat rate to feed.

---

3. TEST 2 — Ana's 87: category error, not a tuning gap

"Ana can reach Family iff the rate is ≥X" fails three ways at once:

1. The denominator is wrong (authored beats ≠ runtime relationship_delta emissions — §2 above).

2. The numerator is unreproducible (the "bond-moving" filter — §1 above).

3. The model is contradicted by the persona doc's own §3.2 (disposition is generated fresh from state,

not summed — L137).

And the executed spine already reaches her arc without a number. All 18 ws.companion_loyalty_transition_events

writes and all 35 ws.companion_roster_state writes are qualitative tokens:

ana_drawn_deeper · ana_present_and_aiding_cooling · ana_rejoined_melee_blade ·

ana_departs_next_node_ch41 · ana_wounded_bond_deepened · ana_forced_out_covered_by_wenceslao_or_hired_blade

(CH_27/28/29/42/51/55/56/61). Note the last one: the spine already executes a companion departure,

branch-resolved per FORK_CH55_A, with no score, no threshold, and no rate. The qualitative register is not

a placeholder awaiting a number — it is the working system.

The integrity control case settles it. Integrity is the one axis where the rate *is* authored:

"Foundational … ten to twenty-five points"; "Substantial … three to ten points"; "Accumulative … half a

point to three points each" [SRC: _source/01_Tier_1_Foundation/T1_Integrity_Paths_Worldstates_Master [ACTIVE v2.1].md # L165-169 §5.1].

Measured across the spine: **406 ws.integrity_score writes across 70 nodes, and ZERO carry a point

value.** They carry class-and-direction — +substantial-generative, −accumulative-corrosive, ~0,

"Substantial direction set". A fully authored rate produced exactly zero numbers in the spine. Authoring

the relational rate would change nothing about anything that exists today. That is not a prediction; it is

what already happened on the axis that ran the experiment.

---

4. TEST 3 — What consumes the number? Measured: nothing. Not one thing.

ConsumerStatus
ws.loyalty_score writes in 79 spine nodes0
ws.bond_state writes in 79 spine nodes0
Lines in harness/*.py referencing loyalty / bond_state / tier_threshold / standing_value0 (sole hit: mastery_tier_threshold in enrich.py L441 — a different subsystem)
tier_thresholds populated cells0 — empty on both FR_0001 / FR_0002
loyalty_score declared in any live registryNO

loyalty_score does not exist outside a plan document. WS_027 landed with its domain reduced to the

free-text "companion-loyalty runtime state" and its consumers field reading "companion-loyalty" — a

placeholder, not a consumer list [SRC: registries/T0_Worldstate_Variables [ACTIVE v0.1]/Sheet1.csv # WS_027].

The loyalty_score(-100..+100) spec exists only at [SRC: docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md # L150, L153].

Its five planned consumers — party_manager, dialogue_resolver, no_dead_end_pathing_resolver,

region_page_section_19_dispatcher, six_option_dispatcher — appear in exactly three files repo-wide, all

of them declarations: the WS7 plan, the WS registry cell that names them, and SSBL_APPENDIXB_MIGRATION.md.

None is code. None is a gate. None is a region page. (Contrast WS_001/WS_002/WS_008/WS_021, which carry

real, specific consumer lists.)

This is decisive for H. The proposal is to spend Josh's scarce authority authoring a per-beat rate for a

variable that is not declared, never written, read by nothing, and whose only ratified rule is insensitive

to it (§5). The honest consequence, exactly as the task anticipated: **author the rate when the first

consumer exists — at the WS_027 wiring commit — not before.**

---

5. TEST 4 — The 90-cap interaction: it dissolves the question, and exposes dead arithmetic

Ratified [SRC: docs/spine/RELATIONSHIP_TIER_BANDS_BRIEF.md # L36-51 Ruling 3, L221 §6]:

eff_trigger = min(base + min(loyalty_score/10, +15), 90), opposition ∈ [0,100].

Domain: loyalty_score ∈ −100..+100 [SRC: docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md # L150].

Finding A — the +15 bonus cap is dead arithmetic. max(loyalty_score/10) = 10.0 at the domain ceiling.

The +15 cap requires loyalty_score = 150, outside the ratified domain. It can never bind. (The task

brief's "saturates at loyalty_score=150" is the naive reading; 150 is off the axis.)

Finding B — the 90 cap binds for exactly one threshold, which has zero live rows.

thresholdbaseeff@ls=0eff@ls=100does the 90 cap ever bind?live rows
complete_opposition8585.090.0yes, at ls ≥ 500
major_opposition6060.070.0NEVER1 (Ana)
any_sustained_misalignment3535.045.0NEVER1 (Tunde)

All five populated loyalty rows, measured [SRC: registries/T0_Character_Index [ACTIVE v1.1]/T0_Character_Index DRAFT v1.1.csv # cols 14-19]:

Ntala for_life/never · Architect not_companion/circumstance · Ana come_and_go/major_opposition ·

Wabenhotep not_companion/never · Tunde drawn_conditional/any_sustained_misalignment.

load-bearing clause, "complete opposition ALWAYS forces departure and investment can never buy immunity"

— governs an empty set today.

docs/proposals/systems/RULINGS.md # L56] governs an empty set today.

loyalty_score does literally nothing for her. Which also dissolves RATE_MISMATCH §3's "saturation"

defect: Ntala pinning the top rung by Ch 24 has no mechanical consequence, because nothing reads the

score and she cannot depart.

Finding C — the price of the whole cardinal. Ana is the only companion for whom loyalty_score does

any work at all. Her Family-vs-Trusted question, priced against its only ratified consumer:

ls = 87  ->  bonus 8.7  ->  eff_trigger = 60 + 8.7 = 68.7
ls = 90  ->  bonus 9.0  ->  eff_trigger = 60 + 9.0 = 69.0
DELTA = 0.3 trigger-points on a 0-100 opposition scale (0.3% of the axis)

**The question that is being nominated for one of Josh's two remaining ruling slots moves the only rule

that consumes its answer by three tenths of one point.** The question does not shrink. It dissolves.

*(Both Findings A and B are Fable-5 tuning repairs, not rulings — Ruling 3 expressly ratified its eight

magnitudes as "AUTHORED STARTING VALUES" that playtest may move without a re-ruling, while fixing the SHAPE

and the 90-cap invariant. Correcting +15 → +10 restores the author's evident intent within that grant. Do

NOT tune the 90 cap itself — that is the ratified invariant.)*

---

6. The logical defect at the centre of the cardinal

RATE_MISMATCH §5 makes two claims in one section, and they destroy each other:

"The claim that relational movement reuses those classes is the BRIEF'S OWN CONSTRUCTION at its L151 …
it was never ratified and it is not canon." [SRC: docs/spine/RATE_MISMATCH_ANALYSIS.md # L71-73]
"The threshold was never the binding constraint. The unauthored per-beat rate is." [SRC: same # L75-76]

The per-beat rate is the free parameter of the model it just disowned. If "relational movement reuses

the §5.1 magnitude classes" is not canon, then "which §5.1 class does a relational beat belong to?" is not a

canon question — it is a question about an unratified model. §5 is internally inconsistent: it correctly

demotes the model and then promotes the model's parameter to a cardinal in the next paragraph.

One honest refinement in the lane's favour, which does not save the cardinal. §5.1 L167 *does* name

relationship beats — "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" [SRC: _source/01_Tier_1_Foundation/T1_Integrity_Paths_Worldstates_Master [ACTIVE v2.1].md # L167 §5.1].

So §5.1 is an event taxonomy that already classifies relationship beats — it just measures what they do

to *integrity*. The brief's transfer was a plausible axis-extension of a real taxonomy, not an invention

from nothing. RATE_MISMATCH is right that it is not canon. But this cuts *against* the cardinal: it shows

the missing piece is a class-and-direction taxonomy, which is precisely the artifact §5.1 already

models and which the spine already writes qualitatively for integrity. That is an authoring pattern to copy

at wiring time, not a question to put to Josh.

Citation defect, flagged. Both RATE_MISMATCH_ANALYSIS.md L71-73 and RELATIONSHIP_TIER_BANDS_BRIEF.md

cite the relational-reuse claim as the brief's "L151". Against the live file, **L151 is the

departure-enum line; the relational-reuse claim now lives at L170** — it moved when the 2026-07-17

correction block was inserted above it. The task brief inherited the stale pointer. Cite L170. (Exactly

the "later agent reads a stale pointer and trusts it" failure mode that RELATIONSHIP_TIER_BANDS_BRIEF §10

was written to prevent.)

---

7. TEST 5 — What IS the right question?

Weighed honestly, including the candidates the task named.

one numeric ladder across *every* relational axis including loyalty_score. And measurement gives no

warrant to re-open it: the integrity axis is numeric *and* qualitatively written, and the companion axis

can be the same. There is no fork here. Bringing it would be the §8 smuggling vector wearing a

measurement hat.

axes are runtime-driven state; both band fine. The ladder survives every number I derived.

TRUE, but not a question.** It is a finding, and it is *this* document. It needs no ruling; it needs the

§5 cardinal retired.

reported:

measured
Companion rows intended~30 [SRC: docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md # L158]
Rows carrying a non-not_companion loyalty_model3 (Ntala, Ana, Tunde)
Of those 3, rows the spine never travels with1 — Tunde: 0 actor-beats, 0 roster writes
Characters named inside live companion_roster_state writes with no loyalty_model4 — CHAR_0140 Edivan Kanamari, CHAR_0144 Helena Vasconcelos, CHAR_0145 Fortunato Ccahuana, CHAR_0146 Efraín Quispe Mamani (all CH_51)

The roster is inverted. The registry rows a companion the spine never travels with, and the spine

travels with four the registry does not row. Two ratified constructs (invested_sticky,

complete_opposition) govern empty sets. This is characterization canon — "which canonical companion gets

which loyalty_model / belief_axis / departure_threshold / join_trigger is Josh's call" — and mass

population is expressly forbidden pre-ratification [SRC: same # L158].

**But it is still not a ruling-slot question yet, and surfacing it as one would break the standing

protocol.** "Who are the ~30 companions?" is a bare question. The standing decision protocol forbids bare

questions absolutely. And most of the answer is *already derivable from the spine's own evidence* — the

executed nodes name who travels, when they join, when they leave. The correct next action is **Claude

authors the roster brief** (fan-out, deep-dive, adversarial, recommendation, strongest objection) grounded

in the 35 companion_roster_state writes and the 891-beat actor census — and *then* Josh ratifies a

proposed roster. That is a ratification, not a slot.

---

8. RECOMMENDATION

**H is TRUE. Do NOT spend a ruling slot on the rate. Retire the §5 cardinal outright — it is not a question,

and it should not be replaced by a different question.**

1. RETIRE the "per-beat relational RATE" cardinal from DECISIONS_PENDING_JOSH.md (the entry at L502

and the queue header) and from RATE_MISMATCH_ANALYSIS.md §5. Kill evidence: zero consumers (§4); a

0.3-point effect on its only ratified consumer (§5); the integrity control case proving an authored rate

yields zero spine numbers (§3); and the §5 self-contradiction — a disowned model's parameter cannot be a

cardinal (§6). **A parallel workflow is briefing this as an authorable number; that framing should be

stood down before it produces a brief for Josh.**

2. CORRECT the two measured defects in the analysis (both cut against the lane's own conclusion, both

should be recorded rather than quietly dropped): Tunde is 0 actor-beats, not 1 (§1); and the "87 /

three points short" figure rests on an unstated, unreproducible bond-moving filter whose neighbours

give 72 (misses by 18) and 96 (clears) (§1). Ana's near-miss is a filter artifact.

3. FIX the stale L151L170 pointer in both docs (§6).

4. AUTHOR THE RATE WHEN THE FIRST CONSUMER EXISTS — at the WS_027 wiring commit, not before — and

author it the way canon already authors this exact thing: a class-and-direction taxonomy per the

§5.1 precedent, with the point resolution living at Fable-5 tuning and the spine continuing to write

+substantial-generative-style tokens. The one *genuine* gap this whole investigation surfaced is small

and mechanical: relational writes carry direction (ana_drawn_deeper) but no magnitude class, where

integrity writes carry both. Adding the class token is creative-within-vision wiring — apply and show the

path; it is not Josh's.

5. APPLY as tuning, when a green window opens (Ruling 3's own grant; the concurrent lane has

fidelity/index_freshness red): the +15 bonus cap → +10, since +15 is unreachable on a −100..+100

domain (§5, Finding A). Do not touch the 90 cap — that is the ratified invariant.

6. IF a slot is spent on this system at all, spend it on the ROSTER — and not yet. The correct sequence

is Claude authors a grounded roster brief from the spine's own writes → Josh ratifies a recommendation.

Nothing blocks in the meantime: the queue's own sweep records that the two live items block nothing, and

all 79 nodes are executed and green on this axis without any of it.

Strongest objection to my own verdict. A ratified ladder whose top rung may be unreachable is a real

defect, and "no consumer exists yet" is the classic argument that lets a defect ship — this repo's own

anti-orphan memory says we build things and never wire them. I take it seriously and it fails on the

measurement: unreachability was computed from a denominator (authored beats) that the ratified runtime

architecture says is not the event set, through a filter nobody authored, on an accumulator model the

persona doc contradicts, for a variable no live registry declares. Every layer of the defect is

construction, not canon. The wiring commit is where a rate becomes real, and that commit is where a rate

should be written — by whoever writes it, at tuning tier, showing the path.

---

9. Verification statement

**23 citations checked; every one opened and read against the claim it carries. 21 resolve and say what is

claimed. 2 do not, and are corrected above:** RATE_MISMATCH_ANALYSIS.md # L21 (Tunde "1 actor-beat" — the

line resolves, but the claim is false against the corpus; it is 0), and the `RELATIONSHIP_TIER_BANDS_BRIEF

L151` pointer carried by both docs (resolves to the departure-enum line, not the relational-reuse claim,

which is at L170).

Every count in this brief is measured by my own read-only parser over the live tree, not quoted.

Reproducible: 79 nodes / 891 beats; per-actor census; ws.* write census by variable; the nine-filter

spread; the departure arithmetic. The concurrent lane's worktree was excluded from all counts.

Stated UNCOUNTABLE rather than estimated: the faction relational event rate (ambient runtime; 50

qualitative standing-writes / 16 nodes is the *authored* surface, not the event set); **and — new — the

companion relational event rate**, for the same reason and on the same authority (relationship_delta at

~0.03 Hz, RUNTIME_GENERATIVE_LAYER L113-114, L143). Neither axis has a countable denominator. **No figure

in this brief is invented; where the corpus cannot supply a number I say so rather than supply one.**

10. What I could not close

Only Josh can, and only against a brief that does not yet exist.

neighbouring filters disagree qualitatively. I cannot recover what its author meant, and did not guess.

architecture. Both are proposal-tier. I lean on RGL because Josh's own Ruling 4 cites it as canon

grounding** (L116, for five of the nine BOND labels) and ENTITY_PERSONA L134 cites §A.4 for the

locked-out threshold — but no tier doc owns this domain, and WS7 L160 already flags that the

companion-loyalty system needs a canonical T1 home. That gap is real, it is orthogonal to the rate,

and it is the thing most likely to generate the *next* phantom cardinal.

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