coleam00/Archon · error

Binding value '$${wholeRef.nodeId}.output' references node '

Error message

Binding value '$${wholeRef.nodeId}.output' references node '${wholeRef.nodeId}', but no node with that id has produced output at this point — the id is either unknown (a typo) or belongs to a node that has not run before this reference.${hint} Fix the id, or add '${wholeRef.nodeId}' to depends_on.

What it means

In strict whole-ref mode, resolveWorkflowValue throws when a string binding value '$node.output' (whole output, no field) points at a nodeId absent from nodeOutputs. Unlike the field case (445), the strict flag is set by the binding resolver (resolveNodeBindings), so this fires specifically for node-local with: bindings. The intent is to fail loudly rather than silently substitute an empty string through the legacy template path.

Source

Thrown at packages/workflows/src/dag-executor.ts:399

  const wholeRef = parseWholeOutputRef(rawValue);
  if (wholeRef !== undefined) {
    const producer = ctx.nodeOutputs.get(wholeRef.nodeId);
    if (producer !== undefined) {
      return wholeRefLogicalValue(producer, wholeRef.nodeId, wholeRef.field);
    }
    if (wholeRef.field !== undefined) {
      throw new OutputRefError(
        wholeRef.nodeId,
        wholeRef.field,
        'unknown-node',
        similarNodeIds(wholeRef.nodeId, ctx.nodeOutputs.keys())
      );
    }
    if (strictWholeRef) {
      const candidates = similarNodeIds(wholeRef.nodeId, ctx.nodeOutputs.keys());
      const hint =
        candidates.length > 0 ? ` Did you mean: ${candidates.map(c => `'${c}'`).join(', ')}?` : '';
      throw new Error(
        `Binding value '$${wholeRef.nodeId}.output' references node '${wholeRef.nodeId}', ` +
          'but no node with that id has produced output at this point — the id is either ' +
          'unknown (a typo) or belongs to a node that has not run before this reference.' +
          `${hint} Fix the id, or add '${wholeRef.nodeId}' to depends_on.`
      );
    }
    // Lenient legacy surface: fall through to the template path, which resolves the
    // unknown whole-text ref to '' with a warn — byte-identical to pre-#2637.
  }
  const { prompt: substituted } = substituteWorkflowVariables(
    rawValue,
    ctx.workflowRun.id,
    ctx.workflowRun.user_message,
    ctx.artifactsDir,
    ctx.baseBranch,
    ctx.docsDir,
    ctx.issueContext,
    undefined,

View on GitHub (pinned to 0773b97458)

Solutions

  1. Correct the node id (use the 'Did you mean' candidates from the hint).
  2. Add the producer to depends_on so it runs before the consumer resolves bindings.
  3. Use the binding directive form with if_skipped when the producer may legitimately not run.

Example fix

// before
with:
  text: '$analizer.output'
// after
with:
  text:
    from: '$analyzer.output'
    if_skipped: ''
depends_on: [analyzer]
Defensive patterns

Strategy: validation

Validate before calling

function validateWholeRefs(withMap: Record<string, unknown>, knownNodeIds: Set<string>): string[] {
  const errs: string[] = [];
  for (const [k, v] of Object.entries(withMap)) {
    if (typeof v === 'string') {
      const m = /^\$([A-Za-z0-9_-]+)\.output$/.exec(v);
      if (m && !knownNodeIds.has(m[1])) errs.push(`with.${k}: unknown node '${m[1]}'`);
    }
  }
  return errs;
}

Try / catch

try {
  runWorkflow(wf);
} catch (e) {
  if (e instanceof Error && e.message.includes("has produced output at this point")) {
    console.error('Whole-output ref targets a missing/unrun node:', e.message);
  } else throw e;
}

Prevention

When it happens

Trigger: A with: entry whose string is exactly '$producer.output' while the producer has no recorded output — unknown id, producer not in depends_on, or producer not yet executed when bindings resolve. Bare-string refs outside bindings go through the lenient legacy path and do not throw this.

Common situations: Copy-pasting a whole-output ref after renaming the producer; missing depends_on edge in hand-written or generated YAML; referencing a node in a parallel branch that is scheduled later; dry-run simulations with an incomplete nodeOutputs map.

Related errors


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