Re-adjudicate: nothing to demote, and close the hole that would have mattered

There is nothing to re-adjudicate. The proven set is empty and always has
been -- verified three ways: proven-status reports EMPTY, validatedSkills()
returns {} for every archetype, and zero conditioning entries have ever
reached PROVEN. The one PROVEN feature is recent_frequency_prior, which is the
incumbent counter itself, proven by the S78 ablation as ~100% of the
champion's resolution. It is the baseline every challenger is measured
against, not a conditioning interaction, and demoting it would leave the model
with nothing to grade from.

A correction to the premise: the cumulative gate did NOT catch a false
positive last session. It caught nothing, because there was nothing in the
proven set to catch. What it did was tighten alpha from 0.0026 to 0.0013
within one session, which demonstrated the mechanism working rather than a
demotion. So steps 3 and 4 -- demote, recalibrate -- are vacuous here, and
readjudicateAll says so plainly rather than glossing a no-op.

But the worry behind the order was well founded, and the audit found the real
exposure: promote() did not require the cumulative denominator. It checked n,
lift and CI, and nothing stopped a future session from testing eight
hypotheses, correcting by eight, and promoting on a p-value that would not
survive the programme's real denominator. That is precisely the hole that
makes a retroactive re-adjudication pass necessary later, so it is closed at
promotion time instead. isSufficient now refuses evidence carrying no
correction, evidence corrected against fewer tests than the cumulative count,
and any p-value that does not clear 0.05 over its own test count. The same
rule guards a PROVEN conditioning entry.

The second audit found two of four analysis scripts still correcting
per-session; pitcher-prove-k and tb-solo-and-interactions now use the
cumulative ledger, so the correction is native on every path.

reAblation.js is the standing second line: pure and injectable, so the
decision rule cannot drift from the gate's, and every verdict records both
p-values and both test counts so a demotion is re-derivable by anyone. A
feature promoted at alpha 0.05/20 can demote on the same p-value once the bar
is 0.05/60 -- correct, because the bar rose only after the programme had more
chances to get lucky. No fresh measurement is PENDING_RETEST and never a
demotion: absence of a re-test is not evidence, and demoting on it would
punish whichever stat happens to be off-season.

Net effect on the proven set is zero. No demotions, no recalibrations, and no
public ledger event -- announcing "recalibrated after re-adjudication" when
nothing changed would itself be a false signal of rigour.

4,238 tests green (337 suites); web build exit 0; counter byte-identical.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W1sivYNqY2TS5ftykmHBU9
This commit is contained in:
Kev
2026-08-04 15:13:39 -04:00
parent ece2b9f5f9
commit ff037e40c2
9 changed files with 473 additions and 14 deletions
+28
View File
@@ -1529,6 +1529,34 @@ phased plan in the Session-57 conversation / BUILD-STATE Next section).
- `team_defense` keys on Savant's DISPLAY NAME (a nickname, "Cubs") while game
logs give full names ("Chicago Cubs") — match on both.
## Re-adjudication + the promotion bar (Session 88 — non-obvious)
- **NOTHING HAS EVER BEEN PROVEN.** `proven-status.js` = EMPTY; `validatedSkills()`
= {} for all archetypes; 0 conditioning entries. The only PROVEN *feature* is
`recent_frequency_prior` — the incumbent COUNTER itself (S78 ablation showed it
is ~100% of the champion's resolution). It is the baseline, not a conditioning
interaction; demoting it would leave nothing to grade from.
- **The cumulative correction did NOT catch a false positive.** It caught nothing
(empty proven set). It tightened α 0.0026 → 0.0013 in one session — the
mechanism working, not a demotion. Don't restate that as a catch.
- **THE REAL HOLE (now closed): `promote()` could bypass the cumulative
correction.** `isSufficient` now REQUIRES `evidence.bonferroni_tests`, refuses
it if lower than `opts.cumulativeTests`, and refuses a `p_value` that doesn't
clear `0.05 / bonferroni_tests`. Same rule guards
`recordConditioning(status:PROVEN)`. This is what makes a retroactive
re-adjudication pass unnecessary — the bar is applied at promotion time.
- **Cumulative correction is now NATIVE on every analysis path** — `cluster-prove`,
`pitcher-prove-k` and `tb-solo-and-interactions` all use `testLedger`. If you
add a new analysis script, wire it or it silently corrects per-session.
- **`src/services/model/reAblation.js` is the standing second line.** Pure +
injectable (no DB, no measurement) so the decision rule can't drift from the
gate's. Records BOTH p-values and BOTH test counts per verdict so a demotion is
re-derivable. **No fresh measurement = `PENDING_RETEST`, never DEMOTE** —
absence of a re-test is not evidence, and demoting on it would punish whichever
stat is off-season. A feature promoted at α=0.05/20 CAN demote on the same
p-value once the bar is 0.05/60; that is correct, not unfair.
- **Don't emit a public "recalibrated after re-adjudication" ledger event when
nothing changed** — announcing rigour that did no work is itself a false signal.
## Active Skills
- vyndr-voice (all user-facing output)
- prop-analysis (grading methodology)