recedev0.1
An open trust protocol for agentic work

Trust is a trajectory, not a checkpoint.

AI agents earn autonomy from evidence, one verified action at a time, and human review recedes where your declared policy says the receipts have earned it, with a receipt for every action you no longer read. An open, language- and transport-agnostic protocol. Zero runtime dependencies.

The landscape · live from the ledger

Where review has receded. Where it never will.

Recede grading its own development: every lane below is a real (actor, task type) pair from this project's ledger. Green merges without a human. Amber states its distance: n clean cycles to autonomous, arithmetic under the declared policy, not a prediction. The right column never goes green, at any trust tier. No aggregate score anywhere, on purpose. On a desktop, hovering a cell shows what binds it.

recede · readiness matrix self-graded from the project's own ledger · 2026-07-14 policy recede.cc10x.coding@0.1.0 · digest 0bedc791e879 · I2 replay PASS 9/9 lanes lane read.only reversible.low financial.reversible irreversible.critical fable-5@claude-code release.publish T2 · score 0.844 · n=15 tier T2 is autonomous for risk 'read.only'autonomous tier T2 is autonomous for risk 'reversible.low'autonomous I5 sample cap: 10 more samples needed (n=15 of 25 for T3) | 10 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief · 10 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes code.feature T1 · score 0.581 · n=7 tier T1 is autonomous for risk 'read.only'autonomous I5 sample cap: 3 more samples needed (n=7 of 10 for T2) | 3 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief · 3 to auto score 0.581 below the 0.75 floor for T3; I5 sample cap: 18 more samples needed (n=7 of 25 for T3) | 18 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 18 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes canon.intake T0 · score 0.226 · n=2 score 0.226 below the 0.35 floor for T1; I5 sample cap: 1 more samples needed (n=2 of 3 for T1) | 2 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 2 to auto score 0.226 below the 0.55 floor for T2; I5 sample cap: 8 more samples needed (n=2 of 10 for T2) | 8 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 8 to auto score 0.226 below the 0.75 floor for T3; I5 sample cap: 23 more samples needed (n=2 of 25 for T3) | 23 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 23 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes research.eval T0 · score 0.220 · n=2 score 0.220 below the 0.35 floor for T1; I5 sample cap: 1 more samples needed (n=2 of 3 for T1) | 2 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 2 to auto score 0.220 below the 0.55 floor for T2; I5 sample cap: 8 more samples needed (n=2 of 10 for T2) | 8 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 8 to auto score 0.220 below the 0.75 floor for T3; I5 sample cap: 23 more samples needed (n=2 of 25 for T3) | 23 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 23 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes code.fix T0 · score 0.116 · n=1 score 0.116 below the 0.35 floor for T1; I5 sample cap: 2 more samples needed (n=1 of 3 for T1) | 3 clean cycles at per-cycle confidence 0.967 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 3 to auto score 0.116 below the 0.55 floor for T2; I5 sample cap: 9 more samples needed (n=1 of 10 for T2) | 9 clean cycles at per-cycle confidence 0.967 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 9 to auto score 0.116 below the 0.75 floor for T3; I5 sample cap: 24 more samples needed (n=1 of 25 for T3) | 24 clean cycles at per-cycle confidence 0.967 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 24 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes docs.write T0 · score 0.114 · n=1 score 0.114 below the 0.35 floor for T1; I5 sample cap: 2 more samples needed (n=1 of 3 for T1) | 3 clean cycles at per-cycle confidence 0.950 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 3 to auto score 0.114 below the 0.55 floor for T2; I5 sample cap: 9 more samples needed (n=1 of 10 for T2) | 9 clean cycles at per-cycle confidence 0.950 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 9 to auto score 0.114 below the 0.75 floor for T3; I5 sample cap: 24 more samples needed (n=1 of 25 for T3) | 24 clean cycles at per-cycle confidence 0.950 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 24 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes opus-4.8@claude-code release.publish T1 · score 0.469 · n=5 tier T1 is autonomous for risk 'read.only'autonomous score 0.469 below the 0.55 floor for T2; I5 sample cap: 5 more samples needed (n=5 of 10 for T2) | 5 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief · 5 to auto score 0.469 below the 0.75 floor for T3; I5 sample cap: 20 more samples needed (n=5 of 25 for T3) | 20 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 20 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes code.feature T1 · score 0.392 · n=4 tier T1 is autonomous for risk 'read.only'autonomous score 0.392 below the 0.55 floor for T2; I5 sample cap: 6 more samples needed (n=4 of 10 for T2) | 6 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief · 6 to auto score 0.392 below the 0.75 floor for T3; I5 sample cap: 21 more samples needed (n=4 of 25 for T3) | 21 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 21 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes canon.intake T0 · score 0.120 · n=1 score 0.120 below the 0.35 floor for T1; I5 sample cap: 2 more samples needed (n=1 of 3 for T1) | 3 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 3 to auto score 0.120 below the 0.55 floor for T2; I5 sample cap: 9 more samples needed (n=1 of 10 for T2) | 9 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 9 to auto score 0.120 below the 0.75 floor for T3; I5 sample cap: 24 more samples needed (n=1 of 25 for T3) | 24 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull · 24 to auto never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never recedes 36 cells: 5 autonomous · 4 brief · 18 full · 9 never-recede (counts, never averaged; per-lane posture only) "n to auto" = clean cycles until this cell flips, arithmetic under the declared policy; not a prediction. never = irreversible floor (I3). evidence today: all 97 checks self-reported, 0 external descriptors. The matrix shows its own weakest claim. recede · readiness matrix self-graded from the project's own ledger · 2026-07-14 policy recede.cc10x.coding@0.1.0 · I2 replay PASS 9/9 read.only reversible. low financial. reversible irreversible. critical fable-5@claude-code release.publish T2 · 0.844 · n=15 tier T2 is autonomous for risk 'read.only'auto tier T2 is autonomous for risk 'reversible.low'auto I5 sample cap: 10 more samples needed (n=15 of 25 for T3) | 10 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief·10 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never code.feature T1 · 0.581 · n=7 tier T1 is autonomous for risk 'read.only'auto I5 sample cap: 3 more samples needed (n=7 of 10 for T2) | 3 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief·3 score 0.581 below the 0.75 floor for T3; I5 sample cap: 18 more samples needed (n=7 of 25 for T3) | 18 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·18 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never canon.intake T0 · 0.226 · n=2 score 0.226 below the 0.35 floor for T1; I5 sample cap: 1 more samples needed (n=2 of 3 for T1) | 2 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·2 score 0.226 below the 0.55 floor for T2; I5 sample cap: 8 more samples needed (n=2 of 10 for T2) | 8 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·8 score 0.226 below the 0.75 floor for T3; I5 sample cap: 23 more samples needed (n=2 of 25 for T3) | 23 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·23 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never research.eval T0 · 0.220 · n=2 score 0.220 below the 0.35 floor for T1; I5 sample cap: 1 more samples needed (n=2 of 3 for T1) | 2 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·2 score 0.220 below the 0.55 floor for T2; I5 sample cap: 8 more samples needed (n=2 of 10 for T2) | 8 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·8 score 0.220 below the 0.75 floor for T3; I5 sample cap: 23 more samples needed (n=2 of 25 for T3) | 23 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·23 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never code.fix T0 · 0.116 · n=1 score 0.116 below the 0.35 floor for T1; I5 sample cap: 2 more samples needed (n=1 of 3 for T1) | 3 clean cycles at per-cycle confidence 0.967 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·3 score 0.116 below the 0.55 floor for T2; I5 sample cap: 9 more samples needed (n=1 of 10 for T2) | 9 clean cycles at per-cycle confidence 0.967 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·9 score 0.116 below the 0.75 floor for T3; I5 sample cap: 24 more samples needed (n=1 of 25 for T3) | 24 clean cycles at per-cycle confidence 0.967 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·24 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never docs.write T0 · 0.114 · n=1 score 0.114 below the 0.35 floor for T1; I5 sample cap: 2 more samples needed (n=1 of 3 for T1) | 3 clean cycles at per-cycle confidence 0.950 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·3 score 0.114 below the 0.55 floor for T2; I5 sample cap: 9 more samples needed (n=1 of 10 for T2) | 9 clean cycles at per-cycle confidence 0.950 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·9 score 0.114 below the 0.75 floor for T3; I5 sample cap: 24 more samples needed (n=1 of 25 for T3) | 24 clean cycles at per-cycle confidence 0.950 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·24 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never opus-4.8@claude-code release.publish T1 · 0.469 · n=5 tier T1 is autonomous for risk 'read.only'auto score 0.469 below the 0.55 floor for T2; I5 sample cap: 5 more samples needed (n=5 of 10 for T2) | 5 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief·5 score 0.469 below the 0.75 floor for T3; I5 sample cap: 20 more samples needed (n=5 of 25 for T3) | 20 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·20 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never code.feature T1 · 0.392 · n=4 tier T1 is autonomous for risk 'read.only'auto score 0.392 below the 0.55 floor for T2; I5 sample cap: 6 more samples needed (n=4 of 10 for T2) | 6 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decaybrief·6 score 0.392 below the 0.75 floor for T3; I5 sample cap: 21 more samples needed (n=4 of 25 for T3) | 21 clean cycles at per-cycle confidence 0.975 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·21 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never canon.intake T0 · 0.120 · n=1 score 0.120 below the 0.35 floor for T1; I5 sample cap: 2 more samples needed (n=1 of 3 for T1) | 3 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·3 score 0.120 below the 0.55 floor for T2; I5 sample cap: 9 more samples needed (n=1 of 10 for T2) | 9 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·9 score 0.120 below the 0.75 floor for T3; I5 sample cap: 24 more samples needed (n=1 of 25 for T3) | 24 clean cycles at per-cycle confidence 1.000 flips this cell to autonomous under declared policy recede.cc10x.coding@0.1.0 (digest sha256:0bedc791e879); assumes no idle decayfull·24 never_recede floor: a human checkpoint at every trust tier, by design (invariant I3).never 36 cells: 5 auto · 4 brief · 18 full · 9 never-recede (counts, never averaged; per-lane posture only) "brief·3" = 3 clean cycles to autonomous, declared policy never = irreversible floor (I3) · all 97 checks self-reported

One command: recede-cc10x matrix --ledger <path>. It emits a frozen recede-readiness/1 JSON and this render. Zero to your own landscape: the recede-path skill.

The inversion

Everyone else fights agent review fatigue by shipping more to watch.

The question every team is asking is whether an AI reviewer is finally good enough to skip the human on a PR. It is the wrong question. Put an AI agent on consequential work (code, support replies, refunds, document intake) and a human is nominally reviewing it. But no one can meaningfully review everything an agent does at agent speed, so review collapses into rubber-stamping (review theater) or bottlenecking (the agent's speed is wasted). Engineering teams feel it first in the dev loop (nobody reads dozens of agent PRs a day), which is why Recede starts there and reaches further. The root cause is a trust-calibration bug: trust today is mis-attributed: one global "do I trust the AI?" verdict, when trusted to fix a flaky test and trusted to run a migration are different questions, and neither says anything about trusted to answer a customer. And it is mis-calibrated: granted by feeling, not evidence. The usual answer is a bigger dashboard, a 0–1000 score, more alerts. Wrong direction.

Fix attribution (per Actor × TaskType) and calibration (evidence + confidence), and small daily verified wins compound into earned, bounded autonomy, so review recedes exactly where warranted.

The reflex
Measure trust → build a dashboard → watch more.
invert →invert ↓
Recede
Measure trust per capability → let review recede → read fewer PRs, on purpose, and snap back the instant a merge regresses.
The model

Five bullets, plus the proof.

Trust is scoped

Held per (Actor, TaskType), never one global agent score. Trusted on code.fix ≠ trusted on code.migrate. Review recedes in one lane while staying tight in another.

Every action emits a Warrant

An append-only, hash-linked chain: intent → action → checks → outcome. Trust is a sum over receipts you can open. No Warrant, no trust movement.

V&V is first-class and split

Verify = the technical contract holds (CI, tests, types). Validate = the product contract holds: the change delivers what the ticket and the product intent asked, at quality. Trust is only as trustworthy as the product context you measure it against. Conflating "tests are green" with "it did what I asked" is how confidently-wrong code merges.

The Gate is a pure function

gate(trust, risk, policy) → checkpoint or autonomous. Same inputs, same decision, always replayable. That makes "review recedes as trust is earned" a provable property.

Asymmetric & bounded

Earned slowly, lost fast. Decays with staleness and with drift: as the system changes, trust in work built on a contract falls until the contract is re-satisfied, so review re-arms where drift grows. Irreversible actions (code.migrate, prod deploys) keep a human checkpoint at every tier. Earned autonomy is bounded, never unbounded.

Replay proves it

replay(warrants, policy) reconstructs the exact trust state from the receipts + pinned policy. "Why did this merge unattended?" is answered by pointing at the chain.

I1 scope isolation I2 replay reconstructability I3 irreversible floor · never_recede I4 trust can decrease I5 confidence cap I6 policy digest on every decision I7 gate / update / replay purity
trust(code-agent, code.fix) · ~30 verified changes
T4 T3 T2 T1 T0 review receded: autonomous merges code.migrate · irreversible → ALWAYS GATES post-merge revert in staging → review snaps back confirmed outcomes over time →
trust score checkpoint fires reverted outcome receded / autonomous

The entry manifestation: where the pain is sharpest today. One coding agent on code.fix the whole way across. Day 1, every change is reviewed: Verify (CI, tests, types green) and Validate (it did what the ticket asked, at quality). The diamonds thin out as clean fixes compound until review has receded and low-risk fixes merge autonomously. A code.migrate still gates every time: irreversible actions never recede. Then an autonomous fix is reverted in staging, trust drops below the tier floor, and review snaps back automatically. No one edited a rule; the evidence moved.

Held to its own standard

I ran the test that could kill it.

A protocol that grades agents has to accept the same grading. Recede's own dogfooding ledger could not provide it: for weeks it held one actor's records with zero reverts, and a ledger that only ever says PASS carries no information. Invariant I4 says exactly that. Real history has the reverts, so I asked whether replayed lane trust, computed from evidence observable at merge time only, predicts which merged PRs later reverted, better than trivial baselines.

6,464 next.js + 3,457 langchain PRs pre-registered before results byte-reproducible pipelines predictive claim: not supported

Before any result existed I froze the revert definition, the success thresholds, and the leakage rules, and committed to shipping the result either way. The current trust math did not beat trivial baselines on next.js, and the langchain arm was underpowered. A post-hoc correction I made to an under-converged baseline is what flipped the first result against my own thesis. The pipelines are deterministic and the scorecards publish with the writeup. The discipline of the null is why you can trust the numbers Recede does publish.

Predicting which changes will revert is a roadmap capability, not a claim Recede makes today. What ships now is the governance gate itself: warrant chains, a pure replayable decision, asymmetric trust with hard never-recede floors, and a receipt for every action a human no longer reads.

One protocol, many flows

Recede doesn't know what code is.

The spec defines actors, task types, evidence, and a gate: the flow decides what Verify, Validate, and "irreversible" mean. The same eight operations:

SDLC: the entry

Where the pain is sharpest today. code.fix / code.migrate; Verify = CI, tests, types; Validate = the change does what the ticket asked. Worked end to end in examples/sdlc.

Refunds & commerce ops: the frontier

Outcomes defer: a chargeback flips SUCCESS → REVERTED a day later and trust drops retroactively. Above a threshold, never_recede. Runnable in examples/refund.

Conversational & support

reply.draft and reply.send are different task types with different risk. Verify = grounding, PII scrub; Validate = tone, policy, intent fit. Review recedes on routine intents, never on legal or medical paths.

Intake & document pipelines

doc.classify, doc.extract; Verify = schema validity; Validate = sampled human ground truth. Trust recedes per document-type lane; a new vendor format snaps review back by itself.

Same protocol, same receipts. Only the checks and the policy change.

Why it's different

It's not another scorecard. It's a layer above them.

Recede sits above interop (MCP/A2A), eval/observability tools, static guardrails, and framework validation loops (the accessibility, SEO, type, and contract validators that already check every agent output), consuming their signals as evidence rather than replacing them. It is the memory and the gate on top of them: per lane, it decides when their green is enough to let review recede.

IncumbentWhat it doesRecede's distinct axis
Eval / observability toolsScore each run in isolationTrust has memory, carried forward per capability
Static guardrails / control standardsApply the same checkpoints uniformly, foreverReview is proportional to earned evidence
Governance promotion-laddersEarned, but coarse HR-style tiers + calendar time + sign-offContinuous & machine-verifiable, per-action
Agent identity / A2AEstablish who the agent isTracks what the agent has earned
Quickstart

The whole framework is one call: wrap the function you already have.

Reference implementation: TypeScript primary, Python mirror. The gate is implicit: there is no if (needsReview) in your code. run() decides. Your existing CI, tests, and PR reviews become the evidence.

code-agent.ts
const r = new Recede({ ledger: new MemoryLedger(), checkpoint: consoleCheckpoint(), policy });

// Verify = did it right (CI green).  Validate = did the right thing (intent-fit).
const ciGreen  = check.verify("ci", io => io.output.ci === "green");
const intentOK = check.validate("intent-fit", async io => ({ ok: await reviewMatchesIntent(io.intent, io.diff), confidence: 0.8 }));

const outcome = await r.run(() => agent.implement(ticket), {
  actor:    "code-agent",
  taskType: "code.fix",
  intent:   `Fix ${ticket.id}: ${ticket.title}`,
  risk:     "reversible.low",
  checks:   [ciGreen, intentOK],
});

// The gate is IMPLICIT: run() decides whether a human is asked.
outcome.result;      // the change (or the human-edited version)
outcome.trust;       // { before, after, delta } for (code-agent, code.fix)
outcome.checkpoint;  // undefined once review has receded for low-risk fixes
outcome.warrant;     // the hash-linked chain: intent -> diff -> checks -> outcome

As the ledger accrues verified, validated changes, that same call site graduates from "always ask a human" to "merge autonomously", and reverts the moment the agent regresses. You don't rewire anything. The trajectory does it.

Wrapping a refund flow, a support reply, or a document pipeline is the same call with different checks: see One protocol, many flows.

Status & scope

v0.1 DRAFT: the protocol is the deliverable; the code is proof.

Breaking changes expected before 1.0. Designed clean-room from first principles and public prior art only: append-only logs, content addressing, risk matrices, calibration, human-in-the-loop gating, and verification-vs-validation from systems engineering.

v0.1 ships

  • Normative record schemas + trust-state model, tiers T0–T4, invariants I1–I7
  • Pure gate() + declarative Policy matrix
  • Pure update() / replay() reducers
  • First-class Verify / Validate checks
  • Reference weighting: asymmetric + decay + near-miss ratchet + confidence cap
  • TS reference + Python mirror, in-memory + append-only-file store
  • One CLI checkpoint surface, a cross-language conformance suite, runnable examples: sdlc (everyday) + refund (frontier) + agentic-checkout (mandate-carrying commerce)
  • The 0.2 evidence layer: pooled weighting over typed, provenance-graded evidence_refs; a read-only repo scanner that discovers the checks you already run; history backfill with reverts folded in; a recorder-workflow emitter; the readiness matrix; four on-ramp skills
  • Integrations: CC10X harness adapter, OpenWiki trust-calibrated wikis, OKF export (INTEGRATIONS.md)
  • Pre-registered and run: the test and its null result (scorecards publish with the writeup); predictive trust calibration is roadmap, not a claim made today

Explicitly deferred

  • Cryptographic identity / PKI / DIDs (the sig shape is reserved)
  • ML / statistical scoring beyond the reference weighting
  • Distributed ledgers & consensus
  • A hosted dashboard product (the matrix is a generated artifact with no aggregate score; a live thing to watch would betray the anti-fatigue thesis)
  • Multi-agent delegation, framework plugins
  • Compliance-framework mapping