From d709da78583ed04bddcb5dff9dc01e81b50fd7f5 Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Mon, 4 May 2026 23:52:37 +0200 Subject: [PATCH 1/2] docs(ws-6): record completion and verification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- dev-docs/ARCH-CONSOLIDATION-2026-04.md | 2 + .../WS-6-COMPLETE-VERIFICATION-2026-05-04.md | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 dev-docs/WS-6-COMPLETE-VERIFICATION-2026-05-04.md diff --git a/dev-docs/ARCH-CONSOLIDATION-2026-04.md b/dev-docs/ARCH-CONSOLIDATION-2026-04.md index 12fc6072..687602f2 100644 --- a/dev-docs/ARCH-CONSOLIDATION-2026-04.md +++ b/dev-docs/ARCH-CONSOLIDATION-2026-04.md @@ -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), diff --git a/dev-docs/WS-6-COMPLETE-VERIFICATION-2026-05-04.md b/dev-docs/WS-6-COMPLETE-VERIFICATION-2026-05-04.md new file mode 100644 index 00000000..6e6637ed --- /dev/null +++ b/dev-docs/WS-6-COMPLETE-VERIFICATION-2026-05-04.md @@ -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`. From deb75ee5001007b4163dda22e214add82d933fa0 Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Mon, 4 May 2026 23:52:44 +0200 Subject: [PATCH 2/2] docs(backlog): add TECH-FORM-BUILDER-INTEGRATION-TEST-NAME-COVERAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Records the naming-vs-coverage gap surfaced during WS-6 closure verification: ARCH-FORM-BUILDER §31 references five integration contract tests by name that don't exist under those filenames in api/tests/Feature/FormBuilder/Integration/. Coverage may be intact under different filenames; only the §31 naming index is stale. Low priority — defer to whoever next touches FormBuilder integration tests. Co-Authored-By: Claude Opus 4.7 (1M context) --- dev-docs/BACKLOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dev-docs/BACKLOG.md b/dev-docs/BACKLOG.md index 1b3da1c4..5a47d8da 100644 --- a/dev-docs/BACKLOG.md +++ b/dev-docs/BACKLOG.md @@ -1352,6 +1352,14 @@ follows organically as features land or are touched. --- +### TECH-FORM-BUILDER-INTEGRATION-TEST-NAME-COVERAGE + +ARCH-FORM-BUILDER §31 lists five integration contract tests (IdentityMatchTriggerTest, ShiftAssignmentFromRegistrationTest, CodeOfConductGatingTest, SupplierIntakeFlowTest, CrowdListAutoAddTest) that don't exist under those exact names in api/tests/Feature/FormBuilder/Integration/. Some may exist under different names (e.g., TagPickerSyncListenerTest covers TagSync; FormSubmissionResourceIdentityMatchTest may cover IdentityMatch). When next touching FormBuilder integration tests, audit the §31 list against actual test files and either rename to match or update §31 to reflect actual names. Low priority — coverage may be intact, only the naming index is stale. + +Priority: low + +--- + ### WS-6 Deferred #### ARTIST-ADV-SECTION-APPLY