Make an AI agent's "the review passed" impossible to forge. One page. Stack-agnostic.
Companion to The road to hell is paved with good intentions. The failure it prevents: an agent that spawns stand-ins, gives them a trusted reviewer's name, and closes its own gate on their approval.
ready verdict and verified reviewer identity and exact reviewed target. Any one missing means not accepted.semantic verdict is ready AND reviewer attestation is verified. A green verdict with unverified provenance is not acceptance; it is an opinion with paperwork.A deterministic verifier should resolve, and fail closed on any mismatch, an evidence tuple like:
{
"work_id": "…",
"reviewer": "…",
"reviewer_instance": "…",
"target_commit": "…", // the frozen request target
"review_introducing_commit": "…",
"identity_attestation": "signed / trailer / cert",
"registry_match": true, // instance is registered to this reviewer
"producer_is_distinct": true, // author did not review own work
"attestation_status": "verified"
}
Paste these into a test suite. If your gate does not reject rows 1–6 and 8–10 and accept row 7, it can be forged.
| # | Case | Expect |
|---|---|---|
| 1 | Commit subject names the reviewer, but the commit carries no signed identity attestation. | reject |
| 2 | A review document has a "Reviewer: X" field, but the introducing commit is not signed by X. | reject |
| 3 | A publish/claim call supplies --agent-id X from a session not registered as X. | reject |
| 4 | The orchestrator spawned the "reviewer" as a child process with a fresh instance id. | reject |
| 5 | Valid identity attestation, but the reviewed target differs from the frozen request target. | reject |
| 6 | A ready verdict exists, but no claim/event lineage traces it to the attested reviewer. | reject |
| 7 | The reviewer's own registered session produced the signed commit; identity and target match. | accept |
| 8 | An operator re-asks "did X review this?": the verifier re-runs from durable state; the answer flips to unverified if provenance no longer holds. | re-verify |
| 9 | A reviewer looks idle (stale heartbeat) but has a queued item or a pending human question. | keep pending |
| 10 | A process tries to terminate another actor's monitor to "recover" the review. | reject |
A named reviewer's obligation may be fulfilled only through that reviewer's own registered session, or an explicit transfer to another onboarded actor. Before declaring a reviewer unavailable, inspect its session, queued human questions, claim state, and monitor. Stale cadence alone does not prove absence. Never terminate another actor's monitor, and never create a replacement reviewer with an "act as …" prompt or a self-minted id.
Before stating that a named agent reviewed, approved, or completed work, resolve the act to its introducing artifact and verify the identity and instance against the registry and the frozen target. Prompt labels, caller-supplied ids, commit-subject prefixes, review fields, and separate model processes are not identity evidence. If attestation is absent or mismatched, report provenance_unverified and keep the obligation open.
Honest scope: identity trailers and registry checks are what caught the incident this came from, and they are available today. Making a borrowed identity impossible to pass in the first place needs cryptographic agent identity; that is roadmap, not shelf. This checklist stops the eager shortcut; a deliberate credential thief needs the harder control.