spec: process templates become policies on the OpenRegister decision lifecycle (gate 23) - #1284
Merged
rubenvdlinde merged 3 commits intoSep 11, 2026
Conversation
… decision lifecycle Proposes the migration that clears hydra gate 23 (or-abstraction, rule 5) honestly: StateMachineValidator is deleted because templates stop having graphs, not renamed. The Decision lifecycle keeps one map, the x-openregister-lifecycle block OpenRegister runs, and one OpenRegister lifecycle guard enforces the body's policy on every write, including a write straight to the object API. Design records the OpenRegister guard mechanics as measured, the repair step for stored template graphs, the honest guard vocabulary, the fate of DecisionTransitionGuard, and two open product questions (Q1 domain resolution, Q2 chair-only scope) that gate the guard PR. Refs #1277
…emplates-as-lifecycle-policies
31 tasks
Contributor
Quality Report — ConductionNL/decidiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-nav-ceiling | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 104/104 | |||
| npm | ✅ | ✅ 545/545 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-09-11 07:55 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.
What
An OpenSpec change (proposal, design, two spec deltas, tasks) for the migration
that clears hydra gate 23 (
or-abstraction, rule 5consume-or-workflow-engine-fleet-wide) honestly. No code changes here.A process template stops drawing its own state machine. The Decision lifecycle
keeps one map, the
x-openregister-lifecycleblock OpenRegister runs, and atemplate becomes a policy on that map: per action who may take the step and
what must be true first, template-wide quorum and decide-without-vote.
StateMachineValidatoris deleted because templates no longer have graphs, notrenamed.
Why
Gate 23 turns blocking on 2026-10-03 00:00 UTC and its only decidiq finding
is
lib/Service/StateMachineValidator.php. Measured in this clone, forced blockmode:
or_abstraction_findings=1 app_id=decidiq mode=BLOCK, exit 1.Reading the code behind the finding turned up four claims the code does not
keep, all written up in the proposal:
DecisionTransitionGuard::TRANSITIONSand the schemaannotation), pinned together by a test, neither derived from the other.
quorum_met,all_amendments_resolved,legal_review_complete) are validated and enforced nowhere, while the schemasays "Guard tokens enforced before this transition".
object API bypasses that gate, exactly as it already bypasses the chair-only
and quorum gates."
Verification
openspec validate process-templates-as-lifecycle-policies --strict: valid.development4bd08beand measured live on:8080 against the
decisionschema (id 978): a rawPUTfromdrafttoenactedanswers 422lifecycle-invalid-transition,drafttoproposedanswers 200. So OpenRegister already enforces the graph on theobject API, and a
requiresguard runs in the same listener(
LifecycleValidationListener.php:227).development(1 finding): this PR ships no code. The design states the measurement the
first code PR must show.
vendor/bin/hydra-gatesat full scope: 2 failures, bothajv not resolvablein this checkout (gate-22, gate-53), an environmentmiss, not a finding about this diff. CI installs node deps and is the
authority.
Open product questions
The design carries two, each with a recommendation, and the guard PR waits for
answers:
DecisionContextResolver::resolveDomain()reads
decision.domainandmeeting.domain; no schema declares either, soevery decision resolves to the permissive
operationspolicy today.GovernanceBody.domainholds the real value and nobody reads it for this.opening or closing the vote in a chair-only body, or on decidiq's decision
endpoint only, which keeps today's bypass.
Refs #1277
🤖 Generated with Claude Code