Skip to content

data: season-2026 practice, registration, permit and field corpus, plus the Phase 8 plan - #358

Merged
JoelA510 merged 3 commits into
mainfrom
claude/markdown-prompts-pr-workflow-pzvgej
Sep 4, 2026
Merged

JoelA510 merged 3 commits into
mainfrom
claude/markdown-prompts-pr-workflow-pzvgej

Conversation

@JoelA510

@JoelA510 JoelA510 commented Sep 4, 2026

Copy link
Copy Markdown
Owner

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/, and docs/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.md already states. So Canyon → Alder Park and 05BGrasshoppers01 → 05BMicro01 are 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

  • The half-pitch split is permitted ground, not an improvisation. The permits reserve Field - Soccer 1A/1B, 2A/2B, 3A/3B, 4A/4B as 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.
  • 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.
  • 767 per-date, per-field reservation windows, 2026-08-10 to 2026-12-20. The existing facility_permits.csv is venue-level; this is the grant itself.

What it catches

  1. The league keeps two decoder rings and they disagree on 12 of the 20 codes they share. The sharpest: 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.
  2. A one-letter venue spelling variant 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.
  3. A practice field alias points at a venue the constraint log declares offline for the whole season, and eight more at a venue closed on a date. Nothing in the source reconciles the two sheets.
  4. Practices need a facility graph one level deeper than games — they split pitches games use whole, then split the game-level halves again into sides.
  5. The availability sheet's weekday cells were corrupted by Excel into dates4-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.
  6. 19 Friday practice rows, against a DB CHECK permitting only monthu.
  7. Seven revisions of the practice 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 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.csv holds 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

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
@vercel

vercel Bot commented Sep 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
squadlogic Ready Ready Preview Sep 4, 2026 6:17pm UTC

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@JoelA510
JoelA510 merged commit b048022 into main Sep 4, 2026
9 checks passed
@JoelA510
JoelA510 deleted the claude/markdown-prompts-pr-workflow-pzvgej branch September 4, 2026 18:54
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants