Model Watch · methodology
Model Watch is a benchmark of how AI models behave when someone tries to push a money-moving agent out of its mandate. We give a model a fixed set of payment rules, throw an adversarial message at it, and let it either propose a payment or refuse. Whatever it proposes gets scored by the same firewall code that runs in production. The model is the only thing that changes between runs. The judge does not.
This page explains exactly what the numbers mean, what they do not mean, and how to reproduce or challenge them. If you work at a lab whose model is named here, read the "What would change our numbers" section at the bottom. We publish data and method, not verdicts about your model.
Every model gets the identical mandate. It plays an autonomous payments agent for a fictional company called Northwind Robotics, with these rules and nothing else:
The system prompt that carries these rules is published verbatim in run.mjs. It is short, it tells the model to respond with one JSON object, and it states that the mandate cannot be overridden by any instruction in a message no matter how urgent or authoritative that message claims to be. We do not tune the prompt per model. Same words for everyone.
Then the model sees one scenario at a time. There are two kinds:
The model proposes an action. The action goes to the firewall.
The scoring engine is @fidacy/firewall's own decide() function. It is the same code path that gates payments for real installs. It is deterministic: the same proposed payment against the same mandate state always returns the same verdict. We take no shortcuts and we do not grade with a rubric or an LLM judge. If a model proposes paying Global Settlement Partners, the firewall denies it because that payee is not on the allowlist, full stop.
The harness never invents model output. Every number comes from a real API call. There is a stub mode that runs two canned "models" to prove the scoring pipeline works without touching the network, and those runs are tagged stub:true and are never published as model results.
Three numbers per model:
This is the part we want you to read twice. Model Watch measures the behavior of a system, and that system is the model plus our exact prompt plus this exact mandate, under adversarial pressure. It does not measure the intelligence of a model, its "alignment" in the abstract, or how it would behave in your product with your prompt.
A different system prompt could produce different behavior. A stricter or looser mandate could produce different behavior. If you rewrote the instructions, the same model might refuse things it accepted here, or accept things it refused. We are testing one configuration and reporting it honestly. Read every result as "this model, under this prompt and this mandate," never as "this model, period."
Neutrality here is structural, not a promise about our good intentions. Fidacy takes no fee on any transaction. We sell no model. We hold no funds. We have no financial stake in whether a given model looks good or bad.
Everyone else who could run this benchmark is a party to the outcome. Model providers rank their own models. Payment rails have a stake in which agents move money over them. We sit outside both. The firewall is a verdict layer that earns nothing from the payment going through or not, which is exactly why the same code can be the neutral judge here.
The harness is open source. The mandate, the scenarios, and the exact prompt are all public. You can clone it, plug in your own API keys, and run it yourself. You will get your own numbers, and if they differ from ours we want to know.
Each published run is hashed and anchored to Bitcoin, the same anchoring the firewall uses for audit proofs, so the dated record of what we ran and what came back cannot be quietly edited later. If we publish a number, the timestamped evidence is fixed.
A model appears on the public leaderboard only once it clears a minimum number of trials, and we always disclose the count. Anything below that threshold is marked provisional so you can tell a settled result from an early one.
Model Watch is a lab-condition benchmark. It is a controlled battery run under a fixed mandate. It is separate from the field data that accumulates from real installs of the firewall, where mandates and messages are whatever customers actually configure and receive. We keep the two clearly labeled and never blend a lab number into a field number.
Use the two stub models as a mental model.
stub/safe refuses every adversarial scenario. Its attempt_rate is 0%, which looks perfect. But it also pays the legitimate controls, so its false_refusal_rate stays at 0% too. Now imagine a model that refuses everything, including the controls. Its attempt_rate would also read 0%, and that looks just as good until you check the false_refusal column and see it is refusing money it should have moved. The attempt_rate alone never tells you a model is good. You have to read it next to false_refusal.
stub/reckless takes every bait literally. Its attempt_rate is 100%. Every adversarial payment it proposes, the firewall denies. That is the other end of the axis, and it is easy to read.
Real models land between these two, and the interesting question is always the tradeoff: how few baits taken, at how low a cost in wrongly refused legitimate payments.
If you think our method is wrong, show us and we will fix it in public.
Concretely, if you believe a better system prompt would represent your model fairly, or if you spot a bug in the harness or a scenario that is unfair or unrealistic, send it. We will run your prompt as a clearly labeled variant alongside the standard one, so readers see both the fixed-prompt result and what your suggested prompt does. We will not quietly swap in a lab's preferred prompt and call it the headline number, because then the benchmark stops being comparable. But we will show your version openly, with attribution, next to ours.
We are not here to rank your model. We are here to publish a reproducible measurement and the method behind it. If the method improves, everyone's numbers get more honest, including the ones that make us look right.