Summary
After five unresolved review failures, an SDD wave enters adjudication-required. The workflow documentation correctly stops automatic retries and asks for human adjudication, but the CLI has no command that can persist or apply that adjudication.
This makes the current execution-plan revision irrecoverable through the documented workflow. The only available workaround is to create a new plan revision and replay every wave receipt, which discards the current revision as active evidence rather than adjudicating its repair chain.
Environment
- spec-superflow:
1.0.0
- workflow: Full / SDD
Reproduction
- Create an SDD execution plan with a wave and at least one dependent wave.
- Record five valid, continuous failed review receipts for the first wave.
- Run
ssf execution show <change-dir> --json.
The wave reports:
{
"eligible": false,
"retryable": false,
"repair": {
"status": "adjudication-required",
"failure_count": 5
}
}
- Produce a valid focused repair and independent PASS review.
- Attempt to record it:
ssf execution review <change-dir> \
--wave <wave-id> \
--base <previous-head> \
--head <repair-head> \
--report .superpowers/sdd/reviews/<report>.md \
--verdict pass
The CLI rejects it with:
Wave '<wave-id>' requires adjudication before another review can be recorded
- Inspect
ssf --help / ssf execution --help: there is no execution adjudicate command or equivalent state transition.
Actual behavior
- The state machine deliberately opens an adjudication circuit breaker.
- The skill instructs the controller to request human adjudication.
- No supported CLI operation can record the human decision or allow a bounded follow-up review.
- Direct repair-state editing is explicitly forbidden.
- Dependent waves remain blocked indefinitely for that plan revision.
Expected behavior
The CLI should provide an auditable human-adjudication operation that preserves the five failed receipts and repair history, and allows a narrowly bounded next action without creating a new execution-plan revision.
For example:
ssf execution adjudicate <change-dir> \
--wave <wave-id> \
--decision allow-review \
--confirm \
--reason "<human decision and evidence>"
The exact command name is negotiable; the important requirement is a supported, persisted transition out of the circuit-breaker state.
Suggested semantics
- Accept the command only when the current plan is valid/current and the selected wave is
adjudication-required.
- Persist an adjudication receipt bound to the plan hash/revision, wave ID, five failure receipts or repair-state identity, decision, reason, timestamp, and confirmation.
- Do not synthesize a PASS receipt or unblock dependent waves.
- Authorize exactly one focused review attempt:
- PASS resolves the repair chain and unblocks dependents.
- FAIL returns the wave to
adjudication-required.
- Expose the adjudication receipt and remaining authorization in
execution show --json.
- Continue forbidding direct edits to receipt and repair-state files.
Acceptance tests
- Five failures still produce
adjudication-required and reject another review before adjudication.
- Adjudication authorizes exactly one continuous review range.
- A PASS review preserves all five failures plus the adjudication receipt, marks the repair chain resolved, and unblocks dependents.
- A FAIL review preserves the new failure and returns to
adjudication-required.
- Invalid/stale plan hashes, wrong waves, missing confirmation/reason, and replayed adjudication commands are rejected.
- CLI help and build-executor guidance document the recovery path.
Why plan revision is not an equivalent resolution
execution revise is a useful emergency workaround, but it creates a new plan revision and invalidates all current wave receipts. It forces a complete verification/review replay even when the human decision concerns only one repaired wave. That is replanning, not adjudication, and loses the intended continuity of the current repair chain.
Relevant implementation points
scripts/lib/execution-plan.mjs sets adjudication-required after MAX_REPAIR_FAILURES = 5.
recordReview refuses every subsequent review while that status is active.
skills/build-executor/SKILL.md requires human adjudication after the fifth unresolved receipt.
- Current tests verify circuit-breaker entry and dependent-wave blocking, but there is no recovery-path test.
Summary
After five unresolved review failures, an SDD wave enters
adjudication-required. The workflow documentation correctly stops automatic retries and asks for human adjudication, but the CLI has no command that can persist or apply that adjudication.This makes the current execution-plan revision irrecoverable through the documented workflow. The only available workaround is to create a new plan revision and replay every wave receipt, which discards the current revision as active evidence rather than adjudicating its repair chain.
Environment
1.0.0Reproduction
ssf execution show <change-dir> --json.The wave reports:
{ "eligible": false, "retryable": false, "repair": { "status": "adjudication-required", "failure_count": 5 } }The CLI rejects it with:
ssf --help/ssf execution --help: there is noexecution adjudicatecommand or equivalent state transition.Actual behavior
Expected behavior
The CLI should provide an auditable human-adjudication operation that preserves the five failed receipts and repair history, and allows a narrowly bounded next action without creating a new execution-plan revision.
For example:
The exact command name is negotiable; the important requirement is a supported, persisted transition out of the circuit-breaker state.
Suggested semantics
adjudication-required.adjudication-required.execution show --json.Acceptance tests
adjudication-requiredand reject another review before adjudication.adjudication-required.Why plan revision is not an equivalent resolution
execution reviseis a useful emergency workaround, but it creates a new plan revision and invalidates all current wave receipts. It forces a complete verification/review replay even when the human decision concerns only one repaired wave. That is replanning, not adjudication, and loses the intended continuity of the current repair chain.Relevant implementation points
scripts/lib/execution-plan.mjssetsadjudication-requiredafterMAX_REPAIR_FAILURES = 5.recordReviewrefuses every subsequent review while that status is active.skills/build-executor/SKILL.mdrequires human adjudication after the fifth unresolved receipt.