Skip to content

Canceled blockers are treated as satisfied dependencies and can start dependent work without prerequisite output #1429

Description

@moses4wen

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:

  1. Dependency no longer required → continuing may be correct.
  2. 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:

  1. Cyrus parks C while A is unresolved.
  2. A is moved to Canceled rather than Done.
  3. Cyrus logs that blockers are resolved and starts C a few seconds later.
  4. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions