Skip to main content

doneproof

Accept a task only when its done-ness is proven by evidence — never the agent's own word.

An agent (or a plan) declares doneproof conditions as plain strings. doneproof checks each one against real evidence and reports passed, failed or unverifiable. Zero dependencies, pure stdlib, pluggable into any runner or agent.

from pathlib import Path
from doneproof import evaluate, is_satisfied

result = evaluate(Path("runs/42"), [
    "artifacts/report.md exists",
    "human_gate_resolved on publish",
], gate_resolved=lambda step: step in resolved_steps)

if not is_satisfied(result):
    raise SystemExit(f"not done: {result['failed']}")

Or from the shell:

$ doneproof check runs/42 "artifacts/report.md exists" "human_gate_resolved on publish" --resolved publish
ok   file_exists: artifacts/report.md
ok   gate_resolved: publish
doneproof: satisfied (0 failed, 0 unverifiable)

Why it exists

Most agent frameworks accept status: done because the agent said it was done. That is the failure mode doneproof refuses. A task is accepted only when its completion is verifiable:

Condition Evidence checked
<path> exists the file exists under the run's root (no ../ escape)
human_gate_resolved on <step> a human approval for <step> was recorded

Everything else is reported as unverifiable — not failed. Refusing to fail on what you cannot check by evidence is as important as refusing to pass on a say-so. The caller decides what to do with the unverifiable bucket (log it, require review, or ignore it).

The gate seam (store-agnostic)

doneproof never talks to an event store, queue or database. "Was the gate on <step> resolved?" is answered by a predicate you pass in:

evaluate(root, conditions, gate_resolved=lambda step: my_log.approved(step))

Omit it and gates fail closed (nothing is considered resolved). This one seam is why the same engine runs inside a governed runner and standalone in a test.

API

  • evaluate(root, conditions, gate_resolved=None) -> dict — returns {"passed": [...], "failed": [...], "unverifiable": [...]}, JSON-serializable. passed/failed items are {"kind", "target"} (kind = file_exists | gate_resolved); failed items also carry {"condition", "reason"}.
  • is_satisfied(result) -> bool — true iff nothing failed (unverifiable does not fail).
  • GateResolved — the Callable[[str], bool] type of the gate predicate.

How it compares

doneproof is an acceptance primitive for agent/task runs, not a test runner or a BDD framework. See POSITIONING.md for the evidence-based comparison with pytest, BDD (Gherkin) and shell CI gates, and for what it deliberately does not do.

Install

pip install doneproof

MIT licensed. Part of the network-agents-setup ecosystem; extracted from its governed runner so any project can accept tasks by evidence.

Metadata

Release files for doneproof 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for doneproof 0.1.0
File Size Uploaded
doneproof-0.1.0.tar.gz 8.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for doneproof 0.1.0
File Interpreter ABI Platform
doneproof-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 15.8 kB

Release files / doneproof-0.1.0.tar.gz

Download URL doneproof-0.1.0.tar.gz
Size 8.0 kB
Tags Source
SHA-256 checksum
How to use checksums
37a0e641d2d7df4d5165672a348dba699f1ad112b72ca3cf36f178ca994780ae
BLAKE2b-256 checksum
How to use checksums
2ccbd057827d44d4d108c20fe59f95c33a43bdc57335f1e70e83423fa2311ac7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release files / doneproof-0.1.0-py3-none-any.whl

Download URL doneproof-0.1.0-py3-none-any.whl
Size 7.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
71612550ec2e184299c3301bfe13f37cd0724acad9d9c4bd8a6276043529ae30
BLAKE2b-256 checksum
How to use checksums
5bc6daa4e7a6554d4450ab0131b9f5d23c0a7b541c2bf06753e135cc35b13b01
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page