Review: SvelteKit public site — layout shell + 8 pages
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). Keepteams/[id]andcoaches/[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.svelteline 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.