{"record":{"id":"7145c60c04e5a819","repo":"coleam00/Archon","slug":"node-capture-response-deprecated","errorCode":"node_capture_response_deprecated","errorMessage":"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.","messagePattern":"Node '(.+?)': 'approval\\.capture_response' is deprecated\\. Gate output is now always structured as (.+?) — read '\\$(.+?)\\.output\\.text' downstream instead\\. This field is ignored\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/workflows/src/loader.ts","lineNumber":450,"sourceCode":"  // 'with:' handling for include nodes.\n  if (isIncludeDirective(node)) return;\n  if (isGateNode(node) && raw !== null && typeof raw === 'object') {\n    const rawApproval = (raw as Record<string, unknown>).approval;\n    if (rawApproval !== null && typeof rawApproval === 'object') {\n      const approvalObj = rawApproval as Record<string, unknown>;\n      // capture_response is genuinely ignored ONLY once the gate has also\n      // opted into the new mechanism by authoring 'decisions:' (GateNode.\n      // decisionsAuthored) — combined with 'on_reject', or on a bare gate with\n      // no 'decisions:' authored, it still fully controls whether the\n      // reviewer's comment becomes the node's output, exactly as before this\n      // PR. Warning unconditionally would be false in those cases.\n      if (approvalObj.capture_response !== undefined && node.decisionsAuthored) {\n        const message =\n          `Node '${id}': 'approval.capture_response' is deprecated. Gate output is now ` +\n          `always structured as {decision, text} — read '$${id}.output.text' downstream ` +\n          'instead. This field is ignored.';\n        warnings.push(message);\n        getLog().warn({ id, warning: message }, 'node_capture_response_deprecated');\n      }\n      if (approvalObj.on_reject !== undefined) {\n        const message =\n          `Node '${id}': 'approval.on_reject' is deprecated. Declare 'approval.decisions' ` +\n          `and wire a rework node with \"when: \\\\\"$${id}.output.decision == 'reject'\\\\\"\" ` +\n          'instead (loop it with loop_group if it should iterate). This gate keeps running ' +\n          'via the legacy mechanism until migrated.';\n        warnings.push(message);\n        getLog().warn({ id, warning: message }, 'node_on_reject_deprecated');\n      }\n    }\n  }\n  const interactiveLoop =\n    (isLoopNode(node) && node.loop.interactive === true) ||\n    (isLoopGroupNode(node) && node.loop_group.interactive === true);\n  if (interactiveLoop) {\n    const message =\n      `Node '${id}': node-level loop 'interactive:' is deprecated. A future release ` +","sourceCodeStart":432,"sourceCodeEnd":468,"githubUrl":"https://github.com/coleam00/Archon/blob/0773b9745896ef0612e709c80845a0f7db315b19/packages/workflows/src/loader.ts#L432-L468","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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."],"exampleFix":"# before\napproval:\n  prompt: \"Approve?\"\n  capture_response: true\n# after\napproval:\n  prompt: \"Approve?\"\n# downstream reads: $approve.output.text","handlingStrategy":"validation","validationCode":"// Reject deprecated gate fields before loading:\nfor (const node of workflow.nodes) {\n  if (node.type === 'approval' && 'capture_response' in (node.approval ?? {})) {\n    throw new Error(`Node '${node.id}': remove deprecated approval.capture_response; read $${node.id}.output.text downstream`);\n  }\n}","typeGuard":"function usesCaptureResponse(node: { type: string; approval?: Record<string, unknown> }): boolean {\n  return node.type === 'approval' && node.approval?.capture_response !== undefined;\n}","tryCatchPattern":null,"preventionTips":["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."],"tags":["workflow","deprecation","approval-gate","loader"],"backgroundTag":"deprecated-workflow-field","analyzedSha":"0773b9745896ef0612e709c80845a0f7db315b19","analyzedAt":"2026-09-01T02:28:07.064Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}