Receipts and Evidence
Receipts and evidence are the durable artifacts ASF50 produces when work is performed. They are the answer to "did this actually happen?".
Receipts
A receipt is the in-process artifact produced by an adapter invocation:
AdapterResult(
status="PASS" | "FAIL" | "TIMEOUT" | "BLOCKED" | "REPAIR_REQUIRED",
exit_code=int,
receipt_path=Path,
stdout_path=Path,
stderr_path=Path,
notes={...},
)
The receipt writer (scripts/goal-runner/receipt_writer.py) persists the receipt to <worktree>/.goal-runner/receipts/<task_id>-<session_id>.yaml and inserts a runs row.
Evidence
Evidence is a Git-tracked file under evidence/<GOAL_ID>/ that proves an assertion. Common evidence files include:
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.
evidence_records rows in the runtime DB track the SHA-256 of each evidence file.
Evidence integrity
The evidence-integrity.yml workflow recomputes SHA-256 digests on every push and compares them against evidence_records. A mismatch fails CI.
Failure-mode receipts
A receipt with outcome: FAIL is not a stop-the-world error. The orchestrator re-dispatches per next_action_policy.on_fail. Three consecutive failures on the same task transition the goal to REPAIR_REQUIRED.