Files
boocode/openspec/changes/archived/2026-06-07-hybrid-workflow-engine/specs/human-approval/spec.md
indifferentketchup c935687725 chore(openspec): drop 9 superseded proposals + 11 stub archive files
Drop 9 batch proposals that are superseded by the boocode-lift-analysis
(boocontext-audit, conductor upgrades, self-healing/verify-gate skills):
add-3tier-memory, import-llm-evaluator, import-pregel-engine, plugin-platform,
conductor-evolution, code-intelligence-upgrade, dev-workflow, ui-overhaul,
agent-reliability.

Delete 11 stub archive files (49-66B each, 'Status: Shipped. Archived.' only)
that provide zero documentation value over the existing CHANGELOG.md + git tags.
2026-06-07 22:15:38 +00:00

1.7 KiB

ADDED Requirements

Requirement: Approval gate pauses execution

An ApprovalNode SHALL pause workflow execution and send a message for human review. Execution SHALL only continue when the user approves or rejects.

Scenario: Approval pauses workflow

  • WHEN an approval node executes
  • THEN the workflow status SHALL transition to paused
  • THEN a message SHALL be sent with the approval message text

Scenario: Approve resumes execution

  • WHEN the user approves a paused workflow
  • THEN the workflow SHALL resume with the next node in the DAG

Scenario: Reject fails the node

  • WHEN the user rejects a paused workflow
  • THEN the node SHALL be marked as failed
  • THEN downstream nodes SHALL evaluate their trigger rules

Requirement: Capture response from approval

An approval node MAY support capture_response: true to store the user's comment as $nodeId.output.

Scenario: Approval with captured response

  • WHEN an approval node has capture_response: true and the user provides a comment during approval
  • THEN the comment SHALL be stored as the node's output, available via $nodeId.output

Requirement: On-reject retry

An approval node MAY specify on_reject with a prompt and optional max_attempts for re-presenting after rejection.

Scenario: Reject with retry prompt

  • WHEN an approval node has on_reject: { prompt: "..." } and the user rejects
  • THEN the on_reject prompt SHALL be executed (typically the AI revises based on feedback)
  • THEN the approval gate SHALL be re-presented to the user

Scenario: Max attempts exceeded

  • WHEN the number of rejections exceeds on_reject.max_attempts
  • THEN the node SHALL fail permanently