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
- Correct the node id (use the 'Did you mean' candidates from the hint).
- Add the producer to depends_on so it runs before the consumer resolves bindings.
- 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
- Use the binding directive form ({ from, if_skipped }) for refs on possibly-skipped branches.
- Ensure depends_on edges cover every $node.output reference.
- Never hand-build with: maps in code without a lint/validation pass.
- Run the dry-run simulator to catch ordering issues cheaply.
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
- '${ref}' references node '${nodeId}', but no node with that
- Node '${consumerId}' binding '${name}' reads '${directive.fr
- Node '${consumerId}' binding '${name}': an object value must
- Node '${consumerId}' binding '${name}': 'from' must be exact
- Cannot execute run '${detachedPreCreatedRun.id}': it belongs
AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01).
Data as JSON: /api/errors/78edd70af20fac51.
Report an issue: GitHub.