Unstructured, disconnected
Text logs record lines, not decisions. They do not tie the turn sequence, the exact tool parameters, and the ALLOW/DENY/MODIFIED outcome into one coherent record.
Raw stdout logs are notes, not evidence: they can be altered, and they rarely tie the agent's turn, the tool parameters, and the policy decision into one verifiable state. Proof-of-Intent converts each turn into a proof envelope, links every envelope to the one before it with a SHA-256 hash chain, and signs the assembled bundle with HMAC-SHA256. Verification recomputes the signature and re-walks the chain offline. The envelope references the tool result by hash, so you can prove exactly what happened without exposing raw responses or PII.
For each agent-tool interaction the gateway builds a proof envelope and stamps it with a hash computed as Hash_N = SHA-256(EventData + Hash_(N-1)), so each entry carries a prev_hash that points at the previous turn.
Because every envelope links to the one before it, altering or deleting any past turn changes its hash and breaks every link that follows, the chain fails verification instantly. The assembled bundle is then signed with HMAC-SHA256 using the gateway's key, and verification recomputes that signature and re-walks the links, offline.
hash: 9f2a…hash: 11bc…hash: a904…recompute HMAC-SHA256 · re-walk prev_hashA proof envelope is metadata and signatures, not payload. It binds the parts that establish what was meant to happen and whether it was authorized, and references the result by hash. The raw response never enters the envelope.
A unique, time-ordered event id and a timestamp give the turn a fixed place in the sequence, so the record can be reconstructed in order.
ORDERThe agent identity and the tool it tried to call, for example a billing copilot invoking a create-payee action, are bound into the envelope.
WHOThe policy decision, ALLOW, DENY, or MODIFIED, with the check that made it, a short human-readable reason, and a one-line summary of the declared intent.
DECISIONThe tool result is referenced only as result_sha256, a digest that proves what came back without ever carrying the raw response or any customer data.
A prev_hash links the entry to the previous turn, and the bundle carries an HMAC-SHA256 signature plus a key_id that names the signing key without exposing it.
Traditional stdout logs leave three gaps that matter the moment anyone asks a hard question. The hash-chained ledger closes all three with a single structure.
Text logs record lines, not decisions. They do not tie the turn sequence, the exact tool parameters, and the ALLOW/DENY/MODIFIED outcome into one coherent record.
Auditors ask precise questions: did the user authorize this, and did a policy engine check it? Scattered logs cannot answer deterministically; a bound record of intent and decision can.
Plain text can be altered, deleted, or spoofed. The prev_hash linkage makes any edit self-evident, a record anyone can quietly change is a note, not evidence.
Stated plainly, without overclaiming. The cryptography and offline verification are real; the parts that are optional or on the roadmap are marked as such.
The SHA-256 hash chain, its prev-hash linkage, the tamper-evidence that linkage provides, and offline verification are real and shippable. Each entry carries a unique, time-ordered event id.
The bundle is signed with HMAC-SHA256 using the gateway's signing key, it is not an ECDSA node key pair. The key_id names the key without exposing it.
The envelope references the tool result by result_sha256, so it holds a hash and never the raw response or PII. It still binds the declared intent, the tool, and the decision, which stay inside your customer boundary. What crosses the federation boundary is zero-payload: counts and hashes only.
The local hash-chained ledger and SIEM export to Splunk, Microsoft Sentinel, and S3 are real and shipping, and the enterprise Kafka audit stream is now available too, opt-in and additive, never an inline dependency. Automated GRC auto-close into ServiceNow or OneTrust is not yet wired.
Proving what happened is the evidence layer of the MCP firewall. It composes with the controls that clean what the model reads, decide whether a call should fire, and bound how much an agent may do.