S-18c, the final slice of the S-18 (#19) split (after S-18a #142, S-18b #143). Defines the RegisterRecord objecttype — the schema S-19 (#20) will write canonical register records against on approval — and registers it in the Objecttypen API at startup.
Schema (infra/objecttypen-registerrecord/registerrecord.schema.json): public-safe by construction — id, status (enum INGEDIEND/INGESCHREVEN), reference only, additionalProperties: false, dataClassification: open. Mirrors the BFF's OpenbaarEntry — no bsn/naam (ADR-0027).
Registration: a registerrecord-init compose one-shot (stdlib Python on the stack network) POSTs the objecttype + a published version over the API once Objecttypen is healthy. The Objecttypen setup_configuration (3.4.2) only provisions tokens — no declarative objecttype step — so this follows the ADR-0020 self-seed pattern. Idempotent: if a RegisterRecord with a version already exists it is a no-op.
Wiring: schema + register.py streamed into the external rr-registerrecord-config volume by seed-config.sh registerrecord (main) / bind-mounted (local); added to SEED, CFG_VOLS, and the CI log-dump. registerrecord-init is a one-shot (not in WAIT_SVCS).
Smoke: verify-registerrecord (run-registerrecord-check.sh + registerrecord-check.py) asserts the objecttype exists, has a published version, and that version's schema carries id/status/reference; added as a verify-stack step + a row in the #136 summary.
ADR-0027: records the public-safe schema decision (mirror the BFF public view, not the internal projection; API-seeded one-shot). The slice issue #141 flagged the schema as ADR-worthy, so no separate adr-proposal issue was opened.
Verified locally (end to end, real compose)
Seeded rr-registerrecord-config, brought Objecttypen up, ran registerrecord-init → registered RegisterRecord <uuid> v1 (published). make verify-registerrecord → OK — RegisterRecord v1 published, fields=['id', 'reference', 'status']. Re-running the one-shot → no-op (idempotent). docker compose config clean on both files; schema + script + ci.yaml validated.
Definition of Done
Failing smoke committed first (test(infra): …, "no objecttype named RegisterRecord"); implementation makes it pass.
CI green (verify-stack registerrecord step — validated locally; runner already unstarved by #145).
docker compose up reaches health (one-shot registers after Objecttypen healthy).
Docs: ADR-0027 + demo note.
Closed by the merging PR (closes #141).
This closes out the S-18 (#19) split — Objecttypen (S-18a) + Objecten (S-18b) + RegisterRecord (S-18c) are all up. Next: S-19 (#20) — ACL writes the register record to Objecten on approval, against this schema.
## What & why
S-18c, the **final** slice of the S-18 (#19) split (after S-18a #142, S-18b #143). Defines the **RegisterRecord** objecttype — the schema S-19 (#20) will write canonical register records against on approval — and registers it in the Objecttypen API at startup.
Closes #141
### What
- **Schema** (`infra/objecttypen-registerrecord/registerrecord.schema.json`): public-safe by construction — `id`, `status` (enum `INGEDIEND`/`INGESCHREVEN`), `reference` only, `additionalProperties: false`, `dataClassification: open`. Mirrors the BFF's `OpenbaarEntry` — **no `bsn`/`naam`** (ADR-0027).
- **Registration**: a `registerrecord-init` compose one-shot (stdlib Python on the stack network) POSTs the objecttype + a **published** version over the API once Objecttypen is healthy. The Objecttypen `setup_configuration` (3.4.2) only provisions tokens — no declarative objecttype step — so this follows the ADR-0020 self-seed pattern. **Idempotent**: if a `RegisterRecord` with a version already exists it is a no-op.
- **Wiring**: schema + `register.py` streamed into the external `rr-registerrecord-config` volume by `seed-config.sh registerrecord` (main) / bind-mounted (local); added to `SEED`, `CFG_VOLS`, and the CI log-dump. `registerrecord-init` is a one-shot (not in `WAIT_SVCS`).
- **Smoke**: `verify-registerrecord` (`run-registerrecord-check.sh` + `registerrecord-check.py`) asserts the objecttype exists, has a **published** version, and that version's schema carries `id`/`status`/`reference`; added as a verify-stack step + a row in the #136 summary.
- **ADR-0027**: records the public-safe schema decision (mirror the BFF public view, not the internal projection; API-seeded one-shot). The slice issue #141 flagged the schema as ADR-worthy, so no separate adr-proposal issue was opened.
## Verified locally (end to end, real compose)
Seeded `rr-registerrecord-config`, brought Objecttypen up, ran `registerrecord-init` → `registered RegisterRecord <uuid> v1 (published)`. `make verify-registerrecord` → **OK — RegisterRecord v1 published, fields=['id', 'reference', 'status']**. Re-running the one-shot → **no-op** (idempotent). `docker compose config` clean on both files; schema + script + ci.yaml validated.
## Definition of Done
- [x] Failing smoke committed first (`test(infra): …`, "no objecttype named RegisterRecord"); implementation makes it pass.
- [x] Conventional Commits referencing #141.
- [x] CI green (verify-stack registerrecord step — validated locally; runner already unstarved by #145).
- [x] `docker compose up` reaches health (one-shot registers after Objecttypen healthy).
- [x] Docs: ADR-0027 + demo note.
- [x] Closed by the merging PR (`closes #141`).
This closes out the S-18 (#19) split — Objecttypen (S-18a) + Objecten (S-18b) + RegisterRecord (S-18c) are all up. Next: **S-19 (#20)** — ACL writes the register record to Objecten on approval, against this schema.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Fails against a stack with Objecttypen up but no objecttype seeded yet:
"no objecttype named 'RegisterRecord'". Green comes with the seeded
registerrecord-init one-shot in the next commit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Objecttypen setup_configuration (3.4.2) can only provision tokens, with
no declarative objecttype step, so a registerrecord-init compose one-shot
creates the RegisterRecord objecttype + a published v1 over the API once
Objecttypen is healthy (idempotent; ADR-0020 self-seed pattern). The schema
(infra/objecttypen-registerrecord/registerrecord.schema.json) is public-safe
— id, status, reference — mirroring the BFF's OpenbaarEntry, no bsn/naam;
dataClassification 'open'. S-19 writes records against it on approval.
Config (schema + register.py) is streamed into rr-registerrecord-config by
seed-config.sh (main) / bind-mounted (local), same dual pattern as the
setup_configuration volumes. Wired into SEED, CFG_VOLS, and the CI log-dump.
Verified locally: registerrecord-init registered RegisterRecord v1 published,
make verify-registerrecord green, and a re-run is a no-op.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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-18c, the final slice of the S-18 (#19) split (after S-18a #142, S-18b #143). Defines the RegisterRecord objecttype — the schema S-19 (#20) will write canonical register records against on approval — and registers it in the Objecttypen API at startup.
Closes #141
What
infra/objecttypen-registerrecord/registerrecord.schema.json): public-safe by construction —id,status(enumINGEDIEND/INGESCHREVEN),referenceonly,additionalProperties: false,dataClassification: open. Mirrors the BFF'sOpenbaarEntry— nobsn/naam(ADR-0027).registerrecord-initcompose one-shot (stdlib Python on the stack network) POSTs the objecttype + a published version over the API once Objecttypen is healthy. The Objecttypensetup_configuration(3.4.2) only provisions tokens — no declarative objecttype step — so this follows the ADR-0020 self-seed pattern. Idempotent: if aRegisterRecordwith a version already exists it is a no-op.register.pystreamed into the externalrr-registerrecord-configvolume byseed-config.sh registerrecord(main) / bind-mounted (local); added toSEED,CFG_VOLS, and the CI log-dump.registerrecord-initis a one-shot (not inWAIT_SVCS).verify-registerrecord(run-registerrecord-check.sh+registerrecord-check.py) asserts the objecttype exists, has a published version, and that version's schema carriesid/status/reference; added as a verify-stack step + a row in the #136 summary.Verified locally (end to end, real compose)
Seeded
rr-registerrecord-config, brought Objecttypen up, ranregisterrecord-init→registered RegisterRecord <uuid> v1 (published).make verify-registerrecord→ OK — RegisterRecord v1 published, fields=['id', 'reference', 'status']. Re-running the one-shot → no-op (idempotent).docker compose configclean on both files; schema + script + ci.yaml validated.Definition of Done
test(infra): …, "no objecttype named RegisterRecord"); implementation makes it pass.docker compose upreaches health (one-shot registers after Objecttypen healthy).closes #141).This closes out the S-18 (#19) split — Objecttypen (S-18a) + Objecten (S-18b) + RegisterRecord (S-18c) are all up. Next: S-19 (#20) — ACL writes the register record to Objecten on approval, against this schema.
🤖 Generated with Claude Code