Summary
Current blocked-by handling treats a blocker in Linear's canceled state as resolved, so a parked dependent session can wake and start even when the canceled blocker never produced the prerequisite work.
This appears to be intentional in the original dependency-deferral design (#1004), which says parked sessions wake when blockers complete or are canceled. The concern is that canceled is ambiguous in coding workflows:
- Dependency no longer required → continuing may be correct.
- Required work was abandoned / failed / superseded without replacement → continuing is unsafe because the downstream task may start without required code or artifacts.
Current behavior
On current main, checkBlockedByDependencies() treats both completed and canceled as resolved states:
if (
state &&
state.type !== "completed" &&
state.type !== "canceled"
) {
unresolvedBlockers.push(...)
}
The state-change wake path likewise reacts to both completed and canceled transitions.
Reproduction
Using three Linear issues:
- A
- B
- C, with
C blocked by A
Observed live behavior:
- Cyrus parks C while A is unresolved.
- A is moved to
Canceled rather than Done.
- Cyrus logs that blockers are resolved and starts C a few seconds later.
- A never produced the prerequisite implementation that C was expected to depend on.
Why this matters
For autonomous coding workflows, a canceled prerequisite is not equivalent to a successfully satisfied dependency. Starting downstream work silently can produce incorrect execution against an invalid plan or missing code state.
Suggested direction
I am not proposing that canceled must always remain blocked. A safer semantic could be:
completed → dependency satisfied → wake automatically
canceled → dependency outcome is ambiguous → require explicit re-evaluation / policy before waking
If the intended Cyrus semantics are that cancellation always means the dependency relation is no longer required, it would be useful to make that contract explicit. Otherwise I would be happy to contribute a minimal fix and regression tests once the preferred behavior is confirmed.
Related
Summary
Current blocked-by handling treats a blocker in Linear's
canceledstate as resolved, so a parked dependent session can wake and start even when the canceled blocker never produced the prerequisite work.This appears to be intentional in the original dependency-deferral design (#1004), which says parked sessions wake when blockers complete or are canceled. The concern is that
canceledis ambiguous in coding workflows:Current behavior
On current
main,checkBlockedByDependencies()treats bothcompletedandcanceledas resolved states:The state-change wake path likewise reacts to both
completedandcanceledtransitions.Reproduction
Using three Linear issues:
C blocked by AObserved live behavior:
Canceledrather thanDone.Why this matters
For autonomous coding workflows, a canceled prerequisite is not equivalent to a successfully satisfied dependency. Starting downstream work silently can produce incorrect execution against an invalid plan or missing code state.
Suggested direction
I am not proposing that
canceledmust always remain blocked. A safer semantic could be:completed→ dependency satisfied → wake automaticallycanceled→ dependency outcome is ambiguous → require explicit re-evaluation / policy before wakingIf the intended Cyrus semantics are that cancellation always means the dependency relation is no longer required, it would be useful to make that contract explicit. Otherwise I would be happy to contribute a minimal fix and regression tests once the preferred behavior is confirmed.
Related
packages/edge-worker/src/EdgeWorker.ts(checkBlockedByDependenciesand issue-state wake handling)