coleam00/Archon · error
workflow.parent_resume_nothing_to_resume
workflow.parent_resume_nothing_to_resume
Error message
the parent had no resumable state
What it means
When a child workflow run changes state and the executor tries to resume its parent, it hydrates the parent's resumable state. A parent paused on a child_workflow gate is always resumable by invariant, so a null hydration result means the parent's pause record is missing or inconsistent. The executor logs a warning, notifies the operator the run is stuck, and abandons the resume rather than proceeding with undefined state.
Source
Thrown at packages/workflows/src/executor.ts:1717
// hydrate's last step; a lost CAS throws WorkflowNotResumableError instead) —
// the parent stays 'paused' and manually resumable, so log and stand down.
if (err instanceof Error && err.name === 'WorkflowNotResumableError') {
// Benign race: a concurrent (manual or duplicate) resume won the CAS and
// now owns the parent. Not an error — no user-facing message (it IS resuming).
getLog().info(
{ parentRunId, childRunId: childRun.id },
'workflow.parent_auto_resume_lost_race'
);
} else {
getLog().error({ err: err as Error, parentRunId }, 'workflow.parent_resume_hydrate_failed');
await notifyStuck('preparing the parent for resume failed');
}
return;
}
if (!hydrated) {
// A parent paused on a child_workflow gate is always resumable (see the
// child_workflow branch in hydrateResumableRun), so null here is unexpected.
getLog().warn({ parentRunId }, 'workflow.parent_resume_nothing_to_resume');
await notifyStuck('the parent had no resumable state');
return;
}
getLog().info(
{ parentRunId, childRunId: childRun.id, childStatus: childRun.status },
'workflow.parent_auto_resume_started'
);
try {
await executeWorkflow(
deps,
platform,
conversationId,
parentCwd,
parentWorkflow,
parent.user_message ?? '',
conversationDbId,
{View on GitHub (pinned to 0773b97458)
Solutions
- Inspect the parent run's persisted pause/resumable state; if the child_workflow pause record was lost, restore it from backup or recreate the pause state.
- Resume the parent directly with `archon workflow resume <parentRunId>` so it re-hydrates its own gate state instead of relying on the child-triggered path.
- If the parent is genuinely inconsistent, fail or cancel it explicitly and start a fresh run of the workflow.
- Check for pruning jobs or interrupted writes that could have removed the record; report persistent cases with run IDs since null here should be impossible.
Example fix
# before: resuming the child in isolation (parent has no state) $ archon workflow resume <childRunId> # after: resume the parent whose gate state is intact (or restart it) $ archon workflow resume <parentRunId>
Defensive patterns
Strategy: validation
Validate before calling
// Confirm the parent actually has resumable state before relying on a child-triggered resume:
const status = await store.getWorkflowRunStatus(parentRunId);
if (status !== 'paused' && status !== 'waiting') {
throw new Error(`Parent ${parentRunId} has no resumable pause state (${status})`);
} Type guard
function isResumableParent(status: string | null): status is 'paused' | 'waiting' {
return status === 'paused' || status === 'waiting';
} Prevention
- Never delete or prune a parent run's pause records while its child runs are still active.
- Resume parents via the CLI rather than mutating run state directly in the store.
- Treat a 'nothing to resume' warning as a data-integrity bug: capture run IDs and investigate, don't just restart blindly.
- Keep the parent's lifecycle consistent (cancel/fail it properly) before resuming orphaned children.
When it happens
Trigger: resumeParent flow (executor.ts:1717): a child run's completion/pause triggers parent resume, and hydrateResumableRun returns hydrated === null for the parent — e.g. the parent's child_workflow gate pause record was deleted, pruned, overwritten by an out-of-band resume/cancel, or never persisted due to an interrupted write.
Common situations: Manual DB cleanup or retention pruning that removed the parent's pause metadata; resuming a child whose parent was already cancelled/failed with its pause state cleared; a crash between pausing the parent and writing its resumable record; store state shape changed by an upgrade.
Related errors
- workflow.parent_resume_no_working_path
- Cannot resume workflow '${workflowName}': failed to load pri
- Cannot resume: the prior run for '${workflowName}' has no co
- Workflow run '${resolvedId}' has no working path recorded. C
- Failed to resume workflow '${run.workflow_name}': ${err.mess
AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01).
Data as JSON: /api/errors/8729106c43a946a1.
Report an issue: GitHub.