coleam00/Archon · warning
node_capture_response_deprecated
node_capture_response_deprecated
Error message
Node '${id}': 'approval.capture_response' is deprecated. Gate output is now always structured as {decision, text} — read '$${id}.output.text' downstream instead. This field is ignored. What it means
Gate (approval) nodes once supported an author-set `capture_response` flag; gate output is now always structured as {decision, text}, so the flag has no effect. The loader warns that the key is deprecated and ignored, and points authors to read `$<gateId>.output.text` downstream instead.
Source
Thrown at packages/workflows/src/loader.ts:450
// 'with:' handling for include nodes.
if (isIncludeDirective(node)) return;
if (isGateNode(node) && raw !== null && typeof raw === 'object') {
const rawApproval = (raw as Record<string, unknown>).approval;
if (rawApproval !== null && typeof rawApproval === 'object') {
const approvalObj = rawApproval as Record<string, unknown>;
// capture_response is genuinely ignored ONLY once the gate has also
// opted into the new mechanism by authoring 'decisions:' (GateNode.
// decisionsAuthored) — combined with 'on_reject', or on a bare gate with
// no 'decisions:' authored, it still fully controls whether the
// reviewer's comment becomes the node's output, exactly as before this
// PR. Warning unconditionally would be false in those cases.
if (approvalObj.capture_response !== undefined && node.decisionsAuthored) {
const message =
`Node '${id}': 'approval.capture_response' is deprecated. Gate output is now ` +
`always structured as {decision, text} — read '$${id}.output.text' downstream ` +
'instead. This field is ignored.';
warnings.push(message);
getLog().warn({ id, warning: message }, 'node_capture_response_deprecated');
}
if (approvalObj.on_reject !== undefined) {
const message =
`Node '${id}': 'approval.on_reject' is deprecated. Declare 'approval.decisions' ` +
`and wire a rework node with "when: \\"$${id}.output.decision == 'reject'\\"" ` +
'instead (loop it with loop_group if it should iterate). This gate keeps running ' +
'via the legacy mechanism until migrated.';
warnings.push(message);
getLog().warn({ id, warning: message }, 'node_on_reject_deprecated');
}
}
}
const interactiveLoop =
(isLoopNode(node) && node.loop.interactive === true) ||
(isLoopGroupNode(node) && node.loop_group.interactive === true);
if (interactiveLoop) {
const message =
`Node '${id}': node-level loop 'interactive:' is deprecated. A future release ` +View on GitHub (pinned to 0773b97458)
Solutions
- Delete `capture_response` from the approval node — behavior is unchanged because the field is ignored.
- Update downstream `when:` conditions and templates to read `$<gateId>.output.text` (and `.decision`).
- Lint existing workflows after upgrading to find every deprecated gate field.
- Update internal templates and docs to the structured gate-output contract.
Example fix
# before approval: prompt: "Approve?" capture_response: true # after approval: prompt: "Approve?" # downstream reads: $approve.output.text
Defensive patterns
Strategy: validation
Validate before calling
// Reject deprecated gate fields before loading:
for (const node of workflow.nodes) {
if (node.type === 'approval' && 'capture_response' in (node.approval ?? {})) {
throw new Error(`Node '${node.id}': remove deprecated approval.capture_response; read $${node.id}.output.text downstream`);
}
} Type guard
function usesCaptureResponse(node: { type: string; approval?: Record<string, unknown> }): boolean {
return node.type === 'approval' && node.approval?.capture_response !== undefined;
} Prevention
- Delete capture_response whenever you touch an approval node; text capture is automatic.
- Read gate results via the structured {decision, text} contract in all downstream when: conditions.
- Run the workflow linter after upgrades to catch deprecated fields.
- Update team templates so new workflows never reintroduce the field.
When it happens
Trigger: parseWorkflow → parseDagNode → collectGateAndLoopDeprecationWarnings on a workflow whose approval node sets `approval.capture_response` (with authored decisions); fires at every parse of the file on a current Archon version (loader.ts:450).
Common situations: Older workflow YAML carried forward past the structured gate-output release; templates predating the {decision, text} contract; authors re-adding capture_response expecting text capture to require it.
Related errors
- node_on_reject_deprecated
- Cannot reject run with status '${run.status}'. Only paused r
- Run ${run.id} is paused waiting on sub-run ${attention.child
- unreadableGateMessage(run, attention, approval) — one of: "R
- Workflow run ${run.id} was already ${String(approval.resolve
AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01).
Data as JSON: /api/errors/7145c60c04e5a819.
Report an issue: GitHub.