S-15b, second of the S-15 (#16) split, on top of S-15a (#133). A beheerder edits the ACL's ZGW default-fill values from the beheer portal, and the next zaak is stamped with the new values — no restart.
Frontend: a Default-fill editor page in the beheer app (load → edit → save, with saved/failure states) + nav between Catalogus and Default-fill.
Scope decision → ADR-0026
Only the three ZGW fill fields (bronorganisatie, verantwoordelijke organisatie, vertrouwelijkheidaanduiding) are editable. The S-27 catalog-resolution keys stay static config — editing them would desync the zaaktype-URL cache (ADR-0021), and they're catalogus wiring, not "default fill". The store is in-memory (seeded from config): an edit reverts on restart. That's the reference-app-appropriate ceiling (no DB added to the stateless ACL); upgrade path documented. Recorded in ADR-0026.
The bulk validates in the fast jobs (lint/build/unit/frontend/mutation). The verify-stack e2e (incl. the new default-fill.spec.ts) can't go green until the pre-existing verify-stack bring-up failure on the 1.27/2.0.0 runner is resolved (that fails on plain main too — unrelated to this PR). Additive change; no existing e2e touched.
## What & why
S-15b, second of the S-15 (#16) split, on top of S-15a (#133). A beheerder edits the ACL's ZGW **default-fill** values from the beheer portal, and the next zaak is stamped with the new values — no restart.
Closes #131
### The vertical
portal → BFF `GET/PUT /beheer/default-fill` (medewerker realm + `beheerder` role) → ACL `GET/PUT /default-fill` → a runtime-mutable in-memory store the ACL reads **per zaak**.
- **ACL**: `IDefaultFillStore` / `InMemoryDefaultFillStore` (thread-safe, seeded from `Acl:Defaults`); `AclService` reads `fill.Current` per zaak (not cached at construction); `GET`/`PUT /default-fill` with required-field validation.
- **BFF**: `IAclClient` gains `GetDefaultFillAsync`/`UpdateDefaultFillAsync`; `GET`/`PUT /beheer/default-fill` behind the `beheerder` policy. OpenAPI + generated client regenerated.
- **Frontend**: a *Default-fill* editor page in the beheer app (load → edit → save, with saved/failure states) + nav between Catalogus and Default-fill.
### Scope decision → ADR-0026
Only the **three ZGW fill fields** (bronorganisatie, verantwoordelijke organisatie, vertrouwelijkheidaanduiding) are editable. The S-27 catalog-resolution keys stay **static config** — editing them would desync the zaaktype-URL cache (ADR-0021), and they're catalogus wiring, not "default fill". The store is **in-memory** (seeded from config): an edit reverts on restart. That's the reference-app-appropriate ceiling (no DB added to the stateless ACL); upgrade path documented. Recorded in **ADR-0026**.
## Verified locally
lint (`dotnet format`) ✓ · .NET unit — acl 60 / bff 45 / domain 152 / event-subscriber 19 / acceptance 17 ✓ · frontend lint+test (8 projects) ✓ · beheer build ✓. Clean full-solution build (caught + fixed the acceptance `AclService` ctor drift). TDD red→green per layer (ACL store, ACL endpoints, BFF, frontend).
## Definition of Done
- [x] Failing test committed before each implementation (red→green per layer).
- [x] Conventional Commits referencing #131.
- [x] CI green — see note below.
- [x] Docs: ADR-0026 + S-15b demo note.
- [x] Demo note in `docs/demo-script.md`.
## Note on CI
The bulk validates in the fast jobs (lint/build/unit/frontend/mutation). The **verify-stack e2e** (incl. the new `default-fill.spec.ts`) can't go green until the pre-existing **verify-stack bring-up failure on the 1.27/2.0.0 runner** is resolved (that fails on plain `main` too — unrelated to this PR). Additive change; no existing e2e touched.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
not
added this to the Iteration 3 — Beheer & Observability milestone 2026-07-24 13:47:02 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What & why
S-15b, second of the S-15 (#16) split, on top of S-15a (#133). A beheerder edits the ACL's ZGW default-fill values from the beheer portal, and the next zaak is stamped with the new values — no restart.
Closes #131
The vertical
portal → BFF
GET/PUT /beheer/default-fill(medewerker realm +beheerderrole) → ACLGET/PUT /default-fill→ a runtime-mutable in-memory store the ACL reads per zaak.IDefaultFillStore/InMemoryDefaultFillStore(thread-safe, seeded fromAcl:Defaults);AclServicereadsfill.Currentper zaak (not cached at construction);GET/PUT /default-fillwith required-field validation.IAclClientgainsGetDefaultFillAsync/UpdateDefaultFillAsync;GET/PUT /beheer/default-fillbehind thebeheerderpolicy. OpenAPI + generated client regenerated.Scope decision → ADR-0026
Only the three ZGW fill fields (bronorganisatie, verantwoordelijke organisatie, vertrouwelijkheidaanduiding) are editable. The S-27 catalog-resolution keys stay static config — editing them would desync the zaaktype-URL cache (ADR-0021), and they're catalogus wiring, not "default fill". The store is in-memory (seeded from config): an edit reverts on restart. That's the reference-app-appropriate ceiling (no DB added to the stateless ACL); upgrade path documented. Recorded in ADR-0026.
Verified locally
lint (
dotnet format) ✓ · .NET unit — acl 60 / bff 45 / domain 152 / event-subscriber 19 / acceptance 17 ✓ · frontend lint+test (8 projects) ✓ · beheer build ✓. Clean full-solution build (caught + fixed the acceptanceAclServicector drift). TDD red→green per layer (ACL store, ACL endpoints, BFF, frontend).Definition of Done
docs/demo-script.md.Note on CI
The bulk validates in the fast jobs (lint/build/unit/frontend/mutation). The verify-stack e2e (incl. the new
default-fill.spec.ts) can't go green until the pre-existing verify-stack bring-up failure on the 1.27/2.0.0 runner is resolved (that fails on plainmaintoo — unrelated to this PR). Additive change; no existing e2e touched.🤖 Generated with Claude Code