Review: Commerce admin page — Svelte implementation (promoted from playground)

review-863-2026-04-06-v2 Doc

review ready

Verdict: APPROVED

Re-review after refinement. All 5 items from the previous review have been addressed. Scope is solid and ready for agent dispatch.

Template Completeness

  • [x] Type — Feature
  • [x] Lineage — references westside-playground#50
  • [x] Repo — forgejo_admin/westside-landing
  • [x] User Story — As Marcus (admin), track payment status
  • [x] Context — playground origin, implementation contract, upstream gate documented
  • [x] File Targets — 2 files, with do-not-touch list
  • [x] Acceptance Criteria — 8 criteria covering nav, tabs, data, filtering, mobile
  • [x] Test Expectations — manual validation + build check
  • [x] Constraints — patterns, CSS, runes, no Tailwind
  • [x] Checklist — PR, build, no unrelated changes
  • [x] Related — playground issue, SOP, project page

Traceability

  • [x] story:WS-S9 — "As an admin, I want to track payment status per player so that I know who owes what"
  • [x] story note verified — found in project-westside-basketball user-stories section (stories-admin)
  • [x] arch:westside-app label present
  • [ ] arch note MISSING — no arch-westside-app note exists in pal-e-docs. Documented as systemic gap, deferred per previous refinement. Not this ticket's scope.
  • [x] Forgejo issue — forgejo_admin/westside-landing#226, open

File Targets

  • [x] src/routes/(app)/admin/commerce/+page.svelte — new file. Parent directory does not exist yet (expected for a new route). SvelteKit will create it.
  • [x] src/routes/(app)/+layout.svelte lines 106-126 — verified. CRM nav at line 114, Teams nav at line 115. Insertion point between them is correct and accurate.
  • [x] Do-not-touch list reasonable: CRM page, app.css (with caveat below), backend code
Minor note: Issue says "commerce CSS already exists in shared/style.css" but no shared/style.css exists. Only src/app.css exists and contains zero commerce CSS classes. This is in the Constraints/NOT-touch guidance — the agent will need to add commerce CSS to app.css. Not a blocker since the agent will naturally handle this, but the statement is factually inaccurate.

Repo Placement

OK. Issue filed on westside-landing, work is in westside-landing (westside-app local checkout). Single repo. No cross-repo concerns.

Dependencies

  • [x] #865 (playground spec, westside-playground#50) — documented upstream gate. Currently in needs_approval. Must reach done before this ticket moves to in_progress. Correctly documented in issue body.
  • [x] basketball-api PR #250 — referenced as already merged (provides commerce fields on /admin/players endpoint). Satisfied.

Acceptance Criteria

8 criteria. All are verifiable by an agent:
  • Nav ordering (Dashboard | CRM | Commerce | Teams | Schedule) — checkable via file content
  • Three tabs (Jerseys, Subscriptions, Contracts) — verifiable from page source
  • Each tab has correct columns, summary counts, and filter buttons — verifiable from source
  • apiFetch reuse — verifiable via grep (no new API calls)
  • $derived aggregation — verifiable via grep
  • Mobile 320px rendering — verifiable via viewport resize + screenshot
All criteria are testable and specific. No ambiguous language. No gaps.

Blast Radius

Low. New page addition + one nav insertion. No modifications to existing pages. The /admin/players CRM page is explicitly excluded. No downstream consumers affected. Bottom nav gains a 5th item — mobile spacing at 320px is called out in AC. Rollback is straightforward (revert one file + one nav line).

Decomposition Assessment

2 file targets, 1 repo, 8 AC. AC count exceeds the 5 threshold, but this is a mechanical playground-to-Svelte promotion with a detailed @-comment spec. The work is: (1) create one new page file with copy-paste + data bindings, (2) add one nav link. Two discrete changes, well under the three-thing limit. Single data source, no new API calls. Fits in one agent pass under 5 minutes. No decomposition needed. No independent subtasks to parallelize.

Recommendation

  • [BODY] Non-blocking nit: "commerce CSS already exists in shared/style.css" is inaccurate — no such file exists, and app.css has no commerce classes. Agent will handle naturally by adding CSS to app.css. Consider correcting for accuracy, but not required before dispatch.
Verdict: APPROVED. Scope is clear, file targets verified, traceability complete (arch note gap is systemic/deferred), upstream gate documented. Ready for agent dispatch once #865 reaches done.