docs(ws-6): record completion and verification

WS-6 (FormBindingApplicator pipeline) is fully landed in main —
sessions 1, 2, and 3 all merged. Verification on 2026-05-04
confirmed every RFC-WS-6.md §7 deliverable plus the v1.1/v1.2
addenda. Backend test suite green at 1486 tests, above the RFC
§8 target of 1445-1465.

Adds a closure-marker note documenting what's verified in main
and adds a single status line under §6.2 of the consolidation
plan pointing at it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-04 23:52:37 +02:00
parent 2d9d2319a5
commit d709da7858
2 changed files with 53 additions and 0 deletions

View File

@@ -405,6 +405,8 @@ helper. Update van `FormSchemaService` met pre-publish-validation.
- Test: schema met AVAILABILITY_PICKER zonder event-koppeling kan niet publiceren
- Test: EVENT_REGISTRATION schema zonder email-binding kan niet publiceren
**Status:** Complete (verified 2026-05-04). All three sessions landed in main; backend test count 1486, exceeds RFC §8 target of 1445-1465. See dev-docs/WS-6-COMPLETE-VERIFICATION-2026-05-04.md for verification details.
### 6.3 WS-4 — Denormalized submission columns
**Scope:** Kolommen `event_id` (nullable), `organisation_id` (niet-nullable),

View File

@@ -0,0 +1,51 @@
# WS-6 — Complete (verification 2026-05-04)
## WS-6 status: complete
All three sessions of WS-6 (FormBindingApplicator pipeline) — Foundation, Pipeline, Admin UI — have landed in `main`. Verification ran on 2026-05-04 against a clean `main` checkout and confirmed every deliverable from RFC-WS-6.md §7 (sessions 1, 2, 3) plus the v1.1 / v1.2 addenda. Backend test suite is green at 1486 tests, exceeding the RFC §8 end-of-WS-6 target of 1445-1465. No further implementation work is queued; WS-6 closes here.
## In main, verified
**Foundation (sessie 1):**
- Enums in `api/app/Enums/FormBuilder/`: `ApplyStatus`, `BindingTargetType`, `DismissalReasonType`, `FormFieldBindingMergeStrategy`
- Value objects in `api/app/FormBuilder/Bindings/`: `ResolvedBinding`, `BindingApplicationResult`, `BindingPassResult`, `BindingTargetMeta`
- `BindingTypeRegistry` + `config/form_builder/binding_targets.php` + `config/form_builder/purposes.php`
- `FormSubmissionActionFailure` + `FormSubmissionActionFailureRetryAttempt` models
- `FormSubmissionActionFailurePolicy` (RFC V3 IDOR FK-chain)
- Schema migrations for `apply_status`, `form_submission_action_failures`, retry-attempts, `default_crowd_type_id`, `kvk_number`
- 11 publish guards in `api/app/FormBuilder/Publishing/` (includes `RequiresDefaultCrowdType` per v1.1)
- 7 `PurposeGuardProvider`s in `api/app/FormBuilder/Purposes/Guards/`
- `FormSchemaService::publish()` integrates the guard chain
- `'section_apply_enabled'` feature flag in `api/config/form_builder.php` with full Q10 comment block
**Pipeline (sessie 2):**
- `FormBindingApplicator` with transaction guard, NO_OP sentinel, per-strategy null-winner matrix, append-collection-only enforcement
- `PersonProvisioner` with race-safe firstOrCreate scoped by `(email, event_id)` per v1.1 Q8 addendum
- `BindingConflictResolver` (Q7 trust+sort_order), `BindingActivityLogger` (Q12 hierarchical pass + per-binding)
- 7 `PurposeSubjectResolver`s in `api/app/FormBuilder/Purposes/Resolvers/`
- `ApplyBindingsOnFormSubmit` listener with full two-transaction failure pattern
- `ApplyBindingsOnFormSectionSubmitted` feature-flag-gated stub
- `TriggerPersonIdentityMatchOnFormSubmit` Q2-refactor (no-subject path is a logged warning failsafe)
- Post-commit `FormSubmissionSubmitted::dispatch` in `FormSubmissionService::submit()` per O2
- Listener wiring in `AppServiceProvider::boot()` lines 166-197 (sync chain order correct)
- Retry/Resolve/Dismiss artisan commands in `api/app/Console/Commands/`
- Dual-route HTTP API on `FormSubmissionActionFailureController` (platform + org) with `withoutScopedBindings()` per V3
- Form Requests + API Resources for failures admin
**Admin UI (sessie 3):**
- 4 pages under `apps/app/src/pages/{platform,organisation}/form-failures/`
- 5 components: `FormFailuresTable`, `FormFailureDetail`, `RetryFailureDialog`, `ResolveFailureDialog`, `DismissFailureDialog`
- 5 vitest specs (805 lines total)
- `useFormFailures.ts` composable + `types/form-failures.ts`
- IDOR-class route security tests in `api/tests/Feature/FormBuilder/Api/Security/`
- `dev-docs/ARCH-OBSERVABILITY.md` skeleton with `$dontReport` decisions concrete
**Docs:**
- `dev-docs/ARCH-BINDINGS.md` §1-9 all present (skeleton + apply pipeline + failures/retry + multi-tenancy + listener chain)
- `dev-docs/RFC-WS-6.md` at v1.2
**Test count:** 1486 backend tests passing (RFC §8 end-of-WS-6 target 1445-1465).
## Open questions deferred
`ARCH-FORM-BUILDER.md` §31 lists five integration contract tests by name (`IdentityMatchTriggerTest`, `ShiftAssignmentFromRegistrationTest`, `CodeOfConductGatingTest`, `SupplierIntakeFlowTest`, `CrowdListAutoAddTest`) that don't exist under those exact filenames in `api/tests/Feature/FormBuilder/Integration/` — only `TagPickerSyncListenerTest.php` is there. Some of the five are likely covered under different filenames (e.g. `FormSubmissionResourceIdentityMatchTest.php` plausibly covers IdentityMatchTrigger), so coverage may be intact even though the §31 naming index is stale. Whoever next touches FormBuilder integration tests should audit the §31 list against actual test files and either rename to match or update §31. Tracked as `TECH-FORM-BUILDER-INTEGRATION-TEST-NAME-COVERAGE` in `BACKLOG.md`.