docs(backlog): add gaps discovered during S3a PR 2

- TECH-06 — ESLint config ontbreekt in apps/portal (pendant van TECH-05).
- DOC-02 — VitePress docs:build faalt op missing image in
  /docs/volunteer/je-aanmelden-via-een-link.md.
- DOC-03 — Formulieren sidebar story is incompleet; nog geen
  publicatieflow, inzendingen-overzicht, templates, webhooks,
  conditionele logica.
- FORM-09 — TriggerPersonIdentityMatchOnFormSubmit ShouldQueue
  herzien: async queue-dispatch levert null bij submit-response;
  eager state + lazy resolution patroon invoeren nu de refactor
  nog klein is (voor FORM-05 landt).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 20:44:46 +02:00
parent a97922d6a4
commit 1875e79ce1

View File

@@ -339,6 +339,32 @@ shifts claimen zonder toegang tot de Organizer app.
---
### DOC-02 — VitePress docs:build faalt op missing image
**Aanleiding:** `/docs/volunteer/je-aanmelden-via-een-link.md` verwijst
naar `./images/placeholder.png` dat niet bestaat. Dev mode werkt,
build faalt. Blokkeert CI als die `docs:build` gaat draaien.
**Wat:** Placeholder afbeelding toevoegen OF de referentie weghalen /
vervangen door een echte screenshot van het registratieflow.
**Prioriteit:** Laag — cosmetisch, niet blokkerend voor dev.
---
### DOC-03 — Formulieren sidebar story is incompleet
**Aanleiding:** Tijdens S3a PR 2 is
`docs/organizer/forms/concepts/wat-is-een-formulier.md` gewired in de
sidebar, samen met de nieuwe veldtype-pagina's. Maar de bredere
Formulieren-sidebar mist nog: publicatieflow, inzendingen-overzicht,
templates, webhook-configuratie, conditionele logica.
**Wat:** Dedicated docs-sprint voor de Formulieren-module in
VitePress. Schat: 6-8 pagina's in Nederlands, aimed at organisatoren
die formulieren configureren.
**Prioriteit:** Middel — landt best vlak voor/na S3b (organizer
form-builder UI), omdat screenshots pas zin hebben als de UI staat.
---
### FORM-05 — Smart identity-match on public submission values
**Stub-status (S3a PR 2, 2026-04-23):** Public event_registration
@@ -366,6 +392,39 @@ Prioriteit: Medium. Kan gebundeld worden met de organizer
---
### FORM-09 — TriggerPersonIdentityMatchOnFormSubmit ShouldQueue herzien
**Aanleiding:** De bestaande listener `implements ShouldQueue`. Gevolg:
bij een public event_registration submission is
`identity_match_status` nog `null` op het moment dat de submit-HTTP-
response terugkeert. De confirmation page rendert daardoor zonder
banner bij first load — pas na een refresh (of queue-worker tick) is
de `pending` staat zichtbaar. Tijdens S3a PR 2 is dit genoteerd als
"dev ergonomics" (draai `queue:work` erbij), maar dat is een
workaround, geen fix.
**Wat:** Verwijder `implements ShouldQueue` uit
`TriggerPersonIdentityMatchOnFormSubmit`. De listener wordt
orchestrator: schrijft `identity_match_status` synchroon in de
request-lifecycle zodat de submit-response direct klopt. Wanneer
FORM-05 proper landt met zwaardere matching-logica
(`PersonIdentityService::detectMatchesByValues` met fuzzy name
matching over de hele org), wordt dat zware werk gedispatched als
aparte `ResolveIdentityMatchJob` vanuit deze listener. Eager state
transition blijft sync, heavy resolution blijft async.
Zie ook: architectuur-discussie in de S3a planning-sessie
("eager state + lazy resolution" patroon).
**Prioriteit:** Middel — niet user-facing blocking vandaag (draait
met `queue:work` gewoon), maar architecturaal is de refactor juist nu
klein (1 regel weghalen + test-aanpassing). Wordt groter als FORM-05
landt zonder deze refactor.
**Impact:** ~5 regels code, 1-2 test-aanpassingen. Eén commit, aparte
PR.
---
### SUP-01 — Leveranciersportal + productieverzoeken
**Aanleiding:** Leveranciers moeten productie-informatie kunnen indienen.
@@ -449,6 +508,20 @@ Vuexy 9.5 template. Moet in één keer groen draaien.
---
### TECH-06 — ESLint config ontbreekt in apps/portal
**Aanleiding:** `npm run lint` faalt in `apps/portal/` omdat
`.eslintrc.cjs` niet bestaat. Geen flat-config equivalent aanwezig.
Portal draait dus effectief zonder lint, wat botst met CLAUDE.md's
zero-compromise regels. Apart van TECH-05 (dat over apps/app gaat).
**Wat:** Flat-config ESLint installeren in `apps/portal/`, afgestemd
op Vue 3 + TypeScript + Vuexy 10.11.1. In één keer groen laten
draaien. Bij voorkeur gedeelde shared-config tussen apps/app en
apps/portal om drift te voorkomen.
**Prioriteit:** Middel — tooling-gap, niet user-facing.
---
### ~~TECH-02 — scopeForFestival helper op Event model~~ ✅ OPGELOST
---