Repository navigation
docs(design): status and findings after P27 to FX-19 and the newcomer pass - #162
Merged
Merged
Conversation
This was referenced Oct 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Docs only:
docs/design/(seven files), plus the push server's address removed fromdocs/push-channel/README.mdanddocs/all-sports/README.md(four lines, nothing else changed in those files). No code, test, config,CHANGELOG.mdordocs/api/**change.This is the docs PR after the batch that rule 7 of the implementation plan describes, the sixth after #51, #67, #81, #96 and #138. It records P27 #134, ST-28 #135, FX-18 #139, P28 #140, FX-17 #145, FX-13 #152 and #153, FX-14a #154, FX-15 #155, FX-19 #156 and FX-14b #161; the pull requests that were not plan items (#136, #137, #143, #146 to #149, #159) and the changelog catch-up #158; the first-time-user review of the web UI (2026-10-06) and its follow-up items; and the decisions of 2026-10-03 and 2026-10-06. Statements about code were read at
b6caf2f(origin/main when this was written; the branch is rebased on it).What changed, per document
03-implementation-plan.mdfetch.save_empty_roundscontrol and Health's next runs, which FX-14a/b left); FX-21 new and proposed: the five schema models of P28 enter schema v1 (a docs-only PR cannot do it, see04below).everyanchor, backup scope names), FX-21 as a new open point; section 14 five questions answered or narrowed, one new (the search and list endpoints FX-19 assumes); section 15 15 rows updated (no new rows: the observation race was a real race fixed by FX-15); section 16 98 rows updated, 60 new; section 17 31 new points, 7 corrected, the work notes of the batch in its closing paragraph.01-storage.mdSixth-revision header; ST-28 as built in 2.1 to 2.4 and 4.4 (no ratchet,
FS_ALLOWLISTwith seven more modules,NAMED_EXCEPTIONStable with reasons and removers,src/config_files.py,league_dir_name); the shadow hooks gone (3.5, FX-15); P28's owner slices and odds history (season history written but never pruned); the odds provenance rule;close_data_dir(6.4); old backup scope names deprecated (9.1); the API restore that keeps the job record through the staged copy and one backup step (9.2, #153, with the remaining edge);Store.purge(9.3: what it deletes and keeps, the maintenance lease, the in-place rebuild, the empty bucket folders);Scope.followedstill tournament-only for reads; section 12 items 128 to 136; two new risks in 13.02-services.mdSixth-revision header; follows always in the follows table (
leagues.txtread-only legacy, adopt viaPATCH {origin:"api"}); search kinds; team, player and event follow sync (window from the follow's seasons,MAX_LAST_PAGES= 5, lists not stored,FailedListingkinds); the selection chain per event with the player link; P27 rules (unset defaults = registry,requiredonly counts); P28's odds and owner slices (7-day pre-match window, groups,body_key, routes); clear job by tournament/season anddelete_data; connection state (per process); export names<label>_<UTC date>_<last 8 of job id>and/exportslistingssc exportfiles; scheduler rules (everyfrom the last run,prune-historyoff by default); FX-13's job specs and routes, with the recorded spec differing from the request body; FX-18's cancel rules (2.4, 3.4); FX-15's removals; CLI 4.1/4.3 (--only seasons,--follow KIND:ID,status --disk, the doctor'sconfigcodes,odds_country). Section 11 items 102 to 117.04-schema-v1.mdSixth-revision header; a new subsection "Odds and standings" with blocks for
Odds,OddsMarket,OddsChoice,OddsLineandStandingsRow. Their field tables are exactly whatrender_fieldsprints for the models, without the generated markers: the document test compares the marked blocks withschema.MODELS, and the models are still inPENDING_MODELS. Moving them, regenerating the tables andtests/golden/schema/*is code: FX-21. The country is only in slice meta (opt-in), the provider inmeta.provider_id. The heading## 9. Open questionsstays (its rename moved from P28 to FX-21).05-web-ui.mdSixth-revision header (the review at
b567409, "the review wins" where it disagrees, the 12-task recheck of #161); as built for FX-14a (the applied rename table in TR/EN, "Add league" entry points, Help and glossary, toggletips, getting-started card, finish toasts, grey "not tried" state, localized typed confirmation) and FX-14b (team/player/match follows, seasons before the first download, checklists, exports, real restore, per-league delete, adopt,/status.connection, job kinds by spec); classic views gone (/classicredirects;client.tsremoved; decision 22 done); browser floor Safari 16.4 / Chrome 111 / Firefox 128; vue-i18n 11 without the JIT define. Section 7: every G1–G24 with its state atb6caf2f, new G25–G33 with owners (FX-20, P30, or section 17 after 3.0.0). Section 11 items 27 to 53.00-platform.md,README.md, the two push-channel pages00: sixth-revision paragraph, state column of section 1, notes in 3, 5, 6 and 10, the live validation's wider scope (11), two rows in 13. README: revision line, status (90 items), decisions. The push server's address is replaced by a neutral wording on the four lines FX-15 named; it still stands on one line of
docs/all-sports/progress.md, which FX-16 now owns (section 16).Decisions recorded (section 13)
sofascore_scraper; REN-1 goes ahead when no other branch is open. Team, player and single-match follows work in 3.0.0. A type-ahead search like the site's (FX-20).everycounts from the last run; the odds country opt-in ([client] odds_country), the provider id always recorded;prune-historyoff by default; dependabot ignorespydantic-corewith apydanticgroup of its own (manual constraints step).Decisions that need the owner
directstep of the live validation (approval in that session), and whatever the validation raises.Feedback accounting
Input: lines 3 to 25 of
~/.local/share/sofascore-orch/design_feedback.txt(everything after "[orchestrator] MARKER-4"; the last line processed is line 25, "[FX-14b #161] merged …"), the "Design mismatches", notes, "Needs live validation", "Not done", "API gaps" and "Finding" bullets of #134 to #161 (168 units), and the follow-ups of the first-time-user review (20 units). Scratch ledgers (not committed) hold 211 units; a script finds a phrase of each placement in the documents: 211 of 211 units placed (674 verified placements), none unplaced. Work notes (how a PR was run) are in the closing paragraph of section 17.Where the code at
b6caf2fcontradicts a line, the documents follow the code, among them: export names end with the last 8 characters of the job id; P28 merged before FX-13 (dependency reversed); P28 did not editsrc/store/history.pyand the first caller ofpruneis FX-15's task, which prunes event history only; ST-28 already removedleague_stats,system_statsandsummary_paths; FX-14a/b did not remove the retiredsave_empty_roundscontrol (now FX-20).Checks
origin/main86 items, 194 edges, 0 problems; this branch 90 items, 205 edges, 0 problems (one false positive, "P3", a decision name).tests/test_schema_v1.pyandtests/test_store_catalog.py::test_schema_file_is_the_ddl_printed_in_the_design: 594 passed. These are the only tests that readdocs/design/.docs/design,docs/push-channelanddocs/all-sports/README.md: none.Not verified
01,02/04,05/00/README, the briefs region of03(As built, new briefs), sections 6 and 15–17 of03were drafted by helper agents from a shared brief of mine, each checking its statements against the code atb6caf2f; I wrote the rest of03(status, sections 1–5, 7–9, 11, 13, 14, 18), checked their reports, the ledgers and the plan's consistency, and reconciled owners. I did not re-read every changed line.Section 18 of the plan (release readiness), verbatim
State on 2026-10-06, at
b6caf2f: 85 of the 90 items are merged or done, one is in progress (FX-20), andfour are to do (FX-21, REN-1, FX-16, and P30, which comes after the release). What remains before the
v3.0.0tag, in order:suggestions first, a SofaScore search after two characters with a short pause, stale requests cancelled,
answers kept for the session and counted in the request budget, the same in quick search), one search
across tournaments, teams and players, the follow's name on a job ("Takım research: SofaScore push channel — coverage, lag, cost, direct connection (Talimat 06+07) #42" today), and small gaps of
the UI (live watching offered for player follows, which
ssc watchskips; the long sport list ofSettings › Data; the retired
fetch.save_empty_roundscontrol and the old text offetch.only_finished; Health without the scheduler's next runs).Odds,OddsMarket,OddsChoice,OddsLine,StandingsRow) move frommodels.PENDING_MODELSintoMODELS, andOdds,OddsLineandStandingsRowintoRECORDS; the blocks this revision added to04-schema-v1.mdbecome generated,test-checked tables (
REGEN_SCHEMA_DOC=1); the JSON Schema golden undertests/golden/schema/and whatdescribe schemasprints are regenerated; the new slice keys joinSlice.key's known values. It can runnext to FX-20 (no shared file).
sofascore_scraper, in one mechanical pull request, with the console-script entry and the Dockerfile(section 14). It goes before the live validation, so that the validation runs the code that is
released.
with the request budget; its
directstep needs the owner's approval given in that session. It checks:the detail endpoints each page requests and their status; this regenerates
tests/fixtures/sport_slices/evidence.json(python tests/sport_evidence.py) and is FX-16's evidence,including the sports without usable evidence today (American football, Aussie rules, badminton, table
tennis, rugby, minifootball);
shoot-out field, table tennis
/eventwith every set and codes beyond 12, volleyball'sdefaultPeriodCount, a legs-only darts/event, the inning, cricket-break, MMA and e-sports codes notseen yet, and the near-end rules of the new sports;
SliceSpec.phasescan be narrowed and apre-match selection can be asked for (P27);
default of
[client] odds_provider); the shape ofwinning_oddsandseason_odds(only 404 samplesso far);
player_statisticsand standingshome(catalog only); the WTA id ofrankings(5 is theATP page's); the sports in which each owner slice exists; where useful, better fixtures for
tests/fixtures/p28/;/search/all(tournament hits, an empty answer as404 or an empty list, other result types) and
/search/unique-tournaments/{q}for an unknown name;a team's
events/last/{n}andnext/{n}(page size,hasNextPage,next/0as 404 for a teamwithout fixtures, sports beyond the nine of the catalog); a player's
events/last/{n}(the event idfield, other sports; no
nextis known); the cost ofMAX_LAST_PAGES = 5for a team follow withall; reading upcoming matches by/eventonly; better fixtures fortests/fixtures/fx19/whereuseful;
/search/allwith short prefixes, and the requests a typed name costs;/status(FX-19) on the browser-first path, and the stop of a download on theasync bridge path with a real browser (FX-18 was checked against fakes only);
page, and, with the owner's approval in that session,direct;ssc sync(a league, a team, a player and a match follow),export(every dataset and format),backupand a restore, andservewith the web UI's twelvenewcomer tasks.
What the validation finds becomes fix items before the tag.
pregame_formoptional forfootball, basketball and tennis; tennis
lineupsandincidentsnot requested; tennispoint_by_pointrequired), with the evidence of the validation, and any row of another sport that the new evidence
changes.
release.ymlbuilds and smoke-tests it only when a tag is pushed. Build it once from the release commit and run
docker/smoke-test.sh(offline,--network none:--version, the HEALTHCHECK,/health, the web appand a headless Chromium start), so that the tag does not find the first failure.
pyproject.tomlstill saysversion = "2.0.0"(pyproject.toml:3atb6caf2f);src/version.pyreads it, and the web UI shows it (v2.0.0in the rail,frontend/src/app/SideRail.vue:71). The release pull request sets 3.0.0, and the checks of releasepoint D (section 8) run on that commit: a green Linux CI and a local run of the full suite (Windows and
macOS best-effort), the Docker smoke test, every behaviour change in the changelog,
directoff inevery default and its warnings in the README. The same pull request corrects two texts that no item
owns:
docs/deploy/describes only the systemd timer, not the in-app scheduler of P29, and.github/workflows/audit.yml:42still names pandas (section 16).entries of what merged after it (feat(web): every function in the new UI — team/player follows, seasons, data types, exports, restore; classic views removed [FX-14b] #161, FX-20, FX-21, REN-1, FX-16 and the fixes of the validation),
states the deprecations of 3.0.0 (the four old backup scope names, the legacy
/apiroutes and flagsthat P30 removes), and turns
[Unreleased]into[3.0.0]with its date:release.ymlrefuses a tagwhose version has no
## [3.0.0]section (scripts/release.py notes).v3.0.0is the owner's (00-platform.mdsection 1, "Merging");release.ymlchecks thatthe tag equals the version in
pyproject.toml, runs CI, builds, smoke-tests and pushes the image andcreates the GitHub Release.
Decisions the owner takes on the way: the three slice proposals of #121 (after the validation; FX-16),
whatever the validation raises, approval of the
directstep in the validation session, and the tag.Proposed by this revision without asking, easy to undo: FX-21 as a new item, and REN-1 before the live
validation. P30 follows once 3.0.0 has shipped with its deprecation notices for one release.