/** A queued parent wake can be suppressed while its child still runs. This is * not a provider failure: admission never started. Keep it in the evidence. */ export function isBlockedUnstartedWake(run: Record) { return run.status === "cancelled" && run.errorCode === "issue_dependencies_blocked" && run.startedAt === null; } /** The dispatch gate retired an obsolete assignment before any provider work. */ export function isReassignedUnstartedWake(run: { status?: unknown; errorCode?: unknown; startedAt?: unknown; nativeIssueId?: unknown; resultJson?: Record; }) { return run.status === "cancelled" && run.errorCode === "issue_assignee_changed" && run.startedAt === null && run.nativeIssueId == null && run.resultJson?.stopReason === "issue_assignee_changed" && run.resultJson.timeoutSource === "stale_queued_run_gate" && run.resultJson.timeoutFired === false; } /** A terminal issue may make a queued wake obsolete before provider admission. */ export function isTerminalUnstartedWake( run: Record, tasks: Array<{ id: string; status?: unknown }>, ) { const context = run.contextSnapshot; const issueId = context && typeof context === "object" && "issueId" in context ? context.issueId : undefined; return run.status === "cancelled" && run.errorCode === "issue_terminal_status" && run.startedAt === null && tasks.some(task => task.id === issueId && ["done", "cancelled"].includes(String(task.status)), ); }