Skip to content

docs(openspec): the committee migration, written down while it is still blocked - #1358

Merged
rubenvdlinde merged 2 commits into
developmentfrom
docs/migrate-committees-plan
Aug 24, 2026
Merged

docs(openspec): the committee migration, written down while it is still blocked#1358
rubenvdlinde merged 2 commits into
developmentfrom
docs/migrate-committees-plan

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Records the dossiq half of D2 — migrating bezwaaradviescommissie onto decidiq's GovernanceBodywith the measurement that produced it, so the shape is agreed before anyone starts.

Why this is a plan and not an implementation

D2 was scoped as "move the schema". It could not be done that way. Measured 2026-08-24, decidiq's GovernanceBody could not represent the committee:

dossiq field decidiq before verdict
active the one field dossiq's live code reads and throws on
quorum (int) quorumRule (a method, e.g. majority) ❌ cannot express Awb 7:13's member count
jurisdiction ❌ missing
members[].external independenceStatus (different axis) ❌ missing
(writing at all) GET-only cross-app API ❌ no supported write path

decidiq#874 closed all five and is merged.

⛔ Still blocked

The tasks file says so explicitly: implementation waits until #874 is in development and deployed. Landing the plan is not starting the work.

Three risks, each already seen in this fleet

  • The roster is a fan-out, not a field copy. members[] is a list of uids on one object; decidiq models it as Person + Membership rows. Re-running must not mint duplicates — so the mapping is recorded before the memberships.
  • active is load-bearing. AdvisoryCommitteeService throws "Committee is archived and cannot accept new bezwaaren" on it. A migration that drops or defaults it starts routing objections to disbanded committees, and nothing errors.
  • The repair step needs runAsSystem(). An upgrade has no session, so without one OpenRegister refuses every create as Anonymous and the step reports a warning that does not fail the upgrade — exactly the defect found and fixed in decidiq the same day, where all 14 templates silently failed to migrate.

Docs only — no code, no schema, no behaviour change.

🤖 Generated with Claude Code

…ll blocked

D2 was planned as "move bezwaaradviescommissie to decidiq" and could not be done
that way: measured on 2026-08-24, decidiq's GovernanceBody could not represent
the committee at all — no `active` (the one field dossiq's live code reads and
throws on), no numeric `quorum` for Awb 7:13, no `jurisdiction`, no
`Membership.external` for 7:13(2), and a GET-only cross-app API, so nothing could
write a body even if the fields had existed.

decidiq#874 closed all five. This records the dossiq half, with the measurement
that produced it, so the shape is agreed before anyone starts.

⛔ EXPLICITLY BLOCKED, and the tasks say so: implementation waits until #874 is
in `development` AND deployed. Landing the plan now is not the same as starting.

Three risks are called out because each has already bitten this fleet:

  - the roster is a FAN-OUT, not a field copy — `members[]` is a list of uids on
    one object and decidiq models it as Person + Membership rows. Re-running must
    not mint duplicates, so the mapping is recorded BEFORE the memberships.
  - `active` is load-bearing. A migration that drops or defaults it starts
    routing objections to disbanded committees, and nothing errors.
  - the repair step needs `runAsSystem()`. An upgrade has no session, so without
    one OpenRegister refuses every create as 'Anonymous' and the step reports it
    as a warning that does not fail the upgrade — exactly the defect found and
    fixed in decidiq the same day.
@rubenvdlinde
rubenvdlinde requested a review from Rem-Dam as a code owner August 24, 2026 20:12
…he REST path

I had this wrong in the first draft, and the error was load-bearing: it named
decidiq#874's cross-app write path as how the migration would create a
governance body.

ADR-041 decides cross-app COMMANDS travel as typed `IEventDispatcher` events.
ADR-066 amended it for COLLECTION only — its own words keep the command rule and
keep gate-27 (`no-phantom-cross-app-rpc`) enforcing it. "Create a governance body
in decidiq" is a command, so the REST seam is the wrong door. It is a real and
correct seam, but for EXTERNAL callers; an in-process migration calling our own
instance over HTTP would also have no session to authenticate with.

The working example is already in this app: `ContractDecisionDelegationService`
commands decidiq by dispatching `DecisionRequestedEvent` with an
`externalReference` / `correlationId`, and the answer returns as
`DecisionConcludedEvent` carrying that correlation.

The consequence is that this change is blocked on MORE than it said. decidiq#874
delivered the schema half of the target; the command seam does not exist —
decidiq has no event/listener pair for creating a governance body, and writing
one is a prerequisite change in that repo.

Better to find this while the plan is a document than while it is a migration.
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/dossiq @ 74fb0c6

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue3-compile
test-l10n
format
check-schema-l10n
composer ✅ 106/106
npm ✅ 552/552
app:check-code ⏭️
info.xml
REUSE
PHPUnit
Newman ⏭️
Playwright
Hydra gates

Quality workflow — 2026-08-24 20:25 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/dossiq @ bcad19d

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue3-compile
test-l10n
format
check-schema-l10n
composer ✅ 106/106
npm ✅ 552/552
app:check-code ⏭️
info.xml
REUSE
PHPUnit
Newman ⏭️
Playwright
Hydra gates

Quality workflow — 2026-08-24 21:48 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 04fc2d5 into development Aug 24, 2026
47 checks passed
@rubenvdlinde
rubenvdlinde deleted the docs/migrate-committees-plan branch August 24, 2026 21:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant