Prepare returning-injury evidence collection and audit handoff (#33) #44

Open
kristofferopsahl wants to merge 2 commits from issue-33-evidence-handoff into main
Collaborator

Summary

#33 has an audit implementation but no local deadline snapshots or forecast cache. This completes its bounded evidence-preparation brief with a reproducible operating sequence and measured readiness report. The broader model-validation issue remains open.

returning-injury evidence
├── runbook: prepare → capture → validate → preserve → audit
└── dated report: official deadline, input gaps, audit JSON, tests, host checks

The next observed deadline is GW8 on 2026-10-23 at 17:30 UTC. Capture is explicitly deferred: local outcomes stop at GW4, GW7 is still in play, and no forecast cache exists. The runbook supplies the repair commands and collection gates.

Evidence

  • Before: no local data/pit, no projection cache, and no configured FPL collection path found on the inspected host surfaces.
    After: committed input inventory and operational checks, an original GW2/3/5/6 audit reporting UNMEASURED, and exact prospective collection/audit commands. No synthetic history or model-validation claim.
  • 141 focused snapshot, audit, selector, scheduler and backup tests passed. All nine Bash examples and three embedded Python examples passed syntax checks; executable examples discovered GW8 and correctly refused early collection and a missing archive.
  • Wiki lint is clean. Documentation and evidence only; no estimator changes, persistent services, paid data calls or repeat of GW4's completed confirmation.

Merge Danger

Door: two-way

Blast Radius: documentation

Operational collection and a verified backup still require an operator-selected persistent host and destination. Related to #33; deliberately does not close it.

## Summary #33 has an audit implementation but no local deadline snapshots or forecast cache. This completes its bounded evidence-preparation brief with a reproducible operating sequence and measured readiness report. The broader model-validation issue remains open. ```text returning-injury evidence ├── runbook: prepare → capture → validate → preserve → audit └── dated report: official deadline, input gaps, audit JSON, tests, host checks ``` The next observed deadline is GW8 on 2026-10-23 at 17:30 UTC. Capture is explicitly deferred: local outcomes stop at GW4, GW7 is still in play, and no forecast cache exists. The runbook supplies the repair commands and collection gates. ## Evidence - **Before:** no local `data/pit`, no projection cache, and no configured FPL collection path found on the inspected host surfaces. **After:** committed input inventory and operational checks, an original GW2/3/5/6 audit reporting `UNMEASURED`, and exact prospective collection/audit commands. No synthetic history or model-validation claim. - 141 focused snapshot, audit, selector, scheduler and backup tests passed. All nine Bash examples and three embedded Python examples passed syntax checks; executable examples discovered GW8 and correctly refused early collection and a missing archive. - Wiki lint is clean. Documentation and evidence only; no estimator changes, persistent services, paid data calls or repeat of GW4's completed confirmation. ## Merge Danger **Door:** two-way **Blast Radius:** documentation Operational collection and a verified backup still require an operator-selected persistent host and destination. Related to #33; deliberately does not close it.
docs: prepare returning-injury evidence collection for #33
Some checks failed
CI / syntax (pull_request) Successful in 8s
CI / wheel (pull_request) Has been cancelled
CI / tests (pull_request) Has been cancelled
151976e932
docs: record submitted evidence handoff PR
All checks were successful
CI / syntax (pull_request) Successful in 9s
CI / tests (pull_request) Successful in 2m47s
CI / wheel (pull_request) Successful in 28s
15770e0d80
Owner

Review of #44, run against the real archive

Run on the user's Windows machine, read-only, with main at b751fbf. #44 merges cleanly onto that main. Every script, flag and imported name the runbook uses exists, and its audit command runs here as written.

Three things should change before the runbook is used on the machine that holds the archive, plus one wording.

  1. The verify block fails on Windows. (snapshot['dir'] / 'bootstrap.json').read_text() decodes with the locale's codec. Under cp1252 it raises UnicodeDecodeError on the frozen bootstrap. CLAUDE.md (2026-10-16): name UTF-8 wherever text crosses into a file. Fix: read_text(encoding='utf-8'), on every read.

  2. It holds a snapshot to the live cache's schema. pipeline.load_cache is the live loader. It refuses GW6's snapshot (2026-10-10) for lacking unmodelled_bps, a field required only since the bonus race (2026-10-16). CLAUDE.md: a field required of the live cache is never required of a snapshot.

    • The snapshot reader is pit.load_cache(snapshot), the audit's own path.

    • With that and fix 1, both rounds verify under cp1252:

      GW6 -> 20261010T070328Z (c1dd1bd54813); passed over: 20261017T070329Z, taken after the GW6 deadline
      GW7 -> 20261017T070329Z (760661eafa6f)
      
    • pit.load_cache raises on a missing file rather than returning None, so the cache is None check would be dead.

  3. The ingest-then-rebuild route skips the weekly chore's guard. With fetch_current_season.py and build_cache.py on two lines, the rebuild runs even when the ingest fails. CLAUDE.md names that case: a rebuild on a failed ingest reproduces the previous projections and looks like success. scripts/after_gameweek.py --gw N refuses a round still in play and stops before the rebuild if the ingest fails.

  4. "No local snapshots exist" reads as the project's state in the shared wiki. It is true of the WSL checkout. The archive is on the user's Windows machine:

    • data/pit holds 19 snapshots, the latest GW7's;
    • the chores take a snapshot in the three hours before every deadline;
    • a scheduled task wakes the PC before each deadline, and a daily job backs up the gitignored data.

    main's 2026-10-15 paragraph (from #43) has the same shape ("data/pit is absent … restoring the original snapshots is necessary"). Scope both to the checkout they describe, and say where the archive is.

The audit, run here as the runbook writes it

--gw 5 --gw 6 --gw 7; exit 1, by design for PARTIAL and UNMEASURED.

round status players Brier, ours Brier, LAST
GW5 UNMEASURED 0 — —
GW6 PARTIAL 3 0.380 0.722
GW7 PARTIAL 1 0.489 0.023
  • GW7's one player is Brobbey: injured at GW6, our forecast 0.699, LAST 0.15, and he did not start.
  • GW7 is still provisional in rounds.json.
  • Four players over two rounds settle nothing, as your brief says.

Merging is the user's call.

🤖 Generated with Claude Code

## Review of #44, run against the real archive Run on the user's Windows machine, read-only, with `main` at `b751fbf`. #44 merges cleanly onto that `main`. Every script, flag and imported name the runbook uses exists, and its audit command runs here as written. Three things should change before the runbook is used on the machine that holds the archive, plus one wording. 1. **The verify block fails on Windows.** `(snapshot['dir'] / 'bootstrap.json').read_text()` decodes with the locale's codec. Under cp1252 it raises `UnicodeDecodeError` on the frozen bootstrap. CLAUDE.md (2026-10-16): name UTF-8 wherever text crosses into a file. Fix: `read_text(encoding='utf-8')`, on every read. 2. **It holds a snapshot to the live cache's schema.** `pipeline.load_cache` is the live loader. It refuses GW6's snapshot (2026-10-10) for lacking `unmodelled_bps`, a field required only since the bonus race (2026-10-16). CLAUDE.md: a field required of the live cache is never required of a snapshot. - The snapshot reader is `pit.load_cache(snapshot)`, the audit's own path. - With that and fix 1, both rounds verify under cp1252: ``` GW6 -> 20261010T070328Z (c1dd1bd54813); passed over: 20261017T070329Z, taken after the GW6 deadline GW7 -> 20261017T070329Z (760661eafa6f) ``` - `pit.load_cache` raises on a missing file rather than returning None, so the `cache is None` check would be dead. 3. **The ingest-then-rebuild route skips the weekly chore's guard.** With `fetch_current_season.py` and `build_cache.py` on two lines, the rebuild runs even when the ingest fails. CLAUDE.md names that case: a rebuild on a failed ingest reproduces the previous projections and looks like success. `scripts/after_gameweek.py --gw N` refuses a round still in play and stops before the rebuild if the ingest fails. 4. **"No local snapshots exist" reads as the project's state in the shared wiki.** It is true of the WSL checkout. The archive is on the user's Windows machine: - `data/pit` holds 19 snapshots, the latest GW7's; - the chores take a snapshot in the three hours before every deadline; - a scheduled task wakes the PC before each deadline, and a daily job backs up the gitignored data. `main`'s 2026-10-15 paragraph (from #43) has the same shape ("`data/pit` is absent … restoring the original snapshots is necessary"). Scope both to the checkout they describe, and say where the archive is. ### The audit, run here as the runbook writes it `--gw 5 --gw 6 --gw 7`; exit 1, by design for PARTIAL and UNMEASURED. | round | status | players | Brier, ours | Brier, LAST | |---|---|---|---|---| | GW5 | UNMEASURED | 0 | — | — | | GW6 | PARTIAL | 3 | 0.380 | 0.722 | | GW7 | PARTIAL | 1 | 0.489 | 0.023 | - GW7's one player is Brobbey: injured at GW6, our forecast 0.699, LAST 0.15, and he did not start. - GW7 is still provisional in `rounds.json`. - Four players over two rounds settle nothing, as your brief says. Merging is the user's call. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
All checks were successful
CI / syntax (pull_request) Successful in 9s
CI / tests (pull_request) Successful in 2m47s
CI / wheel (pull_request) Successful in 28s
This pull request has changes conflicting with the target branch.
  • wiki/concepts/start-probability-and-rates-recency-weighting.md
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin issue-33-evidence-handoff:issue-33-evidence-handoff
git switch issue-33-evidence-handoff

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff issue-33-evidence-handoff
git switch issue-33-evidence-handoff
git rebase main
git switch main
git merge --ff-only issue-33-evidence-handoff
git switch issue-33-evidence-handoff
git rebase main
git switch main
git merge --no-ff issue-33-evidence-handoff
git switch main
git merge --squash issue-33-evidence-handoff
git switch main
git merge --ff-only issue-33-evidence-handoff
git switch main
git merge issue-33-evidence-handoff
git push origin main
Sign in to join this conversation.
No description provided.