Skip to content

fix(dag): complete workflows at rejected review checkpoints instead of failing them - #300

Merged
LeXwDeX merged 1 commit into
devfrom
fix/reject-reachability
Aug 16, 2026
Merged

fix(dag): complete workflows at rejected review checkpoints instead of failing them#300
LeXwDeX merged 1 commit into
devfrom
fix/reject-reachability

Conversation

@LeXwDeX

Copy link
Copy Markdown
Owner

Closes#294

Summary

A REJECT verdict terminalized the workflow as failed — and failed workflows are immutable. That made two of the four Verdict Disposal Contract options physically unreachable (additive extend reopen requires completed; replan rejects terminal workflows), so post-checkpoint correction waves could never happen. The harness also contradicted its own policy: node-level rule says a REJECT gate is a completed node, while the workflow level failed the graph for it.

The reopen mechanism was explicitly designed for this shape (its rationale names skipped dependents as non-executed, so the graph "effectively ended at the checkpoint") — it was simply unreachable.

Change

  • The scheduling loop completes the workflow at an unresolved-review checkpoint instead of failing it; the REJECT shape (skipped dependents, reporting leaf) is exactly what reopen-extend picks up.
  • dag.complete gains an explicit skipReviewGate option: explicit completion shortcuts (tool/HTTP) keep the review gate; only the natural loop path passes the bypass.
  • workflow(action="status") surfaces unresolved_reviews explicitly instead of burying the verdict in a terminal reason string.

Verification

  • Wake-integration expectations rewritten to the new contract (deep + standard modes: REJECT shape settles completed, review/audit nodes skipped, parent woken with the completed terminal wake).
  • Explicit-completion rejection tests unchanged and green (dag.complete default still guarded).
  • 543 DAG/tool tests green; bun typecheck clean from packages/opencode.

Note

Pairs conceptually with #299 (parallel writers) and the disposal wording in the docs/disposal-classifier branch; independent in code, safe to merge in any order.

Sign up for freeto 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

@LeXwDeX