Norsk Tipping is the only book on the board, and it fetches itself #29
No reviewers
Labels
No labels
architecture
cleanup
dependencies
performance
priority: high
priority: medium
reliability
security
testing
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
solvreven/FPL!29
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/nt-only-board"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Stacked on #28 — the first commit here is that fix. Merge #28 first and this reduces to its own commit.
Outcome
Norsk Tipping becomes the only book on the served surfaces: match odds, anytime goalscorer, anytime assist. The consensus files stay on disk and
score_goalscorer.pystill scores both every round, so this is a code change, not a lost comparison.NT does not open its markets all at once, which nothing had measured. Probed at two points before GW3's deadline:
Scorer mål)Spiller gjør en assist)So goals open ~4 days out and assists ~2, per fixture — and
pre_deadline_stepspulled once, in the three hours before the deadline. GW3's goalscorer prices were live for four days with nothing fetching them, and that single shot was also the round's only chance of ever getting assists.nt_watchinchores.pyfixes that. It keys on coverage — "does the newest banked run carry both markets for every fixture of the next round", answered from the manifests on disk — not on a clock and not on a completion marker, so a pull someone ran by hand counts. The denominator is the round's fixture count from FPL, never the run's. Interval tightens toward the deadline (12h / 6h / 90m / 30m); failures back off, doubling to a 6h cap. Runs prune to the newest three, with every manifest kept — 5 KB against 7 MB, and the only record of when each market opens.Defects found while wiring it
Four producer-without-a-consumer, three created by the NT-only switch itself:
disagreements— NT's club disagreementsmain.matches, soprops_movedserved emptyfixtures_without_marketgw{n}_market_nt.jsonfromnt_resolven_fixturescountedmatch_oddsThe third is the sharpest:
nt_resolvehas been in the pre-deadline chore since it was written, andsnapshot_pitthen froze the input to a computation nobody performed. The chore is now pull → resolve → rebuild → snapshot, so the frozen cache is the one built from the frozen prices.A label spanning two causes put a falsehood on screen.
_unpriced_but_oursreturned one flat list, and the panel printed "No book priced Mbeumo, Gyökeres, Watkins, Ekitiké, Havertz — the omission is the bookmakers' saying they are unlikely to feature". All five are in the two fixtures NT had not opened at all. The book had said nothing whatsoever and the screen reported a verdict. It returns{"declined": [...], "unopened": [...]}now, keyed on the FPL team id, because the two need opposite responses: distrust our rate, versus come back nearer kickoff.What removing the consensus cost, measured
_books_expect_himreadn_books / n_books_fixtureand it worked — 133 players under 80% started 2% of the time against 65% above it. That share cannot be computed from one book, so the gate is retired rather than faked.Not recorded as free. NT quoting a player is close to no filter (36–40 selections across two ~25-man squads), and the GW3 board showed the shape the share was built to catch: Wilson 6th on
start_prob0.12, Abraham 9th on 0.11, Kudus on 0.10. Reported rather than patched by raising our own floor — that would let the weakest number in the system decide membership.test_a_conditional_price_on_a_fringe_player_is_currently_keptpins it.Verification
bank_runand feeds its manifest tont_coverage.🤖 Generated with Claude Code
https://claude.ai/code/session_014adnmRztkdAPwinWXnNQ7N
Removes the six-book consensus from the served surfaces and makes NT the market for match odds, anytime goalscorer and anytime assist. The consensus files stay on disk and score_goalscorer.py still scores both every round, so this is a code change, not a lost comparison. NT does not open its markets all at once -- measured 2026-09-01/02, goals open ~4 days out and assists ~2, per fixture -- so a single pre-deadline pull could never carry both. nt_watch in chores.py polls on COVERAGE ("does the newest banked run carry both markets for every fixture of the next round", answered from the manifests on disk) rather than on a clock or a completion marker, so a pull someone ran by hand counts. The denominator is the round's fixture count from FPL, never the run's. Four producer-without-a-consumer defects surfaced while wiring it, three created by the NT-only switch itself: disagreements and fixtures_without_market were computed and discarded by main.matches; gw{n}_market_nt.json was written by nt_resolve with nothing rebuilding the cache to read it; and n_fixtures counted match_odds while the table was drawn from a different subset. _unpriced_but_ours no longer returns one flat list. "No book priced X -- the omission is the bookmakers' saying he is unlikely to feature" was printed over five players in two fixtures NT had not opened at all, which is a verdict reported where the book had said nothing. It returns {"declined": [...], "unopened": [...]} keyed on the FPL team id, because the two need opposite responses. pre_deadline_steps is now pull -> resolve -> rebuild -> snapshot, so the frozen cache is the one built from the frozen prices. snapshot_pit.odds_for takes both market files; the raw NT run is zipped rather than pointed at, since prune_nt_runs can delete the directory. Retires _books_expect_him: the coverage-share gate cannot be computed from one book. Reported rather than patched around -- raising our own start_prob floor would let the weakest number in the system decide membership. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014adnmRztkdAPwinWXnNQ7NView command line instructions
Checkout
From your project repository, check out a new branch and test the changes.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.