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>
4.2 KiB
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.phpFormSubmissionActionFailure+FormSubmissionActionFailureRetryAttemptmodelsFormSubmissionActionFailurePolicy(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/(includesRequiresDefaultCrowdTypeper v1.1) - 7
PurposeGuardProviders inapi/app/FormBuilder/Purposes/Guards/ FormSchemaService::publish()integrates the guard chain'section_apply_enabled'feature flag inapi/config/form_builder.phpwith full Q10 comment block
Pipeline (sessie 2):
FormBindingApplicatorwith transaction guard, NO_OP sentinel, per-strategy null-winner matrix, append-collection-only enforcementPersonProvisionerwith race-safe firstOrCreate scoped by(email, event_id)per v1.1 Q8 addendumBindingConflictResolver(Q7 trust+sort_order),BindingActivityLogger(Q12 hierarchical pass + per-binding)- 7
PurposeSubjectResolvers inapi/app/FormBuilder/Purposes/Resolvers/ ApplyBindingsOnFormSubmitlistener with full two-transaction failure patternApplyBindingsOnFormSectionSubmittedfeature-flag-gated stubTriggerPersonIdentityMatchOnFormSubmitQ2-refactor (no-subject path is a logged warning failsafe)- Post-commit
FormSubmissionSubmitted::dispatchinFormSubmissionService::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) withwithoutScopedBindings()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.tscomposable +types/form-failures.ts- IDOR-class route security tests in
api/tests/Feature/FormBuilder/Api/Security/ dev-docs/ARCH-OBSERVABILITY.mdskeleton with$dontReportdecisions 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.mdat 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.