coleam00/Archon · error

Binding value '$ .output' references node ' ', but no 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.

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.

Appendix: 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)