data: season-2026 practice, registration, permit and field corpus, plus the Phase 8 plan - #358
Merged
Merged
Conversation
The operating data the club ran the 2026 season on: the practice-slot plan, the field constraint log, the coach and player registration exports, the game schedule's change log, and the Select coach roster. Anonymised to the same standard as the game corpus, and into the SAME pseudonym space rather than a second one. The venue, field, team and person maps were derived by joining this drop's game schedule against the published combined_schedule.csv on (date, kickoff, division, format). That join is 1:1 with zero ambiguity on all four axes and reproduces the corpus's own stated 215 assignments / 196 people. No existing pseudonym was changed, so a team code, venue or person key means the same thing in both halves. People absent from the game corpus were minted fresh with unique surnames, so a shared surname never implies a family the source did not state. No free text ships. The registration exports name people in prose that cannot be scrubbed reliably, so those fields became resolved person-key links plus a class label: the signal survives, the prose does not. Emails, phone numbers, exact dates of birth, URLs and verifier names are dropped; birth year is kept because age-group placement needs it. Two independent leak audits run over the result — one inside the writer that refuses to emit a cell still holding a real token, one that re-scans the written files for names, tokens, organisations, emails, URLs and DOB patterns. Both report zero. The real-to-pseudonym map is not in this repo. Four things this corpus catches that the game corpus cannot, recorded in its README with the evidence: - A practice field alias resolves to a venue the constraint log declares offline for the whole season, and eight more to a venue closed on a date. Nothing in the source reconciles the two sheets. - Practices need a facility graph one level deeper than games: they split pitches that games use whole, and split the game-level halves again. - The published field name is not the field. A conflict check reasoning over the name families read is checking the wrong ground. - Seven revisions of the plan coexist with no statement of which is current, so source_sheet is retained per row rather than resolved. Parse limits are stated rather than hidden: 28 rows keep an unresolved venue instead of being dropped, and the sheets that contribute no rows are named. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSVnSbuM6Y5DJhJb6to8qA
Ten tasks, ordered, each with a prompt written to be handed to a sub-agent whole. Continues BUILD_PLAN_STATUS.md, which closed 0.1-7.3. The plan opens with the decision that gates everything from 8.4 onward, because it is not mine to make: there are two schedulers in this repo and they do not meet. The games engine is 161 files and 2,165 tests and is imported by zero frontend modules; the shipped practice path is 2,218 lines with about 35 tests and is imported by seventeen. Tasks 8.0-8.3 are worth doing under either answer. From 8.4 the work either extends an engine nobody can reach or moves the engine under the app. The ordering differs from the one the lessons document proposes, for reasons each task states. Three of them: - The changelog is not first. It is the largest task and it needs persistence, and GAP-30 has to close before any snapshot can be stored safely. - Bounded local repair is reframed. Most of the operator already exists in chooseSlot(); what is missing is per-violation keying, first-fit rather than best-fit, and a change budget that bounds the search instead of refusing it at commit. The prompt is those three, not a rewrite. The search that actually roams is the practice hill-climber. - Season phases are last and marked blocked, because sunsets.csv holds thirteen rows and every one is a Saturday. Practices run on weeknights, so the transition dates the task exists to derive cannot be computed from data in the repo. The prompt says to get the data first and to prefer the corpus over any planning table that disagrees with it, since a sixteen-minute discrepancy exceeds the fifteen-minute margin and can flip legality. Each prompt names what already exists so an agent does not rebuild it: the defended slot ordering in people/, the containment forest and bipartite overlap relation in facility/occupancy.js, reserve/capacity.js for spare ground, resolve/'s causal taxonomy, and availability/'s lighting provenance. The nine open items from BUILD_PLAN_STATUS.md section 3 are carried forward rather than rescheduled, to be folded into whichever task touches their module. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSVnSbuM6Y5DJhJb6to8qA
…ion plan Four facility-use permits and the league's fields workbook, anonymised into the same pseudonym space as the rest of the corpus, plus a Phase 8 task for the import / export / CRUD functionality they exist to support. permit_reservations.csv is the first per-date, per-field permit data in the repo: 767 windows across four venues from 2026-08-10 to 2026-12-20. The existing facility_permits.csv carries venue-level windows; this carries the grant itself, field by field. It settles two open questions. The half-pitch split is permitted ground rather than an improvisation — the permit reserves Soccer 1A/1B, 2A/2B, 3A/3B and 4A/4B as named facilities, which is what the practice grid uses and the game layer does not. And lighting has a documentary source: one permit attaches Field Lights as a service, where GAP-05 notes the corpus carries lit only at venue level. The fields workbook adds venue inventory, equipment, weekly availability and a second decoder ring. That second ring is the find: the league keeps two of them and they disagree on 12 of the 20 codes they share. One disagreement matters more than the rest — 7v7 Field 1 resolves to a venue closed all season on one sheet and to a different venue carrying the author's own "?" on the other. A second is a one-letter spelling variant of a single venue across two sheets, kept as two spellings rather than merged, on the same reasoning that keeps "Nate" and "Nathaniel" in coach_roster_v1.csv: resolving it silently deletes the test case. The availability sheet's weekday cells were corrupted by Excel into dates — "4-7" became 2026-04-07. Every row carries raw_value beside interpreted_window and names the interpretation, so the inference can be checked and overruled rather than trusted. Permit numbers, the approver's name, the vendor's contact details, phone numbers and URLs are dropped; permit_id is positional. External opponents that carried an opposing coach's surname are now normalised to a stable club and designator, which also removes the last 14 withheld cells from game_change_log.csv. Both leak audits report zero across all thirteen files, and no cell anywhere is withheld. One guard change, made deliberately and reviewed by hand: a short allowlist of common words that are also somebody's name — colours, compass points, and equipment nouns. A colour on an equipment label cannot identify anyone, and vetoing it was costing real data. docs/PHASE_8_PLAN.md gains task 8.4, field and blackout administration: non-destructive reviewable import that surfaces both sides of a disagreement rather than picking, a byte-stable export asserted to round-trip, and in-app CRUD where retiring a surface is an end date and every mutation shows its consequences before commit. Tasks 8.4 onward are renumbered. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSVnSbuM6Y5DJhJb6to8qA
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
JoelA510
added a commit
that referenced
this pull request
Sep 5, 2026
…us the Phase 8 plan (#358) * data: add the season-2026 practice, registration and constraint corpus The operating data the club ran the 2026 season on: the practice-slot plan, the field constraint log, the coach and player registration exports, the game schedule's change log, and the Select coach roster. Anonymised to the same standard as the game corpus, and into the SAME pseudonym space rather than a second one. The venue, field, team and person maps were derived by joining this drop's game schedule against the published combined_schedule.csv on (date, kickoff, division, format). That join is 1:1 with zero ambiguity on all four axes and reproduces the corpus's own stated 215 assignments / 196 people. No existing pseudonym was changed, so a team code, venue or person key means the same thing in both halves. People absent from the game corpus were minted fresh with unique surnames, so a shared surname never implies a family the source did not state. No free text ships. The registration exports name people in prose that cannot be scrubbed reliably, so those fields became resolved person-key links plus a class label: the signal survives, the prose does not. Emails, phone numbers, exact dates of birth, URLs and verifier names are dropped; birth year is kept because age-group placement needs it. Two independent leak audits run over the result — one inside the writer that refuses to emit a cell still holding a real token, one that re-scans the written files for names, tokens, organisations, emails, URLs and DOB patterns. Both report zero. The real-to-pseudonym map is not in this repo. Four things this corpus catches that the game corpus cannot, recorded in its README with the evidence: - A practice field alias resolves to a venue the constraint log declares offline for the whole season, and eight more to a venue closed on a date. Nothing in the source reconciles the two sheets. - Practices need a facility graph one level deeper than games: they split pitches that games use whole, and split the game-level halves again. - The published field name is not the field. A conflict check reasoning over the name families read is checking the wrong ground. - Seven revisions of the plan coexist with no statement of which is current, so source_sheet is retained per row rather than resolved. Parse limits are stated rather than hidden: 28 rows keep an unresolved venue instead of being dropped, and the sheets that contribute no rows are named. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSVnSbuM6Y5DJhJb6to8qA * docs: add the Phase 8 plan, one hand-off prompt per task Ten tasks, ordered, each with a prompt written to be handed to a sub-agent whole. Continues BUILD_PLAN_STATUS.md, which closed 0.1-7.3. The plan opens with the decision that gates everything from 8.4 onward, because it is not mine to make: there are two schedulers in this repo and they do not meet. The games engine is 161 files and 2,165 tests and is imported by zero frontend modules; the shipped practice path is 2,218 lines with about 35 tests and is imported by seventeen. Tasks 8.0-8.3 are worth doing under either answer. From 8.4 the work either extends an engine nobody can reach or moves the engine under the app. The ordering differs from the one the lessons document proposes, for reasons each task states. Three of them: - The changelog is not first. It is the largest task and it needs persistence, and GAP-30 has to close before any snapshot can be stored safely. - Bounded local repair is reframed. Most of the operator already exists in chooseSlot(); what is missing is per-violation keying, first-fit rather than best-fit, and a change budget that bounds the search instead of refusing it at commit. The prompt is those three, not a rewrite. The search that actually roams is the practice hill-climber. - Season phases are last and marked blocked, because sunsets.csv holds thirteen rows and every one is a Saturday. Practices run on weeknights, so the transition dates the task exists to derive cannot be computed from data in the repo. The prompt says to get the data first and to prefer the corpus over any planning table that disagrees with it, since a sixteen-minute discrepancy exceeds the fifteen-minute margin and can flip legality. Each prompt names what already exists so an agent does not rebuild it: the defended slot ordering in people/, the containment forest and bipartite overlap relation in facility/occupancy.js, reserve/capacity.js for spare ground, resolve/'s causal taxonomy, and availability/'s lighting provenance. The nine open items from BUILD_PLAN_STATUS.md section 3 are carried forward rather than rescheduled, to be folded into whichever task touches their module. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSVnSbuM6Y5DJhJb6to8qA * data: add the facility permits, fields workbook and field administration plan Four facility-use permits and the league's fields workbook, anonymised into the same pseudonym space as the rest of the corpus, plus a Phase 8 task for the import / export / CRUD functionality they exist to support. permit_reservations.csv is the first per-date, per-field permit data in the repo: 767 windows across four venues from 2026-08-10 to 2026-12-20. The existing facility_permits.csv carries venue-level windows; this carries the grant itself, field by field. It settles two open questions. The half-pitch split is permitted ground rather than an improvisation — the permit reserves Soccer 1A/1B, 2A/2B, 3A/3B and 4A/4B as named facilities, which is what the practice grid uses and the game layer does not. And lighting has a documentary source: one permit attaches Field Lights as a service, where GAP-05 notes the corpus carries lit only at venue level. The fields workbook adds venue inventory, equipment, weekly availability and a second decoder ring. That second ring is the find: the league keeps two of them and they disagree on 12 of the 20 codes they share. One disagreement matters more than the rest — 7v7 Field 1 resolves to a venue closed all season on one sheet and to a different venue carrying the author's own "?" on the other. A second is a one-letter spelling variant of a single venue across two sheets, kept as two spellings rather than merged, on the same reasoning that keeps "Nate" and "Nathaniel" in coach_roster_v1.csv: resolving it silently deletes the test case. The availability sheet's weekday cells were corrupted by Excel into dates — "4-7" became 2026-04-07. Every row carries raw_value beside interpreted_window and names the interpretation, so the inference can be checked and overruled rather than trusted. Permit numbers, the approver's name, the vendor's contact details, phone numbers and URLs are dropped; permit_id is positional. External opponents that carried an opposing coach's surname are now normalised to a stable club and designator, which also removes the last 14 withheld cells from game_change_log.csv. Both leak audits report zero across all thirteen files, and no cell anywhere is withheld. One guard change, made deliberately and reviewed by hand: a short allowlist of common words that are also somebody's name — colours, compass points, and equipment nouns. A colour on an equipment label cannot identify anyone, and vetoing it was costing real data. docs/PHASE_8_PLAN.md gains task 8.4, field and blackout administration: non-destructive reviewable import that surfaces both sides of a disagreement rather than picking, a byte-stable export asserted to round-trip, and in-app CRUD where retiring a surface is an end date and every mutation shows its consequences before commit. Tasks 8.4 onward are renumbered. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSVnSbuM6Y5DJhJb6to8qA --------- Co-authored-by: Claude <noreply@anthropic.com>
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.
Adds the operating data the club actually ran the 2026 season on — the practice-slot plan, the field constraint log, the coach and player registration exports, the game-schedule change log, the Select coach roster, four facility-use permits and the fields workbook — anonymised, plus an eleven-task plan for what to build on it.
Thirteen CSVs under
fixtures/season-2026/practice/, anddocs/PHASE_8_PLAN.md. No code touched.The anonymisation, and why it joins
The game schedule in this drop is the same season as the published corpus, so rather than minting a second namespace I joined the two on
(date, kickoff, division, format)and read the pseudonyms off../combined_schedule.csv.That join is 1:1 with zero ambiguity on all four axes — 6 venues, 22 fields, 136 team codes, and 215 coach assignments resolving to 196 distinct people, which is exactly the 215/196
../README.mdalready states. SoCanyon → Alder Parkand05BGrasshoppers01 → 05BMicro01are derived, not guessed, and a team code, venue or person key means the same thing in both halves. No existing pseudonym changed.People absent from the game corpus were minted fresh with unique surnames, so a shared surname never implies a family the source did not state. The 53 shared surnames in the combined set are all pre-existing pairs inside the published corpus.
No free text ships. The registration exports name people in prose that cannot be scrubbed reliably — "… is the head coach and I would like to be her assistant coach. Her son is …". Those fields became a resolved person-key link plus a class (71 named outright, 24 recovered from prose, 29 narrative, 9 unresolved). The signal survives as a link, which the domain layer wants anyway; the prose does not.
Dropped: emails, phone numbers, exact dates of birth, URLs, permit numbers, the approver's name, the vendor's contact details. Birth year is kept — age-group placement needs it.
Two independent leak audits run over the result: one inside the writer that refuses to emit a cell still holding a real token, one that re-scans the written files for full names, name tokens, organisation names, emails, URLs, phone numbers and DOB patterns. Both report zero across all thirteen files, and no cell anywhere is withheld.
One guard change, deliberate and reviewed by hand: a short allowlist of common words that are also somebody's name — colours, compass points, equipment nouns. A colour on an equipment label cannot identify anyone, and vetoing it was costing real data.
The real→pseudonym map is not in this repo.
What the data settles
Field - Soccer 1A/1B,2A/2B,3A/3B,4A/4Bas named facilities. The practice grid's use of Pitch 2A/2B and 3A/3B — which the game layer uses whole — is what the club is licensed for.Field Lightsas a service, where GAP-05 notes the corpus carrieslitonly at venue level.facility_permits.csvis venue-level; this is the grant itself.What it catches
7v7 Field 1resolves to a venue closed all season on one sheet, and to a different venue carrying the author's own "?" on the other.coach_roster_v1.csv. Resolving it silently deletes the test case.4-7became2026-04-07. Every row carriesraw_valuebesideinterpreted_windowand names the interpretation, so the inference can be checked and overruled rather than trusted.CHECKpermitting onlymon–thu.source_sheetis retained per row rather than resolved.Parse limits are stated rather than hidden: 28 rows keep an unresolved venue instead of being dropped, and the sheets contributing no rows are named.
The plan
docs/PHASE_8_PLAN.md— eleven ordered tasks, each with a prompt written to be handed to a sub-agent whole.It opens with the decision that is not mine to make: there are two schedulers in this repo and they do not meet. The games engine is 161 files and 2,165 tests and is imported by zero frontend modules; the shipped practice path is 2,218 lines with about 35 tests and is imported by seventeen. Tasks 8.0–8.4 are worth doing either way. From 8.5 the work either extends an engine nobody can reach or moves the engine under the app.
8.4 is the task this data exists for: non-destructive reviewable import that surfaces both sides of a disagreement rather than picking, a byte-stable export asserted to round-trip, and in-app CRUD for fields and blackout windows where retiring a surface is an end date and every mutation shows its consequences before commit.
The ordering differs from the source lessons document, and each task says why. The changelog is not first — it is the largest and needs persistence, and GAP-30 must close before any snapshot is stored safely. Bounded local repair is reframed as three specific fixes to
chooseSlot()rather than a rewrite, with the search that actually roams identified as the practice hill-climber. Season phases are last and marked blocked:sunsets.csvholds thirteen rows and every one is a Saturday, so weeknight transition dates cannot be derived from anything in the repo.Each prompt names what already exists so an agent does not rebuild it. The nine open items from
BUILD_PLAN_STATUS.md§3 are carried forward rather than rescheduled.🤖 Generated with Claude Code
https://claude.ai/code/session_01QSVnSbuM6Y5DJhJb6to8qA
Generated by Claude Code