Review: SvelteKit public site — layout shell + 8 pages

review-431-2026-03-26 Review

review ready

Verdict: READY

Fifth review (v5) of board item #431. The v4 finding (incorrect DELETE of (app)/teams/ and (app)/coaches/) has been corrected in the issue body. All prior findings resolved. Ticket is ready for next_up.

v4 Fix Verification

  • [x] Architecture tree updated. Shows (app)/teams/[id]/... and (app)/coaches/[id]/... as retained auth detail routes with explicit "no collision" annotations.
  • [x] Scope section 1 corrected. Now reads: "Delete tryouts/ from auth routes (replaced by public). Keep teams/[id] and coaches/[id] under (app) — these are auth detail pages, no collision with public list pages."
  • [x] DELETE lines corrected. Only 2 DELETE targets remain: src/routes/+page.svelte (old auth redirect) and (app)/tryouts/ (replaced by public). No DELETE for (app)/teams/ or (app)/coaches/.
  • [x] Codebase cross-references verified. 6 links to /teams/{id} and /coaches/{id} from admin/+page.svelte, players/[id]/+page.svelte, coaches/[id]/+page.svelte, and teams/[id]/+page.svelte. All would break if those routes were deleted. Keeping them is correct.

Template Completeness

  • [x] Type — Feature
  • [x] Lineage
  • [x] Repo — forgejo_admin/westside-app
  • [x] User Story
  • [x] Context
  • [x] Architecture (route group diagram)
  • [x] Scope (7 numbered subsections)
  • [x] Translation Reference
  • [x] File Targets — 17 entries including 2 DELETE + 1 cleanup
  • [x] Acceptance Criteria — 12 items
  • [x] Test Expectations — 4 items
  • [x] Constraints — 6 items
  • [x] Checklist — 10 items
  • [x] Depends On
  • [x] Related
All required Feature template sections present. Bonus sections (Architecture, Translation Reference) are thorough.

Traceability

  • [x] story:WS-S26 label — public site user story
  • [x] arch:westside-app label — correct architecture component
  • [x] Forgejo issue — forgejo_admin/westside-app#98, open
Traceability triangle complete.

File Targets

  • [x] src/routes/+layout.svelte — EXISTS. Currently has Keycloak init + auth guard. Will become minimal (just CSS import).
  • [x] src/routes/+layout.js — EXISTS. export const ssr = false; export const prerender = false;
  • [x] src/routes/(public)/+layout.svelte — NEW. Public nav/footer/toggle.
  • [x] src/routes/(public)/+page.svelte — NEW. Replaces current root +page.svelte.
  • [x] src/routes/(public)/about/+page.svelte — NEW.
  • [x] src/routes/(public)/staff/+page.svelte — NEW. Uses publicFetch('/public/coaches').
  • [x] src/routes/(public)/teams/+page.svelte — NEW. Uses publicFetch('/public/teams').
  • [x] src/routes/(public)/schedule/+page.svelte — NEW.
  • [x] src/routes/(public)/tryouts/+page.svelte — NEW. Replaces current auth tryouts page.
  • [x] src/routes/(public)/gear/+page.svelte — NEW.
  • [x] src/routes/(public)/sponsors/+page.svelte — NEW.
  • [x] src/routes/(app)/+layout.svelte — MOVE. Current root layout Keycloak logic moves here.
  • [x] src/routes/(app)/ — MOVE. All existing auth routes relocate (including teams/[id] and coaches/[id]).
  • [x] src/lib/public-api.js — NEW. Unauthenticated fetch helper.
  • [x] src/app.css — EXISTS (will be replaced with playground shared/style.css).
  • [x] DELETE: src/routes/+page.svelte — correct. Auth redirect logic migrates to (app)/+layout.svelte.
  • [x] DELETE: (app)/tryouts/ — correct. Only contains +page.svelte. Replaced by (public)/tryouts.
  • [x] Cleanup: (app)/register/+page.svelte line 182 — VERIFIED. Inline nav at lines 182-187 confirmed.
All file targets verified against codebase. No issues found.

Repo Placement

Correct. Issue filed on forgejo_admin/westside-app, all file targets are in westside-app. Basketball-api dependencies are separate issues on the correct repo.

Dependencies

  • basketball-api #176 (GET /public/teams) — closed (done).
  • basketball-api #177 (GET /public/coaches) — open, board item #430 in next_up. Depends on #176.
  • Dependencies correctly declared in board labels (depends:bb-176+bb-177) and issue body.
  • Sequencing: 6 static pages can proceed without API. 2 dynamic pages (/teams, /staff) blocked until #177 completes. Acceptable.
  • Overlapping board items: #416 (Svelte promotion prep), #405 (Landing page restore), #407 (Tryouts page), #406 (About page) in next_up overlap with this umbrella ticket. This ticket should execute first (structural), then those become additive refinements.

Acceptance Criteria

12 acceptance criteria + 4 test expectations. All are agent-verifiable. Covers auth route survival, Keycloak flow, double-nav prevention, mobile hamburger, graceful API degradation. Good coverage.

Blast Radius

  • teams/[id] and coaches/[id] — now correctly retained. The v4 fix preserves these routes under (app)/. 6 cross-page links confirmed safe.
  • CSS replacement risk. Swapping app.css with playground style.css could affect authenticated page styles. Implementing agent should do visual diff.
  • Overlapping board items. Items #405, #406, #407 in next_up are individual page tickets that overlap with this umbrella ticket's 8-page scope. Execution order matters.
  • PUBLIC_ROUTES allowlist becomes dead code. Current +layout.svelte has a PUBLIC_ROUTES array (line 24). Under route groups, auth guarding is structural. Migration should remove this allowlist. Not explicitly mentioned in scope — minor, agent should catch this naturally during the layout refactor.

Recommendation

Verdict: READY. The v4 fix has been correctly applied — DELETE lines for (app)/teams/ and (app)/coaches/ are removed, architecture tree shows them as retained auth detail routes, and Scope section 1 explicitly clarifies they coexist alongside public list pages. All 5 reviews' worth of findings are resolved. Template is complete, traceability triangle is intact, file targets are verified, and acceptance criteria are testable. No action needed.