Review: Scaffold SvelteKit adapter-node + TypeScript + ESLint

review-1087-2026-04-25 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Board item #1087 — forgejo_admin/westside-admin#6 — column: backlog (review gate: backlog→todo).

Template Completeness

Issue declares ### Type: Task, so reviewed against template-issue (base template with Scope, no File Targets).
  • [x] Type
  • [x] Lineage
  • [x] Repo
  • [x] User Story
  • [x] Context
  • [x] Scope
  • [x] Acceptance Criteria
  • [x] Test Expectations
  • [x] Constraints
  • [x] Checklist
  • [x] Related
All required sections present for Task type. Body is clear, scope is well-bounded, anti-scope is explicit.

Traceability

  • [x] story:admin-row-crud — story name confirmed on project page
  • [x] story note verified — story-westside-admin-admin-row-crud exists, listed in project-westside-admin user-stories table
  • [ ] arch:sveltekit-server — no matching arch note exists. Project page lists exactly three arch notes: arch-domain-westside-admin, arch-dataflow-westside-admin, arch-deployment-westside-admin. The label arch:sveltekit-server does not correspond to any of them. The issue body's Related section actually points to arch-deployment-westside-admin and arch-dataflow-westside-admin, which suggests the correct label is arch:deployment-westside-admin (or arch:dataflow-westside-admin).
  • [x] Forgejo issue — #6 open, valid, well-formed
  • [x] type:infra — appropriate for scaffolding work
Board-wide observation (not blocking this ticket): 10 other items on board-westside-admin use component-style arch labels (arch:scopeddb-helper, arch:keycloak, arch:hooks-server, arch:page-server, arch:postgres-grants, arch:woodpecker-ci, arch:deployment) that also have no backing arch notes. Either the convention here is "label = arch component (sub-element of an arch diagram)" — in which case the three diagram notes are the universe of arch notes and labels point INTO them — or these labels need 7+ new arch notes. This is a project-level scoping decision, not a fix for this single ticket. Flagging for Ava.

File Targets

N/A — Type is Task. Scope section enumerates files to be CREATED in an empty repo (forgejo_admin/westside-admin, README only). All paths are conventional SvelteKit scaffolding paths and don't need to be verified against the repo (it's empty by design).

Repo Placement

OK. Issue filed on forgejo_admin/westside-admin; scope is entirely in that repo. Does not touch pal-e-deployments, pal-e-platform, or basketball-api.

Dependencies

None upstream — this is the first foundational ticket per Lineage ("First foundational ticket for westside-admin. No parent issue."). The scope explicitly defers src/lib/server/db.ts (Drizzle), hooks.server.ts (Keycloak), Dockerfile, and .woodpecker.yaml to their own tickets — those tickets exist on the board (#1, #2, #7, #8 etc.) and are correctly downstream of this one. This ticket BLOCKS most/all other westside-admin repo tickets, which is correct sequencing.

Acceptance Criteria

Six AC, all agent-verifiable via shell commands (npm install, npm run check, npm run build, npm run dev, node build/index.js, lint/prettier). Concrete, testable, no ambiguity. Test Expectations adds a sensible build sanity check (node build/index.js responds 200 on /).

Blast Radius

None. New empty repo, no consumers. The only interaction with existing systems is the "match package versions to westside-app" constraint, which is advisory and easy to verify.
Soft note on the constraint itself: westside-app uses adapter-static + plain Svelte + jsconfig.json (no TypeScript) + vite.config.js + no ESLint/Prettier config. This ticket requires TypeScript + ESLint + adapter-node. So "match package versions where applicable" really only applies to @sveltejs/kit (^2.16.0), svelte (^5.19.0), svelte-check (^4.1.4), vite (^6.1.0). Dev agent should be told this explicitly so they don't go hunting for ESLint config in westside-app and find nothing. Minor [BODY] tightening, not blocking.

Decomposition Assessment

6 AC, 1 repo, ~10 files of scaffolding, all conventional SvelteKit boilerplate. Estimated agent time: 5–10 minutes (mostly npm create svelte, configure adapter, add ESLint). Borderline on the 5-minute rule but the work is highly cohesive (one repo, one PR, one commit) and decomposing scaffolding into sub-tickets would create more overhead than it saves. No decomposition needed.

Recommendation

  • [LABEL] Change arch:sveltekit-server to arch:deployment-westside-admin (matches arch-deployment-westside-admin note that the issue's Related section actually links to). OR adopt a component-label convention project-wide and create the matching arch notes — this is a project-level call for Ava, not a per-ticket fix.
  • [BODY] (minor) In Constraints, narrow "Match package versions to forgejo_admin/westside-app" to specifically: @sveltejs/kit ^2.16.0, svelte ^5.19.0, svelte-check ^4.1.4, vite ^6.1.0. Note that westside-app uses adapter-static and has no TypeScript or ESLint config, so those areas have no reference to match.
  • [SCOPE] (board-wide, not this ticket) Decide on arch label convention for board-westside-admin. Either (a) labels reference the three diagram notes only (arch:domain-westside-admin, arch:dataflow-westside-admin, arch:deployment-westside-admin) and component-level grouping happens inside those notes, or (b) create component-level arch notes for the 7 currently-orphaned labels. Affects 10 other board items.
Once the arch label is corrected (single-line fix on the board item) this ticket is READY. Body refinement is nice-to-have, not blocking.