docs(openspec): the committee migration, written down while it is still blocked - #1358
Merged
Merged
Conversation
…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.
…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.
Contributor
Quality Report — ConductionNL/dossiq @
|
| 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.
Contributor
Quality Report — ConductionNL/dossiq @
|
| 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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Records the dossiq half of D2 — migrating
bezwaaradviescommissieonto decidiq'sGovernanceBody— with 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
GovernanceBodycould not represent the committee:activequorum(int)quorumRule(a method, e.g.majority)jurisdictionmembers[].externalindependenceStatus(different axis)decidiq#874 closed all five and is merged.
⛔ Still blocked
The tasks file says so explicitly: implementation waits until #874 is in
developmentand deployed. Landing the plan is not starting the work.Three risks, each already seen in this fleet
members[]is a list of uids on one object; decidiq models it asPerson+Membershiprows. Re-running must not mint duplicates — so the mapping is recorded before the memberships.activeis load-bearing.AdvisoryCommitteeServicethrows "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.runAsSystem(). An upgrade has no session, so without one OpenRegister refuses every create asAnonymousand 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