Split application domains and cache player delivery #43
No reviewers
Labels
No labels
architecture
cleanup
dependencies
enhancement
needs-info
needs-triage
performance
priority: high
priority: medium
ready-for-agent
ready-for-human
reliability
security
testing
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
solvreven/FPL!43
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/open-issues"
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?
Repeated player requests rebuilt and serialized the complete projection graph, while API, pipeline and browser behavior lived in large mixed modules. This change introduces domain routers, typed build/cache/player stages and explicit ES modules; caches player shaping by published input version; serves a smaller startup summary with complete details on demand; and makes live refresh reuse fresh data without overwriting newer publications.
CSS consolidation preserves the unchanged computed-style baseline. The default player API is byte-identical on the complete 610-player historical benchmark pool. Warm identity serving fell from 236 ms to 6 ms; JSON bytes fell 26% and retained parsed heap 21%. Cold cost was unchanged. Browser readiness did not improve, and opening full detail became slower because it requires another request; the benchmark records these tradeoffs.
Validation:
Merged main
2184143passed syntax, 2,144 tests / 145 skipped, and wheel checks in CI run 121. All nine closing references below are closed; #33 is the sole remaining open issue.06e1db5passed remote syntax, tests (2,144 passed / 145 skipped) and wheel checks.docs/benchmarks/2026-10-15-pipeline-verification.tar.gz.The #11 score-bank implementation already existed; this corrects its misleading missing-bank message and provenance documentation. #34's actionable fixes already existed and were independently verified. For #33, the preregistered GW4 confirmation already passed and was not rerun. The new returning-injury audit explicitly reports UNMEASURED because historical point-in-time injury flags are absent; #33 remains open.
Closes #7. Closes #8. Closes #11. Closes #22. Closes #23. Closes #24. Closes #25. Closes #26. Closes #34.
The bonus race is ported onto #43's layout and pushed (
aaca006, a merge oforigin/mainat790fab1into the race's branch, now fast-forwarded onmain).The race (item 2 of the calculations audit, #31) went live on this machine the morning after #43 landed, so the two met in the merge. #43 moved most of
main.pyandpipeline.pyinto new modules. The race's pieces went where #43 put their neighbours:player_index.py, re-exported by thepipelinefacade;projection_cache.py;build_stages.load_inputs;routes/admin.pyand_live_play_probinroutes/squad.py.test_player_index_boundary's row is reshaped for the new field. The three wiki conflicts were dates only.Equivalence. On one frozen set of live inputs, the player index built by
88bb0a1and byaaca006was identical for all 667 players, and so were the strengths, fixtures, notes and BPS weights.Three faults on Windows, none visible under CI's UTF-8 Linux, are fixed in
808feaf:tests/web/test_html_sinks.pyhands node its program on stdin withtext=Trueand no encoding. Python encoded it in the locale's cp1252, which has no code forhtml.js's box-drawing characters. The writer thread died, stdin never closed, and node waited for two hours. It names UTF-8 now, with a 60 s timeout so any other stall fails.tests/web/test_frontend_parses.pyread the modules with a bareread_text().modules/fixtures.jsandmodules/cards.jsdo not decode in cp1252, which gave three failures. It now uses UTF-8 both ways, with the same timeout.tests/web/test_operator_status.pybuilt a status cache without the race's figures and ran the load check on it, which gave eight errors. The fixture now carries the figures.A new guard,
tests/test_subprocess_text_names_its_encoding.py, fails on any subprocess text call that does not name its encoding. It reads the syntax tree, because a text search survived a cut.Checks. 8 hand cuts on the merge and 52 cuts from the race's plan retargeted onto the new modules all went red, each on the test it names, as did 3 for the guard and 1 for the status fixture. The full suite in the live checkout after the go-live: 3,262 passed, 0 skipped, 0 failed at
2474892, which carries the port (2026-10-17).🤖 Generated with Claude Code