coleam00/Archon · error · Error

Dry-run failed; missing stubs: ${blockingMissingStubs.join('

Error message

Dry-run failed; missing stubs: ${blockingMissingStubs.join(', ')} / Dry-run failed. See the trace for details.

What it means

A dry-run simulation failed. If any missing stubs actually blocked nodes (excluding ones an `all_done` join tolerated, per #2869), the error names them; otherwise it points the operator at the trace. Thrown after result.missingStubs is filtered against toleratedMissingStubs.

Source

Thrown at packages/cli/src/commands/workflow.ts:1809

      execCode: options.execCode,
      defaultStubs: options.defaultStubs,
      pauseAtGates: options.pauseAtGates,
      config: dryRunConfig,
      aiProfile: applyResolvedRunModelOverrides(dryRunBaseProfile, dryRunModelOverrides),
    });
    if (options.json) {
      await writeJsonLine(result);
    } else {
      await writeStdout(`${formatDryRunTrace(result)}\n`);
    }
    if (result.outcome === 'failed') {
      // Same filter `checkFixture` applies: a stub an `all_done` join tolerated
      // never blocked anything, so naming it as a cause of this failure points
      // the reader at the wrong node (#2869).
      const blockingMissingStubs = result.missingStubs.filter(
        nodeId => !result.toleratedMissingStubs.includes(nodeId)
      );
      throw new Error(
        blockingMissingStubs.length > 0
          ? `Dry-run failed; missing stubs: ${blockingMissingStubs.join(', ')}`
          : 'Dry-run failed. See the trace for details.'
      );
    }
    return;
  }

  // Validate mutually exclusive flags (defensive — cli.ts checks these for UX, but
  // workflowRunCommand is the authoritative boundary for programmatic callers)
  if (options.branchName !== undefined && options.noWorktree) {
    throw new Error(
      '--branch and --no-worktree are mutually exclusive.\n' +
        '  --branch creates an isolated worktree (safe).\n' +
        '  --no-worktree runs directly in your repo (no isolation).\n' +
        'Use one or the other.'
    );
  }

View on GitHub (pinned to 0773b97458)

Solutions

  1. Add stub entries for the named node ids and re-run the dry-run
  2. If no stubs are named, inspect the run trace to find the failing node and fix the workflow or inputs
  3. Check whether stub node ids still match the current YAML node names

Example fix

// before (stubs.yaml)
build: ok
// after (add the missing node)
build: ok
test: ok
Defensive patterns

Strategy: try-catch

Validate before calling

const stubs = parseStubsFile(stubsPath);
const nodeIds = workflow.nodes.map(n => n.id);
const missing = nodeIds.filter(id => !(id in stubs));
if (missing.length) console.warn('Nodes without stubs:', missing.join(', '));

Try / catch

try {
  await runDryRun(args);
} catch (e) {
  const m = String(e.message).match(/missing stubs: (.*)$/);
  if (m) {
    for (const nodeId of m[1].split(', ').map(s => s.trim())) addStub(nodeId);
    return runDryRun(args);
  }
  throw e; // no stubs named: inspect the trace
}

Prevention

When it happens

Trigger: `archon workflow run wf --dry-run --stubs ...` where the simulation reached a node with no stub value that was required to proceed.

Common situations: Incomplete stub file for a new node added to the workflow; stub node ids renamed after a YAML refactor; genuine workflow failure unrelated to stubs.

Related errors


AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01). Data as JSON: /api/errors/7013d758f727df05. Report an issue: GitHub.