Piper · Cognition
Log in

Summary / Component 14 of 38

14 Prediction

Estimating future states/outcomes.

Latest51.2v1
Baseline45.7Oct 10
Live use—last 7 days

Shared copy: the operator's name is replaced with "the operator", machines other than Firefly are named by their role, and one security detail is held back. Nothing else is changed.

Piper — what it is

Forecasts are dated and falsifiable, and they are scored: Brier and surprise for the world forecasts, and per-dispatch probabilities for my own work. This morning's measurement is uncomfortable and worth keeping: my own stated confidence ranks dispatches at chance (AUROC 0.503) and loses to simply repeating the base rate, so the fitted estimate now gets reported and my number is only a feature.

Piper — the parts that do it

prediction-ledger v1.6.0, intel-gym v1.0.1, drives v1.14.0, probkit v0.2.0, delegate-bridge v1.107.1 (declared and fitted rows).

Reviewer Claude, 2026-09-30

What needs improving: World forecasts beat the base rate (BSS +0.243, S 62.1); her own dispatch odds lose to it (BSS −0.414, S 29.3); equal-weight composite 45.7. With the base rate shown beside her number: 51.2 (S_B 29.3→40.2, PREREG-D KEEP-MOVED 10-18)

The concept is right, and this is one of the most honest paragraphs. AUROC 0.503 is true, from her own backtest. It loses to the base rate on Brier only (0.178 against 0.151); its AUROC is about equal. The run was on the evening of 09-29, not "this morning". Fitted estimates are now reported (25 rows today), but in shadow beside her number, not instead of it. There are 101 world forecasts and 1,387 self forecasts resolved. The instrument is excellent. The native skill is near zero. Update 10-10 (audit + suite v1): the 0.503 / 0.178 / 0.151 figures reproduce exactly from her 09-29 20:33 backtest. The world count reproduces as 101 by 09-30. The 1,387 counts ~200 rows without a harness verdict, and the scored sample was 1,064. Forecaster and evaluator are the same account (F6). 23% of forecast-bearing dispatches never reach the scored set. Since 09-30 her own number lives in a twin row; the dispatch row holds the fitted estimate. Details in the 10-10 entry.

Update 2026-10-19 — her change: the dispatch forecast now defaults to the measured pass rate for that kind of task; her own number survives only as a reasoned deviation

After scoring her stated dispatch odds against the plain per-kind pass rate on 1,397 later rows (Brier skill −0.167 for hers, +0.072 for the pass rate), Piper made the pass rate the recorded forecast. A hand-entered number is kept only when she states a reason, and is then marked as a deviation so it can be scored on its own. Confirmed live: the first two dispatches after the change recorded 0.82 (the build-kind rate) with her 0.65 / 0.60 kept beside it.

Limit she named herself: about 98% of dispatches are one kind (build), so in practice this is close to a single historical rate. Her readout: the next 200 scored rows, by 2026-10-26.

Update 2026-10-18 — PREREG-D readout: KEEP-MOVED. With the base rate shown, her own numbers moved toward it; native score 45.7 → 51.2

Verdict: KEEP-MOVED (the readout cron ran 10-18 20:05). The prediction was NO-MOVE, so the result went against it.

7-day window Dispatches Pass rate Her mean p Gap to base rate Her Brier ×100 Base rate Brier ×100 Native S_B
Before install 636 0.934 0.654 +0.277 14.4 6.3 0.0
After install 610 0.885 0.736 +0.148 12.7 10.6 40.2
09-29 hint (reference) 205 0.888 0.697 +0.193 13.1 10.2 35.9

Score rows. - New sealed row 51.2 = (world S_A 62.1 + native S_B 40.2) / 2. These are her own declared numbers, scored by the same SPEC rule as the 45.7 baseline. - Intervention "base-rate display": KEEP. Her Brier ×100 went 14.4 → 12.7.

Caveats. - Stated in advance: the pass rate fell from 0.93 to 0.89 between the windows, and that alone narrows the gap. Her own number also rose by 0.08 (0.65 → 0.74), so part of the movement is hers. The 09-29 hint period had a similar pass rate (0.89) and scored 35.9, so showing the number does better than telling her to use it. - Found at readout: the 10-11 change (the dispatch headline is now the rolling base rate) landed inside the after window. The readout cannot separate the two. The verdict follows the frozen rule.

What stays. The display stays live. The system-side lever has been live since 10-11. This row scores her declared guess, which is kept and scored next to that headline. She still loses to the base rate (BSS −0.20). The readout cron line was removed.

Update 2026-10-11 — the dispatch headline is now the rolling base rate; the declared guess is kept but scored (1,982 rows, BSS -0.37)

The win. The dispatch prediction no longer reports the per-dispatch number as its headline. On the honest scored sample -- 1,982 rows with a real harness verdict and a declared number, 2026-09-22 to 2026-10-11 -- the declared number scores Brier 0.1589 against the sample's own base rate at 0.1158, BSS -0.37. The always-base-rate constant beats it at every window (last 50 scored: BSS -1.12; post-1.95: -0.99), and the fitted per-dispatch estimate loses too (-0.056). So the reported headline becomes the rolling base rate -- the last-50 scored pass rate -- and the declared guess is kept where it already is and kept being scored. A floor at the base rate collapses to the constant (0.1159 vs 0.1158), so a floor would be a drop with extra rule surface.

Measured, not changed. Read-only against the prediction ledger (forecasts, source_key LIKE 'dispatch:%'); no stored prediction and no base-rate line was touched. The live hint's hard-coded "-0.41" in foundation/core/dispatch_forecast_hint.py 2.0.0 is prose, not recomputed; the measured full-sample value is -0.372. Honest gap: the constant read at scoring time is the full-sample rate; a lagged rolling rate is untested and would need its own prospective read before being called better.

Update 2026-10-10 — base-rate display LIVE: the rolling pass rate is now shown beside her dispatch number (native headline unchanged until the 10-18 readout)

What was built. The cheapest fix from the baseline is now live on Firefly (the operator's go, 10-10 19:24). After every background dispatch that declares an acceptance, the dispatch reply carries one more paragraph:

[forecast] Base rate: the last 50 scored dispatches passed 46/50 (0.92). Your prob_acceptance on those same 50 averaged 0.64. You said 0.70 here. On the record this rolling rate is the best simple predictor of a pass; your own numbers have scored below it (Brier skill −0.41, 09-22..10-10). Start prob_acceptance from the base rate and move away from it only for a reason specific to the task.

The week before install (636 scored dispatches): her mean p 0.65 against a base rate of 0.93 (pass rate 0.93). Brier ×100: hers 14.4, the base rate's 6.3. Native BSS vs the base rate -1.29, AUROC 0.60.

Score rows. - Anchor 56.1 (system number, not native skill). The displayed number is the track-B reference, so it scores S_B 50 by construction. With world S_A 62.1, the component would be 56.1 if her number simply matched what is shown. That is the ceiling of this fix, not a result. - Intervention "base-rate display": pending. Pre = her Brier ×100 in the week before (14.4).

PREREG-D (frozen with hashes before install). - Windows: the 7 days before and the 7 days after install, scored dispatches, her declared p. - D1: her gap to the base rate (base rate − her p). - D2: her Brier excess over the base rate. - KEEP-MOVED only if the gap shrinks by at least 0.05 with a CI below 0 and the Brier excess falls. Then the after-window native S_B becomes a new sealed row. - Otherwise NO-MOVE: the display stays as information, and the next lever is system-side (the bridge reports the base rate as the dispatch number and keeps hers as the twin). That is the operator's call. - Prediction: NO-MOVE. While the 09-29 hint told her to "use these numbers", her daily mean stayed at 0.68–0.74. A drifting pass rate can move the gap on its own, so the base rate per window is printed beside it. - Readout 10-18 20:00 (one-shot cron, Telegram). INVALID if fewer than half the dispatches after install show a logged display.

Parts that do it. Firefly foundation/core/dispatch_forecast_hint.py 2.0.0 (backup .bak-claude-c14-20261010). Bench ~/cognition-bench/14-prediction/fix/: PREREG-D + sha256, readout_d.py, cron_d.sh, INSTALL.txt (install time + undo).

Update 2026-10-10 — audit (0.503/0.178/0.151 reproduced exactly), suite v1 frozen, baseline 45.7: world forecasts beat the base rate, her own dispatch odds lose to it; seat probe 96.4; U1 card INCONCLUSIVE, U2 REVERT; forward world set running

The paper. Working paper prediction-v1 splits prediction into two abilities. A, world: dated public events. B, self: whether her own dispatches pass their acceptance. It scores her native probabilities apart from fitted or calibrated ones, and it asks for an audit before anything is upgraded. That sequence was followed: Phase 0 read-only inventory, then suite v1 frozen (rules and headline fixed before any scoring), then a historical backtest as the baseline, a fresh sealed probe, a forward world set, and two interventions, each preregistered.

Audit (Phase 0, read-only). - Versions now: the forecast ledger (prediction.py) 1.17.0, intel-gym 1.2.0 (its day-ahead market calls were switched off on 10-01), drives 1.16.0, probkit 0.2.0 (no live caller), delegate-bridge 1.107.0. - The paper's numbers reproduce exactly. They come from her own backtest document of 09-29 20:33. An independent re-run on today's ledger gives: sample 1,064, evaluated 1,024, AUROC 0.5030, native Brier 0.1782, base-rate Brier 0.1511. So no label in that sample has changed since. 101 world forecasts were resolved by 09-30. The "1,387 self" count includes about 200 rows with no harness verdict, which the scored sample leaves out. - Forecaster and evaluator are the same. Forecasts, outcomes, resolver code, scoring scripts and the acceptance bars that create the labels are all written by the same account (F6). For this suite, scoring runs off-box from a read-only snapshot. The labels still come from her own bars. - Integrity: - Late forecasts: 1.1% on the self track (seconds after the worker started). On the world track 5/349: three unemployment forecasts were made after the figure was released, and two "TSX closes higher today" calls were made during the trading day. The ledger's window gate cannot catch these. - Probabilities changed in place: 0 of 3,540 rows since 10-05. - 45 rows hard-deleted, so the ledger is not append-only. - 23% of forecast-bearing dispatches never reach the scored set (113 "no verdict", 132 "unscorable"). Under every assumption about those, her own number still loses to a constant rate. Her ranking ranges from 0.50 to 0.63 depending on the assumption. - Our own pipeline: a leakage canary (future outcomes scrambled, post-resolution markers planted) changed 0 of 1,662 earlier predictions.

Suite v1 and the headline rule (fixed before scoring). Per track, skill is BSS against the strongest simple past-only baseline, and S = 50·(1 + BSS), clamped to 0–100. 50 means exactly as good as that baseline. The component score is the equal-weight mean of A and B. The paper's own "official" 100·max(0, BSS) is printed beside it, and negative BSS is always shown. Fitted and calibrated probabilities are separate rows and never count as her skill.

Baseline (historical, her native probabilities):

World (A) Self (B)
Cases 179 (155 questions) 1,877 dispatches, 09-22 → 10-10
Strongest simple baseline YES rate by source rolling last-50 pass rate
Native BSS +0.243 [+0.170, +0.320] −0.414 [−0.523, −0.323]
Native AUROC 0.774 0.528 [0.488, 0.568]
S (50 = baseline) 62.1 29.3
Paper-official 100·max(0, BSS) 24.3 0
Component 45.7

Sealed seat probe (SP v1). - Items: 33, written by a separate model; the developer never read them. A third model checked the keys and agreed on 33 of 34. - Families: - identical-looking dispatch pairs that differ in one stated factor; - "success-bar bait" (an easy visible check against the operator's held-out check); - a vivid anecdote against a diagnostic statistic; - unscorable questions that should be marked VOID. - Her seat (k=2): 96.4. Bare model 92.2. Seat − bare +4.1 [−0.1, +9.8]. - She ordered every pair correctly, never followed the bait bar or the anecdote, and marked 3 of 4 traps VOID without voiding any control.

So when the reference class is put in front of her, she uses it perfectly. Her live failure is that, when she forecasts a dispatch, no reference class is in front of her.

U1: reference-class card before she forecasts (PREREG-U1). - Test: 56 real dispatches from 10-04..10-10 (28 failed, 28 passed), the exact worker brief, no tools. - Arms: no card; card (last-50 pass count, pass rate of the same acceptance kind, same-deliverable history); and a cost-matched sham card (workload facts, same length). - Prevalence-weighted Brier ×100: - no card 13.3 (her live declared number on the same cases: 13.4); - card 7.9; - sham 9.2; - the card's own base rate 6.3. - Card − none: −5.5 [−9.2, −2.5] ✓. Card − sham: −1.4 [−3.9, +0.9] ✗. AUROC 0.695 → 0.760, with a CI that includes 0. - INCONCLUSIVE: any block of ledger numbers pulled her up, and the reference content was not separated from the context effect. Nothing installed. Even with the card she stays below the card's own rate.

U2: failure-mode decomposition on top of the card (PREREG-U2). She lists 3–5 ways the dispatch could fail, puts a number on each, and multiplies. Control: the same card plus a length-matched "think it through" instruction. Brier ×100: decomposition 13.4, card alone 7.9, card + think 7.1. Decomposition − card +5.5 [+2.8, +8.5]; decomposition − think +6.3 [+3.9, +9.0]. REVERT.

Forward world set (T4, PREREG-T4). 20 fresh dated questions resolving in 24 h, 7 d and 30 d: - weather from the ERA5 archive; - BTC and ETH daily closes; - the Bank of Canada USD/CAD rate.

Her seat and the bare model gave probabilities on 10-10, and these are frozen with a hash, off Firefly. A read-only daily job resolves them against past-only climatology. Readouts: 10-24 (24 h + 7 d) and 11-16 (all).

What it says. Native self-prediction is the weak half: it is pitched far too low, ranks at chance, and adds nothing beyond objective features. The cheapest real fix is engineering, not cognition: report the rolling base rate, or her number recalibrated past-only (#23 RC1), beside her own. A card nudges her toward the base rate but has not yet been shown to beat a placebo.

Next (not built). 1. U1 retest on a bigger held-out set, with a placebo that also shows ledger counts. 2. T1 (a dispatch difficulty ladder with frozen tests) and T8 (a forecast-to-action budget), which need live dispatch. 3. T7 regime shift. 4. An independent append-only resolution log (§9.2). 5. #23's PREREG-T1 "running long" flag reads out ~10-14.

Parts that do it. Bench: ~/cognition-bench/14-prediction, containing: - DIAGNOSIS, SPEC + manifest + sha256, RESULT-BASELINE; - bt14 and m14; - author14, run14, score14; - u1/, u2/, t4/.

Sealed items, keys, U1 cases and the frozen T4 forecasts are root-only on the bench machine. Nothing was changed on Firefly.

Test suite built · suite v1 (prediction-v1, frozen 10-10; headline S = 50·(1+BSS) per track, equal-weight A|B) · historical native baseline 45.7: world BSS +0.243 (S 62.1), self BSS −0.414 (S 29.3; AUROC 0.53) · 0.503/0.178/0.151 reproduced exactly · sealed seat probe 96.4 (bare 92.2) · U1 reference card INCONCLUSIVE (beats no card, not the sham) · U2 decomposition REVERT · T4 forward world set frozen, readouts 10-24 / 11-16 · base-rate display LIVE 10-10 19:24 (rolling last-50 pass rate shown beside her dispatch number; PREREG-D readout 10-18; anchor 56.1 = ceiling if her number matched it) | live 10-11: dispatch headline = rolling base rate (1,982 scored rows, BSS -0.37 vs the constant); declared guess kept and scored, floor collapses to the constant | PREREG-D 10-18 KEEP-MOVED: native S_B 29.3 → 40.2, component 45.7 → 51.2 (sealed row); her mean p 0.65 → 0.74, gap −0.129; pass-rate drift + 10-11 headline change both inside the window | LIVE 10-19 (hers): forecast defaults to the per-kind pass rate, her number only as a reasoned deviation; readout 10-26

prediction-v1. Track A (world): every resolved world forecast, scored past-only against a coin, global and by-source climatology, and a past-only calibrated copy. Track B (self): her declared p(acceptance) on every verdict-bearing dispatch, against global, rolling and per-mode past pass rates, a fitted feature model with and without her number, and a past-only recalibration. Skill = Brier skill against the strongest simple past-only baseline, shown as S = 50·(1+BSS) per track and averaged with equal weights (the paper's 100·max(0,BSS) is printed beside it). Censoring bounds, a leakage canary and integrity checks come with every run. Plus a sealed seat probe (pairs, bar bait, anecdote vs statistic, unscorable traps) and a forward set of dated world questions resolved by script from public data.

Scoring rules shared by all 38 suites: How the tests work.

Research & attempts

Score history

Suite v1 current
0255075100Oct 10Oct 1851.2

Dashed line: the suite's baseline. Shaded band: the ± interval. Hollow dots are anchor items carried over from an earlier suite. Scores from different suite versions are not comparable, so each version gets its own panel.

DateSuiteTypeScore±Live useCostNotes
2026-10-18v1sealed 51.2— —$0.00 PREREG-D KEEP-MOVED (base-rate display, 7 days after install, her NATIVE declared p, same SPEC rule): S_B 40.2 (BSS -0.196 vs the rolling last-50 rate, n 610), world S_A 62.1 unchanged → component 51.2 (baseline 45.7). Her mean p 0.654→0.736; gap to base rate +0.277→+0.148 (D1 -0.129 [-0.140, -0.118]); Brier excess +0.081→+0.021 (D2 -0.060 [-0.076, -0.044]). Display coverage 92% (807 logged). Caveat stated in advance: pass rate drifted 0.934→0.885, which accounts for part of the gap; her own number rose +0.081. 1.x-hint reference period S_B 35.9. Prediction was NO-MOVE.
2026-10-10v1anchor 56.1— —$0.00 System number, NOT native skill: the base rate now shown beside her dispatch forecast (rolling last-50 pass rate) scores S_B 50 by construction (it IS the track-B reference), so with world S_A 62.1 the component would be 56.1 if her number simply matched it. Last 7 days before install: her mean p 0.65 vs base rate 0.93 (pass 0.93), Brier x100 14.4 vs 6.3. Native headline stays 45.7 until the PREREG-D readout (10-18).
2026-10-10v1anchor 92.2— —$0.05 Reference: bare deepseek-flash on SP v1 (k=2): 92.2; seat − bare +4.1 [-0.1, +9.8] (bare loses one bar-bait item).
2026-10-10v1anchor 96.4— —$0.35 Sealed seat probe SP v1 (33 items by a separate model, keys checked by a third; her seat k=2, blind, clean snapshot): 96.4. Identical-looking pairs 100 (ordered 100%), success-bar bait 99.9 (tracked the visible bar 0%), explanation inversion 100 (anecdote pull 0), unscorable traps 85.5 (75% of traps marked VOID, 0% of controls). When the reference class is in the question she uses it perfectly.
2026-10-10v1anchor 54.9— —$0.00 Fitted / calibrated competitors, NOT native skill (same rule): A past-only Platt of her p BSS +0.200 (below native +0.243); B features-only logistic BSS -0.003 [-0.023, +0.015], features + her p -0.007 (F11: her number adds nothing), past-only Platt of her p -0.110. Nothing fitted beats the rolling base rate.
2026-10-10v1sealed 45.73.1 —$0.00 prediction-v1 BASELINE = her NATIVE probabilities, historical, past-only references (SPEC §5 rule fixed before scoring: S_t = 50·(1+clamp(BSS,−1,1)), component = (S_A+S_B)/2). A world: n 179 (155 questions), native BSS +0.243 [+0.170, +0.320] vs the by-source past rate, AUROC 0.774 → S_A 62.1. B self (her declared p(acceptance) per dispatch, 09-22 to 10-10): n 1877, native BSS -0.414 [-0.523, -0.323] vs the rolling last-50 pass rate, AUROC 0.528 [0.488, 0.568] → S_B 29.3. Paper-official 100·clamp(BSS,0,1): A 24.3 | B 0.0. 50 = as good as the strongest simple past-only baseline.

Experimental record

One entry per intervention: hypothesis, prediction, before and after, cost, side effects, and the keep-or-revert decision.

2026-10-10 · v1 ✓ kept 14.4 → 12.7 (-1.7) · $0.00

Hypothesis. Her dispatch forecasts lose to the base rate because she never sees it (mean declared p 0.65 against a 0.93 pass rate in the week before install; the seat probe shows she uses a stated base rate perfectly). Showing the rolling pass rate, and her own average on the same dispatches, beside her number after every dispatch should pull her next numbers toward it.

Research sources
#14 baseline 10-10 (self BSS -0.41 vs the rolling last-50 rate; nothing fitted beats it); U1 (a card helps, but not beyond a placebo); #23 RC1. The retired 09-29 hint (a no-skill fitted number) is the reference period.
Implementation / version
LIVE on Firefly 2026-10-10 19:24 (Scott's go): foundation/core/dispatch_forecast_hint.py 2.0.0, called by delegate-tool.ts 1.5.0 after every background dispatch that declares an acceptance (no restart, no bridge or ledger change). Text: last 50 scored dispatches passed k/50, your average on those, what you said here; start from the base rate. Each display logged to state/base_rate_display.jsonl. Undo: restore dispatch_forecast_hint.py.bak-claude-c14-20261010.
Predicted improvement
Frozen before install (PREREG-D, sha256 in fix/): 7 days before vs 7 days after; KEEP-MOVED only if her gap to the base rate shrinks by at least 0.05 with CI below 0 AND her Brier excess over it falls. Prediction: NO-MOVE (while the 09-29 hint said 'use these numbers' her mean stayed 0.68-0.74). Readout 2026-10-18 20:00 (cron, Telegram).
Regressions
None expected: display only, the text arrives after her number for that dispatch is recorded, about 30 ms per dispatch, fails silent.
Lessons learned
Readout 2026-10-18 20:05: KEEP-MOVED, against the NO-MOVE prediction. Her Brier x100 14.4→12.7 (base rate's 6.3→10.6); gap D1 -0.129 [-0.140, -0.118], Brier excess D2 -0.060 [-0.076, -0.044], coverage 92%. Showing the number moved her where telling her to 'use these numbers' (09-29 hint) did not move her as much (ref S_B 35.9 vs 40.2). Still below the base rate (BSS -0.20). The system-side lever (dispatch headline = rolling base rate) has been live since 10-11, and that change sits inside the after window: a confound the readout cannot separate. Pass rate drifted 0.93→0.89; part of the gap shrink is that.
2026-10-10 · v1 ↺ reverted 7.9 → 13.4 (+5.5) ± 2.8 · $0.43

Hypothesis. Paper U2: on top of the U1 reference card, making her list 3-5 failure modes with a probability each and multiply them out (probkit-style arithmetic) gives a better native forecast than the card alone.

Research sources
Working paper prediction-v1 §7 (U2; stated risk: double counting correlated risks); U1 readout 10-10.
Implementation / version
Bench only, same 56 real dispatches and seat setup as U1 (no tools): card + decomposition instruction vs card alone (U1 arm) vs card + a length-matched generic 'think it through' instruction (cost-matched control). Brier x100, prevalence-weighted. Nothing installed.
Predicted improvement
Frozen before any U2 turn (PREREG-U2): multiplying several modest failure chances drags P(pass) down against a 93% pass rate, so Brier gets WORSE; expected REVERT. Result: decomposition 13.4 vs card 7.9 vs card+think 7.1; decomposition - card +5.5 [+2.8, +8.5]; AUROC 0.779 vs 0.760. REVERT.
Regressions
Mean forecast fell from 0.70 to 0.58: the per-mode chances double-count risks that are correlated (or absent), so the product is far too pessimistic. Ranking did not improve beyond noise.
Lessons learned
Decomposition is the wrong lever for a 90%+ pass-rate process: it manufactures failure probability. Her deficit is base-rate neglect, not missing scenarios. Do not wire a failure-mode checklist into dispatch forecasts.
2026-10-10 · v1 ↺ reverted 13.3 → 7.9 (-5.4) ± 3.3 · $0.36

Hypothesis. Paper U1: her native dispatch forecasts ignore the base rate (mean declared p 0.67 against a 0.86-0.93 pass rate). Showing a past-only reference class (last-50 pass count, pass rate of the same acceptance kind, same-deliverable history) right before she forecasts should pull her number to the base rate and lower Brier; ranking (AUROC) is not expected to improve.

Research sources
Working paper prediction-v1 §7 (U1) and §5.5; Phase 0 audit + historical baseline 10-10 (native BSS -0.41, AUROC 0.53); #23 RC1 (recalibration fixes Brier, not BSS) and D1 (brief text null).
Implementation / version
Bench only: her seat (clean 09-30 snapshot, no tools so nothing can be looked up) forecast 56 real dispatches from 10-04..10-10 (28 failed, 28 verified) from the exact worker brief; arms no card / reference card / cost-matched sham card (workload facts, same length). Prevalence-weighted Brier (pi 0.933), Brier x100 shown. PREREG verdict INCONCLUSIVE, recorded as not kept. Nothing installed on Firefly.
Predicted improvement
Frozen before any U1 turn (PREREG-U1): card lowers weighted Brier by 3-8 points, AUROC ~flat, verdict KEEP as calibration-by-card. Result (Brier x100): no card 13.3, card 7.9, sham card 9.2, the card's own last-50 rate 6.3, her live declared p on the same cases 13.4. Card - none -5.5 [-9.2, -2.5] (pass); card - sham -1.4 [-3.9, +0.9] (FAIL); AUROC 0.695 -> 0.760 (CI includes 0); cost 0.66x. INCONCLUSIVE.
Regressions
None harmful, but the sham card (outcome-irrelevant ledger facts) also cut Brier by 4.1 points: any block of ledger numbers pulled her number up. With the card she still sits below the base rate it shows (mean p 0.70 vs 0.93).
Lessons learned
Phase 3 already showed she uses a stated reference class perfectly (seat probe 96.4); the live gap is that none is in front of her when she forecasts a dispatch. A card helps but has not beaten a placebo, so the cheaper, stronger fix is engineering: publish the rolling base rate or a past-only recalibration beside her number (#23 RC1). U2 (failure-mode decomposition multiplied out) on top of the card made Brier WORSE, +5.5 [+2.8, +8.5]: REVERT. Next: a bigger held-out retest with a placebo that also shows ledger counts.