Build the conditioning registry, and a probe so "proven" stops drifting

The order opens with "two proven clusters live". They are not proven -- the
proven set is empty -- and this is the fourth consecutive order to start from
a stronger claim than the measurements support. Correcting that in prose four
times has not worked, so this session adds scripts/proven-status.js, which
recomputes the answer from the ledger: hits LOSES (-0.096, CI excluding zero),
total_bases INCONCLUSIVE (+0.004), strikeouts INCONCLUSIVE (+0.259 at n=57).
It deliberately reports sample readiness separately from recorded verdicts, so
"n>=500" can never again be read as "passed".

A counting error worth recording. The first read of the top-volume archetype
said BOMBER x hits was 641 rows -- gate-ready. It is 287. model_snapshots
holds one row per prop PER SNAPSHOT CYCLE, so joining it to ledger_entries
counts each ledger row once per cycle it appeared in. Deduping on the ledger
row id gives the true figure, and my own status script had the same bug until
it was fixed. That is the difference between running the gate and being short
by 213.

So no archetype x stat combination reaches the gate. BOMBER x hits at 287 is
the closest; pitcher archetypes are untestable at 58 settled strikeout rows
across all of them, so the pitcher half of this order could not be run.

The registry is built: recordConditioning keys archetype x underlying-skill x
interaction x status with measured lift, and the skill tag is MANDATORY and
enforced -- untagged entries are refused, and PROVEN without sufficient
evidence is refused. validatedSkills() returns the coherent profile as it
stands, which is {} for every archetype, by design.

BOMBER x hits conditioning was tested across the order's categories and every
result is underpowered: arsenal (barrel x breaking share) incremental +0.043,
batted-ball (launch x pitcher GB) +0.001, contact quality -0.020 and -0.015,
K x K -0.063. Within BOMBER the counter still leads on hits, 0.218 to 0.160,
consistent with the closed pooled negative.

One bug fixed mid-run: fromStatcastRow maps percentage and raw fields only and
does not carry pitch_mix, so the arsenal category first reported n=0 for every
row -- it was measuring nothing rather than failing. Without catching it,
"arsenal doesn't matter" would have been recorded from a column that was never
populated.

On defense: I looked for a derivable proxy before calling it unsourceable, and
there isn't one. We ingest no fielding data at all, and opposing pitchers'
hits-allowed conflates pitching with defense, so it would validate the wrong
skill. It needs Savant's fielding endpoint -- free, same host as the five
feeds already ingested -- and it is not sourced here, because sourcing it to
test at n=282 would answer nothing.

Nothing proved, so nothing was recalibrated and nothing shipped.

4,221 tests green (335 suites); web build exit 0.

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-03 21:49:51 -04:00
parent 9538e11198
commit ac1361486e
6 changed files with 468 additions and 5 deletions
+25
View File
@@ -3,6 +3,31 @@
## Last Updated
2026-08-03
## Session 86 (2026-08-03) — Conditioning registry + a probe so "proven" stops drifting ✅
Spec: `specs/conditioning-registry.md`. 4,221 tests / 335 suites green, build exit
0. Counter + batter model + pitcher engine byte-identical.
- **`scripts/proven-status.js`** recomputes the proven set from the ledger.
PROVEN_SET = **EMPTY**. Built because four consecutive orders opened by calling
null results proven; prose decays, a recomputed number does not.
- **COUNTING BUG CAUGHT:** joining model_snapshots to ledger_entries fans out
(one snapshot row per cycle) — BOMBER x hits read 641, true distinct 287.
Fixed in both the analysis and the status probe.
- **NO archetype x stat reaches the gate.** BOMBER x hits 287 (short 213) is
closest; pitcher archetypes untestable (58 settled Ks total).
- **Structured registry built:** `recordConditioning` keys archetype x SKILL x
interaction x status + lift, with the skill tag ENFORCED (untagged refused,
PROVEN-without-evidence refused). `validatedSkills()` = {} everywhere, by design.
- **BOMBER x hits conditioning tested, all UNDERPOWERED:** arsenal (barrel x
breaking share) incr +0.043, batted-ball (launch x pitcher GB) +0.001, contact
quality 0.020/0.015, K x K 0.063. Within BOMBER the counter still leads
(0.218 vs 0.160).
- **Bug fixed mid-run:** `fromStatcastRow` doesn't carry pitch_mix, so the arsenal
category read n=0 — it was measuring nothing, not failing.
- **DEFENSE: genuinely not derivable** from ingested data (no OAA/DRS; pitching
proxies conflate skills). Needs Savant's free fielding feed — not sourced,
because sourcing it to test at n=282 answers nothing.
- **Nothing proved → nothing recalibrated, nothing shipped.**
## Session 85 (2026-08-03) — Rung 1 derived free; the cap fix fingerprinted ✅
Spec: `specs/lineup-k-rate-rung1.md`. 4,221 tests / 335 suites green, build exit
0. Counter + batter cluster + pitcher engine byte-identical.