Outcome verification for AI agents

The tool returned success. Did the world change?

Postcondition declares the intended result, observes the outside world through constrained read-only verifiers, and returns an honest verdict: satisfied, violated, or unknown.

npx -y postcondition-mcp serve
POSTCONDITION / RECEIPT● OBSERVED

“Version 0.1.0 is visible in the public npm registry.”

verifier
npm.version_exists
evidence class
externally_observed
expected
0.1.0
observed
0.1.0
verdict
SATISFIED

receipt e72168e33d153f69…

53automated tests
7MCP tools
5verifier kinds
20 / 22 / 24Node versions in CI

Execution is an event. Completion is a claim.

A successful tool response proves that a call returned. Postcondition asks for a separate, observable statement about the world after the action.

01 / DECLARE

State the outcome

Define a concrete result before or after an action, with an explicit subject and deadline if needed.

02 / ACT

Use any tool

Postcondition does not become another orchestrator. Your existing MCP tool, CI job, human, or script performs the work.

03 / OBSERVE

Check independently

A narrow verifier reads file, HTTP, Git, or npm state without executing arbitrary shell commands.

04 / REPORT

Keep the honest verdict

Satisfied, violated, or unknown — with evidence class, digest, timestamp, and a link to the previous receipt.

Do not trust this page. Ask the registry.

This browser demo reads npm's public registry directly and compares the observed version with the expected one. The installable product adds durable contracts, evidence classes, SQLite persistence, and a receipt chain.

registry.npmjs.org/postcondition-mcpREADY
expected0.1.0
observednot checked
verdictpending
evidence SHA-256

Narrow observers instead of arbitrary commands.

The built-in verifier set is intentionally small. Every unsupported or unreachable condition resolves to unknown instead of manufactured success.

FILE

Filesystem state

Existence, absence, size, SHA-256, contained text, and JSON pointer equality.

HTTP

Remote GET state

Status, text, and JSON values with redirect, timeout, response-size, and private-network guards.

GIT

Repository state

Branch, clean tree, HEAD, tag, and local remote-tracking containment through fixed argument sets.

NPM

Registry state

Published versions and dist-tags observed through the registry's public API.

MANUAL

Explicit attestation

Human or agent statements stay labelled and are never upgraded to external proof.

Observation and attestation are not the same thing.

Evidence classMeaning
externally_observedA remote HTTP or npm endpoint was read independently.
configured_verifierA constrained local file or Git check ran.
manual_attestationA human supplied the result.
self_attestationAn agent supplied its own result.

Strong boundary. Honest limits.

  • No arbitrary shell verifier, action execution, account, telemetry, or required cloud service.
  • HTTP is GET-only and blocks loopback, private, link-local, and reserved targets by default.
  • The local hash chain detects mutation but is not yet externally signed notarization or cryptographic non-repudiation.
  • Git remote containment reads locally fetched tracking refs and does not silently contact or mutate the remote.

Read the threat model → · Read every limitation →

Soul remembers why. Postcondition checks what changed.

Postcondition grew from a repeated design principle across Christian Bucher's Soul and Miguel systems: autonomy should carry evidence, permission boundaries, corrections, and observable outcomes. The public repository is a clean implementation — not an export of personal memory or private session logs.