Files
atomic-design-poc/docs/backlog/WP-04-ui-not-infrastructure.md
Edwin van den Houdt f769242f76 docs: replace SHOWCASE-ROADMAP.md with docs/backlog/ (17 WPs)
Turns the prior roadmap sketch into ordered, gated work packages (enforcement
gates, FP/DDD consistency, CIBG fidelity, Storybook curriculum, a11y) from the
2026-07-02 showcase-hardening audit.
2026-07-02 17:07:59 +02:00

3.3 KiB

WP-04 — Boundaries II: ui ↛ infrastructure + showcase sanction

Status: todo Phase: 0 — enforcement & gates

Why

The documented rule ui → application → domain (CLAUDE.md §1) is not lint-enforced, and three components inject infrastructure adapters directly. This is the biggest refactor of Phase 0 — a pure move of wiring, no behavior change.

Read first

  • CLAUDE.md §1, docs/ARCHITECTURE.md
  • eslint.config.mjs
  • src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts (lines ~18-19: BrpAdapter/parseBrpAddress, DuoAdapter/parseDuoLookup)
  • src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts (~line 28: IntakePolicyAdapter)
  • src/app/registratie/application/big-profile.store.ts (the facade pattern to copy)
  • src/app/showcase/ui/concepts.page.ts

Decisions (pre-made, don't relitigate)

  • Showcase is sanctioned, not fixed: showcase/ is a teaching page whose point is showing multiple contexts side by side. Add an explicit eslint override allowing @registratie/* / @herregistratie/* from src/app/showcase/**, with a message comment — same precedent as the existing debug-state exemption. Document in ARCHITECTURE.md: "showcase may read every context; nothing imports showcase."
  • Move wiring only — do not redesign adapter signatures. Existing machine specs are the safety net.

Files

  • eslint.config.mjs — forbid **/ui/** and **/layout/****/infrastructure/**; add the showcase sanction
  • src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts — BRP/DUO lookups move behind a registratie application/ facade (command or store methods)
  • src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts — policy resource moves behind new src/app/herregistratie/application/ (folder doesn't exist yet)
  • docs/ARCHITECTURE.md — fix "three contexts, four layers" → six contexts (shared, auth, registratie, herregistratie, brief, showcase), five layers (+ contracts); add the showcase sanction
  • CLAUDE.md §1 — add brief to the context list; note the showcase sanction

Steps

  1. Create the application-layer facades (pattern: big-profile.store.ts / submit-*.ts commands); components inject those instead of adapters.
  2. Add the eslint restriction; add the showcase override with rationale message.
  3. Fix any further hits lint finds (letter-composer's infra import is handled in WP-03; if it slipped, fix here).
  4. Update both docs' context/layer inventory.

Acceptance criteria

  • Rule active; lint green; no disables beyond the documented showcase + debug-state exemptions.
  • No **/ui/** file imports from **/infrastructure/**.
  • Both wizards behave unchanged (specs pass; manual smoke).
  • CLAUDE.md and ARCHITECTURE.md list 6 contexts / 5 layers.

Verification

GREEN + npm run test-storybook:ci. Manual smoke: npm start → run the registratie wizard (BRP prefill + DUO lookup steps) and the intake wizard end-to-end.

Out of scope

Redesigning the adapters or resource loading; parse boundaries (WP-05).

Risks

Resource wiring moving layers can subtly change injection timing — keep facades providedIn: 'root' like existing stores and hand the resource through unchanged.