paperclipai/paperclip · warning

This task is paused by a parent task. Restart it from the pa

Error message

This task is paused by a parent task. Restart it from the pause root.

What it means

toggleTaskPause in SidebarRecentTasks throws this fixed message when the task's pause state has an activePauseHold created by a parent task. A child task cannot be restarted directly; the user must restart at the pause root (the parent that imposed the hold).

Source

Thrown at ui/src/components/SidebarRecentTasks.tsx:207

        if (restartIssue.assigneeAgentId) {
          const wakeResult = await agentsApi.wakeup(
            restartIssue.assigneeAgentId,
            {
              source: "assignment",
              triggerDetail: "manual",
              reason: "recent_task_restart",
              payload: { issueId: restartIssue.id },
            },
            restartIssue.companyId,
          );
          if (!("id" in wakeResult)) {
            throw new Error(wakeResult.message ?? "The assignee wake was skipped.");
          }
        }
        setRestartWakeRetryPending(restartRetryStorageKey, entry.id, false);
        toastActions?.pushToast({ title: "Task restarted", tone: "success" });
      } else if (state.activePauseHold) {
        throw new Error("This task is paused by a parent task. Restart it from the pause root.");
      } else if (readRestartWakeRetryIssueIds(restartRetryStorageKey).has(entry.id)) {
        const restartIssue = await issuesApi.get(entry.id);
        if (restartIssue.assigneeAgentId) {
          const wakeResult = await agentsApi.wakeup(
            restartIssue.assigneeAgentId,
            {
              source: "assignment",
              triggerDetail: "manual",
              reason: "recent_task_restart_retry",
              payload: { issueId: restartIssue.id },
            },
            restartIssue.companyId,
          );
          if (!("id" in wakeResult)) {
            throw new Error(wakeResult.message ?? "The assignee wake was skipped.");
          }
        }
        setRestartWakeRetryPending(restartRetryStorageKey, entry.id, false);

View on GitHub (pinned to 01ad858492)

Solutions

  1. Navigate to the parent/pause-root task and restart it there
  2. Clear the parent's tree hold before restarting the child
  3. Update the sidebar to offer 'Go to pause root' instead of restart for held children

Example fix

// before
throw new Error("This task is paused by a parent task. Restart it from the pause root.");
// after
if (state.activePauseHold) {
  toastActions?.pushToast({ title: "Paused by parent", description: "Restart it from the pause root.", tone: "warning" });
  return;
}
Defensive patterns

Strategy: validation

Validate before calling

if (state.activePauseHold) { showToast('Restart from pause root'); return; }

Type guard

function isChildHold(s: { activePauseHold?: unknown }): boolean { return Boolean(s.activePauseHold); }

Try / catch

try { await toggleTaskPause(entry); } catch (e) { if (/pause root/.test(e.message)) navigateToTask(state.activePauseHold.rootIssueId); else throw e; }

Prevention

When it happens

Trigger: User clicks resume/restart on a recent task whose pause originates from a parent task's tree hold (state.activePauseHold set).

Common situations: Resuming a subtask of a paused epic from the sidebar, orchestrator-paused child tasks where only the root can be resumed, stale sidebar state showing a child as independently pausable.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10). Data as JSON: /api/errors/8ab83c478ea729aa. Report an issue: GitHub.