Skip to main content

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.