Review: Interactive girls roster draft tool (mobile-first)

review-526-2026-03-28 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- standalone, discovered during girls roster meeting prep
  • [x] Repo -- forgejo_admin/westside-roster-draft
  • [x] User Story -- coach role, assign girls to teams
  • [x] Context -- 16 registered girls, coaches meeting prep
  • [x] File Targets -- 6 files to create, 1 exclusion
  • [x] Acceptance Criteria -- 6 items
  • [x] Test Expectations -- 3 items with run command
  • [x] Constraints -- 4 constraints listed
  • [x] Checklist -- present
  • [x] Related -- project and board references
All sections present per template-issue-feature. Template is structurally complete.

Traceability

  • [x] story:WS-S6 -- "As an admin, I want to assign players to teams via draft board so that placement is transparent and trackable" (Admin/Marcus stories on project-westside-basketball)
  • [ ] arch:roster-tool -- ISSUE: No architecture note arch-roster-tool exists in pal-e-docs. The project page architecture section lists Domain Model, Data Flow, Deployment, and Auth -- no roster-tool component. New repos require an architecture note.
  • [x] Forgejo issue -- forgejo_admin/westside-roster-draft#1, open

File Targets

  • [x] index.html -- new file in new repo, no conflict
  • [x] style.css -- new file in new repo, no conflict
  • [x] app.js -- new file in new repo, no conflict
  • [ ] server.py -- ISSUE: Creates SQLite backend that duplicates basketball-api's existing POST /admin/teams/save endpoint and GET /admin/teams endpoint (see blast radius below)
  • [ ] seed.py -- ISSUE: Proposes direct Postgres connection to basketball-api DB. This creates a coupling that bypasses the API layer and requires DB credentials in the standalone tool
  • [x] db.sqlite -- gitignored artifact

Repo Placement

MAJOR ISSUE: The ticket proposes a new standalone repo westside-roster-draft with its own SQLite backend. However:
  • basketball-api already has GET /admin/teams (returns all players with division, position, height, graduating_class, photo_url, parent info) and POST /admin/teams/save (persists player-to-team assignments). Both endpoints are specifically documented as "for the SPA draft-board UI."
  • westside-app already has a functional draft board at /admin/teams that reads from and writes to these endpoints, with player assignment, team creation, save/reset, and unassign functionality.
  • The new repo is not listed in the project page Repos table.
The correct approach is to enhance the existing draft board (add division filter for girls-only view, add missing fields like tryout_number and current_school, improve mobile UX) rather than create a parallel data silo.

Dependencies

  • Existing infrastructure: basketball-api /admin/teams and /admin/teams/save endpoints already handle the core CRUD
  • Existing UI: westside-app /admin/teams page already implements draft board with assignment logic
  • Board item #122 (Phase 5: Team Placement -- draft board, coach roster) is in done column, confirming this feature was already built
  • No items currently in in_progress or next_up that block or are blocked by this

Acceptance Criteria

  • "Mobile-first layout readable on 390px screens" -- testable, but the existing westside-app admin/teams page could be made mobile-responsive instead
  • "Read-only link shows all 16 girls grouped by grad class" -- the existing API already returns graduating_class and division; a filter param on the existing page would achieve this
  • "Admin link adds drag/tap to assign" -- existing westside-app page already has assign/unassign; needs mobile touch improvement, not a new tool
  • "Assignments persist in SQLite" -- WRONG PERSISTENCE LAYER. Assignments should persist in basketball-api Postgres via the existing /admin/teams/save endpoint
  • "seed.py successfully pulls current girls data" -- unnecessary if the tool reads from basketball-api directly
  • "No concurrent write conflicts" -- the existing API handles this; SQLite would introduce a sync problem

Blast Radius

HIGH. Creating a separate SQLite data store for team assignments means:
  • Assignments made in the draft tool would NOT be visible in westside-app admin dashboard
  • Assignments made in westside-app would NOT be visible in the draft tool
  • Two sources of truth for the same data (player-team assignments)
  • seed.py requires direct Postgres access, creating an undocumented coupling to basketball-api's database
The Player model already has all fields referenced in the ticket: name, date_of_birth (not "age" directly -- needs computation), height, position, current_school (not "school"), tryout_number, team_preference, division.
Minor field naming discrepancy: ticket says "age" but model has date_of_birth; ticket says "school" but model has current_school.

Decomposition

If rescoped to enhance the existing draft board, this is likely 2-3 tickets:
  • Add division filter + missing fields (tryout_number, current_school, team_preference) to basketball-api GET /admin/teams response and westside-app UI
  • Mobile-optimize the existing westside-app admin/teams page for 390px
  • Add read-only coach view (no auth token required, or URL-param auth for quick sharing)
Each is a single-agent ticket. Current scope as written is too large AND architecturally wrong.

Recommendation

  • [SCOPE] Fundamental architecture decision needed: enhance existing westside-app draft board vs. create standalone SQLite tool. Existing infra already covers 80% of the need. Recommend enhancing, not duplicating.
  • [BODY] If standalone approach is chosen despite overlap: fix field names -- "age" should reference date_of_birth (computed), "school" should reference current_school
  • [LABEL] arch:roster-tool label references a nonexistent architecture note. Either create arch-roster-tool or re-label to arch:westside-app if work happens in the existing app
  • [BODY] Remove seed.py direct Postgres access -- if standalone, use basketball-api REST endpoints instead of DB coupling
  • [DECOMPOSE] If rescoped to enhance existing draft board: split into 3 tickets (API field additions, mobile CSS, read-only view) via template-board