From 67bede2e49cfa091280ef04377005db5910118c8 Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Fri, 24 Apr 2026 20:51:28 +0200 Subject: [PATCH] =?UTF-8?q?docs(form-builder):=20WS-5a=20follow-up=20?= =?UTF-8?q?=E2=80=94=20=C2=A76.2=20registry,=20=C2=A76.7=20dual=20activity?= =?UTF-8?q?-log=20note,=20Q3=20commit-3=20caveat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ARCH-CONSOLIDATION-ADDENDUM-2026-04-24.md | 2 ++ dev-docs/ARCH-FORM-BUILDER.md | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/dev-docs/ARCH-CONSOLIDATION-ADDENDUM-2026-04-24.md b/dev-docs/ARCH-CONSOLIDATION-ADDENDUM-2026-04-24.md index 65ccadcc..20972dfb 100644 --- a/dev-docs/ARCH-CONSOLIDATION-ADDENDUM-2026-04-24.md +++ b/dev-docs/ARCH-CONSOLIDATION-ADDENDUM-2026-04-24.md @@ -154,6 +154,8 @@ class FormField extends Model **Service-grens:** `FormFieldBindingService` is de enige schrijver. `FormFieldService::insertFromLibrary` kopieert rijen via `copyBindings`, niet JSON (Q3 row-copy mandaat). Snapshot-writer en API-resources lezen via `toJsonShape` zodat het externe JSON-contract ongewijzigd blijft. +**Git-log kanttekening commit 3.** De 1Password signer gaf herhaalde "failed to fill whole buffer" errors op de lange HEREDOC body van de bedoelde commit-message; de uiteindelijke commit landde met alleen de titel (`refactor(form-builder): pre-publish check reads form_field_bindings; drop binding JSON columns`, SHA `61719bf`). De volledige rationale — pre-publish check switch van JSON naar relationele query, kolom-drops op `form_fields.binding` en `form_field_library.default_binding`, factory/resource/form-request cleanup, fixture-rewrites — staat in de WS-5a completion notitie, niet in `git show 61719bf`. Amenden is niet geprobeerd: CLAUDE.md verbiedt signed-commit amenden. + --- ## Q4 — Sanctum `personal_access_tokens` diff --git a/dev-docs/ARCH-FORM-BUILDER.md b/dev-docs/ARCH-FORM-BUILDER.md index 093c7a27..56452193 100644 --- a/dev-docs/ARCH-FORM-BUILDER.md +++ b/dev-docs/ARCH-FORM-BUILDER.md @@ -1124,6 +1124,7 @@ return [ 'admin_notes' => ['type' => 'text', 'label' => 'Notities', 'writable' => true, 'admin_only' => true], ], 'company' => [ + 'name' => ['type' => 'string', 'label' => 'Bedrijfsnaam', 'writable' => true], 'contact_first_name' => ['type' => 'string', 'label' => 'Contact voornaam', 'writable' => true], 'contact_last_name' => ['type' => 'string', 'label' => 'Contact achternaam', 'writable' => true], 'contact_email' => ['type' => 'string', 'label' => 'Contact e-mail', 'writable' => true], @@ -1289,6 +1290,23 @@ table itself. snapshot writer embeds at most one binding per field. Multi-binding on a single field (per §6.1 future scenarios) needs a snapshot shape decision. +**Activity log events.** Changing a field's bindings emits two +entries on the parent `FormField` subject: + +- `field.updated` — payload includes `old.binding` / `new.binding` + shapes reconstructed from the relational table via + `FormFieldBindingService::toJsonShape()`. Preserves the pre-WS-5a + audit-consumer contract for downstream tooling that parses + `field.updated` diffs. +- `field.bindings_replaced` — the semantic binding-change event, + emitted by `FormFieldBindingService::replaceBindings()`. + +Both fire for the same semantic change. Aggregate queries over +activity-log event counts should filter on one, not both. +Downstream consumers that migrate to the semantic event can stop +listening to `field.updated` binding diffs once all their callers +have moved. + --- ## 7. Filter architecture