DOCS · CONCEPTS
ALL DOCS FIG. 15 · DWG VC-015

Delivery proof

Evidence discipline: report frontmatter, claims versus settlement, the f/x/n ledger, and why a process exit never finalizes anything.

Canonical source — docs/public/concepts/delivery-proof.md

Delivery proof

Vibecrafted treats “the agent said it finished” as a claim, not a fact. A run becomes settled only when independent evidence agrees with the claim. This page explains the evidence chain: structured reports, the separation of execution from proof from delivery, and the settlement ledger you can query.

The core inequality

the process exited
≠ the verifier actually examined the product
≠ the declared effect was achieved
≠ the change was delivered where it was promised
≠ the proof of delivery was sealed

The runtime represents these facts separately and never derives one from another automatically. A bare exit code 0 finalizes nothing.

Reports carry a machine contract

Every Markdown artifact a worker produces — plan, report, research doc — must open with a YAML frontmatter block (contract id vibecrafted.report-frontmatter.v1):

---
run_id: impl-<timestamp>-<id>
agent: codex
skill: vc-implement
project: my-app
status: completed
claim_status: completed # the agent's own claim
date: 2026-07-30T12:00:00+00:00
---

Required keys are run_id, agent, skill, and status. A missing block or missing required key is an artifact contract error (report_frontmatter_*) — the run is not Finalized, regardless of how confident the prose below sounds.

A claim is not a self-seal. claim_status: completed is triangulated against the process exit code, the report and transcript, and the delivery kernel’s own axes. Contradictions do not resolve in the agent’s favor — they land the run in Needs attention.

Three orthogonal axes

The delivery-proof kernel keeps three states that may not be collapsed into each other:

AxisQuestion it answersExample values
ExecutionDid the process run and how did it end?running, exited, interrupted, launch_failed
ProofDid a qualified verifier examine the product and pass?undeclared, running, passed, failed, invalid, stale
DeliveryDoes the proven effect exist where it was promised?unverified, delivered, sealed

Each arrow on the success path requires its own evidence:

execution.exited(0) → proof.passed → delivery.delivered → delivery.sealed

A report that exists and has bytes proves only that a report exists (artifact_ok — a transport fact). An interrupted or partial run can never be promoted to delivered by a compatibility projection. And a proof is invalid — not the product, the proof — when the verifier cannot demonstrate it would detect a controlled falsehood.

Only the shipping authority (vc-ship) issues a delivery seal. A direct worker run can honestly end as execution.exited / proof.passed / delivery.unverified — that is not failure; it is precision.

The settlement ledger: f / x / n

Run-level settlement truth lives in an immutable, append-only, hash-chained ledger at ~/.vibecrafted/control_plane/settlement_ledger.jsonl. Every finished run settles into one of three buckets:

BucketMeaning
fFinalized — claim and evidence agree
xFailed — the run demonstrably failed
nNeeds attention — contradiction, missing evidence, or an unsettled end

Zero on this rail is a verdict, not a default. UI counters, boards, and chat surfaces must derive f/x/n from this ledger; none of them may invent an f locally.

Querying settlements

The read-only query surface (schema vibecrafted.settlements-query.v1) never mutates the ledger:

vibecrafted settlements summary          # f/x/n counts over the ledger
vibecrafted settlements list             # filtered run rows
vibecrafted settlements inspect <run_id> # one run, full settlement view
vibecrafted settlements revalidatable    # runs whose evidence is still on disk

revalidatable means the report and transcript still exist for a deliberate re-verification campaign — not that anything will resume automatically.

Why this discipline exists

Autonomous agents are rewarded, by default, for telling a good story about finishing. The proof discipline removes that reward: the runtime stops trusting well-narrated endings and starts requiring contact with reality — a verifier that ran the actual product, an assertion that consumed its actual output, and a ledger entry that cannot be rewritten afterwards. That is what makes it safe to give agents real autonomy.