Construction
5 decisions only you can make
Nothing else is blocked. Each of these stops one box turning green, and each is a sentence long.
- nothing — this is a record of a decision, not a requestPW-75 · CUT: the unattended Deep Think / Deep Research loop
- (no question recorded — see C-17)C-17 · C-17 — College play-by-play and player seasons from collegefootballdat
- (no question recorded — see C-18)C-18 · C-18 — One photo of the week's ticket stack becomes the price actually
- (no question recorded — see D-07)D-07 · D-07 — Once tickets accumulate, learn how the Jackpot board sits again
- (no question recorded — see L-09)L-09 · L-09 — The holdout moves under a separate macOS user that only the eva
3 lanes working · 71 plan items built in 3h of 75 commits
- gemini is empty — declared hold — Gemini CLI allowance exhaustedmedium
checked 13:41 · every 10 minutes, zero model tokens
13 proposed changes waiting, 89 hypotheses open
Everything the lanes and mice produce drains here, and promotion is the narrow point. A lane never edits the model: it measures and proposes. Applied so far: 18. Claims independently reviewed: 1 — Codex is the reviewer and has been out of tokens since 2026-09-17.
Nothing wrong on the rendered site
Every settled week shows a projection distinct from its actual, and no week renders a stub.
The machine map data under a minute ago
The machine — 35 of 40 boxes measured present
The predictive machine by layer, then the spine that ships v1 underneath. Every colour is measured at render time — a table with rows, a file on disk, or launchctl answering. Nothing here is typed green.
All 50 lanes producing work. Judged on evidence, not exit codes.watchdog ran Wed 13:44 (2 min ago)
69 of 124 plan items built · 2 being worked
This is the plan, and it is the only board. Each chip is one item of the design. GREEN is built and measured, AMBER is being worked right now, RED is not started — the same three colours the machine map above uses, because absent is absent wherever you read it. A blue ring means a lane has its marker on it this minute. Hover for what it is.
Infrastructure probes — a different question: is the data actually there, are the jobs loaded. Not the plan, and it reads far greener.
bin/pw-now.py; it sits ON TOP of the state rather than replacing it, because somebody working on a thing is not evidence the thing is there. The top four bands are the machine Fable's Play-Grain plan describes, and the bottom two keep the current product shipping while that is built.The research organisation read live at render
How the lanes work — 12 of 12 loaded
Twelve vertical lanes, each owning one layer and reading that layer's outside literature as well as our own data, and one horizontal agency that owns none. Every position, hour and model below is read at render time from LANES.md, the launchd plists and the launcher scripts.
In flight
2 lanes holding a marker this minute · 57 more armed and between firings · 23 commits landed in the last hour. A lane between firings is armed, not stopped — research lanes fire four times a day and mice clear their marker between crumbs.
- S-17: hypothetical.py — any team-season vs any team-season, with play-by-playbuild-w1 · queries over one world · 13:29
S-17 — Any team-season against any team-season, retired players included. The north star's first demand - A-05: fix under-dispersion of lineup_sampler share bands (per-game persistence term)build-w5 · hurdle model · 13:34
A-05 — For each trajectory, draw who is active, the role depth chart, and the on-field set for each per
Queued
130 items
data under a minute agoFiled wrong: PW-72, PW-70, PW-68, PW-67, PW-62, V-04, V-03, V-02, PW-59, PW-52, PW-36, PW-31, F-04, T-02, X-02, X-04, A-05, B-03, F-09, T-05, X-06, A-03, A-04, A-06, B-05, B-06, D-01, S-14, A-07, E-06, E-07, F-08, L-10, O-05, O-06, O-07, O-08, P-08, P-09, Q-03, Q-04, S-16, T-08, PW-19, PW-20, PW-23, PW-28, PW-39, PW-40, PW-43, PW-44, PW-46, PW-47, PW-104, PW-60, PW-79, PW-80, PW-83, PW-84, PW-87, PW-88, PW-91, PW-95, PW-96, PW-99, PW-100, PW-103, PW-107, PW-108 are in this section but marked with a state that belongs to another. Move the item, or fix its state.
xwalk's season/gsis_id ranking is nondeterministic -- reruns silently swap which roster snapshot wins
- Why
- Found while verifying C-13's clock fix on xwalk (playerweek/identity.py), not by probing an assertion.
- Detail
- 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.
Eight lanes starve the write lock: weather lost 8 hours of captures
- Why
- The watchdog caught it: 'weather capture — no work for 481 min (budget 480)'.
- Detail
- 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.
CUT: the unattended Deep Think / Deep Research loop
- Why
- Sean, 2026-09-22: "if I can't trust you to run it in the web then you should cut it from the plan."
- Detail
- 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.
The register is the logjam: production scaled 4x tonight, promotion did not
- Why
- 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.
- Detail
- 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.
Record why the NOT FOUNDs are the interesting part, not the discouraging part
- Why
- The reasoning Gemini reached only after Sean pushed back, worth keeping as doctrine.
- Detail
- 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.
The covariance compiler: price a correlated prop off the joint rollout
- Why
- Gemini's re-ranked #3, and the thing it says is our only structural monopoly.
- Detail
- '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.
Sever B and Q from the Ridge; apply them as bounds on the transition matrix
- Why
- Gemini's re-ranked #2, replacing its own residual-stacking proposal after the research found no published evidence for it.
- Detail
- 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.
Turn the density-ratio classifier into the loss function (GAIL loop)
- Why
- Gemini's re-ranked #1 and its explicit WHAT TO DO FIRST, after Sean pushed it off the coward's consensus.
- Detail
- 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.
Rotate proposer and critic so one provider's style is not our prior
- Why
- '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.
A job is a charter, not a prompt
- Why
- '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.
The nine stub tabs ARE the nine desks — V-04 is a staffing gap
- Why
- 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.
The reviewer must not be the builder
- Why
- 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.
V-05 — One declared contract for what a page may show
- Why
- 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.
V-04 — The nine stub tabs on the build monitor
- Why
- 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.
V-03 — Every week renders, or declares itself empty by design
- Why
- 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-02 — A settled week keeps the number filed before kickoff
- Why
- 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.
Wire the podcast corpus into features
- Why
- 12.3M transcribed words reach nothing.
- Detail
- 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.
Stack the arms S->B->Q instead of pooling them
- Why
- 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."
- Detail
- 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.
Grade the STAT LINE, not fantasy points
- Why
- Sean, 2026-09-22: "actuals are the stats, fantasy points is math."
- Detail
- 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.
Give the QB a passing leg in the attribution chain -- conversion is not one bucket
- Why
- 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.
- Detail
- 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.
AAR: share error is 8% of our total, and it is allocation's layer
- Why
- 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.
- Detail
- 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.
AAR: conversion error is 32% of our total, and it is forecast's layer
- Why
- 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.
- Detail
- 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.
The 15-minute model-fired progress cron is the expensive kind of loop
- Why
- 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.
- Detail
- 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.
Lead: separate two worlds for his snap share
- Why
- 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.
- Detail
- { "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.
C-13 — Fill `published_at` and `effective_at` on the 9,039 receipts, then on every table without a cloc
- Why
- Plan item C-13, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
F-04 — Move the 0.40 FantasyPros blend, league-rate calibration, designation decay and rookie pass *ins
- Why
- 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.
- Detail
- 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.
S-11 — Kickoffs (with the 2024 rule era), punts, returns, blocks, and field goals by kicker rating × di
- Why
- Plan item S-11, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-02 — Regularised adjusted plus-minus at the play grain: a sparse design matrix (players on field × ro
- Why
- Plan item T-02, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
X-02 — Add `form_off`, `form_def` (leave-one-play-out EPA in this game) to `LATENT`; fit the distributi
- Why
- Plan item X-02, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-04 — Simulation-based calibration of a small vector of logit offsets against drive and game moments f
- Why
- Plan item X-04, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-02 — P(active) → P(plays \| active) → snap share \| plays. LightGBM plus isotonic, fitted at each loc
- Why
- Plan item A-02, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-05 — For each trajectory, draw who is active, the role depth chart, and the on-field set for each per
- Why
- Plan item A-05, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-03 — Personnel grouping (11/12/21…) given state and roster. This selects the on-field set from A-05.
- Why
- Plan item B-03, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-10 — Coach and coordinator press conferences within 24 h. Podcast priority queue over the 461,382 ind
- Why
- Plan item C-10, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-14 — The injury-report ladder and depth charts "cannot be walked backwards" only through one endpoint
- Why
- Plan item C-14, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-05 — Add the built-and-locked but unused PRE_KICKOFF blocks: home, rest, division, travel_km, tz_shif
- Why
- 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.
- Detail
- 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-09 — The shipped DST ranking is *exactly* the market's. Rebuild it from unit ratings. | DST rank corr
- Why
- 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.
- Detail
- 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.
Q-01 — Claim schema v2 adds **hedge**, **time anchor**, speaker role and copy ancestry. Q-22 is registe
- Why
- Plan item Q-01, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
T-05 — Weekly state-space update per player-skill: process noise by age and position, a shock term on r
- Why
- Plan item T-05, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-05 — Key numbers: the mass at 3, 6, 7, 10, 14 and 17 on margin, and at 37, 41, 44, 47 and 51 on total
- Why
- Plan item X-05, lane kernel, drift, decision, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-06 — The column-by-column real-against-simulated feature diff that found the 3.2-sd `games_seen` shif
- Why
- Plan item X-06, lane kernel, drift, decision, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-03 — Bets go down early, so forecast the injury report itself: P(Friday status \| Tuesday information
- Why
- Plan item A-03, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-04 — Per-snap exit hazard by position, age, injury history, surface and workload. Inside the simulato
- Why
- Plan item A-04, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
A-06 — Role regime changes as a changepoint posterior on snap share (`regime.py` and `kalman_share` exi
- Why
- Plan item A-06, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-05 — Box count, rushers, man/zone, shell, given state, offensive personnel and DC. These are the W-00
- Why
- Plan item B-05, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-06 — Who gets the ball. Run: carrier among on-field backs and QB (designed or scramble). Pass: a mult
- Why
- Plan item B-06, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-17 — College play-by-play and player seasons from collegefootballdata.com (free key) for rookie prior
- Why
- Plan item C-17, lane sensors, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
D-01 — Fair prices from the calibrated distribution for every market on the board; exact push handling
- Why
- Plan item D-01, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
E-10 — Re-run what the old path measured wrongly (the queue follows this table).
- Why
- 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.
- Detail
- 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.
Q-02 — Settle every claim against what happened. Only 7 are settled, so language's value is *unmeasured
- Why
- Plan item Q-02, lane sensors, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-14 — The rollout, vectorised across trajectories and the slate, with **player attribution**: every pl
- Why
- Plan item S-14, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-07 — Audit: when a player is removed, where do the opportunities go, in the simulator and in reality.
- Why
- Plan item A-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-16 — The missing sensor nobody runs at scale outside the league: coaches-film computer vision produci
- Why
- Plan item C-16, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-18 — One photo of the week's ticket stack becomes the price actually got for each bet. Local vision m
- Why
- Plan item C-18, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-07 — Once tickets accumulate, learn how the Jackpot board sits against the wider market on a Tuesday:
- Why
- Plan item D-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-06 — Plant an effect of known size in the play data and require every gate to find it. Also the place
- Why
- Plan item E-06, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-07 — The smallest detectable effect per layer, per window, game-clustered. It replaces the single 0.1
- Why
- Plan item E-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-09 — Run `world-model-compiler-v1/cross-team-response-experiment.json`, which is `DESIGNED_NOT_RUN`:
- Why
- Plan item E-09, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-06 — Per-key hyperparameter search. `max_depth=3, l2=5.0` already fixes WR carries from −29.86% to −5
- Why
- Plan item F-06, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-08 — Replace `intervals.SHIPPED_CURVE` with `sim.simulate` (`sim.py:813`), which has 0.7788 coverage
- Why
- Plan item F-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
L-09 — The holdout moves under a separate macOS user that only the evaluator can read; `playgrain-holdo
- Why
- Plan item L-09, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-10 — The evaluator today scores only the action model. Generalise it to every kernel component (play-
- Why
- Plan item L-10, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
O-05 — The throughput budget for S-14, measured on every release.
- Why
- Plan item O-05, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-06 — New launchd jobs, all catch-up style.
- Why
- Plan item O-06, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-07 — The SQL findings stay, and the fabricated citations go. Nine of them independently corroborate t
- Why
- Plan item O-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-08 — Remove the 60 worktrees whose branches have zero unmerged patches. The branches remain, so nothi
- Why
- Plan item O-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-08 — 2026 in-season participation does not publish until after the season. Impute on-field sets from
- Why
- Plan item P-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-09 — `game_context_asof`: roof, surface, elevation, travel_km, tz_shift, rest days, short week, offic
- Why
- Plan item P-09, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- `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.
Q-03 — `speaker_is` is unknown on 141 of 153 pressers, and it is the one field Q-36 turns on.
- Why
- Plan item Q-03, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- `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-04 — Claims become as-of features for availability (A-02), role change (A-06) and play-caller intent
- Why
- Plan item Q-04, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-16 — Trajectories are content-hashed per (game, lock, release); issuance is frozen with the existing
- Why
- Plan item S-16, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-17 — Any team-season against any team-season, retired players included. The north star's first demand
- Why
- Plan item S-17, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-18 — Whole seasons and playoffs. Ratings evolve between simulated weeks and injuries accrue through A
- Why
- Plan item S-18, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-19 — Compile the boosters (treelite or lleaves, or Numba lookup tables) if S-14 misses its budget. |
- Why
- Plan item S-19, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-08 — Every rating family is scored on what it adds to the kernel and logged to the ledger. | —
- Why
- Plan item T-08, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
Forecast did he play at all (worth +0.76 MAE as an oracle)
- Why
- 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'.
- Detail
- MEASURED 2026-09-23, 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]
Forecast his targets (worth +0.51 MAE as an oracle)
- Why
- 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'.
- Detail
- MEASURED 2026-09-23, 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]
Forecast team rush attempts (worth +0.40 MAE as an oracle)
- Why
- 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'.
- Detail
- MEASURED 2026-09-23, 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]
Forecast team pass attempts (worth +0.36 MAE as an oracle)
- Why
- 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'.
- Detail
- MEASURED 2026-09-23, 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]
Forecast his snap share (worth +0.33 MAE as an oracle)
- Why
- 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'.
- Detail
- MEASURED 2026-09-23, 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]
Forecast his carries (worth +0.32 MAE as an oracle)
- Why
- 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'.
- Detail
- MEASURED 2026-09-23, 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]
Probe an untested limit (cannot) in board:D-04
- Why
- 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.
- Detail
- 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.
Probe an untested limit (banned-floor) in board:J-10
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:31c2db51
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:0611cf72
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:4a9ba165
- Why
- 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.
- Detail
- 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.
Probe an untested limit (not-worth) in commit:a2e6a739
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:16e1274b
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:60a5ac67
- Why
- 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.
- Detail
- 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.
Probe an untested limit (banned-floor) in commit:837568d5
- Why
- 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.
- Detail
- 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.
Probe an untested limit (banned-floor) in commit:837568d5
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cost-estimate) in commit:9895266b
- Why
- 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.
- Detail
- 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.
Probe an untested limit (banned-floor) in commit:e4521890
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:412242d1
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:153a9251
- Why
- 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.
- Detail
- 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.
bin/janitor.sh not loaded in launchd, log stale since 2026-09-20 -- adjacent finding from PW-47, not fixed
- Why
- 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.
- Detail
- 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.
QB backup-conditional-level model, named as F-08's real remaining gap across seven follow-ups, never built
- Why
- 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.
- Detail
- 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.
wh.hurdle_pred is a one-time 2019-2025 backtest, not a live sensor -- 2026 rows are zero and the box reads green anyway
- Why
- 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.
- Detail
- 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.
Probe an untested limit (banned-floor) in commit:b21879f1
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cost-estimate) in commit:0f5799bb
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:11cc5974
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:ff116765
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:605cea4d
- Why
- 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.
- Detail
- 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.
Probe an untested limit (not-possible) in commit:13a9dc8e
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:605cea4d
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:153a9251
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:412242d1
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:575058ef
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:93bd4e60
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:4a9ba165
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:31c2db51
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:0611cf72
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:16e1274b
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:9800600d
- Why
- 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.
- Detail
- 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.
evidence_clocks.py's clock probe treats ANY TIMESTAMP column as a clock, over-counting coverage
- Why
- 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.
- Detail
- 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-now.py's STALE_MIN check mass-expires every live worker at midnight
- Why
- 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.
- Detail
- 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.
168 of 353 test files are not green at baseline -- 114 error, 54 time out, unrelated to mutation
- Why
- 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.
- Detail
- 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).
A concurrent git reset on the shared working tree wipes every lane's uncommitted work at once
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in board:PW-93
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in board:PW-94
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:129b56f4
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:65eb92cd
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:9f460d2d
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:938e33e9
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:89994e3f
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:6e1730dd
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:e1766d30
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:53b6dc03
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:06c4f524
- Why
- 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.
- Detail
- 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.
Probe an untested limit (out-of-scope) in commit:bbabdf70
- Why
- 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.
- Detail
- 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.
Being built right now. If this is not what you want built, this is the page to say so on.
Agreed and waiting. The order is deliberate, not arbitrary.
Finished and verified. The list is at the foot of this page.
The nine-desk operating model. Gemini's system runs as a challenger, not the spine.
This board is asserted, not measured. It says what is deliberately being built and why. Maintenance reads the machine at render time and will contradict this page whenever the two disagree — which is exactly what it is for.
Plan of record — every named component
From the v1 handbook and the nine-desk operating model, read in full rather than skimmed
93 components across 10 groups. 8 are running, 8 are partial, 77 do not exist. Codex's own status words are kept rather than flattened, because UNAVAILABLE and NOT CERTIFIED mean different things and need different work. Where a component names a launchd job, the state is measured at render time; everything else is Codex's assertion carried over.
This is the gap between the machine that is described and the machine that runs. It is meant to be uncomfortable reading.
Living checklist
v1 handbook §17 — Codex's own states, carried over verbatim
| Component | State | What it is |
|---|---|---|
| Original v1 artifact audit | ACCEPTED | Original learned bytes reproduced under the frozen capsule and are serving. |
| Write-once v1 registry and guarded loader | ACTIVE | Release v1.0-20260916, manifest dcf95ac625…; fresh issuance and unattended reuse. |
| Golden W2/W3 numerical replay | PASS | 1,326 players / 54,226 numeric values and 32 games / 256 values match. |
| All-remaining Weeks 2–18 producer | ACTIVE | 11,271 player rows, 256 games, zero player or K/DEF fits. |
| Fantasy opponent products after Week 14 | UNAVAILABLE | Needs source schedule and exact opponent roster receipts. |
| Bench-position DEF roster repair | OPERATING PASS | 162-row roster delivery; no missing bench-defense identity. |
| Phone tracker | ACTIVE | Private URL live; 60-second launchd sync installed. |
| 99.5% service level | OBSERVING, NOT CERTIFIED | Seven-day window immature; availability, freshness and correctness sampled separately. |
| R&D worker prompt audit | REPAIRS INTEGRATED, JOBS PAUSED | Canonical receipt parsing and exact baseline/change bindings integrated; the jobs are paused. |
| Whole-model S/B/Q isolation | NOT CERTIFIED | Needs complete ancestry and intervention controls across all learned and serving paths. |
| Prospective player grading | ACTIVE FRAME, OUTCOMES PENDING | Grade full issued populations only after admitted truth. |
| Autonomous shipper | NOT ACTIVE | Root remains integration and activation owner. |
| Handbook regeneration hook | ACTIVE | Scheduled regeneration; inspect the log for later writes. |
Institute jobs
v1 handbook §14 — a plist in Git does not prove a job is loaded
| Component | State | What it is |
|---|---|---|
| institute.capture | NOT LOADED | hourly · raw qualitative, article and gamebook capture |
| institute.structured | NOT LOADED | every 4h · structured public-source archive |
| institute.forecast-refresh | LOADED | every 4h + Thursday pre-kickoff · snapshot, forecast, validation, prepared site |
| institute.phone-sync | NOT LOADED | every 60s · bounded status to the private tracker |
| institute.tracker-feed | NOT LOADED | continuous · separates provider, collector and content clocks |
| institute.site-service | NOT LOADED | supervised · serves validated assets and saved health |
| institute.report-service | NOT LOADED | supervised · serves report, tracker and handbook |
| institute.service-health | NOT LOADED | every minute · availability, integrity and freshness sampled separately |
| institute.handbook | NOT LOADED | every 5 min · regenerates the canonical handbook HTML |
Six connected levels
v1 handbook §20 — the destination, each with a strong simpler challenger
| Component | State | What it is |
|---|---|---|
| Season and organization | UNAVAILABLE | Personnel continuity, coaching regime, development. Challenger: dynamic team strength + persistent roster. |
| Game and environment | UNAVAILABLE | Both teams, venue, officiating, score/time. Challenger: direct margin/total plus market benchmark. |
| Unit and task | UNAVAILABLE | Personnel combinations, protection and route obligations. Challenger: opportunity allocator with interactions. |
| Play and response | UNAVAILABLE | Observable cues, actor-limited information, action policies. Challenger: sequence/count model. |
| Physical event and credit | UNAVAILABLE | One event ledger producing coherent player/team/defense totals. Challenger: direct stat forecasts. |
| Measurement and belief | UNAVAILABLE | Source access, selection, publication and receipt. Challenger: source-aware predictor with deduplication. |
Nine desks
staffing model — one chain of evidence, none edits the model
| Component | State | What it is |
|---|---|---|
| Commission & Portfolio | UNAVAILABLE | What the machine is asked for, and what it declines. |
| World Model Lab | UNAVAILABLE | The predictive core. Recommends experiment design. |
| Football Intelligence | UNAVAILABLE | Roles, legal actions, counters, credit conventions. |
| Behavior & Qualitative | UNAVAILABLE | S / B / Q evidence classes kept separately attributable. |
| Data & Provenance | UNAVAILABLE | Origin graph, revision history, permeability trace. |
| Markets & Portfolio | UNAVAILABLE | Price, stake, exposure. Sean taps before money moves. |
| Experience Studio | UNAVAILABLE | What Sean actually sees, against the design system. |
| Operations & Learning | UNAVAILABLE | The loop that improves the machine. |
| Forecast Accuracy Directorate | UNAVAILABLE | Were we right, prospectively and per cohort. |
Resident expertise
v1 handbook §22 — each owes a required artifact before a claim advances
| Component | State | What it is |
|---|---|---|
| Data science | UNAVAILABLE | Paired prospective loss, calibration, compute accounting. |
| Statistics and causal inference | UNAVAILABLE | Estimand, causal graph, negative controls, sensitivity. |
| Physics and physiology | UNAVAILABLE | Units, conservation and support checks, uncertainty propagation. |
| Psychology and organizational behavior | UNAVAILABLE | Opportunity-normalized behavioral posterior and rival explanations. |
| Economics and game theory | UNAVAILABLE | Equilibrium and rival policy predictions, intervention tests. |
| Market microstructure | UNAVAILABLE | Executable quote lineage, depth and latency state, settlement. |
| Football tactics | UNAVAILABLE | Event-bound annotation agreement and adversarial counterexamples. |
| Information science | UNAVAILABLE | Origin graph, revision history, permeability trace. |
| Reliability engineering | OBSERVING | Availability, correctness and freshness receipts. Partly real — service-health exists but is not loaded. |
Deep Think supply chain
staffing model — keeps every desk supplied
| Component | State | What it is |
|---|---|---|
| Continuous intake | UNAVAILABLE | Everything arriving, before any screening. |
| Flash screening | UNAVAILABLE | Cheap, narrow, numerous — the first rung of the ladder. |
| Gemini 3 Pro graph | UNAVAILABLE | Cross-domain mechanism finding. |
| Parallel explanations | UNAVAILABLE | Rival accounts kept separate rather than averaged. |
| Deep Think research | UNAVAILABLE | The weekly deep synthesis. |
| Desk packets | UNAVAILABLE | What each desk receives, addressed to it. |
| Outcome feedback | UNAVAILABLE | Spend judged by learning, not by volume. |
Governance and decision rights
staffing model — who recommends, who approves, when Sean is involved
| Component | State | What it is |
|---|---|---|
| New hypothesis | UNAVAILABLE | Any research job recommends · Research Director admits · Sean never, for routine admission. |
| Experiment design | UNAVAILABLE | World Model Lab · Independent Replication Scientist · Sean when risk appetite changes. |
| Production code | OBSERVING | Claude-led operators · tests + Codex on high-risk boundaries · Sean on irreversible external consequence. |
| Forecast release | UNAVAILABLE | Forecast council · Deterministic Release Authority · Sean only on a recorded override. |
| Bet placement | UNAVAILABLE | Markets & Portfolio · Sean taps before money moves · ALWAYS. |
| New paid data | UNAVAILABLE | Acquisition & Rights Lead · Sean approves spend and terms · ALWAYS. |
| Visual direction | UNAVAILABLE | Experience Studio · Product Director against the design system. |
| Incident rollback | UNAVAILABLE | SRE · automated safe rollback · Sean on data loss or external lock. |
| Model promotion | UNAVAILABLE | Scientific council · prospective scorecard gate. |
Information gaps to capture now
v1 handbook §23 — a week not captured is gone; these cannot be backfilled
| Component | State | What it is |
|---|---|---|
| Full prospective information history | UNAVAILABLE | Every raw revision, first receipt, failure and issuance, so mutation cannot alter an earlier issuance. |
| Event participation and true zeros | UNAVAILABLE | Official gamebook coverage; stop grading only survivors. |
| Multiweek availability and role transitions | UNAVAILABLE | Dated return, designation and roster panels. |
| Unit task combinations | UNAVAILABLE | Dated personnel combinations and public practice descriptions. |
| Joint timing and geometry | UNAVAILABLE | Synchronized full-unit traces with visibility metadata. |
| Untargeted and unused options | UNAVAILABLE | Deterrence and feasible opportunity, not only realized touches. |
| Workload and recovery across tasks | UNAVAILABLE | Load proxies, rest and travel exposure. |
| Directional environment and surface | UNAVAILABLE | Venue, surface, source-time weather and direction. |
| Institution and officiating response | UNAVAILABLE | Crew, rule and context records with observed decisions. |
| Full qualitative context and origin graph | UNAVAILABLE | Complete question and answer, attribution, hedge, revision. |
| Actor exposure and public influence | UNAVAILABLE | Information about football vs information that changes preparation. |
| Executable market and settlement history | UNAVAILABLE | Immutable quoted terms, received prices, settlement revisions. |
| Pipeline observation of its own failures | UNAVAILABLE | Failed requests, skipped issuances, scheduler delays, validation rejections. |
Model ladder and pairings
staffing model — deterministic first, a frontier call matches one of four commissions
| Component | State | What it is |
|---|---|---|
| Deterministic first | ACTIVE | Where code can decide exactly, no model votes. Already true across the pipeline. |
| Cheap, narrow, numerous | UNAVAILABLE | Screening and extraction at volume. |
| Daily builders and critics | OBSERVING | Claude and Codex build daily — but not as a scheduled rung with a brief. |
| Four deliberate specialists | UNAVAILABLE | Deep Think, Opus, Sol — a frontier call must match one of four exact commissions. |
| Explore → formalize | UNAVAILABLE | Gemini 3 Pro finds mechanisms; Sol converts them to state, equations, falsifiers. |
| Specify → build | UNAVAILABLE | Sol writes the contract; Sonnet implements and instruments it. |
| Build → attack | UNAVAILABLE | Sonnet builds; Luna searches narrow failures. Many cheap attacks beat one self-review. |
| Quantify → interpret | UNAVAILABLE | Sol computes residuals; Gemini connects patterns to film, language, science. |
| Disagree → decide | UNAVAILABLE | Blind forecasts from provider families; deterministic evidence judges; Fable adjudicates. |
The constitution
staffing model — nine lessons from the METR incident, none built
| Component | State | What it is |
|---|---|---|
| Impossible tasks turn into score-gaming | UNAVAILABLE | Record a failed gate as failed. The pressure valve that keeps a bench honest. |
| An unintended cache became government | UNAVAILABLE | Shared state acquires authority nobody granted it. |
| 'The board approved it' replaced authorization | UNAVAILABLE | A root of trust, not a consensus. |
| Tool output and transcripts are not ground truth | UNAVAILABLE | Verify against the real thing, not the report of it. |
| Self-invented signatures lacked a root of trust | UNAVAILABLE | Identity must be issued, not asserted. |
| Shared artifacts produced real breakthroughs | UNAVAILABLE | The upside of the same mechanism — keep it, govern it. |
| Agents noticed danger and did not tell humans | UNAVAILABLE | An escalation path that is used, not just present. |
| AI summaries inherit the subject's frame | UNAVAILABLE | The reviewer adopts the reviewed agent's perspective. |
| Agents risked their own runs for the collective | UNAVAILABLE | Pay for negative results and shared instrumentation. |
Landed
86 items
data under a minute agoverified
Landed
86 items
data under a minute agoB-02 — Action model v2, replacing `train_action.py`: P(action \| state, personnel, unit ratings, QB, we
- Why
- Plan item B-02, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
F-07 — Turn on `K_PER_POSITION` and `POSR_DRIFT`; replace the covariate-free shrinkage with conditional
- Why
- Plan item F-07, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
V-01 — The rendered page as a standing surface
- Why
- 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.
F-01 — The measured fix. | MAE 4.2600 → 3.8748
- Why
- 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.
- Detail
- The measured fix. | MAE 4.2600 → 3.8748 FILES THE PLAN NAMES: none all present No prior board item ever mentioned this.
C-12 — Parse the FTN payloads already sitting in `evidence.sqlite` into `ftn_charting`: play-action, sc
- Why
- Plan item C-12, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
O-03 — The 38 duplicated 459 MB warehouses in `forecast-refresh/` become hard links to one content-addr
- Why
- Plan item O-03, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
J-10 — Delete the stale "irreducible" text; fail the build on `irreducible\|noise floor\|ceiling` appli
- Why
- 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.
- Detail
- 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.
J-07 — Force `ORDER BY` on every sampled frame and hash the frame. This removes the ~0.006 pts/wk row-o
- Why
- 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.
- Detail
- 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-06 — Score and fit on the unconditional population, with `E[pts] = P(play)·E[pts \| play]` and DNPs a
- Why
- 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.
- Detail
- 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.
C-01 — Per-source staleness measured by the *source's own timestamp*, not the job's exit code. It write
- Why
- Plan item C-01, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-02 — Fix the `-3≤hours_to_kickoff≤6` window bug. Turn the eight one-shot captures into standing ones:
- Why
- Plan item C-02, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-05 — Props for all markets, not 6, hourly; de-vig method unchanged.
- Why
- Plan item C-05, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
P-06 — Load all 372 pbp columns into `plays_wide`; `plays` stays as a stable view. Extend the banned li
- Why
- Plan item P-06, lane ratings, lineups, policies, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
C-03 — Captures append to `data/land/*.parquet` and never touch DuckDB. One single-writer loader owns t
- Why
- Plan item C-03, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
J-05 — The durable results store, `data/results.duckdb`. It exposes `record(script, git_sha, population
- Why
- 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.
- Detail
- 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.
D-04 — Independent settlement from play-by-play into the append-only `data/proving.jsonl`. **Opened thi
- Why
- Plan item D-04, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
F-02 — Give each QB a pass-attempt *share*, not the team's whole volume. | The QB gap of +0.975 closes
- Why
- 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.
- Detail
- 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.
X-01 — **First thing built.** k-step rollouts from real states (k = 1, 2, 4, 8, 16, to end of drive); d
- Why
- Plan item X-01, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- **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.
S-08 — Early stopping on a validation season, not an inference cap at 60 rounds. 115 integer yard bins.
- Why
- Plan item S-08, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
E-08 — Weekly prospective issuance at the TUE lock, frozen beside v1 and the rival, graded the followin
- Why
- Plan item E-08, lane kernel, drift, decision, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
C-11 — One refresher for everything on the nflverse release path: pbp, participation, FTN charting, NGS
- Why
- Plan item C-11, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
J-02 — Remove the `HOME_FIELD_MARGIN/2` double count (1.748 pts/game). Home field is derived from sched
- Why
- 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.
- Detail
- 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.
C-09 — Daily roster diff: signings, IR, practice-squad elevations (the Saturday tell), waiver claims.
- Why
- Plan item C-09, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
P-10 — One identity: GSIS canonical through `dp_ids` (35 id systems, 100% populated) in place of `xwalk
- Why
- Plan item P-10, lane ratings, lineups, policies, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
P-07 — Participation 2016–2025 → `participation(game_id, play_id, gsis_id, side, pos)` and `play_person
- Why
- Plan item P-07, lane ratings, lineups, policies, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
C-06 — Fix the Eastern-into-UTC index bug. Capture the forecast ladder (lead 7→0 days, hourly) for ever
- Why
- Plan item C-06, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
Week totals withheld while their own component total is published
- Why
- 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.
- Detail
- 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.
F-03 — Train on `played=0` rows too, so the model *can* emit a low number. | Re-enables `loss="absolute
- Why
- 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.
- Detail
- 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.
C-04 — **The number you actually face.** Hourly from Monday 00:00 to Wednesday 23:59 MT: spreads, total
- Why
- Plan item C-04, lane sensors, due Tue 22 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- **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
Probe an untested limit (cannot) in commit:0c3c6c18
- Why
- 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.
- Detail
- 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.
J-01 — Remove `mkt_total`, `mkt_spread`, `mkt_team_total` from `team_volume` and refit. At serve time t
- Why
- 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.
- Detail
- 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.
T-01 — The role of every player on every play: passer, carrier, target, route runner, pass blocker, run
- Why
- Plan item T-01, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
E-02 — CRPS (margin, total, team totals, player lines), log loss (winner), energy score (joint: both QB
- Why
- Plan item E-02, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
N-02 — The board IS the plan, enforced by a test
- Why
- 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.
- Detail
- 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.
D-03 — For each wager, the worst line and price at which it is still a bet. The board will have moved b
- Why
- Plan item D-03, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-06 — Closing-line value as a read-only diagnostic. The previous release keeps issuing in shadow, and
- Why
- Plan item D-06, lane kernel, drift, decision, due Fri 9 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
L-12 — One row per packet: job, model, tokens, findings, confirmed, false positives, duplicates, downst
- Why
- Plan item L-12, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
S-12 — Interception and fumble returns, defensive TDs, recovery. This replaces the additive 2.18 pts/te
- Why
- Plan item S-12, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
N-01 — A first-class hold signal: a job that pauses says so, and every sensor reads it
- Why
- 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.
- Detail
- 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.
A first-class 'deliberate hold' signal, instead of case-by-case exemptions
- Why
- 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.
- Detail
- 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.
J-03 — Re-run every headline accuracy number on clean features and the full population; publish before/
- Why
- 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.
- Detail
- 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-09 — Cross-fit every calibration, isotonic and stack weight that is in-sample today (D-232: 0.9984 in
- Why
- 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.
- Detail
- 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.
S-09 — A learned penalty model: type, yards and automatic first down, by crew (C-07) and team disciplin
- Why
- Plan item S-09, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
X-03 — Density-ratio classifier (real states against simulated); reweight the transition fits to the si
- Why
- Plan item X-03, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
Probe an untested limit (cannot) in board:C-14
- Why
- 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.
- Detail
- 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.
Probe an untested limit (cannot) in commit:9800600d
- Why
- 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.
- Detail
- 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.
Probe an untested limit (banned-floor) in commit:837568d5
- Why
- 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.
- Detail
- 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.
D-02 — One sitting, up to ~100 wagers that settle together. Portfolio Kelly over the joint trajectories
- Why
- Plan item D-02, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-05 — The sheet: wager, line, walk-away, stake, in window order. Offline, on a phone.
- Why
- Plan item D-05, lane kernel, drift, decision, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
E-05 — The Residual Attribution Ledger of §1. `oracle_pairs.py` tests candidate sensors **in pairs**, b
- Why
- Plan item E-05, lane ratings, lineups, policies, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
L-11 — It has 5 entries, all `UNRESOLVED`, while the docs call it the record of what is refuted. Popula
- Why
- Plan item L-11, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
Probe an untested limit (banned-floor) in commit:e4521890
- Why
- 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.
- Detail
- 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.
Probe an untested limit (not-worth) in commit:d81a4a26
- Why
- 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.
- Detail
- 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.
S-06 — Isotonic calibration on a rolling holdout. The current model says 0.606 where 0.759 happens. Unb
- Why
- Plan item S-06, lane kernel, drift, decision, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-03 — Directly measured component skills with shrinkage, from NGS, PFR advanced, FTN and pbp (the comp
- Why
- Plan item T-03, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-06 — The lineup → unit function: a learned map from the on-field players' vectors to the unit quantit
- Why
- Plan item T-06, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
E-03 — Evaluator-only, unreadable from the proposer's sandbox: skill against the closing line (nflverse
- Why
- Plan item E-03, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
AAR: variance error is 58% of our total, and it is calibration's layer
- Why
- 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.
- Detail
- 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.
Grade the GAME SHAPE — the rung above the stats
- Why
- Sean, 2026-09-22: "the goal is that the play by play, the shape of the game can be graded, not just the stats."
- Detail
- 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.
BLOCKED_WITH_EVIDENCE: pay a lane for proving something impossible
- Why
- '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.
Three build lanes were busy and the board showed nothing in flight
- Why
- Sean: "only mice are working?" — they were not; three build-loop processes and two witness leases were running at that moment.
- Detail
- 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.
V-06 — No deploy may break a rendered invariant
- Why
- 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.
Codex is a peer model and it has been dark since 2026-09-17
- Why
- 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.
E-04 — One score per layer on the full issued population. The layers are availability, action, personne
- Why
- Plan item E-04, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
S-13 — Rule-exact overtime by era. | 61% of overtime games finish on 3, as in history.
- Why
- Plan item S-13, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
S-10 — Semi-Markov durations: the elapsed-time *distribution* per play type, state, tempo and coach, in
- Why
- Plan item S-10, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
B-04 — Go/punt/kick by coach. The late-and-close policy is its own model: kneel-downs, playing for the
- Why
- Plan item B-04, lane ratings, lineups, policies, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
E-01 — Rolling origin 2004→2025: fit ≤ season s−2, calibrate on s−1, simulate every game of s from its
- Why
- Plan item E-01, lane kernel, drift, decision, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
Never grade on binary win/loss accuracy — magnitude is what pays
- Why
- Gemini's conflict resolution, settling two numbers in the dossier that look comparable and are not.
- Detail
- 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.
L-07 promotes its own proposals; promotion is not its authority
- Why
- '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.
C-07 — Referee crew per game, historical from nflverse `officials` plus the weekly assignment release.
- Why
- Plan item C-07, lane sensors, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
B-07 — A play-caller effect has to survive a change of team and quarterback, or it is a team effect in
- Why
- Plan item B-07, lane ratings, lineups, policies, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-15 — Every public Big Data Bowl tracking release (10 Hz, all 22 players) into `data/tracking/*.parque
- Why
- Plan item C-15, lane sensors, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
S-15 — The compiler: margin, total, moneyline, team totals, alt lines, any prop, fantasy points under a
- Why
- Plan item S-15, lane kernel, drift, decision, due Fri 2 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
T-07 — From the tracking releases: speed, acceleration, separation at throw, get-off, closing speed. Th
- Why
- Plan item T-07, lane ratings, lineups, policies, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
L-07 — The orchestrator: worst residuals → explanation brief → sandboxed proposal → evaluator → promote
- Why
- Plan item L-07, lane kernel, drift, decision, due Fri 9 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
T-04 — Priors for players with little history: draft pick (the only B-hypothesis that ever paid, B13/B4
- Why
- Plan item T-04, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
A-01 — The Wed/Thu/Fri practice-status and game-status ladder, 2016–2026, as-of, from `inj_raw` and C-1
- Why
- Plan item A-01, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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-01 — Head coach, play-caller, OC and DC per team-week, as-of. `coordinators.csv` exists; fix `games_r
- Why
- Plan item B-01, lane ratings, lineups, policies, due Fri 25 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
P-11 — `asof()` covers every new table. | 7/7 → n/n.
- Why
- Plan item P-11, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- `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.
O-04 — Every new job beats a heartbeat, and silence raises an alarm on the board.
- Why
- Plan item O-04, lane unassigned, due unscheduled. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
The fuel gate reads 62% while the client reads 3% — a safety device off by 20x
- Why
- 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.
- Detail
- 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.
J-08 — Mutation harness: inject a known defect per test and require a red result. 73 of 156 tests curre
- Why
- 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.
- Detail
- 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.
C-08 — Two to four named beat writers per team through RSS, Bluesky and team sites, via `playerweek/bro
- Why
- Plan item C-08, lane sensors, due Tue 29 Sep. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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
L-08 — The second loop. The ledger's top unexplained cluster becomes a brief naming two worlds the mach
- Why
- Plan item L-08, lane sensors, due Tue 6 Oct. This board IS the plan now: 119 items, their files, their order.
- Detail
- 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.
Probe an untested limit (cost-estimate) in commit:0f5799bb
- Why
- 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.
- Detail
- 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.