Files
crewli/dev-docs/WS-6-COMPLETE-VERIFICATION-2026-05-04.md
bert.hausmans d709da7858 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>
2026-05-04 23:52:37 +02:00

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.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 PurposeGuardProviders 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 PurposeSubjectResolvers 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.