Review: Seed practice_schedules table with Spring/Summer 2026 schedule (re-review)
Verdict: READY
Re-review of board item #739 after refinement. Previous review:
review-739-2026-04-03 (NEEDS_REFINEMENT, 3 issues). All three issues addressed.Previous Issues Resolved
- [BODY] NULL vs non-nullable conflict — FIXED. Sunday rows now have explicit times (14:00-16:00). All 17 rows have non-NULL start_time and end_time values.
- [BODY] Seed script path — FIXED. Changed from
scripts/seed_practice_schedules.sqlto existingscripts/seed_schedule.py. File verified at/home/ldraney/basketball-api/scripts/seed_schedule.py(203 lines, uses SQLAlchemy session pattern with idempotent checks). - [LABEL] Missing arch note — PARTIALLY FIXED. Label changed from
arch:scheduletoarch:basketball-api, which is more appropriate. No backingarch-basketball-apinote exists in pal-e-docs, but this is a project-wide gap, not specific to this ticket. Acceptable for a data-seeding ticket.
Template Completeness
- [x] Type — Feature
- [x] Lineage — Standalone, discovered while verifying schedule data
- [x] Repo — forgejo_admin/basketball-api
- [x] User Story — clear as-a/I-want/so-that
- [x] Context — clear motivation, season start date, table state
- [x] File Targets — listed with explicit "do not touch" list
- [x] Acceptance Criteria — 5 criteria with full 17-row data table
- [x] Test Expectations — SQL count + API verification
- [x] Constraints — tenant_id, data-only, source of truth noted, non-nullable constraint explicitly called out
- [x] Checklist — present
- [x] Related — project + source note referenced
Traceability
- [x] story:WS-S13 label — "As an admin, I want to view and manage the program schedule"
- [x] story note verified — WS-S13 found in project-westside-basketball user-stories section under Admin (Marcus)
- [x] arch:basketball-api label — present on board item
- [ ] arch note MISSING — no
arch-basketball-apinote in pal-e-docs. Project-wide gap, not blocking for this data-only ticket. [SCOPE] Create architecture notearch-basketball-apias a separate backlog item. - [x] Forgejo issue — forgejo_admin/basketball-api#279, open
File Targets
- [x]
scripts/seed_schedule.py— verified exists (203 lines). Currently has 8 placeholder practice rows usinglabel/divisionpattern withoutteam_id. Agent will replace with 17 real rows usingteam_id. - [x]
src/basketball_api/models.py— verified PracticeSchedule model at line 505. Correctly marked "do not touch." - [x]
src/basketball_api/routes/schedule.py— verified exists. Correctly marked "do not touch."
Model Field Coverage
Checked issue data table against PracticeSchedule model fields:
- [x]
tenant_id— specified as 1 for all rows - [x]
team_id— specified for all 17 rows - [x]
day_of_week— specified for all rows - [x]
start_time— specified for all rows (non-nullable, previously was the blocker) - [x]
end_time— specified for all rows - [x]
location— specified for all rows (non-nullable in model:Mapped[str]) - [x]
notes— specified where relevant (nullable, OK to omit) - [~]
label— NOT in data table, but non-nullable in model (Mapped[str] = mapped_column(String(200))). Agent must derive from Team + day context. Existing script uses descriptive labels like "Kings Varsity Practice". Minor gap — agent can infer (e.g., "16U Local Kings Mon Practice") but explicit values would be cleaner. Not blocking — the Team column provides enough context. - [x]
division— nullable, not in data table. Agent can derive from team name (Kings=boys, Queens=girls) or omit. - [x]
is_active— server default true, no action needed.
Repo Placement
OK. Issue filed on basketball-api, seed data targets basketball-api. Single-repo scope.
Dependencies
- [x] #629 (Schedule data model + migration + seed) — done, pr:234-merged
- [x] #630 (Schedule API endpoints CRUD) — done, pr:236-merged
- [x] #653 (Public schedule endpoint) — done, pr:241-merged
- [x] 7 teams exist in teams table — stated in context
- No blocking items in in_progress.
Acceptance Criteria
5 AC — all testable and specific. Data table provides exact values for every INSERT. Agent can verify via SQL count and API response. The
kubectl exec test command has a pod name placeholder (postgres-...) but agent can discover — not blocking.Blast Radius
- Public schedule page (
routes/public.py,is_active=Truefilter) will show new data immediately. Intended. - Admin schedule view (westside-app) will show new data. Intended.
- No other repos consume practice_schedules.
- Rollback:
DELETE FROM practice_schedules.
Decomposition
1 file target, 5 AC, single repo, estimated under 5 minutes. No decomposition needed.
Recommendation
READY for dispatch. All three previous NEEDS_REFINEMENT issues resolved.
[SCOPE]Create architecture notearch-basketball-apias a separate backlog item (project-wide gap, not blocking this ticket).
No other action needed.