docs(form-builder): WS-5a follow-up — §6.2 registry, §6.7 dual activity-log note, Q3 commit-3 caveat

This commit is contained in:
2026-04-24 20:51:28 +02:00
parent 8d3c1ec6b7
commit 67bede2e49
2 changed files with 20 additions and 0 deletions

View File

@@ -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`

View File

@@ -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