Skip to content

SDD repair chain becomes unrecoverable because adjudication-required has no CLI resolution path #108

Description

@jack-lrx

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

  1. Create an SDD execution plan with a wave and at least one dependent wave.
  2. Record five valid, continuous failed review receipts for the first wave.
  3. Run ssf execution show <change-dir> --json.

The wave reports:

{
  "eligible": false,
  "retryable": false,
  "repair": {
    "status": "adjudication-required",
    "failure_count": 5
  }
}
  1. Produce a valid focused repair and independent PASS review.
  2. 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
  1. 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

  1. Accept the command only when the current plan is valid/current and the selected wave is adjudication-required.
  2. Persist an adjudication receipt bound to the plan hash/revision, wave ID, five failure receipts or repair-state identity, decision, reason, timestamp, and confirmation.
  3. Do not synthesize a PASS receipt or unblock dependent waves.
  4. Authorize exactly one focused review attempt:
    • PASS resolves the repair chain and unblocks dependents.
    • FAIL returns the wave to adjudication-required.
  5. Expose the adjudication receipt and remaining authorization in execution show --json.
  6. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions