Receipts
A receipt is a durable artifact written when a task transitions. The canonical writers are scripts/goal-runner/receipt_writer.py and the adapter invoke methods.
Where receipts live
<worktree>/.goal-runner/receipts/
├── <task_id>-<session_id>.yaml # task receipt
├── <task_id>-<session_id>.stdout.log # captured stdout
├── <task_id>-<session_id>.stderr.log # captured stderr
└── …
Per-goal evidence lives under evidence/<GOAL_ID>/ and is Git-tracked.
Receipt schema
A task receipt contains:
adapter: <adapter-name>
role: <role>
task_id: <task-id>
session_id: <session-uuid>
outcome: PASS | FAIL | TIMEOUT | BLOCKED | REPAIR_REQUIRED
notes: <text>
created_at: <UTC ISO-8601>
An adapter result is the in-process object; the receipt is the persisted form. The orchestrator only treats a task as terminal when the adapter outcome is PASS and the corresponding task receipt has been verified.
Evidence
Evidence is any Git-tracked file in evidence/<GOAL_ID>/ that proves an assertion. Common evidence files:
canonical_sources_read.yaml— proves the role read the canonical sources.module_inventory.yaml— proves a planning inventory.gap_classification_report.md— proves a planning gap analysis.pr_<N>_review_evidence.json— proves a PR review was ingested.governed_commit_log.txt— proves the governed commit landed.ci_status_log.txt— proves CI passed.merge_approval_gate.yaml— proves the merge gate was materialized at the exact head.deployment_health.txt— proves the deployment succeeded.
Failure mode
A receipt with outcome: FAIL does not by itself block a goal — the orchestrator re-dispatches according to next_action_policy.on_fail. The REPAIR_REQUIRED outcome is special: it triggers the bounded repair path, which requires a separate REPAIR_GOAL and a separate gate.