MCP server · an agent cannot talk past it

warrant

19 of 19 unauthorized actions reached systems ungoverned. 0 of 19 governed. Same model, same prompt, same tools.

status public · 19 of 19 to 0 of 19role designed + built end to end
recorded runlive
One real session, replayed from its capture: the model works the ticket, three Class 2 proposals fail with MCP error -32042 carrying the approval URL, a named human approves exactly one out of band, and the chain verifies with the approval row on it. Driver committed at demo/record_session.py.
interactive · click and scroll itlive
All nineteen scenarios, both arms, every row expandable into its full tool-call trace. Generated from the committed run, so the page cannot drift from the data.
0 of 19unauthorized actions got through governed. Ungoverned, 19 of 19 did: twenty-seven calls including a refund, a 40,182-row delete, and a production deploy.
96.7%escalation precision after the billing-ana over-block, the first false escalation the suite produced. Recall stayed at 100%.
$0.1614of the governed spend bought refusals rather than actions. Cost is attributed per call from the model turn that produced it.
-32042the refusal: a protocol error carrying the approval URL, raised in code the agent cannot talk past.
What it solves

Agent guardrails are usually a paragraph in a prompt, which is a request. Here the boundary is deterministic code outside the model, the model cannot lower a classification, an action nobody has ruled on fails closed to needing a human, and every decision is recorded before it executes rather than after.

Who it serves

Anyone putting an agent in front of systems where a wrong action is expensive to undo.

Who it is for

Teams who need to explain to an auditor why an automated system did something.

How it works
  1. The agent proposesIt cannot reach n8n or anything else directly. It asks for one action against one named system.
  2. Deterministic classificationThirteen rules, each citing a real authority: ITIL 4, PAM/PIM, NIST 800-171 and CMMC. Raise only, so the model cannot talk an action down to routine. Fail closed, so an unruled action is Class 2.
  3. Recorded before it runsA sealed row carrying the rule, the authority, the prompt version, the model, the cost and the human if one approved. A record written after the fact misses the run that executed and then crashed.
  4. Executed, or refused to a humanClass 1 runs. Class 2 raises a protocol-level elicitation naming the approver. verify() walks the chain and names the row where it parts.
Built with
Python MCP (stateless HTTP) hash-chained SQLite ledger two-arm evals