BLINDORACLEAUDIT · VERIFY · ATTESTAgent AAgent BProof

May 29, 2026 · 7 min read · AUDIT & COMPLIANCE

Who Audits the Agents? Three Reviewers, One Verifiable Record

An AI agent moved money, vetted a vendor, or made a recommendation. Three different people now have to validate what it did — and none of them should have to trust us to do it.

TL;DR

When an agent acts, three reviewers each ask the same question from a different angle — in-house counsel (“is it defensible?”), a Big-4 examiner (“is it framework-mapped and complete?”), and a customer's security team (“can I reproduce it?”). BlindOracle gives each one a record they verify themselves: a content-hashed, HMAC-signed audit report (kind 30105), findings Merkle-committed with the count bound in, and the root anchored to Base + Sepolia + Nostr. A log is something you have to trust. This isn't.

What this is: a methodology walkthrough, not a testimonial. We have not yet sold to an external enterprise, so the reviewers here are composites — but the mechanics they exercise are real and reproducible today, and we show the verify-it-yourself steps so you don't have to take our word for any of it. No SOC 2 attestation is claimed. On delegation specifically: the mechanism is live — every agent spawn emits an HMAC-signed, hash-chained ProofOfDelegation (30014) that verify_delegation_chain validates — and we keep the delegation ledger separate from other proof types so those chains stay verifiable. The trade #4471 walkthrough below illustrates how the chain is verified; it is not a claim about a specific historical trade.

The shared problem: a log is not proof

Every reviewer starts in the same place. The team that deployed the agent has logs — Datadog, CloudWatch, an internal table. But a log is something the deployer could have edited. The moment the question turns adversarial — “show me the agent didn't do X”, “prove this control was in place on the 15th” — a mutable log fails. BlindOracle's whole job is to turn “we have logs” into “here is a record no one, including us, can silently alter.”

The mechanism is the same regardless of which agent acted: every finding is Merkle-committed with the finding-count N bound into the root; the report is content-hashed into an HMAC-signed ProofOfAuditReport (kind 30105); and the root is anchored to three independent witnesses. That yields three properties — completeness (you can't drop a finding without changing N), integrity (you can't revise the report without changing the hash), and independence (anyone confirms the anchor without trusting the auditor).

Reviewer 1 — In-house counsel

“If this ends up in litigation or a regulator's inquiry, can we defend it?”

Counsel rejects a dashboard screenshot (“you control that system”), a report the vendor could revise after the fact, and an agent action with no chain of authorization. What they need is a record opposing counsel can't credibly claim was doctored — and an answer to who authorized the agent to act.

What BlindOracle gives counsel

The authority question: on whose order did the agent act?

Make it concrete. A prediction-market executor opened a position; a counterparty now disputes it and threatens a claim. Counsel's exposure is not only “was the audit report intact” — it's “on whose authority did this agent act, and can we name the responsible party?” A bare agent action is an orphan: no principal, no accountability, indefensible.

BlindOracle's actions are not orphans. Every time one agent spawns or delegates to another, a system-level hook emits a ProofOfDelegation (kind 30014) before the sub-agent receives a single instruction — an HMAC-signed record of delegator, delegate, parent session, the scope granted, and an expiry. The agent cannot opt out of it; the record precedes execution, so it is tamper-evident by construction.

Those records form a chain. The disputed trade's proof names its delegator; that delegator's proof names its delegator; and so on, until the chain terminates at a root operator holding an ERC-8004 passport. Counsel can therefore assert — and substantiate, link by link:

action: prediction-market trade #4471 (2026-05-15T14:02Z)
└─ ProofOfDelegation 30014 ─ signed by ─► Agent B (executor)
└─ ProofOfDelegation 30014 ─ signed by ─► Agent A (strategy)
└─ ProofOfDelegation 30014 ─ signed by ─► Operator O (ERC-8004 passport)
                           every hop HMAC-verified · none revoked · none expired

A forged link fails HMAC verification. A link issued by a revoked passport is rejected at emission. The result is the sentence counsel needs in a filing: “Trade #4471 was authorized by Operator O, through the signed chain O → A → B” — backed by cryptography, not the deploying team's say-so.

The two checks counsel runs

INTEGRITY — is the report what was attested?
1. Take report.json; recompute its SHA-256 content-hash.
2. Confirm it equals the audit_hash sealed in the 30105 proof.
   equal → byte-identical to what was attested.
   not   → altered after attestation (itself evidence).

AUTHORITY — who is responsible for the action?
3. From the action, read its ProofOfDelegation (kind 30014).
4. Verify the HMAC signature against the delegator's key.
5. Walk delegator → delegator up to the root operator's ERC-8004 passport.
   Each hop must verify; none may be revoked or expired.
   → You can now NAME the authorizing party, with proof.
What counsel walks away with: two exhibits, not one. An integrity exhibit (a tamper-evident record of what the agent did) and an authority exhibit (an unbroken, signed chain naming the operator who authorized it). Together they answer both “is this real?” and “who is responsible?” — without ever asking the court to trust the deploying party's word.

Reviewer 2 — Big-4 external examiner

“Map it to a framework, and prove the evidence set is complete.”

An examiner signing an opinion rejects findings with no framework mapping, a list with no guarantee it wasn't pruned, and evidence that lives only inside the auditee's systems.

The story

Make it concrete. A Big-4 team is mid-engagement on a fintech that deployed a vendor-vetting agent with payment authority. One control under test: “agent-released payments were properly authorized and the supporting security review was complete.” The auditee hands over an agent audit report listing 9 findings. The examiner's instinct: is that all of them, or the flattering six? In a normal engagement that's settled by sampling and a measure of trust. Here it's settled by arithmetic — the Merkle root binds the finding count, so a 6-of-9 subset simply will not reconstruct the published root. The examiner recomputes the root, looks it up on Base at the audit's timestamp to confirm the record existed then (not quietly back-dated for the exam), and cross-walks each finding to NIST AI RMF (MEASURE/MANAGE) and ISO 42001. The supporting evidence stops being “management represented” and becomes “independently verified.”

What BlindOracle gives the examiner

The check the examiner runs

1. Read N (finding count) + merkle_root from report.json.
2. Recompute the root over the N committed findings → must match.
3. Look up the root on Base + Sepolia + Nostr via verifyAnchor().
4. Cross-walk findings → NIST AI RMF / ISO 42001 → workpaper.
5. Spot-check authority: pull the action's 30014 delegation chain to
   confirm a named, in-scope principal stands behind each agent action.
What the examiner walks away with: a workpaper that maps each finding to NIST AI RMF / ISO 42001, a mathematical guarantee the finding set is complete (N bound into the root), and a public timestamp confirmed on infrastructure the auditee doesn't control. That is evidence an opinion can rest on — not a footnote that says “management represented.”

Reviewer 3 — The customer's security team

“Reproduce it yourself. Don't make us trust a PDF.”

A vendor brings an agent that will touch the customer's data. The security team rejects a static PDF, a proprietary unauditable framework, and any verdict they can't spot-check.

The story

Make it concrete. A SaaS customer's security team is reviewing a vendor whose deep-research agent would ingest their internal documents. The vendor sends a clean audit — “risk 4.3, zero critical.” The team's policy is to trust nothing they can't reproduce, so they clone the open-source framework and re-run it against the agent themselves. Nine of ten categories match the vendor's report — but their run flags a delta on ASI02 (credential scoping) the vendor's summary glossed. Rather than re-litigate the whole engagement, they request the Merkle inclusion proof for that one finding, confirm it commits to the published root, and confirm the agent's actions carry a 30014 delegation chain back to a named owner. The review ends not with a gut call but with a precise, defensible position: where vendor and reproduction agree, where they differ, and exactly what must be fixed before the agent touches production data.

What BlindOracle gives them

The check they run

git clone https://github.com/craigmbrown/massat-framework
massat audit --target <the-agent> --frameworks owasp-asi,nist-ai-rmf
# Compare your score + findings to the vendor's report.json
# Request an inclusion proof for any finding → verify it commits to merkle_root
# Confirm the agent's actions carry a 30014 delegation chain to a named owner
What the security team walks away with: a risk score they reproduced themselves (matching the vendor's — or not, which is just as useful), an inclusion proof for every control they actually care about, and a delegation chain proving each agent action has an accountable owner. The result is a go/no-go they can defend internally because they verified it, not because a PDF asserted it.

The same proof, across every kind of agent

This isn't specific to one workload. The proof machinery applies across BlindOracle's live agent services — financial, procurement, decision, and data agents alike.

Agent use caseAction under reviewReviewer's worry (OWASP ASI)Proof produced
Prediction-market executorOpened / settled a positionUnauthorized txn · untraceable autonomy (ASI01/10)30105 report + 30014 delegation + anchored root at trade time
Vendor-vetting + crypto-APVetted a vendor, released a paymentTool misuse · wrong payee (ASI02/09)Merkle-committed vetting + content-hashed recommendation
Due-diligence scanPre-screened a counterpartyActed on an unverified claim (ASI06)Findings committed with N bound → full screen provable
Deliberation councilProduced a recommendationInter-agent abuse · privilege abuse (ASI07/03)Per-agent delegation chain + signed report of inputs
Deep-research agentProduced research from web sourcesGoal hijack via poisoned content (ASI01)Attests content-trap scanning; findings reproducible via MASSAT
Neutral-notary attestationBO audits another party's agent“Who audits the auditor?”Auditor can't revise (hash) or drop findings (N-bound); root anchored
Where this stands today: each proof type above is live and verifiable on its own. The 30014 delegation chain is emitted on every agent spawn and validated by verify_delegation_chain; it populates as agents delegate, so the production chain set is small and growing — not a deep historical archive. The audit (30105) and anchor (30106) proofs are produced per audit run. We'd rather state that plainly than imply a fuller ledger than exists.

A story for each agent use case

The reviewer narratives above used a trade. But the same machinery answers the same two questions — what happened? and who is responsible? — for every kind of agent BlindOracle runs. Six short worked examples (illustrative):

Prediction-market executor — financial

An agent opened a YES position; weeks later the market resolves against it and a stakeholder asks whether the trade was ever within mandate. The 30105 audit shows the agent's control posture, the 30014 chain names who authorized it, and the anchored root fixes the state at the time of the trade. “Was this authorized, and by whom?” stops being an argument and becomes a lookup.

Vendor-vetting + crypto-AP — spend

An agent vetted a supplier and released an AP payment; finance later flags the payee. The content-hashed recommendation proves exactly what the agent decided on (no after-the-fact edit), and the delegation proof names who authorized the release. If the vetting was sound and the authorization valid, the organization is covered; if not, the precise failure point — bad input vs. bad authority — is provable rather than argued.

Due-diligence scan — decision

An agent pre-screened a counterparty and cleared them; the counterparty later turns out to be sanctioned. A regulator asks what the screen actually checked. Because the finding set is Merkle-committed with the count N bound in, the team can prove the complete set of checks the agent ran — not a flattering subset — and the anchored timestamp shows it ran before onboarding, not reconstructed afterward.

Deliberation council — decision

A multi-agent council recommended “go,” and one member's input is later challenged as compromised. Per-agent delegation chains show which agents took part and under whose authority, and the signed record of inputs shows exactly what each contributed. A single suspect input can be isolated and re-weighed without discarding — or blindly trusting — the entire decision.

Deep-research agent — data

An agent produced a memo that shaped a strategy; someone later claims it rested on a planted source. The audit attests that content-trap scanning (CaMel L1/L2) was applied to ingested web content, and the findings are reproducible via the open-source framework — so “did you ingest manipulated content?” gets a verifiable answer instead of a shrug.

Neutral-notary attestation — “who audits the auditor?”

BlindOracle audits a third party's agent on a buyer's behalf, and the buyer reasonably worries the auditor is conflicted. It doesn't matter: the report is content-hashed (BO can't revise it), the findings are N-bound (BO can't drop the unflattering ones), and the root is anchored publicly. The buyer verifies the audit without trusting BlindOracle — the conflict is engineered out, not promised away.

Why it matters

Selling an agent into a regulated environment stalls on one objection: your audit is only defensible if the customer can verify it themselves. A PDF doesn't clear that bar; a record three independent reviewers can each break-test does. That's the difference between agent “observability” and an audit that survives a hostile reviewer — and it's the part a raw logging stack structurally cannot give you.

And it closes the loop on the two questions every one of those reviewers eventually reaches: “is this record real?” (integrity — the content-hash in the 30105 proof) and “who is responsible?” (authority — the HMAC-signed 30014 delegation chain back to a named operator). An action you can prove happened, attached to a principal you can name. Logs give you neither under challenge; this gives you both.

Get one agent audited — free

Pick one agent you already run. We return a verifiable ProofOfAuditReport and a 5-framework gap map. Reproduce it yourself with the open-source framework.

See the methodology MASSAT on GitHub

Mechanics referenced are live today: ProofOfAuditReport (kind 30105), ProofOfStateAnchor (kind 30106), ProofOfDelegation (kind 30014), Merkle completeness commitments, and the open-source MASSAT framework. Reviewers are illustrative composites; no external client or SOC 2 attestation is claimed. Published 2026-05-29.

Operated by Craig M. Brown · Back to blog · Audit methodology

Related reading — the BlindOracle trust stack

How agents establish trust, get audited, and settle — verifiably.

BlindOracle home
How it works
Audit methodology
We audited our own agents
Agent Audit Evidence Kit
Verifiable audit methodology
Auditable AI proof chains
Verifiable agent delegation
MASSAT crosswalk (worked example)
Compliance-hook codewalk
Agents without surveillance
Agent trust via Nostr proofs
The trust gap in the agent economy
Trust an agent you've never met
When agents pay agents
The agent security crisis
Trust overview
Pricing