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

  1. Delete `capture_response` from the approval node — behavior is unchanged because the field is ignored.
  2. Update downstream `when:` conditions and templates to read `$<gateId>.output.text` (and `.decision`).
  3. Lint existing workflows after upgrading to find every deprecated gate field.
  4. 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

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


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