Includes project operations
From idea to evidence.
Every commitment, its owner, its next step and its recorded evidence. Search by subject or item number.
106 of 124 marked done · counted once across the machine
Build progress counts items equally.
It does not estimate time or prediction accuracy.
Arrows show the architecture and intended handoffs, not live traffic. Plan completion is separate from runtime health and prediction accuracy. Snapshot Sep 23 · 10:13 PM MT. Select a component for its evidence.
Board state; evidence below
See Who is working for live jobs
Ordered by recorded priority
A-03A-03 — Bets go down early, so forecast the injury report itself: P(Friday status \| Tuesday informationdone
Why this matters
Plan item A-03, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Bets go down early, so forecast the injury report itself: P(Friday status \| Tuesday information). | Brier against the base rate by body part. FILES THE PLAN NAMES: research/playgrain/lineup/inj_report_forecast.py MISSING: inj_report_forecast.py No prior board item ever mentioned this.
A-04A-04 — Per-snap exit hazard by position, age, injury history, surface and workload. Inside the simulatodone
Why this matters
Plan item A-04, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Per-snap exit hazard by position, age, injury history, surface and workload. Inside the simulator a player can leave and his backup enters. | Simulated exits per game match history by position. FILES THE PLAN NAMES: research/playgrain/lineup/ingame_injury_hazard.py MISSING: ingame_injury_hazard.py No prior board item ever mentioned this.
D-01D-01 — Fair prices from the calibrated distribution for every market on the board; exact push handling done
Why this matters
Plan item D-01, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Fair prices from the calibrated distribution for every market on the board; exact push handling at integers; edge against the *early* number. FILES THE PLAN NAMES: research/playgrain/decide/price.py MISSING: price.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
F-04F-04 — Move the 0.40 FantasyPros blend, league-rate calibration, designation decay and rookie pass *insdone
Why this matters
Plan item F-04, lane truth and the fantasy path, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Move the 0.40 FantasyPros blend, league-rate calibration, designation decay and rookie pass *inside* `lines_for`, or score the board end to end, so the board and the measured model are one object. | Live mean error −3.42 → ~0 FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
L-09L-09 — The holdout moves under a separate macOS user that only the evaluator can read; `playgrain-holdonext
Why this matters
Plan item L-09, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Dependency
root/admin credential to create a separate macOS user account (dscl/sysadminctl need sudo; `sudo -n true` fails, no passwordless sudo held by this session) -- the plan's own spec for this item ('the holdout moves under a separate macOS user') cannot be done by a headless build worker. Needs an interactive session with Sean's sudo password, or the credential minted for this seat.
Evidence and next step
The holdout moves under a separate macOS user that only the evaluator can read; `playgrain-holdout.duckdb` is already mode 0400. Revision 2 named this honestly as a process boundary rather than an air gap, and this closes it. FILES THE PLAN NAMES: loop/holdout.py, loop/split.py all present No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
L-10L-10 — The evaluator today scores only the action model. Generalise it to every kernel component (play-done
Why this matters
Plan item L-10, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The evaluator today scores only the action model. Generalise it to every kernel component (play-level log loss, n≈911k) and to a simulator-level paired test under common random numbers. A proposal that improves a component and worsens game CRPS is refused: the aggregation trap is how the share model died. FILES THE PLAN NAMES: research/playgrain/loop/multi_target_evaluator.py MISSING: multi_target_evaluator.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
PW-56Grade the STAT LINE, not fantasy pointsnext
Why this matters
Sean, 2026-09-22: "actuals are the stats, fantasy points is math."
Evidence and next step
statline.score() is a dot product of a 33-field StatLine with ONE league's scoring vector — it calls itself 'the only such function'. The model computes the whole line; every grading surface discards it and stores the projection. aar_forecasts HAS a `quantity` column built for this and every writer hardcodes 'fantasy_points'. Two different lines with the same total grade identically, so a miss cannot be attributed to which stat was wrong; and a prop is priced on a stat, so an edge there is invisible in points MAE. player_week already carries every actual column (targets, receptions, receiving_yards, carries, rushing_yards, TDs, first downs, fumbles). bin/aar-ladder.py is the start.
PW-62The reviewer must not be the builderdone
Why this matters
The operating model: 'the same model may fill several jobs, but never proposes, implements, and approves the same material claim.' Tonight one process proposed the AAR->topics link, built it and approved it; proposed the stacked arm, built it and graded it; and wrote the mouse landing gate AND the checks that gate runs. The arm-vintage artifact — four contrasts at sign z beyond 26 that were one code difference read twice — was caught only because I happened to look again. Nothing structural would have caught it. Name, for each material claim, who proposed it and who approved it, and make them different. See §2.
PW-64The nine stub tabs ARE the nine desks — V-04 is a staffing gapnext
Why this matters
Commission & Portfolio, World Model Lab, Football Intelligence, Behavior & Qualitative, Data & Provenance, Markets & Portfolio, Experience Studio, Operations & Learning, Forecast Accuracy Directorate — an exact match to D01-D08 plus the accuracy desk, 37 chartered jobs between them. The institution was chartered and never staffed, and nine 200-character pages are the visible shape of that. Work V-04 with this in mind: each tab shows what its desk knows, or the desk is struck. See §4.
PW-68Turn the density-ratio classifier into the loss function (GAIL loop)done
Why this matters
Gemini's re-ranked #1 and its explicit WHAT TO DO FIRST, after Sean pushed it off the coward's consensus.
Evidence and next step
X-03 built a density-ratio classifier that separates real from simulated game states essentially perfectly, and we used it once as an AUDITOR and never again. Gemini: 'Instead of just measuring the disjointness, close the loop: the simulator must minimize the scalar error while maximizing the probability that the classifier flags the simulated trajectory as real.' That is Generative Adversarial Imitation Learning, and it avoids hand-defining a loss for 33 fields over 150 plays. MIDTERM EXAM, its words: wired as the discriminator loss, the classifier's AUC drops from ~1.0 to ~0.5 on simulated 10-step sequences — the kernel has learned football physics rather than a shortcut to the scalar. ITS MECHANISM FOR WHY THIS IS THE ROOT CAUSE, which is worth keeping: grading only the terminal dot product is a credit-assignment failure. 'A model can achieve exactly 15.4 FP by simulating one 80-yard touchdown and 60 consecutive kneels.' Unpenalised intermediate states let the transition kernel learn alien shortcuts, and rolled out autoregressively those errors compound off the manifold. Related: PW-56, PW-57, V-01.
PW-74The register is the logjam: production scaled 4x tonight, promotion did notnext
Why this matters
Sean, 2026-09-22: "the top half is green, but everything is going to logjam at the register level?" Measured the moment he asked, and he is right.
Evidence and next step
236 hypotheses, 88 OPEN. 819 crumbs closed. 72 findings. 31 proposed changes, 13 still waiting. ZERO claims ever independently reviewed. Tonight the mice went 3 to 10 and the research lanes 4 to 12 — a 4x increase in production with no increase downstream of the register. THE AUTHORITY RULE NAMES THE FIX AND WE HAVE HALF OF IT: 'Promotion comes from INSTRUMENTS and an independent reviewer.' The reviewer is Codex, four slots a day, and site work takes priority on three of them. That cannot clear a queue this size and it should not have to. The instruments are the half that scales: a proposal carrying its own measurement and passing a gate should promote without a reviewer, and the reviewer should spend its scarce slots on the ones instruments cannot settle. ALSO MEASURED: 390 mouse runs found nothing or collided on the claim lock, because crumbs.py --next re-enumerates every surface per mouse behind one lock and took 2m18s with THREE. With ten it is the second bottleneck. Enumerate once into a queue and let mice pop from it.
PW-93Eight lanes starve the write lock: weather lost 8 hours of capturesnext
Why this matters
The watchdog caught it: 'weather capture — no work for 481 min (budget 480)'.
Evidence and next step
Two causes, one fixed. bin/weather-capture.py called duckdb.connect() directly, skipping the retry, the honest LockTimeout and D-106's 'a writer yields to the capture' — now routed through warehouse.connect and added to the capture exemption beside availability and availsnap, because a forecast at T-8h cannot be re-fetched at T-4h. THE SECOND CAUSE IS THE SCALING AND IT IS NOT FIXED. Eight build lanes plus their model fits contend for one DuckDB writer. Even through the connector the capture did not land on the retry after the fix. Reads do not contend; WRITES do, and more lanes means more of them. Options, none free: cap concurrent writers with a token so only N lanes may fit at once; give captures a reservation window the writers honour; or fewer lanes. Measure first — data/logs shows 14 build-lane lock failures today against 116 lock messages, so the contention is real but not yet the dominant cost. MEASURED 2026-09-23 01:35, from data/logs/job-misses.jsonl and long-holds.jsonl, since 20:00: 178 LOST FIRINGS, led by availability with 55 — the capture this project protects above everything, because ESPN serves only CURRENT status and a missed one is gone. Then gate 25, chain-report 18, ingest-rotowire 13, officials-capture 11, bodies 10. 60 LONG HOLDS, led by bodies with 18, then probe 10, rotowire-ids 5, news-sweep 5, stacked-arm 3. Q-01 recorded '14 retries over 157s all blocked by one PID holding the write lock 11+ min'. THE FAILURE IS NOT THAT WRITERS EXIST, IT IS THAT THEY ALL RETRY AT ONCE. Eight lanes and their fits hammer one file, each burning its whole budget, and the loser is whoever asked at the wrong moment — which is how an irreplaceable capture loses to a backfill that could have run any time. THE FIX IS A WRITE TOKEN: heavy writers queue for a token before attempting the DB lock, captures never wait for one, and a token whose owner died is reclaimed. That does not make writes faster; it makes the LOSER PREDICTABLE, and the loser must never be a capture. ATTEMPTED AND REVERTED 01:45. Editing warehouse.connect() live with 46 lanes running broke the module on an import indent and every lane would have failed on its next open. Restored from HEAD and verified. This belongs in a quiet window with the negative test written first: seed a long holder, prove a capture still lands.
Q-01Q-01 — Claim schema v2 adds **hedge**, **time anchor**, speaker role and copy ancestry. Q-22 is registenext
Why this matters
Plan item Q-01, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Claim schema v2 adds **hedge**, **time anchor**, speaker role and copy ancestry. Q-22 is registered and untested because the fields do not exist. Re-extract all 12,139 news bodies plus pressers and transcripts with the local reader, keeping the verbatim-evidence check. About 46 h of Mac time, overnight. FILES THE PLAN NAMES: playerweek/claims_v2.py MISSING: claims_v2.py No prior board item ever mentioned this.
V-02V-02 — A settled week keeps the number filed before kickoffdone
Why this matters
Week 1 prints 384.40 under ACTUAL, PLAYERWEEK and YAHOO — the same figure three times, both sides. Week 2 does it on our side and on the opponent's YAHOO column while PLAYERWEEK correctly holds 417.63. Weeks 3 and 4 are right. Storing a forecast with a clock is pointless if the page overwrites it with the result once the week settles. EXAM: week 1 shows three distinct figures and V-01 stops reporting it.
V-04V-04 — The nine stub tabs on the build monitordone
Why this matters
Eleven sections, and nine are stubs of about 200 characters: Commission & Portfolio, World Model Lab, Football Intelligence, Behavior & Qualitative, Data & Provenance, Markets & Portfolio, Experience Studio, Operations & Learning, Forecast Accuracy Directorate. Only Construction and Maintenance carry anything. Each one either gets the content its title promises or is removed — a navigation item that leads to 200 characters is a lie about what the machine knows. EXAM: no tab under the stub threshold, measured by V-01 extended to the build site.
C-13C-13 — Fill `published_at` and `effective_at` on the 9,039 receipts, then on every table without a clocnext
Why this matters
Plan item C-13, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Fill `published_at` and `effective_at` on the 9,039 receipts, then on every table without a clock (125 of 187), in order of use. FILES THE PLAN NAMES: research/playgrain/sensors/evidence_clocks.py MISSING: evidence_clocks.py No prior board item ever mentioned this.
PW-100Probe an untested limit (cannot) in commit:938e33e9done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:938e33e9: "If pgrep itself cannot be run the row assumes the worse case, because a check that cannot look must not clear an alarm." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-101Probe an untested limit (out-of-scope) in commit:89994e3fnext
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:89994e3f: "pytest is not installed in .venv so tests/test_board_is_plan.py did not run; out of scope for this change (render.py carries no plan-sync dependency) and gate.py was open both before and after with no plan-of-record edit made." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-102Probe an untested limit (out-of-scope) in commit:6e1730dddone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:6e1730dd: " overstates it (PW-70 has no family), but the substance holds: PW-70 is a different, unowned item on shard 6 (70 % 8), genuinely out of scope for T-02 on shard 2." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-103Probe an untested limit (out-of-scope) in commit:e1766d30done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:e1766d30: "10 of 13 warehouse tables now covered; the 3 refused ones need a versioned/append-only redesign before they can be gated, out of scope for this item's named files." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-106xwalk's season/gsis_id ranking is nondeterministic -- reruns silently swap which roster snapshot winsnext
Why this matters
Found while verifying C-13's clock fix on xwalk (playerweek/identity.py), not by probing an assertion.
Evidence and next step
The `ranked` CTE in identity.SQL picks one roster_raw row per (season, gsis_id) with `ROW_NUMBER() OVER (PARTITION BY season, gsis_id ORDER BY <count of non-NULL ids> DESC)` and no further tiebreak. VERIFIED directly, not assumed: ran the UNMODIFIED SQL twice back-to-back against one identical in-memory snapshot of roster_raw/dp_ids -- 147 of 33,898 xwalk rows differed between the two runs, same code, same inputs, zero relation to any change made this session. Whenever two roster snapshots for the same player-season tie on id-fill count, which one xwalk keeps depends on DuckDB's internal ordering, not the data -- so a full rebuild can silently change which pfr_id/yahoo_id/etc a player carries, with no error and no signal. Needs a deterministic final tiebreak column (e.g. the roster row's own capture order, or an explicit sort key) added to the ORDER BY.
PW-107Probe an untested limit (out-of-scope) in commit:53b6dc03done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:53b6dc03: "F-08 stays open -- the binding blocker is the joint correlation matrix, not the QB coverage gap, and closing it needs a copula/joint structure over the six-slot matrix, out of scope for this unit." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-108Probe an untested limit (cannot) in commit:06c4f524done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:06c4f524: "Falls back to the live warehouse if a clean copy can't be taken inside 120s rather than failing the job outright." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-109Probe an untested limit (out-of-scope) in commit:bbabdf70next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:bbabdf70: "Filed as a finding, not fixed: whether its capture_health check is a design decision, out of scope here." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-111Probe an untested limit (cannot) in commit:c970bb94done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:c970bb94: "S-18: a fresh 2025 kernel rollout at HEAD plays totals of 67 against a real 41 -- the live simulator is not a calibrated kernel since the 09-22 S-08 refit (committed evals show it in time order: 42/44 before, 77/88 after), so the kernel-vs-rating bar cannot be re-read yet and no grind is registered." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-112Probe an untested limit (cannot) in commit:26e0e681next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:26e0e681: "Chose E-10 as shard 2s remainder cannot be settled, S-18 is built." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-113Two lanes are named for a vendor instead of a jobnext
Why this matters
Sean, 2026-09-23: "What does the label 'Codex' mean? That is a tool name not the job it is doing."
Evidence and next step
Every other lane is named for what it does — s-observation, calibration, decision, serving. Two are named for the CLI that happens to serve them: bin/codex-site.sh and bin/codex-review.sh, surfacing as 'codex' on every marker, log line and chart. THE NAMES ARE experience AND audit. The first owns the product surface; the second independently checks measured claims. Neither is about OpenAI — bin/pick-model.py already fails the audit job over to Gemini or Claude when the outside seat is empty, and the only thing that travels with it is the constraint that a reviewer may never be the builder. A vendor name on a lane makes that failover look like a different lane, which is exactly how five days of Codex silence went unnoticed: nobody was looking for a job called 'audit'. Rename the scripts, the PW_LANE values, the watchdog entry and the markers. Keep the vendor in the MODEL field, which is where it belongs.
PW-114Probe an untested limit (cannot) in commit:668f3540next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:668f3540: "PW-112: the s remainder cannot be settled' claim probed -- half true." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-115Probe an untested limit (cannot) in commit:4f96e73cdone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:4f96e73c: "A finding that never proposes anything cannot reach the model, cannot be refereed, and cannot be wrong in a way that costs anything." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-25Probe an untested limit (cannot) in board:D-04next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from board:D-04: "**Opened this Tuesday with paper entries.** It cannot be backfilled, and it costs nothing." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work. ID RE-PREFIXED 2026-09-22. This item was filed as C-25, which collides with the plan's own C-01..C-18 namespace. A lane reading 'C-19' could not tell a residual-ledger proposal from a plan item, and the two mean entirely different things. Locally-generated items carry PW- now; the plan owns the bare letter prefixes.
PW-26Probe an untested limit (banned-floor) in board:J-10next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from board:J-10: "Delete the stale "irreducible" text; fail the build on `irreducible\|noise floor\|ceiling` applied to football." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work. ID RE-PREFIXED 2026-09-22. This item was filed as C-26, which collides with the plan's own C-01..C-18 namespace. A lane reading 'C-19' could not tell a residual-ledger proposal from a plan item, and the two mean entirely different things. Locally-generated items carry PW- now; the plan owns the bare letter prefixes.
PW-28Probe an untested limit (out-of-scope) in commit:31c2db51done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:31c2db51: "migration is out of scope for this item, and there's no .github/workflows to" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work. ID RE-PREFIXED 2026-09-22. This item was filed as C-28, which collides with the plan's own C-01..C-18 namespace. A lane reading 'C-19' could not tell a residual-ledger proposal from a plan item, and the two mean entirely different things. Locally-generated items carry PW- now; the plan owns the bare letter prefixes.
PW-29Probe an untested limit (cannot) in commit:0611cf72next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:0611cf72: "snapshot exists for a moment and cannot be backfilled; settlement grades" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work. ID RE-PREFIXED 2026-09-22. This item was filed as C-29, which collides with the plan's own C-01..C-18 namespace. A lane reading 'C-19' could not tell a residual-ledger proposal from a plan item, and the two mean entirely different things. Locally-generated items carry PW- now; the plan owns the bare letter prefixes.
PW-31Lead: separate two worlds for his snap sharedone
Why this matters
The residual ledger named his snap share as a known unknown worth 0.3332. This lead proposes an observation that would tell two competing explanations apart. It is a LEAD, not a design: it passed the airlock (schema + at least one resolving citation) and nothing more.
Evidence and next step
{ "two_worlds": [ "The player is an every-down foundational starter whose usage is immune to offensive game script.", "The player is a situational package specialist dependent on down, distance, and game flow." ], "separating_observation": "The percentage of first-quarter, first-and-ten plays the player was on the field for.", "where_to_get_it": "The free 'nflverse' public participation dataset (pbp_participation), specifically by parsing the 'offense_players' column for the player's GSIS ID.", "citations": [ "https://nflreadr.nflverse.com/reference/load_participation.html", "https://github.com/nflverse/nflverse-data/releases/tag/pbp_participation" ], "confidence": "high", "_dead_citations": [] } ID RE-PREFIXED 2026-09-22. This item was filed as C-31, which collides with the plan's own C-01..C-18 namespace. A lane reading 'C-19' could not tell a residual-ledger proposal from a plan item, and the two mean entirely different things. Locally-generated items carry PW- now; the plan owns the bare letter prefixes.
PW-34The 15-minute model-fired progress cron is the expensive kind of loopnext
Why this matters
Audit finding, and Sean should know the cost. The update itself reads precomputed files and is cheap in work; it is not cheap in tokens, because each firing lands in this session's full context. It has fired roughly 150 times since it was set.
Evidence and next step
Everything the update reports is already computed at zero model tokens by launchd -- gate.json, chain.json, watchdog.json, the plan strip on the page. The model adds two lines of judgement per tick, and on a QUIET tick adds nothing. Two honest options: widen to 60 minutes and lose almost nothing, or have the page carry a 'last 15 minutes' delta block (progress.py already computes it) so the update is a thing he reads rather than a thing that is generated. Sean's call on spend, which is why this is filed rather than done.
PW-36AAR: conversion error is 32% of our total, and it is forecast's layerdone
Why this matters
The after-action review attributes 32% of all forecast error we have actually made to conversion — 2,804 rows, mean |error| 11.43. That layer belongs to the forecast lane: efficiency: turning opportunity into points. This is not a counterfactual about what would be worth knowing; it is the error we made, decomposed.
Evidence and next step
Worst positions by count: QB (1,271), WR (693), RB (516). READ THE DECOMPOSITION BEFORE PROPOSING ANYTHING. aar_attribution carries e_variance, e_regime, e_volume, e_share and e_conversion per forecast, so the question is not 'how do we get better' but 'why does THIS component dominate for THESE positions'. AND CHECK IT AGAINST THE RESIDUAL LEDGER, which answers a different question — what a variable would be worth if known perfectly, rather than what we actually got wrong. Where the two disagree is the interesting case: an error we keep making on a variable the ledger says is cheap means the cost is in our method, not in the unknown. A variance-labelled error is the honest residual of a stochastic process and may be correct; the question there is whether our INTERVALS cover it, which is calibration's layer, not whether the point estimate was wrong.
PW-37AAR: share error is 8% of our total, and it is allocation's layernext
Why this matters
The after-action review attributes 8% of all forecast error we have actually made to share — 1,032 rows, mean |error| 8.14. That layer belongs to the allocation lane: who gets the ball, inside the room. This is not a counterfactual about what would be worth knowing; it is the error we made, decomposed.
Evidence and next step
Worst positions by count: WR (491), RB (286), TE (237). READ THE DECOMPOSITION BEFORE PROPOSING ANYTHING. aar_attribution carries e_variance, e_regime, e_volume, e_share and e_conversion per forecast, so the question is not 'how do we get better' but 'why does THIS component dominate for THESE positions'. AND CHECK IT AGAINST THE RESIDUAL LEDGER, which answers a different question — what a variable would be worth if known perfectly, rather than what we actually got wrong. Where the two disagree is the interesting case: an error we keep making on a variable the ledger says is cheap means the cost is in our method, not in the unknown. A variance-labelled error is the honest residual of a stochastic process and may be correct; the question there is whether our INTERVALS cover it, which is calibration's layer, not whether the point estimate was wrong.
PW-38Probe an untested limit (out-of-scope) in commit:4a9ba165done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:4a9ba165: "Left alone -- out of scope for" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-39Probe an untested limit (not-worth) in commit:a2e6a739done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:a2e6a739: "Still not worth building." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-40Probe an untested limit (cannot) in commit:16e1274bdone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:16e1274b: "cannot be recovered later." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-41Probe an untested limit (cannot) in commit:60a5ac67next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:60a5ac67: "Week 3 would otherwise go unfiled and the ledger cannot be backfilled." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-42Probe an untested limit (banned-floor) in commit:837568d5next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:837568d5: "irreducible noise" (contradicting this project's own D-345 correction a few" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-43Probe an untested limit (banned-floor) in commit:837568d5done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:837568d5: "irreducible|noise floor|hard ceiling|inherent limit (reusing bin/premise-" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-44Probe an untested limit (cost-estimate) in commit:9895266bdone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:9895266b: "fetching the 372 columnsa multi-month" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-45Probe an untested limit (banned-floor) in commit:e4521890next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:e4521890: "("a measurement-procedure noise floor: the spread you get from refitting the" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-46Probe an untested limit (out-of-scope) in commit:412242d1done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:412242d1: "Wiring the mechanism into drives.py is out of scope for this item -- it" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-47Probe an untested limit (out-of-scope) in commit:153a9251done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:153a9251: "One adjacent gap recorded in the result, not fixed here (out of scope for this" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-52Give the QB a passing leg in the attribution chain -- conversion is not one bucketdone
Why this matters
PW-36 found that attrib.decompose() (playerweek/attrib.py) never substitutes truth into a QB's passing production -- pass_attempts, pass_yards, pass_tds, interceptions ride unchanged from the forecast through every intermediate score to conversion = m2 - m3. That makes conversion the ONLY label a QB miss outside its interval can get, whatever actually moved: a pick-six and a missed deep shot are attributed identically. QB is 45% of all conversion-labelled rows (1,271 of 2,804) partly because of this, not because per-attempt efficiency is where QB forecasting is worst -- and nobody can tell which it is until the chain can tell them apart.
Evidence and next step
trace.py's CHAIN (playerweek/trace.py:26-34) lists nine fields, all receiving or rushing. Add a passing leg the same shape as the existing two: hold the QB's TRUE pass_attempts, substitute true per-attempt rates (completions/att, yards/att, tds/att, interceptions/att) the way _rates()/_line() already do for targets and carries, and add a fifth decompose() step between volume and conversion so the QB's own passing splits into a volume term (pass attempts) and a genuine per-attempt efficiency term. THIS CHANGES STORED aar_attribution ROWS. Any change to decompose() must be followed by attrib.classify() and must still pass tests/test_aar_attrib_fresh.py's per-row exact-reproduction check (TOL=1e-9) and the identity check in decompose() itself (the components must still sum to total_error to 1e-6). Re-derive the conversion/regime/volume/share shares after the change -- QB's share of 'conversion' should fall once passing has somewhere else to go, and that shift is the thing to report, not just that the code compiles.
PW-53Probe an untested limit (banned-floor) in commit:b21879f1next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:b21879f1: "PW-42: probe irreducible-noise claim in commit 837568d5 -- survives, its (J-10) message, which quotes the stale" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-54Probe an untested limit (cost-estimate) in commit:0f5799bbnext
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:0f5799bb: "PW-44: probe the multi-month/fetch claim on P-06 -- refuted premise-scan's claim was already false on the day it was made: P-06" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-58Stack the arms S->B->Q instead of pooling themnext
Why this matters
Sean, 2026-09-22: "SBQ should be stacked S-->B-->Q because B is kinda a version of statistical data, whereas Q is actually thinkings like judgement and sentiment."
Evidence and next step
Today an arm is a FEATURE SUBSET handed to one ridge, so SBQ is an independent fit that can land anywhere relative to S — and does: B+Q move 99.8% of forecasts, hurting 6,944 and helping 5,377 (sign z=+14.1) for a net +0.0072 MAE whose interval crosses zero. Most of that movement is the whole fit shifting because ten columns entered the penalty, not signal. A stack stores delta_B and delta_Q per player-week, so 'we cut him on the language and were wrong' becomes a row you can query; a row with no Q signal gets exactly zero instead of a fit-wide perturbation. research/stacked_arm.py is built and unmeasured.
PW-59Wire the podcast corpus into featuresdone
Why this matters
12.3M transcribed words reach nothing.
Evidence and next step
playerweek/transcripts.py was built for the newsletter brief and filters to rostered players; no transcript-derived column exists in share.ALL_FEATURES. features.py declares three and all are built=False: stated_role_change ('a reporter or coach saying the staff wants him more involved — LEADING rather than lagging'), coach_intent, insider_confidence. The Q arm is five columns of injury-report boilerplate while this sits unread, so every verdict on Q so far is a verdict on the boilerplate. Needs the 2024-25 backlog transcribed first — com.playerweek.transcribe is now on a 55-minute clock.
PW-60Probe an untested limit (cannot) in commit:11cc5974done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:11cc5974: "six open gaps named so they cannot be mistaken for oversights." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-67Rotate proposer and critic so one provider's style is not our priordone
Why this matters
'Gemini 3 Pro finds cross-domain mechanisms; a second model converts them into state, equations, falsifiers and gates.' Tonight Gemini proposed AND judged, reached what it called the coward's consensus twice, and needed Sean to push it back both times. Step 3 of our pipeline asks it to judge itself. A different model should hold that chair. See §7.
PW-69Sever B and Q from the Ridge; apply them as bounds on the transition matrixnext
Why this matters
Gemini's re-ranked #2, replacing its own residual-stacking proposal after the research found no published evidence for it.
Evidence and next step
Its diagnosis of the Ridge survives and is sharp: 'Because B and Q are sparse, to make them move the terminal forecast when they do fire, the optimizer must assign them massive weights. To pay for those under the L2 budget, it is mathematically forced to shrink your highly predictive S-weights. You are actively taxing your dense physics engine to pay for sparse linguistic adjustments.' And the geometry error: 'an injury does not evenly subtract 3.5 points; it means a 30% chance of leaving the game early and 70% of playing normally. A flat regression cannot output a bimodal distribution; it can only smear it into an inaccurate mean.' THE FIX IS SEAN'S OWN SYNTHESIS, which Gemini calls the only correct frame: language and decisions are evidence about PARAMETERS of the simulated distribution, not a shift on a mean. An injury designation caps a max snap-transition probability; it does not subtract points. ITS MIDTERM EXAM IS STALE AND MUST BE RESTATED. Gemini wrote: 'the +14 z-score sign split vanishes completely.' That z=+14 was OUR number and it was an artifact — four arms compared across two code vintages. Re-measured from one vintage on 15,022 paired player-weeks, every contrast's interval crosses zero and every sign split is near even (B without Q -0.0066 [-0.0194, +0.0061]). There is no +14 to make vanish. The honest exam: B and Q applied as simulation bounds beat the S-only baseline by an interval that EXCLUDES zero — which they have never done in any arrangement yet. Supersedes the pooled-vs-stacked framing in PW-58.
PW-70The covariance compiler: price a correlated prop off the joint rolloutdone
Why this matters
Gemini's re-ranked #3, and the thing it says is our only structural monopoly.
Evidence and next step
'By reading all markets from one joint distribution, you natively price the cascading tail covariances that sportsbooks' static copulas miss.' This is S-15 with an exam attached. MIDTERM EXAM, its words: the compiler prices a correlated derivative prop — trailing QB pass attempts OVER plus leading RB rush yards OVER — directly from the joint distribution of rollouts, yielding a price that DIVERGES from the sportsbook's implied parlay odds while MATCHING the historical play-by-play baseline. Both halves are required: diverging without matching history is just being wrong. Its own pre-mortem on this, kept because it is the thing that would kill it: the verdict dies if a sportsbook's closed-form static copulas already capture >95% of cross-market tail risk, in which case the world model is computationally inferior and structurally redundant.
PW-77Probe an untested limit (cannot) in commit:ff116765next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:ff116765: "One stamp cannot be true for all of them." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-78Probe an untested limit (cannot) in commit:605cea4ddone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:605cea4d: "A findings file that cannot be read counts as -1, not" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-79Probe an untested limit (not-possible) in commit:13a9dc8edone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:13a9dc8e: "Now it is hard, in both the picker and the brief: while ANY plan item is open in a shard, a PW- item is not available to take." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-80Probe an untested limit (cannot) in commit:605cea4ddone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:605cea4d: "A findings file that cannot be read counts as -1, not 0: an audit that never ran is not a clean site, and defaulting to review on a read error is how the site job would quietly stop." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-81Probe an untested limit (out-of-scope) in commit:153a9251next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:153a9251: "One adjacent gap recorded in the result, not fixed here (out of scope for this item): nothing in bin/ or launchd actually invokes playerweek.suite on a schedule, so is true only when someone runs the suite by hand." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-82Probe an untested limit (out-of-scope) in commit:412242d1next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:412242d1: "Wiring the mechanism into drives.py is out of scope for this item -- it needs both teams simulated jointly per takeaway, which the result text already flags as S-14s own status of " PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-83Probe an untested limit (out-of-scope) in commit:575058efdone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:575058ef: "Not wired into grade_week.pys simpler z-test in this unit -- out of scope for the scoring library itself." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-84Probe an untested limit (out-of-scope) in commit:93bd4e60done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:93bd4e60: "These are raw source-ingest tables needing a per-table ETL change each, out of scope for one unit; the script ranks them by row count for the next pass." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-85Probe an untested limit (out-of-scope) in commit:4a9ba165next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:4a9ba165: "Left alone -- out of scope for this item, worth a careful look next time someone touches rivalgap.py." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-86Probe an untested limit (out-of-scope) in commit:31c2db51done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:31c2db51: "Residual: no other script calls results.record() yet -- that repo-wide migration is out of scope for this item, and theret on GitHub Actions." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-87Probe an untested limit (cannot) in commit:0611cf72done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:0611cf72: "The pre-kickoff availability snapshot exists for a moment and cannot be backfilled; settlement grades games that already finished and loses nothing by waiting." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-88Probe an untested limit (cannot) in commit:16e1274bdone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:16e1274b: "That is the only property that cannot be recovered later." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-89Probe an untested limit (cannot) in commit:9800600dnext
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:9800600d: "And C-56 established the constraint that shapes the whole plan: nflverse publishes participation POST-SEASON (2024 landed 2025-09-04), so 2026 cannot be fetched and must be imputed from snap counts, depth charts, personnel tendencies and pbp role ids, trained where truth is known." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-90evidence_clocks.py's clock probe treats ANY TIMESTAMP column as a clock, over-counting coveragenext
Why this matters
Found while working C-13 (shard 5, 2026-09-22): CLOCK_PAT in research/playgrain/sensors/evidence_clocks.py matches column NAMES against words like published/ingested/modified, but duckdb_clockless_tables() also does `or "TIMESTAMP" in ty` -- so any TIMESTAMP-typed column counts as a clock regardless of what it means. `base` reads as clocked solely because its `kickoff` column (game time, not an ingestion/capture clock) is TIMESTAMP-typed; it has no ingested_at and none of build.py's base_sql() columns carry one.
Evidence and next step
Rule from CLAUDE.md: 'check that a column means what its name says' (games_raw.total was the historical example). This probe violates that rule against itself -- it is the C-13 measurement instrument, and its 95/201 'have a clock' count is inflated by every table that happens to carry an unrelated TIMESTAMP column (kickoff, birth_date-as-timestamp if any, capture windows, etc). The true count of tables genuinely missing an ingestion/publish/capture clock is HIGHER than the 105/201 currently reported, not lower. FIX: drop the `or "TIMESTAMP" in ty` clause entirely and rely on CLOCK_PAT matching the column NAME only (it already covers ingested/captured/published/effective/modified/etc plus a bare `_at` suffix, which is the actual convention this project uses for every clock column added under C-13). Re-run and diff the missing list before and after to see how many tables were false-negative-missing (i.e. wrongly marked 'have'). Does not change C-13's current unit of work (lagged had no candidate column of any kind), but it does mean the 105-of-200 fraction should not be trusted as a stopping condition or progress measure until this is fixed.
PW-91pw-now.py's STALE_MIN check mass-expires every live worker at midnightdone
Why this matters
Found while clearing the marker after X-04 (shard 4, 2026-09-23): `bin/pw-now.py --clear` reported "cleared build-w4" with no `expired` list moments after marking live, then a later `--clear` in the same unit wiped ALL six other workers' entries (w2/w3/w5/w6/w7, timestamps 23:33-23:47 the prior day) at once, leaving now.json empty.
Evidence and next step
pw-now.py parses each entry's `at` as bare HH:MM and reattaches TODAY's year/month/day before computing age against STALE_MIN=35 minutes. The date rolled from 2026-09-22 to 2026-09-23 at local midnight between two workers' writes; every entry stamped 23:xx on the old day, reparsed against the new day's date, computed as ~23 hours old (or, since the code only accepts -5<=age<=35, simply outside range) and got dropped as stale in one shot -- not because the writers died, but because midnight happened. This is the exact failure the STALE_MIN block's own comment warns against ("a marker that outlives its writer... puts a reader on a hunt for a lane that does not exist") inverted: here live lanes vanished from the board while genuinely still running. FIX: compare against a stamped epoch/ISO timestamp instead of bare HH:MM, or carry the date alongside the time so age is computed across a day boundary correctly. Self-healing in practice (every worker overwrites its own entry on its next unit), so no data was permanently lost, but the machine map read empty for a stretch of real activity right at 00:00 local -- worth fixing before the next midnight, not urgent tonight.
PW-94A concurrent git reset on the shared working tree wipes every lane's uncommitted work at oncenext
Why this matters
Measured 2026-09-23 ~02:25 MT: git reflog on this shared checkout shows two `git reset` events landing back at HEAD (E-07's commit, 8fa32e8b) within the same minute. `git show --stat` on that commit confirms it touched only 3 files (construction.json, now.json, mde_table.py) -- it did NOT itself carry the files that vanished. Something else ran a reset against the tree while other lanes' edits sat unstaged in it, and every one of those edits was gone afterward: this unit's own in-progress edit to playerweek/regime.py/build.py and its construction.json write (grep for the added text came back empty after the reset, present again only after this unit redid the edit from scratch); and, separately, everything this session's git-status snapshot showed modified at session start (bin/chain-report.py, six buildsite/dist/*.html pages, buildsite/chain.json, research/scientist/HYPOTHESES.md, research/scientist/run/h150_room_domain.log) is gone from `git status` now with no commit that explains where it went.
Evidence and next step
8 shards share ONE working tree (not 8 worktrees), so any script in any lane that runs a blind `git reset`/`git stash`/`git checkout --`/`git add -A` over the whole tree can destroy another lane's not-yet-committed work with no error and no trace -- the destroyed lane's own unit just silently has to redo the work (costly but survivable) or, worse, records a result for an edit that was never actually committed (silent data loss, not survivable, and matches this repo's own rule 3: verify the object under test is the object that shipped). This is the same class of finding as the git-add-sweeps-staged-index and shared-register-partial-staging lessons already on record, but at the working-tree layer instead of the index layer: no amount of care about staging scope protects an unstaged edit from a concurrent hard reset elsewhere in the fleet. NOT INVESTIGATED HERE (out of scope for the unit that found it): which script actually issued the reset -- every buildloop/autoloop/chain-run entrypoint that runs `git` unconditionally is a candidate and would need to be greped and audited to name the one at fault, and the reflog alone does not carry a process name.
PW-95Probe an untested limit (cannot) in board:PW-93done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from board:PW-93: "bin/weather-capture.py called duckdb.connect() directly, skipping the retry, the honest LockTimeout and D-106's 'a writer yields to the capture' — now routed through warehouse.connect and added to the capture exemption beside availability and availsnap, because a forecast at T-8h cannot be re-fetche" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-96Probe an untested limit (out-of-scope) in board:PW-94done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from board:PW-94: "NOT INVESTIGATED HERE (out of scope for the unit that found it): which script actually issued the reset -- every buildloop/autoloop/chain-run entrypoint that runs `git` unconditionally is a candidate and would need to be greped and audited to name the one at fault, and the reflog alone does not carr" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-97Probe an untested limit (cannot) in commit:129b56f4next
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:129b56f4: "Committing them here via an isolated GIT_INDEX_FILE + compare-and-swap ref update so this commit cannot be swept by another shard's concurrent git add -A the way the last two attempts were." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-98Probe an untested limit (out-of-scope) in commit:65eb92cdnext
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:65eb92cd: "out of scope for the scoring library itself") -- it was true." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-99Probe an untested limit (out-of-scope) in commit:9f460d2ddone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:9f460d2d: "covariance_compiler and evalx-issue-shadow are other families' dead lanes, out of scope this unit." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
S-11S-11 — Kickoffs (with the 2024 rule era), punts, returns, blocks, and field goals by kicker rating × dinext
Why this matters
Plan item S-11, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Dependency
a kicker-rating sensor (no such sensor exists in the warehouse, a T or C family gap) and a B-family endgame-policy decision for the onside-kick ATTEMPT trigger (score margin x clock, which _kickoff_draw has no input for) -- the only two pieces of this item's acceptance bar left with no gate, and neither is this file's to close
Evidence and next step
Kickoffs (with the 2024 rule era), punts, returns, blocks, and field goals by kicker rating × distance × wind × altitude × roof. Also extra points, two-pointers and onside kicks. | FG make curve calibrated; no possession starts at a constant 30. FILES THE PLAN NAMES: research/playgrain/kernel/special_teams.py MISSING: special_teams.py No prior board item ever mentioned this.
T-02T-02 — Regularised adjusted plus-minus at the play grain: a sparse design matrix (players on field × rodone
Why this matters
Plan item T-02, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Regularised adjusted plus-minus at the play grain: a sparse design matrix (players on field × role) in `scipy.sparse`, solved by LSQR with ridge, targets EPA, success, yards, pressure, completion. Hierarchical prior by position, as-of each week, exponential decay. Output `player_latents(gsis_id, role, valid_time, mu, sd, n_eff)`. | Adds play-level log-loss to the kernel, held out, above the parsimony tax. FILES THE PLAN NAMES: research/playgrain/talent/rapm_fit.py MISSING: rapm_fit.py No prior board item ever mentioned this.
V-03V-03 — Every week renders, or declares itself empty by designdone
Why this matters
Weeks 15-18 render 529 characters against a 3,492 median — 15% of a normal week. A fantasy playoff opponent that is not yet determined is a REAL unknown and saying so is correct behaviour; silently rendering a stub is not, and neither is silencing the check. The declaration must be in a form the audit can read. EXAM: no week below 40% of the median without a declared reason.
V-05V-05 — One declared contract for what a page may showdone
Why this matters
playerweek/gameserving.py already governs the model's published columns: a field is declared, its producer named, and an absent column emits NULL rather than changing the shape. The pages have no such contract, so a column can silently change what it means — which is exactly what V-02 is. EXAM: adding a rendered field forces a decision, the way adding a serving column already does.
X-02X-02 — Add `form_off`, `form_def` (leave-one-play-out EPA in this game) to `LATENT`; fit the distributidone
Why this matters
Plan item X-02, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Add `form_off`, `form_def` (leave-one-play-out EPA in this game) to `LATENT`; fit the distribution of form given ratings; the simulator draws it once per trajectory per unit. | Simulated margin sd 14.2 ± 0.3; yards per play within 0.05 of real. FILES THE PLAN NAMES: research/playgrain/drift/game_effect.py, features.py MISSING: game_effect.py No prior board item ever mentioned this.
X-04X-04 — Simulation-based calibration of a small vector of logit offsets against drive and game moments fdone
Why this matters
Plan item X-04, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Simulation-based calibration of a small vector of logit offsets against drive and game moments from `drive_week`, under common random numbers. The moments are plays per drive, third-down rate, TD/FG/punt rates, totals, margin sd and key-number masses. | All moments within tolerance at once. No more cancelling errors. FILES THE PLAN NAMES: research/playgrain/drift/sbi_calibrate.py MISSING: sbi_calibrate.py No prior board item ever mentioned this.
A-02A-02 — P(active) → P(plays \| active) → snap share \| plays. LightGBM plus isotonic, fitted at each locnext
Why this matters
Plan item A-02, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
P(active) → P(plays \| active) → snap share \| plays. LightGBM plus isotonic, fitted at each lock (TUE, WED, THU, FRI, SAT, T-90); the feature list follows this table. | Log loss beats carry-forward *and* the pre-kickoff consensus (the OR-12.2 rows). FILES THE PLAN NAMES: research/playgrain/lineup/avail_hurdle.py MISSING: avail_hurdle.py No prior board item ever mentioned this.
A-05A-05 — For each trajectory, draw who is active, the role depth chart, and the on-field set for each perdone
Why this matters
Plan item A-05, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
For each trajectory, draw who is active, the role depth chart, and the on-field set for each personnel grouping. Returns the `Lineup` the kernel consumes. | Simulated snap shares against realised: MAE by position, published. FILES THE PLAN NAMES: research/playgrain/lineup/lineup_sampler.py MISSING: lineup_sampler.py No prior board item ever mentioned this.
B-03B-03 — Personnel grouping (11/12/21…) given state and roster. This selects the on-field set from A-05.done
Why this matters
Plan item B-03, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Personnel grouping (11/12/21…) given state and roster. This selects the on-field set from A-05. FILES THE PLAN NAMES: research/playgrain/policy/policy_personnel.py MISSING: policy_personnel.py No prior board item ever mentioned this.
C-10C-10 — Coach and coordinator press conferences within 24 h. Podcast priority queue over the 461,382 indnext
Why this matters
Plan item C-10, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Coach and coordinator press conferences within 24 h. Podcast priority queue over the 461,382 indexed episodes: team-beat shows first, 72 h before each game, `whisper-large-v3-turbo` at ~27× realtime. Proper nouns are resolved against the 450,604-row roster table ("George Corloftis" → Karlaftis). FILES THE PLAN NAMES: research/playgrain/sensors/pressers_capture.py, sensors/podcast_transcribe.py MISSING: pressers_capture.py PRIOR EVIDENCE on the old board: C-10
C-14C-14 — The injury-report ladder and depth charts "cannot be walked backwards" only through one endpointdone
Why this matters
Plan item C-14, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The injury-report ladder and depth charts "cannot be walked backwards" only through one endpoint. nflverse git history and the Wayback Machine do hold them. Rebuild Wed/Thu/Fri practice status for 2016–2025. FILES THE PLAN NAMES: research/playgrain/sensors/wayback_backfill.py MISSING: wayback_backfill.py PRIOR EVIDENCE on the old board: C-14
F-05F-05 — Add the built-and-locked but unused PRE_KICKOFF blocks: home, rest, division, travel_km, tz_shifnext
Why this matters
Plan item F-05, lane truth and the fantasy path, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Add the built-and-locked but unused PRE_KICKOFF blocks: home, rest, division, travel_km, tz_shift, elevation, roof, surface, OL continuity, pressure allowed/made, six turnover-cause rates. | One feature family per run, recorded FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
F-09F-09 — The shipped DST ranking is *exactly* the market's. Rebuild it from unit ratings. | DST rank corrdone
Why this matters
Plan item F-09, lane truth and the fantasy path, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The shipped DST ranking is *exactly* the market's. Rebuild it from unit ratings. | DST rank correlation to market < 1 FILES THE PLAN NAMES: kdefmodel.py all present No prior board item ever mentioned this.
PW-75CUT: the unattended Deep Think / Deep Research loopnext
Why this matters
Sean, 2026-09-22: "if I can't trust you to run it in the web then you should cut it from the plan."
Dependency
Sean: nothing — this is a record of a decision, not a request
Evidence and next step
bin/deep-cycle.py drove Gemini's Deep Think and Deep Research through an isolated Chrome profile. Deep Research NEVER WORKED: C-168 records that the profile cannot carry a Google session without a one-time interactive sign-in, and run_research() has always written a FAILED row rather than a success it never saw — which was honest and still meant the feature did not exist. com.seano.playerweek.deep-think is unloaded. WHAT IS NOT CUT: the three-step pipeline Sean runs by hand — prompt 1 Deep Think, prompt 2 Deep Research, prompt 3 the judge, in docs/gemini/. That is a human-run workflow with a real result already (it produced the audit, the four contrasts, and the coward's-consensus correction). The machine automating it unattended is the part that was fiction. TO REVIVE IT the bar is a single observed round trip, not another attempt: one real Deep Research response captured from the browser path. Until then the brief builder in deep-cycle.py stays as dead code with this note on it.
T-05T-05 — Weekly state-space update per player-skill: process noise by age and position, a shock term on rdone
Why this matters
Plan item T-05, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Weekly state-space update per player-skill: process noise by age and position, a shock term on return from injury. The posterior **mean and variance** are stored, and the simulator samples from the posterior, so rating uncertainty becomes game variance. | Calibrated: standardised one-step errors ~N(0,1). FILES THE PLAN NAMES: research/playgrain/talent/kalman_latents.py MISSING: kalman_latents.py No prior board item ever mentioned this.
X-05X-05 — Key numbers: the mass at 3, 6, 7, 10, 14 and 17 on margin, and at 37, 41, 44, 47 and 51 on totalnext
Why this matters
Plan item X-05, lane kernel, drift, decision, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Key numbers: the mass at 3, 6, 7, 10, 14 and 17 on margin, and at 37, 41, 44, 47 and 51 on totals, against history by rules era. | Every ratio in 0.90–1.10. FILES THE PLAN NAMES: research/playgrain/drift/shape_test.py MISSING: shape_test.py No prior board item ever mentioned this.
X-06X-06 — The column-by-column real-against-simulated feature diff that found the 3.2-sd `games_seen` shifdone
Why this matters
Plan item X-06, lane kernel, drift, decision, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The column-by-column real-against-simulated feature diff that found the 3.2-sd `games_seen` shift, as a standing gate. | No feature beyond 0.25 sd. FILES THE PLAN NAMES: research/playgrain/drift/feature_shift_diff.py MISSING: feature_shift_diff.py No prior board item ever mentioned this.
A-06A-06 — Role regime changes as a changepoint posterior on snap share (`regime.py` and `kalman_share` exidone
Why this matters
Plan item A-06, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Role regime changes as a changepoint posterior on snap share (`regime.py` and `kalman_share` exist), not a raw delta. FantasyPros' entire edge sits on players whose situation is changing (+4.753 MSE at 15+ pts of snap movement). | Beats `RECENCY_FEATURES`, which was measured as noise. FILES THE PLAN NAMES: research/playgrain/lineup/depth_roles.py MISSING: depth_roles.py No prior board item ever mentioned this.
B-05B-05 — Box count, rushers, man/zone, shell, given state, offensive personnel and DC. These are the W-00done
Why this matters
Plan item B-05, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Box count, rushers, man/zone, shell, given state, offensive personnel and DC. These are the W-001…W-014 columns that are "held on disk and read by no feature". FILES THE PLAN NAMES: research/playgrain/policy/policy_defense.py MISSING: policy_defense.py No prior board item ever mentioned this.
B-06B-06 — Who gets the ball. Run: carrier among on-field backs and QB (designed or scramble). Pass: a multdone
Why this matters
Plan item B-06, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Who gets the ball. Run: carrier among on-field backs and QB (designed or scramble). Pass: a multinomial over the routes on the field, given target-earning ratings, the coverage draw, the depth-of-target distribution and QB tendencies. Identity-free, so it works for any roster. It attacks the −0.5036 usage-share oracle directly. FILES THE PLAN NAMES: research/playgrain/policy/policy_target.py MISSING: policy_target.py PRIOR EVIDENCE on the old board: C-79
C-17C-17 — College play-by-play and player seasons from collegefootballdata.com (free key) for rookie priornext
Why this matters
Plan item C-17, lane sensors, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Dependency
CFBD_API_KEY -- a free collegefootballdata.com account only Sean can open; ingest is built and tested on a stub, the live pull is unrun
Evidence and next step
College play-by-play and player seasons from collegefootballdata.com (free key) for rookie priors. FILES THE PLAN NAMES: research/playgrain/sensors/cfbd_ingest.py MISSING: cfbd_ingest.py PRIOR EVIDENCE on the old board: C-17
E-10E-10 — Re-run what the old path measured wrongly (the queue follows this table).next
Why this matters
Plan item E-10, lane truth and the fantasy path, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Re-run what the old path measured wrongly (the queue follows this table). FILES THE PLAN NAMES: research/playgrain/evalx/retest_queue.py MISSING: retest_queue.py No prior board item ever mentioned this.
PW-65A job is a charter, not a promptnext
Why this matters
'A versioned charter with inputs, permitted actions, required evidence, timing, and a SUCCESSOR.' Our lanes have briefs — no successor, no independent reviewer, no output contract, no version. LANES.md plus a launchd interval is about half a charter, and the missing half is the accountability half. See §5.
PW-72Record why the NOT FOUNDs are the interesting part, not the discouraging partdone
Why this matters
The reasoning Gemini reached only after Sean pushed back, worth keeping as doctrine.
Evidence and next step
Three research targets came back NOT FOUND and its first instinct was 'an operational suicide mission'. Its second: 'Public academia is only measuring 1-step context or static divergence. THIS ABSENCE IS THE ALPHA. If academia hasn't mapped the decay of 150-play rollouts, it means public consensus believes it is computationally intractable. The proprietary syndicates who have solved it do not publish.' And on Target C: 'the literature is completely blind to the structural asymmetry you are building.' That inversion is already written into docs/GEMINI-NO-COWARDICE.md and the prompts. This item is to check it holds when we act on it: an unmapped frontier is a candidate moat, and it is also where a solo operator can burn a season. The discipline is that each of these gets a MIDTERM exam short enough to fail fast.
Q-02Q-02 — Settle every claim against what happened. Only 7 are settled, so language's value is *unmeasurednext
Why this matters
Plan item Q-02, lane sensors, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Settle every claim against what happened. Only 7 are settled, so language's value is *unmeasured*, not null. Per-speaker and per-outlet reliability as house effects (the XD-B04 house-effect test passed; `consensus.py` shows +4.51 pts/team/season at 4.23σ). Feeds A-02 and B-02. FILES THE PLAN NAMES: playerweek/claim_settle.py, playerweek/speaker_reliability.py MISSING: claim_settle.py, speaker_reliability.py No prior board item ever mentioned this.
S-14S-14 — The rollout, vectorised across trajectories and the slate, with **player attribution**: every pldone
Why this matters
Plan item S-14, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The rollout, vectorised across trajectories and the slate, with **player attribution**: every play records passer, carrier and target, so player stat lines accumulate per trajectory. It draws lineup, rating posterior, form, weather and crew per trajectory. | One ledger: on every path, QB passing equals the sum of receivers, and team points equal the sum of scores. Exactly. FILES THE PLAN NAMES: research/playgrain/sim2.py MISSING: sim2.py No prior board item ever mentioned this.
A-07A-07 — Audit: when a player is removed, where do the opportunities go, in the simulator and in reality.done
Why this matters
Plan item A-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Audit: when a player is removed, where do the opportunities go, in the simulator and in reality. | Reallocation error by position. FILES THE PLAN NAMES: research/playgrain/lineup/vacated_share.py MISSING: vacated_share.py No prior board item ever mentioned this.
C-16C-16 — The missing sensor nobody runs at scale outside the league: coaches-film computer vision producinext
Why this matters
Plan item C-16, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Dependency
the ledger's own commissioning gate -- re-run bin/residual-ledger.py and check whether the UNASSIGNED row names tracking-grade state; it does not today (checked 2026-09-23, see result)
Evidence and next step
The missing sensor nobody runs at scale outside the league: coaches-film computer vision producing tracking for *every* play of *every* game. About 10M frames a season, roughly a week of M5 time per season, run overnight. Built last, and commissioned only when the ledger's UNASSIGNED row says tracking-grade state is the biggest remaining prize. `source_probe.py` checks the terms of use first. FILES THE PLAN NAMES: research/playgrain/sensors/all22/, detect.py, track.py, register_field.py, to_tracking.py MISSING: , detect.py, track.py, register_field.py, to_tracking.py PRIOR EVIDENCE on the old board: C-16
C-18C-18 — One photo of the week's ticket stack becomes the price actually got for each bet. Local vision mnext
Why this matters
Plan item C-18, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Dependency
A real photograph of a real ticket stack (Sean places the wagers and photographs them, plan sec. 7; first stakes 2026-10-10). The reader is built and measured on synthetic slips only; what is left cannot be done by a build worker.
Evidence and next step
One photo of the week's ticket stack becomes the price actually got for each bet. Local vision model; falls back to the sheet price. Feeds D-04 and D-07. FILES THE PLAN NAMES: research/playgrain/sensors/ticket_ocr.py MISSING: ticket_ocr.py PRIOR EVIDENCE on the old board: C-18
D-07D-07 — Once tickets accumulate, learn how the Jackpot board sits against the wider market on a Tuesday:next
Why this matters
Plan item D-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Dependency
C-18 (research/playgrain/sensors/ticket_ocr.py, shard 2, state next, not built -- no ticket-price sensor exists anywhere in the repo) AND actual accumulated tickets (real photographed bet-slip data from Sean placing bets), which only exists once C-18 is built and run for a while -- neither precondition this file names ("once tickets accumulate") can be met by a build worker.
Evidence and next step
Once tickets accumulate, learn how the Jackpot board sits against the wider market on a Tuesday: its shade, its stale numbers, which markets it hangs. FILES THE PLAN NAMES: research/playgrain/decide/book_profile.py MISSING: book_profile.py No prior board item ever mentioned this.
E-06E-06 — Plant an effect of known size in the play data and require every gate to find it. Also the placedone
Why this matters
Plan item E-06, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Plant an effect of known size in the play data and require every gate to find it. Also the placebo battery (the astrology columns already exist as the negative control) and permutation nulls. Every gate publishes its power. FILES THE PLAN NAMES: research/playgrain/evalx/plant_controls.py MISSING: plant_controls.py No prior board item ever mentioned this.
E-07E-07 — The smallest detectable effect per layer, per window, game-clustered. It replaces the single 0.1done
Why this matters
Plan item E-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The smallest detectable effect per layer, per window, game-clustered. It replaces the single 0.138 figure. FILES THE PLAN NAMES: research/playgrain/evalx/mde_table.py MISSING: mde_table.py No prior board item ever mentioned this.
E-09E-09 — Run `world-model-compiler-v1/cross-team-response-experiment.json`, which is `DESIGNED_NOT_RUN`: next
Why this matters
Plan item E-09, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Run `world-model-compiler-v1/cross-team-response-experiment.json`, which is `DESIGNED_NOT_RUN`: G0 terminal Gaussian against the generator, five negative controls. FILES THE PLAN NAMES: research/playgrain/evalx/energy_experiment.py MISSING: energy_experiment.py No prior board item ever mentioned this.
F-06F-06 — Per-key hyperparameter search. `max_depth=3, l2=5.0` already fixes WR carries from −29.86% to −5done
Why this matters
Plan item F-06, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Per-key hyperparameter search. `max_depth=3, l2=5.0` already fixes WR carries from −29.86% to −5.17%. | Board breaches cleared FILES THE PLAN NAMES: research/sweep_tree_params.py MISSING: sweep_tree_params.py No prior board item ever mentioned this.
F-08F-08 — Replace `intervals.SHIPPED_CURVE` with `sim.simulate` (`sim.py:813`), which has 0.7788 coverage done
Why this matters
Plan item F-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Replace `intervals.SHIPPED_CURVE` with `sim.simulate` (`sim.py:813`), which has 0.7788 coverage and correct zero atoms. | Intervals from a generator, not a table FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
O-05O-05 — The throughput budget for S-14, measured on every release.done
Why this matters
Plan item O-05, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The throughput budget for S-14, measured on every release. FILES THE PLAN NAMES: research/playgrain/operate/bench.py MISSING: bench.py No prior board item ever mentioned this.
O-06O-06 — New launchd jobs, all catch-up style.done
Why this matters
Plan item O-06, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
New launchd jobs, all catch-up style. FILES THE PLAN NAMES: bin/*.plist MISSING: *.plist PRIOR EVIDENCE on the old board: C-178, C-163
O-07O-07 — The SQL findings stay, and the fabricated citations go. Nine of them independently corroborate tdone
Why this matters
Plan item O-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The SQL findings stay, and the fabricated citations go. Nine of them independently corroborate the credit-registry conservation defects. FILES THE PLAN NAMES: research/quarantine-20260919/, research/gemini-deep/ MISSING: , No prior board item ever mentioned this.
O-08O-08 — Remove the 60 worktrees whose branches have zero unmerged patches. The branches remain, so nothidone
Why this matters
Plan item O-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Remove the 60 worktrees whose branches have zero unmerged patches. The branches remain, so nothing is lost. FILES THE PLAN NAMES: bin/prune-worktrees.sh MISSING: prune-worktrees.sh No prior board item ever mentioned this.
P-08P-08 — 2026 in-season participation does not publish until after the season. Impute on-field sets from done
Why this matters
Plan item P-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
2026 in-season participation does not publish until after the season. Impute on-field sets from weekly snap counts, depth charts, personnel tendencies and the pbp role ids (passer, rusher, target, tacklers, pass defenders). Trained and validated on 2016–2025, where truth is known. | Mean Jaccard ≥ 0.85 on hidden truth; error propagated as uncertainty into T-02. FILES THE PLAN NAMES: research/playgrain/participation_impute.py MISSING: participation_impute.py No prior board item ever mentioned this.
P-09P-09 — `game_context_asof`: roof, surface, elevation, travel_km, tz_shift, rest days, short week, officdone
Why this matters
Plan item P-09, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
`game_context_asof`: roof, surface, elevation, travel_km, tz_shift, rest days, short week, officials, weather ladder. All keyed by `valid_time`. | As-of tests. FILES THE PLAN NAMES: research/playgrain/load_context.py MISSING: load_context.py No prior board item ever mentioned this.
PW-104bin/janitor.sh not loaded in launchd, log stale since 2026-09-20 -- adjacent finding from PW-47, not fixeddone
Why this matters
PW-47 (C-32, 2026-09-22 17:28 MDT), while fixing the identical bug for suite-check, found the SAME bug already live in janitor.sh and scoped it out on purpose rather than guess at a fix. Re-verified 2026-09-23 03:45 MDT while closing PW-47's own stale bookkeeping: the plist com.seano.playerweek.janitor.plist is present in ~/Library/LaunchAgents but `launchctl list` does not show it loaded, and data/logs/janitor.log's mtime is still 2026-09-20 21:20 -- unchanged, so the gap has held for three days, not just the two originally measured.
Evidence and next step
janitor.sh is not in bin/lane-watchdog.py's LANES table either, so its silence is invisible to the one system built to catch exactly this (bin/lane-watchdog.py:245's own comment: "'not loaded' reads as silence, not a fault" -- referring to this file by name as the precedent suite-check was built to not repeat). NOT A SIMPLE RELOAD: janitor.sh's own checks (research/plan_conditions.py, a six-condition "IS THE PLAN DONE" gate, and an LANES.md-era lane count) reference the pre-2026-09-22 board regime (the 174-item board construction.json's own `note` field says was replaced because it named only 21 of 119 plan items). Reloading it blind risks resurrecting a check built against a retired board rather than the current gate.py/construction.json regime. Whoever takes this needs to read research/plan_conditions.py first and decide: rewrite it against the current gate, retire it explicitly (remove the plist, log why), or confirm its checks still hold unmodified before reloading.
PW-105wh.hurdle_pred is a one-time 2019-2025 backtest, not a live sensor -- 2026 rows are zero and the box reads green anywaynext
Why this matters
Found while closing PW-23: research/playgrain/build_hurdle.py's oof() and its --write path are hardcoded to test season <= 2025 (bh.oof(df, first=2019, last=2025)); wh.hurdle_pred holds 48,999 rows, all seasons 2019-2025, zero for 2026. research/playgrain/evalx/residual_ledger.py's own NEXT_SENSORS already named this gap ("the hurdle model's own P(active) output... this ledger's 'played' candidate uses the REALISED outcome, not the pre-kickoff forecast") before this probe confirmed it live.
Evidence and next step
buildsite/machine.py's 'hurdle model' box (A family, P(active) -> P(plays) -> share) reads `ev("{n:,} out-of-fold rows", "wh.hurdle_pred", need=1000)` -- a plain row-count threshold with no season filter, so it shows green on 48,999 historical rows while the table that would actually inform THIS season's decisions has none. Same shape as the hardcoded-green defects machine.py's own comments warn about (rapm_theta, caller_policy), just not one of the named ones yet. Measured 2026-09-23 (see PW-23's result): extending oof() to test season 2026 (training unchanged, still 2017-2025 only) and substituting that real forecast for bets against 2026 weeks 1-2 gave real_worth=-0.0334 against an oracle ceiling of +0.5288 -- the live forecast is not yet capturing the value the backtest promised, on a small n=689/2-week sample. Whoever takes this: (1) decide whether build_hurdle.py should run weekly with --write extended through the current season (an expanding-window refit each week, same pattern as build_playprob.py needs to be checked for), or (2) give the box a season-aware probe so it cannot read green on stale infrastructure -- both are real fixes, neither is done here. This item does not choose between them.
PW-110QB backup-conditional-level model, named as F-08's real remaining gap across seven follow-ups, never builtnext
Why this matters
F-08 (construction.json, closed 2026-09-23) measured across seven follow-ups that sim.simulate() cannot match intervals.SHIPPED_CURVE's QB coverage (0.6923 vs nominal 0.80) because a benched starter's play-time uncertainty has no home in the simulator: a post-hoc floor patch and a per-draw conservation-preserving redistribution (sim.qb_draw_weights, built and proven in F-08's sixth follow-up) both help but neither closes the gap, because the real defect is one level up -- playprob.py's own module docstring names a backup QB's CONDITIONAL scoring level (his own rate when he actually plays) as measured too high, independent of how correctly his play probability is modeled. F-08 declined to fix this inside its own measurement script twice (fifth and seventh follow-ups), on the same reasoning both times: proxying around it via P(play) scores better out-of-sample but hides the level bug rather than fixing it, which is a worse trap than leaving the gap named.
Evidence and next step
Scope, if taken: fit a backup QB's expected fantasy output CONDITIONAL on actually playing (not blended with his near-zero bench rate) as its own model or feature, then feed that corrected level into sim.qb_draw_weights (already built, sim.py:258, proven by tests/test_qb_draw_weights.py) rather than the roster's raw historical share. Needs its own held-out measurement against real backup-QB games (injury-forced starts are the natural test set), not a re-run of F-08's coverage/correlation gate, which measures the simulator's structure and cannot see a level bug shared identically by both arms of an A/B. Not started -- no code exists for this anywhere in the codebase, research or production.
PW-92168 of 353 test files are not green at baseline -- 114 error, 54 time out, unrelated to mutationnext
Why this matters
Found while re-verifying J-08's mutation harness (shard 0, 2026-09-23): tests/audit-gates-baseline.json now has full population coverage (353/353), and its 'skipped' bucket breaks down as 114 'baseline not green (rc=1)' + 54 'baseline timeout' -- 168 files, 48% of the suite, that the harness could not even mutation-test because the UNMUTATED test already fails or hangs. This is not a J-08 defect; J-08 correctly excludes what it cannot exercise. It is a finding about the suite itself: a test that cannot pass at baseline gives zero signal either way, mutated or not, and CI green on the suite as a whole says nothing about these 168.
Evidence and next step
No fix attempted here -- filing the finding, not the repair, per the rule that discovering a defect does not make it the discoverer's to work next. Next step for whoever picks this up: pull the 114 rc=1 filenames and their tracebacks (the harness's sandboxed run captures rc but this ledger entry format does not keep stderr -- would need a rerun with output captured, or grep test collection logs) and the 54 timeout filenames, and sort by whether the failure is a real regression (code moved under the test) versus an environment/fixture problem (missing fixture data, a since-renamed import, a live-service call that should have been in SAFETY_EXCLUDE). 12 additional files are fully green but 'cannot_fail' after 3 mutation attempts each -- listed on J-08's result -- which is a smaller, separate debt (the test runs fine, the harness just couldn't kill it).
Q-03Q-03 — `speaker_is` is unknown on 141 of 153 pressers, and it is the one field Q-36 turns on.done
Why this matters
Plan item Q-03, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
`speaker_is` is unknown on 141 of 153 pressers, and it is the one field Q-36 turns on. FILES THE PLAN NAMES: playerweek/news.py all present No prior board item ever mentioned this.
Q-04Q-04 — Claims become as-of features for availability (A-02), role change (A-06) and play-caller intent done
Why this matters
Plan item Q-04, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Claims become as-of features for availability (A-02), role change (A-06) and play-caller intent (B-02). Never for points directly: that was measured at +0.002 RMSE, where availability was −0.0038 Brier with a clean placebo. FILES THE PLAN NAMES: research/playgrain/sensors/claims_to_features.py MISSING: claims_to_features.py No prior board item ever mentioned this.
S-16S-16 — Trajectories are content-hashed per (game, lock, release); issuance is frozen with the existing done
Why this matters
Plan item S-16, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Trajectories are content-hashed per (game, lock, release); issuance is frozen with the existing row-lock discipline. | Replays bit-for-bit. FILES THE PLAN NAMES: research/playgrain/sim_store.py MISSING: sim_store.py No prior board item ever mentioned this.
S-17S-17 — Any team-season against any team-season, retired players included. The north star's first demandnext
Why this matters
Plan item S-17, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Any team-season against any team-season, retired players included. The north star's first demand. | A football person reads the play-by-play without flinching. FILES THE PLAN NAMES: research/playgrain/hypothetical.py MISSING: hypothetical.py No prior board item ever mentioned this.
S-18S-18 — Whole seasons and playoffs. Ratings evolve between simulated weeks and injuries accrue through Anext
Why this matters
Plan item S-18, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Whole seasons and playoffs. Ratings evolve between simulated weeks and injuries accrue through A-04. | Division and playoff odds calibrated on 2004–2025. FILES THE PLAN NAMES: research/playgrain/season_sim.py MISSING: season_sim.py No prior board item ever mentioned this.
S-19S-19 — Compile the boosters (treelite or lleaves, or Numba lookup tables) if S-14 misses its budget. | next
Why this matters
Plan item S-19, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Dependency
S-14
Evidence and next step
Compile the boosters (treelite or lleaves, or Numba lookup tables) if S-14 misses its budget. | 16 games × 10,000 trajectories in under 60 minutes on the M5. FILES THE PLAN NAMES: research/playgrain/compile_models.py MISSING: compile_models.py No prior board item ever mentioned this.
T-08T-08 — Every rating family is scored on what it adds to the kernel and logged to the ledger. | —done
Why this matters
Plan item T-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Every rating family is scored on what it adds to the kernel and logged to the ledger. | — FILES THE PLAN NAMES: research/playgrain/talent/latent_eval.py MISSING: latent_eval.py No prior board item ever mentioned this.
PW-19Forecast did he play at all (worth +0.76 MAE as an oracle)done
Why this matters
Proposed by bin/residual-ledger.py, not by a person. The ledger feeds each candidate's REALISED value in as an oracle and records how much error disappears; that number is the value of measuring it perfectly, and ranking by it turns 'what should we build' from an opinion into a measurement. Sean, 2026-09-20, on being told the board was the one thing still written by hand: 'why not'.
Evidence and next step
MEASURED 2026-09-24, n=817: knowing this perfectly takes our MAE from 4.1828 to 3.8487, worth +0.3341. That is a CEILING on what measuring it can buy, not a promise -- a variable worth 2 points as an oracle may be worth 0.2 once forecast. Sensor: the availability hurdle (C-53) -- P(active) before kickoff. [ledger:did he play at all]
PW-20Forecast his targets (worth +0.51 MAE as an oracle)done
Why this matters
Proposed by bin/residual-ledger.py, not by a person. The ledger feeds each candidate's REALISED value in as an oracle and records how much error disappears; that number is the value of measuring it perfectly, and ranking by it turns 'what should we build' from an opinion into a measurement. Sean, 2026-09-20, on being told the board was the one thing still written by hand: 'why not'.
Evidence and next step
MEASURED 2026-09-24, n=817: knowing this perfectly takes our MAE from 4.1828 to 3.8275, worth +0.3553. That is a CEILING on what measuring it can buy, not a promise -- a variable worth 2 points as an oracle may be worth 0.2 once forecast. Sensor: the target policy: who gets the ball, given who is on the field. [ledger:his targets]
PW-21Forecast team rush attempts (worth +0.40 MAE as an oracle)next
Why this matters
Proposed by bin/residual-ledger.py, not by a person. The ledger feeds each candidate's REALISED value in as an oracle and records how much error disappears; that number is the value of measuring it perfectly, and ranking by it turns 'what should we build' from an opinion into a measurement. Sean, 2026-09-20, on being told the board was the one thing still written by hand: 'why not'.
Evidence and next step
MEASURED 2026-09-24, n=817: knowing this perfectly takes our MAE from 4.1828 to 4.0947, worth +0.0881. That is a CEILING on what measuring it can buy, not a promise -- a variable worth 2 points as an oracle may be worth 0.2 once forecast. Sensor: team volume, rushing half. [ledger:team rush attempts]
PW-22Forecast team pass attempts (worth +0.36 MAE as an oracle)next
Why this matters
Proposed by bin/residual-ledger.py, not by a person. The ledger feeds each candidate's REALISED value in as an oracle and records how much error disappears; that number is the value of measuring it perfectly, and ranking by it turns 'what should we build' from an opinion into a measurement. Sean, 2026-09-20, on being told the board was the one thing still written by hand: 'why not'.
Evidence and next step
MEASURED 2026-09-24, n=817: knowing this perfectly takes our MAE from 4.1828 to 4.1311, worth +0.0517. That is a CEILING on what measuring it can buy, not a promise -- a variable worth 2 points as an oracle may be worth 0.2 once forecast. Sensor: team volume: plays and pass rate given script and opponent. [ledger:team pass attempts]
PW-23Forecast his snap share (worth +0.33 MAE as an oracle)done
Why this matters
Proposed by bin/residual-ledger.py, not by a person. The ledger feeds each candidate's REALISED value in as an oracle and records how much error disappears; that number is the value of measuring it perfectly, and ranking by it turns 'what should we build' from an opinion into a measurement. Sean, 2026-09-20, on being told the board was the one thing still written by hand: 'why not'.
Evidence and next step
MEASURED 2026-09-24, n=817: knowing this perfectly takes our MAE from 4.1828 to 3.654, worth +0.5288. That is a CEILING on what measuring it can buy, not a promise -- a variable worth 2 points as an oracle may be worth 0.2 once forecast. Sensor: role forecasting from depth, usage and the injury ladder. [ledger:his snap share]
PW-24Forecast his carries (worth +0.32 MAE as an oracle)next
Why this matters
Proposed by bin/residual-ledger.py, not by a person. The ledger feeds each candidate's REALISED value in as an oracle and records how much error disappears; that number is the value of measuring it perfectly, and ranking by it turns 'what should we build' from an opinion into a measurement. Sean, 2026-09-20, on being told the board was the one thing still written by hand: 'why not'.
Evidence and next step
MEASURED 2026-09-24, n=817: knowing this perfectly takes our MAE from 4.1828 to 3.9925, worth +0.1903. That is a CEILING on what measuring it can buy, not a promise -- a variable worth 2 points as an oracle may be worth 0.2 once forecast. Sensor: the carry policy and the backfield committee split. [ledger:his carries]
A-01A-01 — The Wed/Thu/Fri practice-status and game-status ladder, 2016–2026, as-of, from `inj_raw` and C-1done
Why this matters
Plan item A-01, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The Wed/Thu/Fri practice-status and game-status ladder, 2016–2026, as-of, from `inj_raw` and C-14. | Every status row has a received-time or a reconstructed publish time. FILES THE PLAN NAMES: research/playgrain/lineup/inj_ladder.py MISSING: inj_ladder.py PRIOR EVIDENCE on the old board: C-75
B-01B-01 — Head coach, play-caller, OC and DC per team-week, as-of. `coordinators.csv` exists; fix `games_rdone
Why this matters
Plan item B-01, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Head coach, play-caller, OC and DC per team-week, as-of. `coordinators.csv` exists; fix `games_raw.home_coach`. FILES THE PLAN NAMES: research/playgrain/policy/coach_dim.py MISSING: coach_dim.py No prior board item ever mentioned this.
B-04B-04 — Go/punt/kick by coach. The late-and-close policy is its own model: kneel-downs, playing for the done
Why this matters
Plan item B-04, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Go/punt/kick by coach. The late-and-close policy is its own model: kneel-downs, playing for the field goal when tied, the two-point chart, timeout use, and the end-of-half "give up" mode both Gemini runs named as a collapse source. **This is where the missing mass on 3 comes from.** FILES THE PLAN NAMES: research/playgrain/policy/policy_fourth.py, policy/policy_endgame.py MISSING: policy_fourth.py, policy_endgame.py No prior board item ever mentioned this.
C-01C-01 — Per-source staleness measured by the *source's own timestamp*, not the job's exit code. It writedone
Why this matters
Plan item C-01, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Per-source staleness measured by the *source's own timestamp*, not the job's exit code. It writes `alarms.jsonl` for the board, the only alarm path. Catches odds on 7 of 15 days, props 5 days stale, availability 48 h dark. FILES THE PLAN NAMES: research/playgrain/sensors/capture_health.py all present PRIOR EVIDENCE on the old board: C-01
C-02C-02 — Fix the `-3≤hours_to_kickoff≤6` window bug. Turn the eight one-shot captures into standing ones:done
Why this matters
Plan item C-02, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Fix the `-3≤hours_to_kickoff≤6` window bug. Turn the eight one-shot captures into standing ones: `inj_snapshot` Wed/Thu/Fri, `avail_snap`, `presser`, `workload_claim` (where `lock_legal_wed` is TRUE on 0 of 715 rows). FILES THE PLAN NAMES: bin/institute-capture.sh, bin/institute-structured-capture.sh all present PRIOR EVIDENCE on the old board: C-02
C-03C-03 — Captures append to `data/land/*.parquet` and never touch DuckDB. One single-writer loader owns tdone
Why this matters
Plan item C-03, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Captures append to `data/land/*.parquet` and never touch DuckDB. One single-writer loader owns the write lock, which ends `"status":"lost"`. FILES THE PLAN NAMES: research/playgrain/sensors/land_loader.py MISSING: land_loader.py PRIOR EVIDENCE on the old board: C-03
C-04C-04 — **The number you actually face.** Hourly from Monday 00:00 to Wednesday 23:59 MT: spreads, totaldone
Why this matters
Plan item C-04, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
**The number you actually face.** Hourly from Monday 00:00 to Wednesday 23:59 MT: spreads, totals, moneylines, team totals and alt lines from every book in the feed. `williamhill_us` (Caesars, the operator of the Jackpot property) is flagged as the board proxy. `odds_history` already holds 32 books and 205 instants since 2023-09. Table: `early_lines`. FILES THE PLAN NAMES: research/playgrain/sensors/early_lines_capture.py MISSING: early_lines_capture.py PRIOR EVIDENCE on the old board: C-76, C-04
C-05C-05 — Props for all markets, not 6, hourly; de-vig method unchanged.done
Why this matters
Plan item C-05, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Props for all markets, not 6, hourly; de-vig method unchanged. FILES THE PLAN NAMES: bin/odds-capture.sh, playerweek/props.py all present PRIOR EVIDENCE on the old board: C-05
D-02D-02 — One sitting, up to ~100 wagers that settle together. Portfolio Kelly over the joint trajectoriesdone
Why this matters
Plan item D-02, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
One sitting, up to ~100 wagers that settle together. Portfolio Kelly over the joint trajectories, fractional, with every correlated position in the same game priced jointly. The maximum fraction at risk is read from `~/.config/playerweek/risk.json`, which no agent may write. FILES THE PLAN NAMES: research/playgrain/decide/stake_portfolio.py, playerweek/stake.py MISSING: stake_portfolio.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
D-03D-03 — For each wager, the worst line and price at which it is still a bet. The board will have moved bdone
Why this matters
Plan item D-03, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
For each wager, the worst line and price at which it is still a bet. The board will have moved by the time you reach the window. FILES THE PLAN NAMES: research/playgrain/decide/walkaway.py MISSING: walkaway.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
D-04D-04 — Independent settlement from play-by-play into the append-only `data/proving.jsonl`. **Opened thidone
Why this matters
Plan item D-04, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Independent settlement from play-by-play into the append-only `data/proving.jsonl`. **Opened this Tuesday with paper entries.** It cannot be backfilled, and it costs nothing. FILES THE PLAN NAMES: research/playgrain/decide/settle.py, decide/ledger.py MISSING: settle.py No prior board item ever mentioned this.
D-05D-05 — The sheet: wager, line, walk-away, stake, in window order. Offline, on a phone.done
Why this matters
Plan item D-05, lane kernel, drift, decision, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The sheet: wager, line, walk-away, stake, in window order. Offline, on a phone. FILES THE PLAN NAMES: research/playgrain/decide/sheet.py, playerweek/pwa.py MISSING: sheet.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
D-06D-06 — Closing-line value as a read-only diagnostic. The previous release keeps issuing in shadow, and done
Why this matters
Plan item D-06, lane kernel, drift, decision, due Fri 9 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Closing-line value as a read-only diagnostic. The previous release keeps issuing in shadow, and a CUSUM on paired CLV and Brier reverts the pointer. A seeded regression reverts in 3 weeks. FILES THE PLAN NAMES: research/playgrain/decide/clv_diag.py, loop/rollback.py MISSING: clv_diag.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
E-01E-01 — Rolling origin 2004→2025: fit ≤ season s−2, calibrate on s−1, simulate every game of s from its done
Why this matters
Plan item E-01, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Rolling origin 2004→2025: fit ≤ season s−2, calibrate on s−1, simulate every game of s from its as-of state. Produces a distribution for every game in 22 seasons. Runs overnight; resumable. FILES THE PLAN NAMES: research/playgrain/evalx/walkforward.py MISSING: walkforward.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10. HOW TO RUN IT IN A UNIT, added 2026-09-22 after three units were killed at the alarm and the lane was restarted mid-origin: `--limit 1`. One origin is ~9 min (2008: fit 130s + sim 412s); two fit a 20-minute unit, three do not. Origin 2008 is checkpointed in data/playgrain-walkforward/manifest.json; 2009 was lost to the restart and is the resume point. Run one or two origins, exit clean, let the next unit continue.
E-02E-02 — CRPS (margin, total, team totals, player lines), log loss (winner), energy score (joint: both QBdone
Why this matters
Plan item E-02, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
CRPS (margin, total, team totals, player lines), log loss (winner), energy score (joint: both QBs plus both team scores), interval coverage. Confidence intervals by **game-block bootstrap**; paired Diebold–Mariano between releases. FILES THE PLAN NAMES: research/playgrain/evalx/scores.py MISSING: scores.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
E-04E-04 — One score per layer on the full issued population. The layers are availability, action, personnedone
Why this matters
Plan item E-04, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
One score per layer on the full issued population. The layers are availability, action, personnel, target, outcome, magnitude, clock, drive, game and player line. Each faces the same frozen baselines at the same cutoff: carry-forward, pre-kickoff consensus, v1, the teamstate rival. A right total with a wrong workload story shows as two errors. FILES THE PLAN NAMES: research/playgrain/evalx/layer_scorecard.py MISSING: layer_scorecard.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
E-05E-05 — The Residual Attribution Ledger of §1. `oracle_pairs.py` tests candidate sensors **in pairs**, bdone
Why this matters
Plan item E-05, lane ratings, lineups, policies, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The Residual Attribution Ledger of §1. `oracle_pairs.py` tests candidate sensors **in pairs**, because `measurement_value.py` already proved greedy selection is blind: two sensors worth 4.4e-16 nats each were jointly worth 0.1766. FILES THE PLAN NAMES: research/playgrain/evalx/residual_ledger.py, evalx/oracle_pairs.py MISSING: residual_ledger.py, oracle_pairs.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
E-08E-08 — Weekly prospective issuance at the TUE lock, frozen beside v1 and the rival, graded the followindone
Why this matters
Plan item E-08, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Weekly prospective issuance at the TUE lock, frozen beside v1 and the rival, graded the following Tuesday. Two shadow slots, as the schematic specifies. FILES THE PLAN NAMES: research/playgrain/evalx/issue_shadow.py, evalx/grade_week.py MISSING: issue_shadow.py, grade_week.py No prior board item ever mentioned this.
F-01F-01 — The measured fix. | MAE 4.2600 → 3.8748done
Why this matters
Plan item F-01, lane truth and the fantasy path, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The measured fix. | MAE 4.2600 → 3.8748 FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
F-02F-02 — Give each QB a pass-attempt *share*, not the team's whole volume. | The QB gap of +0.975 closes done
Why this matters
Plan item F-02, lane truth and the fantasy path, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Give each QB a pass-attempt *share*, not the team's whole volume. | The QB gap of +0.975 closes most of the way FILES THE PLAN NAMES: playermodel.py all present No prior board item ever mentioned this.
J-05J-05 — The durable results store, `data/results.duckdb`. It exposes `record(script, git_sha, populationdone
Why this matters
Plan item J-05, lane truth and the fantasy path, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The durable results store, `data/results.duckdb`. It exposes `record(script, git_sha, population_sql, metric, value, ci_lo, ci_hi, n, seed, release)`. Nothing writes findings to `/tmp` again. | `tests/test_results_store.py`: a script run without a `record()` call fails CI. FILES THE PLAN NAMES: research/playgrain/results.py all present No prior board item ever mentioned this.
J-06J-06 — Score and fit on the unconditional population, with `E[pts] = P(play)·E[pts \| play]` and DNPs adone
Why this matters
Plan item J-06, lane truth and the fantasy path, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Score and fit on the unconditional population, with `E[pts] = P(play)·E[pts \| play]` and DNPs as zeros. Include weeks 1–3, which have never been scored. | Every gate states its population string; `tests/test_gate_population.py`. FILES THE PLAN NAMES: playerweek/arms.py:229 all present No prior board item ever mentioned this.
J-07J-07 — Force `ORDER BY` on every sampled frame and hash the frame. This removes the ~0.006 pts/wk row-odone
Why this matters
Plan item J-07, lane truth and the fantasy path, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Force `ORDER BY` on every sampled frame and hash the frame. This removes the ~0.006 pts/wk row-order floor that blocked 20 verdicts. | The same seed twice gives an identical hash. FILES THE PLAN NAMES: research/playgrain/evalx/determinism.py all present No prior board item ever mentioned this.
J-10J-10 — Delete the stale "irreducible" text; fail the build on `irreducible\|noise floor\|ceiling` applidone
Why this matters
Plan item J-10, lane truth and the fantasy path, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Delete the stale "irreducible" text; fail the build on `irreducible\|noise floor\|ceiling` applied to football. The CORE-BRIEF's two sanctioned senses are allow-listed. | Green. FILES THE PLAN NAMES: tests/test_banned_words.py MISSING: test_banned_words.py No prior board item ever mentioned this.
L-07L-07 — The orchestrator: worst residuals → explanation brief → sandboxed proposal → evaluator → promotedone
Why this matters
Plan item L-07, lane kernel, drift, decision, due Fri 9 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The orchestrator: worst residuals → explanation brief → sandboxed proposal → evaluator → promote or anti-library. Five proposals a night, hard-limited. The proposer sees a schema and a residual summary, never a row and never the holdout. FILES THE PLAN NAMES: research/playgrain/loop/nightly.py, bin/com.seano.playerweek.playgrain-loop.plist MISSING: nightly.py, com.seano.playerweek.playgrain-loop.plist PRIOR EVIDENCE on the old board: C-177 REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
L-11L-11 — It has 5 entries, all `UNRESOLVED`, while the docs call it the record of what is refuted. Populadone
Why this matters
Plan item L-11, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
It has 5 entries, all `UNRESOLVED`, while the docs call it the record of what is refuted. Populate it from the 48 rejected hypotheses, each with its population. Anything rejected on `played=1` is marked RETEST, not refuted. FILES THE PLAN NAMES: loop/anti-library.json all present No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
L-12L-12 — One row per packet: job, model, tokens, findings, confirmed, false positives, duplicates, downstdone
Why this matters
Plan item L-12, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
One row per packet: job, model, tokens, findings, confirmed, false positives, duplicates, downstream layer movement. Staffing follows measured yield. FILES THE PLAN NAMES: research/playgrain/loop/yield_ledger.py MISSING: yield_ledger.py No prior board item ever mentioned this. REPRIORITISED TO 0 on 2026-09-22 by Sean's instruction to cover the gaps. The objective is a SELF-IMPROVING machine and this item is on the chain that makes it one: L-07 is the loop, L-10 is the evaluator that stops the loop promoting a component gain that worsens the game forecast, E-* is how the machine tells whether anything is better, D-* is how it stakes. The plan's own order put L-07 on Fri 9 Oct -- the last day -- and L-10 unscheduled, which is exactly why zero proposals have ever been promoted. Measured at reprioritisation: L 0/6, E 1/10, D 1/7. 18 days to 10/10.
N-01N-01 — A first-class hold signal: a job that pauses says so, and every sensor reads itdone
Why this matters
Five times in 36 hours a sensor reported a designed pause as a fault -- build-serving deferring an archive, the odds job holding for budget, the watchdog restarting lanes for idling on an empty board, twice, and chain-report breaking a link on the pre-kickoff yield. Each was fixed as an exemption in the reader. The plan has no item for this because the plan assumed sensors would be right; the objective's 'limited human interaction' clause fails every time one is wrong and a person has to say so.
Evidence and next step
Added to the plan 2026-09-22 (revision noted in §6 of the plan document). Family N: what the objective needs that the design did not name.
N-02N-02 — The board IS the plan, enforced by a testdone
Why this matters
The old board named 21 of the plan's 119 items and 87% of its own items came from elsewhere; nobody noticed for a week because nothing checked. A test that fails if any plan item is missing from the board, or any non-plan item lacks the PW- prefix, or a done item names a file that does not exist. Run by the gate. The confusion of 2026-09-22 cannot recur if it is a failing test rather than a thing a person notices.
Evidence and next step
Added to the plan 2026-09-22 (revision noted in §6 of the plan document). Family N: what the objective needs that the design did not name.
O-03O-03 — The 38 duplicated 459 MB warehouses in `forecast-refresh/` become hard links to one content-addrdone
Why this matters
Plan item O-03, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The 38 duplicated 459 MB warehouses in `forecast-refresh/` become hard links to one content-addressed copy, with manifests kept. 70 GB shrinks to a few. Enforce the written 21-day policy. FILES THE PLAN NAMES: bin/archive-retention.sh, research/playgrain/operate/dedupe_runs.py MISSING: dedupe_runs.py No prior board item ever mentioned this.
P-06P-06 — Load all 372 pbp columns into `plays_wide`; `plays` stays as a stable view. Extend the banned lidone
Why this matters
Plan item P-06, lane ratings, lineups, policies, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Load all 372 pbp columns into `plays_wide`; `plays` stays as a stable view. Extend the banned list to `spread_line`, `total_line`, `vegas_*`, `*_vegas`, `odds*`. | `test_warehouse.py` extended: 0 market columns reachable from `plays_wide`. FILES THE PLAN NAMES: research/playgrain/load_plays_wide.py, schema.py all present PRIOR EVIDENCE on the old board: C-79, C-100
P-07P-07 — Participation 2016–2025 → `participation(game_id, play_id, gsis_id, side, pos)` and `play_persondone
Why this matters
Plan item P-07, lane ratings, lineups, policies, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Participation 2016–2025 → `participation(game_id, play_id, gsis_id, side, pos)` and `play_personnel(offense_personnel, defense_personnel, defenders_in_box, n_pass_rushers, formation, route, man_zone, coverage_type, time_to_throw, was_pressure)`. **Every charted post-snap field is tagged `POST_SNAP` in the contract** and usable only as a training target or a rating input, never as a same-play feature. This is the Gemini B-arm's own correction about `defense_coverage_type`. | Leak witness green. FILES THE PLAN NAMES: research/playgrain/load_participation.py MISSING: load_participation.py No prior board item ever mentioned this.
P-10P-10 — One identity: GSIS canonical through `dp_ids` (35 id systems, 100% populated) in place of `xwalkdone
Why this matters
Plan item P-10, lane ratings, lineups, policies, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
One identity: GSIS canonical through `dp_ids` (35 id systems, 100% populated) in place of `xwalk` (29% null). Kickers and DST included; all kickoffs in UTC with the Eastern source column kept. Fixes the week-1 FantasyPros-id join that "silently matches nothing". | 0 orphan ids; `SCHEDULE_IDENTITY_CONFLICT` (`player_scorecard.py:731-750`) re-keyed from exact-UTC equality to `game_id`. FILES THE PLAN NAMES: research/playgrain/players_dim.py MISSING: players_dim.py No prior board item ever mentioned this.
PW-32Week totals withheld while their own component total is publisheddone
Why this matters
Sean found this, which means nothing else did. Weeks 1 and 2 read 'Not published -- No stored product was supplied' for my_total while group_totals.mine.starters.projection sat beside them at 280.20 and 273.65. The new check finds EIGHT such weeks, not two.
Evidence and next step
THE CHECK EXISTED AND COULD NOT SEE IT. validate-payload.py asks whether a GROUP total is missing while its rows are present. The group total was present; the thing missing was one level up, the WEEK total, and nothing looked there. A validator that covers every level but one inspires exactly the confidence that makes the gap expensive. The check is now in and proven red against the live payload -- 8 gaps: weeks 1, 2 and 15 among them, both sides. WHAT IS LEFT: the CAUSE. bin/build-serving.py reads w.get('my_total') from upstream, so the producer's source already withholds it. Weeks 1 and 2 are PLAYED and week 15 is not, so 'played weeks differ' is not the whole story -- find what actually distinguishes the eight, and fix it there rather than defaulting the total to the group sum at render time. A number computed in the publisher to paper over a missing product is the same defect wearing arithmetic.
PW-57Grade the GAME SHAPE — the rung above the statsdone
Why this matters
Sean, 2026-09-22: "the goal is that the play by play, the shape of the game can be graded, not just the stats."
Evidence and next step
The ladder is play sequence -> drives -> team shape -> stat line -> points, and only the bottom rung is graded. drive_week already exists (1999-2025: start, end, points, clock burned, game state) and sim.py generates game scripts, so the drive rung is gradeable TODAY. research/aar_gameshape.py grades team totals for a single week and is not part of the standing review. X-01 and X-03 did the play-level comparison once as research and found real and simulated states DISJOINT, not shifted — that finding never became a standing grade. An error inherited from the team rung is not an error born at the player rung, and only this separation tells you which.
PW-61Codex is a peer model and it has been dark since 2026-09-17done
Why this matters
80 codex/* branches, a passdown written BY Codex TO Claude, and no lane, plist, board item or plan family mentions it. Its charter is the systems scientist: architecture contracts, promotion gates, decisive experiment design, leakage audit, and independent red-team before real-money use. That is precisely the role nothing currently fills. Decide the runner, the clock and the mandate, and put it on launchd like every other lane. See docs/WHAT-I-WAS-MISSING.md §1.
PW-73Three build lanes were busy and the board showed nothing in flightdone
Why this matters
Sean: "only mice are working?" — they were not; three build-loop processes and two witness leases were running at that moment.
Evidence and next step
The plan map only colours PLAN items, and the build lanes mostly work PW- items, which are self-generated and deliberately excluded from it. So the one section he reads to answer 'what is getting worked' is structurally blind to most of the work. The In-flight card carries it, but it sits below the map and reads as a list rather than as the answer. Make the answer visible where the question is asked: every lane, what it holds, plan item or not.
PW-76The fuel gate reads 62% while the client reads 3% — a safety device off by 20xdone
Why this matters
Sean, 2026-09-22: "Session usage at 67%, weekly usage at 3%." playerweek.cli fuel said "weekly 62% of 100% limit" at the same moment.
Evidence and next step
Every lane gates on this number: a FUEL STOP halts the build lanes, the AAR, the scientists and the referee. If the true weekly figure is 3% and the gate believes 62%, the machine has been throttling itself against a wall that is not there — all night, while three providers were being asked to cover each other. fuel.py reads seven_day.utilization from api.anthropic.com/api/oauth/usage. Probed just now the endpoint returned HTTP 429, so `fuel` was serving its CACHE while reporting "source: live meter" — which is its own defect: a cached reading must not describe itself as live. TWO THINGS TO SETTLE: whether seven_day is the same bucket the client calls "weekly" (there may be separate Opus and overall buckets), and why the cache is labelled live. Until then treat 62% as unverified — do NOT widen any throttle on the strength of it, because the failure mode of being wrong in the other direction is spending his money. CORRECTION 2026-09-22 21:15: Sean — "Nothing ran dry today." He is right about his subscription and I was wrong to say I burned it. The agy CLI is signed in as his Ultra account and still returns "Individual quota reached… upgrade your subscription"; the CLI has its own per-account ceiling, and that is what the mice emptied. His Deep Think and Deep Research capacity was never touched. This also means the 3%/62% gap above is a question about ANTHROPIC's buckets only — the Gemini story is a separate tank entirely.
S-08S-08 — Early stopping on a validation season, not an inference cap at 60 rounds. 115 integer yard bins.done
Why this matters
Plan item S-08, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Early stopping on a validation season, not an inference cap at 60 rounds. 115 integer yard bins. Passes split into air yards and YAC (`mag_air`, `mag_yac`). Every booster registered with its training hash. | OOS log-loss monotone in rounds. FILES THE PLAN NAMES: fit_models.py all present No prior board item ever mentioned this.
S-10S-10 — Semi-Markov durations: the elapsed-time *distribution* per play type, state, tempo and coach, indone
Why this matters
Plan item S-10, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Semi-Markov durations: the elapsed-time *distribution* per play type, state, tempo and coach, in place of five constants. Two-minute warning, runoffs, timeouts. | Plays per game 152.3 ± 2%. FILES THE PLAN NAMES: research/playgrain/kernel/clock.py MISSING: clock.py No prior board item ever mentioned this.
V-01V-01 — The rendered page as a standing surfacedone
Why this matters
Every other check validates what we PRODUCE — the payload, the serving columns, the 129-link data chain — and every one was green while week 1 of the consumer site was visibly wrong in a browser. The rules here are comparative because that is what a row-by-row validator structurally cannot be: a settled week whose projection equals its actual, a week rendering far below its siblings' median. Runs every 30 minutes at zero model tokens; findings become crumbs the mice claim and fix, and appear on the build board. An audit that could not open the site writes ok:false and becomes its own crumb, because no findings reads exactly like a clean site.
X-01X-01 — **First thing built.** k-step rollouts from real states (k = 1, 2, 4, 8, 16, to end of drive); ddone
Why this matters
Plan item X-01, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
**First thing built.** k-step rollouts from real states (k = 1, 2, 4, 8, 16, to end of drive); divergence curves for yards per play, completion and field position, stratified by the game's realised-minus-rated quality. It confirms or kills the §3 diagnosis. | The result decides the order of X-02/03/04. FILES THE PLAN NAMES: research/playgrain/drift/drift_decompose.py MISSING: drift_decompose.py No prior board item ever mentioned this.
C-06C-06 — Fix the Eastern-into-UTC index bug. Capture the forecast ladder (lead 7→0 days, hourly) for everdone
Why this matters
Plan item C-06, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Fix the Eastern-into-UTC index bug. Capture the forecast ladder (lead 7→0 days, hourly) for every venue. Backfill historical *forecasts*, not observations, from Open-Meteo's historical-forecast archive. Remove `temp_observed`/`wind_observed` from the five feature tables that leak them. FILES THE PLAN NAMES: research/playgrain/sensors/weather_asof.py, playerweek/openmeteo.py:40-59 MISSING: weather_asof.py No prior board item ever mentioned this.
C-07C-07 — Referee crew per game, historical from nflverse `officials` plus the weekly assignment release.done
Why this matters
Plan item C-07, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Referee crew per game, historical from nflverse `officials` plus the weekly assignment release. FILES THE PLAN NAMES: research/playgrain/sensors/officials_capture.py MISSING: officials_capture.py PRIOR EVIDENCE on the old board: C-07
C-09C-09 — Daily roster diff: signings, IR, practice-squad elevations (the Saturday tell), waiver claims.done
Why this matters
Plan item C-09, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Daily roster diff: signings, IR, practice-squad elevations (the Saturday tell), waiver claims. FILES THE PLAN NAMES: research/playgrain/sensors/transactions_capture.py MISSING: transactions_capture.py PRIOR EVIDENCE on the old board: C-09
C-11C-11 — One refresher for everything on the nflverse release path: pbp, participation, FTN charting, NGSdone
Why this matters
Plan item C-11, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
One refresher for everything on the nflverse release path: pbp, participation, FTN charting, NGS (2026 rows are missing), PFR advanced stats (2026 missing), snaps, depth charts, rosters_weekly, injuries, officials, contracts. Records `fetched_at` and the upstream `last_modified`. FILES THE PLAN NAMES: research/playgrain/sensors/nflverse_refresh.py MISSING: nflverse_refresh.py No prior board item ever mentioned this.
C-12C-12 — Parse the FTN payloads already sitting in `evidence.sqlite` into `ftn_charting`: play-action, scdone
Why this matters
Plan item C-12, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Parse the FTN payloads already sitting in `evidence.sqlite` into `ftn_charting`: play-action, screen, RPO, motion, blitzers, rushers, out-of-pocket, catchable, contested, drop, created reception, read thrown, QB location, hash. FILES THE PLAN NAMES: research/playgrain/sensors/ftn_parse.py MISSING: ftn_parse.py PRIOR EVIDENCE on the old board: C-77
F-03F-03 — Train on `played=0` rows too, so the model *can* emit a low number. | Re-enables `loss="absolutedone
Why this matters
Plan item F-03, lane truth and the fantasy path, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Train on `played=0` rows too, so the model *can* emit a low number. | Re-enables `loss="absolute_error"`, which passed every gate and was silently killed FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
J-01J-01 — Remove `mkt_total`, `mkt_spread`, `mkt_team_total` from `team_volume` and refit. At serve time tdone
Why this matters
Plan item J-01, lane truth and the fantasy path, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Remove `mkt_total`, `mkt_spread`, `mkt_team_total` from `team_volume` and refit. At serve time they are constants that collapse into the intercept, so they buy nothing and contaminate every backtest. Call `knowability.assert_clean` *inside* `lines_for`; it never runs on the model path today. | `tests/test_no_market_reachable.py` fails if any market-derived column is reachable from `ALL_FEATURES` or `team_volume`. FILES THE PLAN NAMES: playerweek/playermodel.py:95-170, playerweek/share.py all present No prior board item ever mentioned this.
J-02J-02 — Remove the `HOME_FIELD_MARGIN/2` double count (1.748 pts/game). Home field is derived from scheddone
Why this matters
Plan item J-02, lane truth and the fantasy path, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Remove the `HOME_FIELD_MARGIN/2` double count (1.748 pts/game). Home field is derived from schedule and venue only. | Mean home residual on the 2019–2025 holdout within ±0.2. FILES THE PLAN NAMES: playerweek/gameproj.py all present No prior board item ever mentioned this.
J-03J-03 — Re-run every headline accuracy number on clean features and the full population; publish before/done
Why this matters
Plan item J-03, lane truth and the fantasy path, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Re-run every headline accuracy number on clean features and the full population; publish before/after. Expect the numbers to get worse. | Table written to the results store. FILES THE PLAN NAMES: research/playgrain/evalx/remeasure_ledger.py MISSING: remeasure_ledger.py No prior board item ever mentioned this.
J-08J-08 — Mutation harness: inject a known defect per test and require a red result. 73 of 156 tests curredone
Why this matters
Plan item J-08, lane truth and the fantasy path, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Mutation harness: inject a known defect per test and require a red result. 73 of 156 tests currently cannot fail. | 0 un-failable tests; the auto-shipper's two first. FILES THE PLAN NAMES: tests/audit_gates_can_fail.py MISSING: audit_gates_can_fail.py No prior board item ever mentioned this.
J-09J-09 — Cross-fit every calibration, isotonic and stack weight that is in-sample today (D-232: 0.9984 indone
Why this matters
Plan item J-09, lane truth and the fantasy path, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Cross-fit every calibration, isotonic and stack weight that is in-sample today (D-232: 0.9984 in-sample against 1.1383 held out). | Held-out `got/said` within 0.97–1.03 by position. FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
PW-27Probe an untested limit (cannot) in board:C-14done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from board:C-14: "The injury-report ladder and depth charts "cannot be walked backwards" only through one endpoint." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work. ID RE-PREFIXED 2026-09-22. This item was filed as C-27, which collides with the plan's own C-01..C-18 namespace. A lane reading 'C-19' could not tell a residual-ledger proposal from a plan item, and the two mean entirely different things. Locally-generated items carry PW- now; the plan owns the bare letter prefixes.
PW-30Probe an untested limit (not-worth) in commit:d81a4a26done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:d81a4a26: "Team play-calling tendency not worth carrying as a feature." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work. ID RE-PREFIXED 2026-09-22. This item was filed as C-30, which collides with the plan's own C-01..C-18 namespace. A lane reading 'C-19' could not tell a residual-ledger proposal from a plan item, and the two mean entirely different things. Locally-generated items carry PW- now; the plan owns the bare letter prefixes.
PW-33A first-class 'deliberate hold' signal, instead of case-by-case exemptionsdone
Why this matters
Audit finding. Five separate times in 36 hours a sensor reported a designed pause as a fault: build-serving exiting 1 on a deferred archive, the odds sensor calling a budget-driven hold STALE, the watchdog restarting build lanes for idling on an empty board, then the mice for the same, and chain-report breaking a link on the pre-kickoff yield. Each fix was correct and each was a one-off exemption written into the reader.
Evidence and next step
That is the wrong layer. A job that decides to hold KNOWS it is holding; the reader is guessing. Every lane should write its hold reason to one place (data/holds.json: job, since, reason, expected-until) and every sensor should consult it before calling a silence a fault. Then a sixth deliberate hold does not need a sixth exemption. The five existing exemptions become the first five entries, and stay as the test that the mechanism catches what they caught.
PW-35AAR: variance error is 58% of our total, and it is calibration's layerdone
Why this matters
The after-action review attributes 58% of all forecast error we have actually made to variance — 20,655 rows, mean |error| 2.83. That layer belongs to the calibration lane: is the spread honest — intervals and coverage. This is not a counterfactual about what would be worth knowing; it is the error we made, decomposed.
Evidence and next step
Worst positions by count: WR (7,954), RB (5,270), TE (5,089). READ THE DECOMPOSITION BEFORE PROPOSING ANYTHING. aar_attribution carries e_variance, e_regime, e_volume, e_share and e_conversion per forecast, so the question is not 'how do we get better' but 'why does THIS component dominate for THESE positions'. AND CHECK IT AGAINST THE RESIDUAL LEDGER, which answers a different question — what a variable would be worth if known perfectly, rather than what we actually got wrong. Where the two disagree is the interesting case: an error we keep making on a variable the ledger says is cheap means the cost is in our method, not in the unknown. A variance-labelled error is the honest residual of a stochastic process and may be correct; the question there is whether our INTERVALS cover it, which is calibration's layer, not whether the point estimate was wrong.
PW-48Probe an untested limit (cannot) in commit:0c3c6c18done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:0c3c6c18: "C-128: NYG@LAR kicks Mon 9/21 6:15 PM MT, so its first live close capture cannot be tested until then; last capture 4:41 PM MT today." PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-49Probe an untested limit (cannot) in commit:9800600ddone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:9800600d: "cannot be fetched and must be imputed from snap counts, depth charts," PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-50Probe an untested limit (banned-floor) in commit:837568d5done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:837568d5: "senses actually present today: a measurement-procedure noise floor (refit" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-51Probe an untested limit (banned-floor) in commit:e4521890done
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:e4521890: "tdoe.py, actions.py, qarm.py, roleparam.py each compute a genuine noise floor" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-55Probe an untested limit (cost-estimate) in commit:0f5799bbdone
Why this matters
bin/premise-scan.py found a sentence asserting something cannot be done, carrying no measurement. Sean, 2026-09-20: 'you assumed a limitation that doesn't exist.' An asserted limit is a claim, not a fact, and the cost of believing one is invisible -- the work is simply never attempted and nothing records that it was possible.
Evidence and next step
THE CLAIM, from commit:0f5799bb: "shipped in one commit (6b5b2d6a, same day, not multi-month), reading" PROBE IT. Either produce the measurement that makes it true -- a number, an interval, a sample size, the thing that turns an assertion into a finding -- or do the work it said could not be done. Record whichever happened. A limit that survives a probe is worth more than one that was never tested; a limit that does not was costing us the work.
PW-66BLOCKED_WITH_EVIDENCE: pay a lane for proving something impossibledone
Why this matters
'Every job has an authorized objective, impossibility detector, stop condition, and a BLOCKED_WITH_EVIDENCE terminal state. A worker earns credit for proving a task impossible; it never needs to manufacture success.' We have BLOCKED.md and a hold registry but no terminal state that PAYS for a proven impossibility. This is the designed answer to asserted-limits-are-claims, the failure mode with no trace. See §6.
PW-71Never grade on binary win/loss accuracy — magnitude is what paysdone
Why this matters
Gemini's conflict resolution, settling two numbers in the dossier that look comparable and are not.
Evidence and next step
The dossier held a 1D CNN at '>74% accuracy' on 620 games against a JQAS study showing spreads capture '86% of the variability' on 5,000 matches. Different designs: the CNN evaluates BINARY classification, JQAS evaluates CONTINUOUS magnitude variance. Its ruling, which matches our own gate: 'You are staking CLV against continuous point spreads. Optimizing for binary accuracy guarantees building a model that perfectly mimics the moneyline and mathematically bleeds out to the vigorish.' Make it a rule the evaluation family enforces rather than a thing we remember: no promotion gate may be keyed to a win/loss hit rate.
S-09S-09 — A learned penalty model: type, yards and automatic first down, by crew (C-07) and team disciplindone
Why this matters
Plan item S-09, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
A learned penalty model: type, yards and automatic first down, by crew (C-07) and team discipline rating. Defensive pass interference is real yardage that box scores record as zero. | Penalty yards per game by crew within 5%. FILES THE PLAN NAMES: research/playgrain/kernel/penalties.py MISSING: penalties.py No prior board item ever mentioned this.
S-12S-12 — Interception and fumble returns, defensive TDs, recovery. This replaces the additive 2.18 pts/tedone
Why this matters
Plan item S-12, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Interception and fumble returns, defensive TDs, recovery. This replaces the additive 2.18 pts/team-game constant in `drives.py:865`. | Non-offensive points emerge within 0.2. FILES THE PLAN NAMES: research/playgrain/kernel/turnover_returns.py MISSING: turnover_returns.py No prior board item ever mentioned this.
S-13S-13 — Rule-exact overtime by era. | 61% of overtime games finish on 3, as in history.done
Why this matters
Plan item S-13, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Rule-exact overtime by era. | 61% of overtime games finish on 3, as in history. FILES THE PLAN NAMES: research/playgrain/kernel/overtime.py MISSING: overtime.py No prior board item ever mentioned this.
T-01T-01 — The role of every player on every play: passer, carrier, target, route runner, pass blocker, rundone
Why this matters
Plan item T-01, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The role of every player on every play: passer, carrier, target, route runner, pass blocker, run blocker, rusher, coverage, box. From participation and pbp ids. | Coverage ≥ 99% of 2016–2025 snaps. FILES THE PLAN NAMES: research/playgrain/talent/player_roles.py MISSING: player_roles.py No prior board item ever mentioned this.
T-04T-04 — Priors for players with little history: draft pick (the only B-hypothesis that ever paid, B13/B4done
Why this matters
Plan item T-04, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Priors for players with little history: draft pick (the only B-hypothesis that ever paid, B13/B41: +0.0475, +0.0595), combine, college production (C-17), Madden ratings (`data/madden.csv`), position age curves. | Rookie first-four-games error beats the league-mean prior. FILES THE PLAN NAMES: research/playgrain/talent/priors.py, talent/age_curves.py MISSING: priors.py, age_curves.py No prior board item ever mentioned this.
V-06V-06 — No deploy may break a rendered invariantdone
Why this matters
bin/verify-live.py checks that markers are PRESENT after a deploy, and presence is not correctness — it was green throughout the week-1 defect. The invariants are V-01's rules, run against the bytes the browser receives, and a deploy that breaks one is rolled back. EXAM: seed a broken render and watch the deploy refuse. A check never seen red is not a check.
X-03X-03 — Density-ratio classifier (real states against simulated); reweight the transition fits to the sidone
Why this matters
Plan item X-03, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Density-ratio classifier (real states against simulated); reweight the transition fits to the simulator's state distribution. | Play-level log-loss on real states not worse by more than the tax. FILES THE PLAN NAMES: research/playgrain/drift/dagger_refit.py MISSING: dagger_refit.py No prior board item ever mentioned this.
B-02B-02 — Action model v2, replacing `train_action.py`: P(action \| state, personnel, unit ratings, QB, wedone
Why this matters
Plan item B-02, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Action model v2, replacing `train_action.py`: P(action \| state, personnel, unit ratings, QB, weather, play-caller effect). Multiclass LightGBM with as-of hierarchical play-caller encodings. Includes pass rate over expected, tempo, shotgun, play-action, screen, RPO and motion rates. Play-caller intent is modelled separately from QB execution: a checkdown is not a conservative call. FILES THE PLAN NAMES: research/playgrain/policy/policy_offense.py MISSING: policy_offense.py No prior board item ever mentioned this.
C-08C-08 — Two to four named beat writers per team through RSS, Bluesky and team sites, via `playerweek/brodone
Why this matters
Plan item C-08, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Two to four named beat writers per team through RSS, Bluesky and team sites, via `playerweek/browser.py` (isolated headless browser, never your Chrome). Received-time stamped. FILES THE PLAN NAMES: research/playgrain/sensors/beatwire_capture.py MISSING: beatwire_capture.py PRIOR EVIDENCE on the old board: C-08
S-06S-06 — Isotonic calibration on a rolling holdout. The current model says 0.606 where 0.759 happens. Unbdone
Why this matters
Plan item S-06, lane kernel, drift, decision, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Isotonic calibration on a rolling holdout. The current model says 0.606 where 0.759 happens. Unbuilt since revision 2. | Reliability slope 0.95–1.05. FILES THE PLAN NAMES: research/playgrain/calibrate.py all present No prior board item ever mentioned this.
T-03T-03 — Directly measured component skills with shrinkage, from NGS, PFR advanced, FTN and pbp (the compdone
Why this matters
Plan item T-03, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Directly measured component skills with shrinkage, from NGS, PFR advanced, FTN and pbp (the component list follows this table). | Each component must earn its place through L-10. FILES THE PLAN NAMES: research/playgrain/talent/skill_components.py MISSING: skill_components.py No prior board item ever mentioned this.
T-06T-06 — The lineup → unit function: a learned map from the on-field players' vectors to the unit quantitdone
Why this matters
Plan item T-06, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The lineup → unit function: a learned map from the on-field players' vectors to the unit quantities the kernel consumes (pass protection, rush, coverage, run block, run fit, QB, skill group). | Natural-experiment test: across every historical starter absence, predicted unit change against realised. Slope 0.8–1.2. FILES THE PLAN NAMES: research/playgrain/talent/unit_compose.py MISSING: unit_compose.py No prior board item ever mentioned this.
B-07B-07 — A play-caller effect has to survive a change of team and quarterback, or it is a team effect in done
Why this matters
Plan item B-07, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
A play-caller effect has to survive a change of team and quarterback, or it is a team effect in disguise. FILES THE PLAN NAMES: research/playgrain/policy/policy_transport_test.py MISSING: policy_transport_test.py No prior board item ever mentioned this.
C-15C-15 — Every public Big Data Bowl tracking release (10 Hz, all 22 players) into `data/tracking/*.parquedone
Why this matters
Plan item C-15, lane sensors, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Every public Big Data Bowl tracking release (10 Hz, all 22 players) into `data/tracking/*.parquet`. Used to train T-07, never joined to live weeks. FILES THE PLAN NAMES: research/playgrain/sensors/bdb_ingest.py MISSING: bdb_ingest.py PRIOR EVIDENCE on the old board: C-15, C-77
E-03E-03 — Evaluator-only, unreadable from the proposer's sandbox: skill against the closing line (nflversedone
Why this matters
Plan item E-03, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Evaluator-only, unreadable from the proposer's sandbox: skill against the closing line (nflverse `spread_line`/`total_line`, 1999+) and simulated return against the **early** ladder (the 540-snapshot backfill, T-21d to T-60m, six seasons, plus `early_lines`). Never a feature, never a training target. FILES THE PLAN NAMES: research/playgrain/evalx/market_diag.py MISSING: market_diag.py No prior board item ever mentioned this.
PW-63L-07 promotes its own proposals; promotion is not its authoritydone
Why this matters
'A lower model may falsify or quarantine a frontier result. It may not promote the result. Promotion comes from instruments and an independent reviewer.' The loop promotes unattended and has done so successfully, which is why it never looked wrong. Falsification authority and promotion authority are different powers. See §3.
S-15S-15 — The compiler: margin, total, moneyline, team totals, alt lines, any prop, fantasy points under adone
Why this matters
Plan item S-15, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The compiler: margin, total, moneyline, team totals, alt lines, any prop, fantasy points under any scoring (through `statline.score`, the single scoring function), K and DST. All read from the same trajectory parquet. | No number is published that is not a query. FILES THE PLAN NAMES: research/playgrain/queries.py MISSING: queries.py No prior board item ever mentioned this.
L-08L-08 — The second loop. The ledger's top unexplained cluster becomes a brief naming two worlds the machdone
Why this matters
Plan item L-08, lane sensors, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
The second loop. The ledger's top unexplained cluster becomes a brief naming two worlds the machine cannot tell apart and the smallest observation that would separate them. Deep Research is driven through `browser.py`; its answer passes the airlock (schema, citations must resolve) or is dropped. `source_probe.py` fetches a sample and measures latency and rights. An admitted source becomes a capture config. FILES THE PLAN NAMES: research/playgrain/loop/sensor_loop.py, loop/intake_airlock.py, loop/source_probe.py MISSING: sensor_loop.py, intake_airlock.py, source_probe.py No prior board item ever mentioned this.
T-07T-07 — From the tracking releases: speed, acceleration, separation at throw, get-off, closing speed. Thdone
Why this matters
Plan item T-07, lane ratings, lineups, policies, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
From the tracking releases: speed, acceleration, separation at throw, get-off, closing speed. Then a teacher-student model predicts those from public stats, so every player in every season gets an estimate. | Student R² reported per skill; enters only via L-10. FILES THE PLAN NAMES: research/playgrain/talent/tracking_latents.py MISSING: tracking_latents.py No prior board item ever mentioned this.
F-07F-07 — Turn on `K_PER_POSITION` and `POSR_DRIFT`; replace the covariate-free shrinkage with conditionaldone
Why this matters
Plan item F-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Turn on `K_PER_POSITION` and `POSR_DRIFT`; replace the covariate-free shrinkage with conditional models on the same features. | Scored unconditionally FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
O-04O-04 — Every new job beats a heartbeat, and silence raises an alarm on the board.done
Why this matters
Plan item O-04, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
Every new job beats a heartbeat, and silence raises an alarm on the board. FILES THE PLAN NAMES: operate/watch.py all present No prior board item ever mentioned this.
P-11P-11 — `asof()` covers every new table. | 7/7 → n/n.done
Why this matters
Plan item P-11, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
Evidence and next step
`asof()` covers every new table. | 7/7 → n/n. FILES THE PLAN NAMES: warehouse.py, test_warehouse.py all present No prior board item ever mentioned this.
Gemini’s report produced six registered experiments and an exact-score diagnostic. Open World Model Lab for the decisions, sources and promotion criteria.