Review: Add age-based team reassignment clause to Queens contracts

review-592-2026-03-29 Review

review approved

Verdict: APPROVED

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- discovered during girls roster assignment 2026-03-28
  • [x] Repo -- forgejo_admin/westside-contracts
  • [x] User Story -- admin wants Queens contracts to include age-based reassignment clause
  • [x] Context -- explains graduating class spread (2027-2031) and need for discretion
  • [x] File Targets -- 2 files listed with clear change descriptions
  • [x] Acceptance Criteria -- 3 criteria, clear and testable
  • [x] Test Expectations -- 3 items with concrete steps
  • [x] Constraints -- 2 items (tone + legal soundness)
  • [x] Checklist -- present
  • [x] Related -- project-westside-basketball

Traceability

  • [x] story:WS-S9 label -- billing and contracts user story
  • [x] arch:contract-flow label -- contract-flow architecture component
  • [x] Forgejo issue -- forgejo_admin/westside-contracts#29, open

File Targets

  • [x] src/routes/contract/[token]/+page.svelte -- verified: file exists (702+ lines). Queens-specific content block already exists at line 389 ({:else if !isLocal && isGirls}). Existing "Roster Flexibility" section at line 506 covers roster changes but not age-based reassignment specifically. The isGirls boolean is already destructured from data (line 7), so the agent should use isGirls rather than player.team_name?.includes('Queens') as the issue body suggests.
  • [x] src/routes/contract/[token]/+page.server.ts -- verified: file exists (46 lines). Already passes team_name and derives isGirls (line 44). No changes needed, as stated in issue.

Repo Placement

Correct. Issue filed on forgejo_admin/westside-contracts, changes target westside-contracts repo. Single-repo scope.

Dependencies

  • [x] #556 "Phase 14: Billing Tiers and Contracts" (in_progress) -- parent work area, not a blocker
  • [x] #534 "Show contract status in admin CRM player list" (done) -- WS-S9 sibling, no conflict
  • [x] #133 "Phase 16: Expense Tracking" (backlog) -- WS-S9 sibling, no dependency
No unresolved dependencies. No blockers.

Acceptance Criteria

3 criteria, all verifiable by an agent:
  • [x] Queens contracts include reassignment clause -- agent can check rendered HTML
  • [x] Language is professional and clear -- subjective but agent can draft, human reviews in PR
  • [x] Clause only appears on Queens, not Kings -- agent can verify via isGirls conditional guard
Test expectations are concrete: npm run build && npm run dev, then navigate to Queens vs Kings contract pages.

Blast Radius

  • Low blast radius. Change is a new HTML block inside an existing Queens-only conditional ({:else if !isLocal && isGirls}).
  • No shared components affected. No API changes. No database changes.
  • The existing "Roster Flexibility" section (line 506-509) already mentions team assignment adjustments in general terms. The new clause adds specific age-based reassignment language -- these are complementary, not conflicting. Agent should place the new clause near the existing Roster Flexibility section for coherence.
  • The sign/+server.ts endpoint (line 60) also derives isGirls for contract versioning -- not affected by this change.
  • Rollback is straightforward -- single file, single conditional block removal.

Decomposition Assessment

No decomposition needed.
  • 1 file to modify (the .svelte file), server file confirmed no-op
  • 3 acceptance criteria -- under the three-thing limit
  • Estimated agent time: 2-3 minutes -- well within the five-minute rule
  • No independent subtasks to parallelize -- this is a single HTML block insertion

Recommendation

  • [BODY] Minor: issue says "conditional on player.team_name?.includes('Queens')" but codebase already has isGirls destructured from data. Agent should use isGirls (the existing pattern). Not a blocker -- agent will discover this naturally.
No action needed. Scope is solid and ready for dispatch.