Review: Seed practice_schedules table with Spring/Summer 2026 schedule (re-review)

review-739-2026-04-03-r2 Doc

review ready

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.sql to existing scripts/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:schedule to arch:basketball-api, which is more appropriate. No backing arch-basketball-api note 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-api note in pal-e-docs. Project-wide gap, not blocking for this data-only ticket. [SCOPE] Create architecture note arch-basketball-api as 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 using label/division pattern without team_id. Agent will replace with 17 real rows using team_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=True filter) 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 note arch-basketball-api as a separate backlog item (project-wide gap, not blocking this ticket).
No other action needed.