- what is compared
- 6 positions on the path, not products
- what decides one
- which moments of a request it is present for
- what is not here
- a feature table, which is wrong within a quarter
- as of
- 28 August 2026
Position is the part that keeps. Where a product sits on the path, and who pays it for what, holds for years: a marketplace will not stop being the counterparty, a gateway will not stop thinking in routes, a governance platform will not build a data plane. Features move the other way. The products here are converging on one list from opposite directions, so a cell saying any of them lacks something is wrong within a quarter. The grid below is drawn from position rather than features, and a deployment can be planned around it.
One request, and who is present at each moment
A single call in the order it happens, in the same four bands the product figure draws, from the credential the client presents to the check somebody outside the system can run on what was decided. Under it, one row per product: a filled mark where that product acts at that stage, a ring where it acts only through something else, and the case where it is the right answer and pistra is not. Take a stage and its column lights, with what is true there and what is not.
1 of 10The client authenticates
- on the path here
- A marketplace, a proxy, the API gateway you run, the cloud's own service, pistra. Each issues its own credential and holds the provider's.
- not on it
- A detector and a governance SDK are handed text by an application that already holds the provider key.
2 of 10The request is admitted or refused
- on the path here
- A proxy, the API gateway you run, the cloud's own service, pistra. A key, a model allowlist, a quota, a rule.
- not on it
- A marketplace bills the call it has already made. A detector returns a score and admits nothing.
3 of 10What the request says is read
- on the path here
- A detector, the cloud's own service, pistra. pistra runs the detectors inside the process holding the connection.
- not on it
- A proxy calls a detector over the network, so that detector's latency and its failure mode are the network's.
4 of 10What a tool result says is read
- on the path here
- pistra, on the
tool_resultsegment, by default. That is where an injection arrives when a page an agent fetched carries one. - not on it
- A product that thinks in routes sees one request body. A detector reads a tool result only when the application passes it one.
5 of 10What comes back is read in the stream
- on the path here
- The cloud's own service for its own models, pistra. Inspected as it streams, without buffering the response.
- not on it
- A detector called once the response is assembled answers after the user has read it.
6 of 10The tool call and the message to a peer agent
- on the path here
- pistra, at
/mcp/<name>and/a2a/<name>, under the same keys, rules, budgets and record as the model call. - not on it
- An API gateway with an MCP plugin reaches the call and not what the arguments say. The rest sit in front of a model endpoint.
7 of 10What it cost is settled
- on the path here
- A marketplace, a proxy, the API gateway you run, the cloud's own service, pistra. pistra reserves the cost before the call and settles it against real usage after.
- not on it
- A detector and a governance SDK never see usage. A rate limit counts requests rather than spend.
8 of 10What was decided is written down
- on the path here
- Every position writes something. pistra signs each decision with the key of the node that made it and chains it to the one before.
- not on it
- A record kept in the vendor's account is the vendor's to produce, and says what the vendor chose to write.
9 of 10The claim is checked
- on the path here
pistra audit verifyreads a trail in any order and reports every record altered, removed, moved, forged or cut short.- not on it
- Nothing else on the path offers a check somebody outside it can run.
10 of 10What never came through
- on the path here
- pistra builds a second ledger from the provider's own usage API and judges the two against each other per day.
- not on it
- A ledger inside any product on the path cannot report the traffic that went around it.
| Position | Stage 1: The client authenticates | Stage 2: The request is admitted or refused | Stage 3: What the request says is read | Stage 4: What a tool result says is read | Stage 5: What comes back is read in the stream | Stage 6: The tool call and the message to a peer agent | Stage 7: What it cost is settled | Stage 8: What was decided is written down | Stage 9: The claim is checked | Stage 10: What never came through |
|---|---|---|---|---|---|---|---|---|---|---|
| A marketplaceOpenRouter, Requesty, Vercel AI GatewayA developer with nobody asking. One person, one project, the model changes weekly, and a marketplace that does not store prompts by default beats most teams' own logging. | present | not present | not present | not present | not present | not present | present | present | not present | not present |
| A proxyLiteLLM, Portkey, HeliconeFive people and three providers. Run LiteLLM, and keep it upgraded, because that is where the list of known fields lives. | present | present | present only through another product | not present | not present | not present | present | present | not present | not present |
| The API gateway you runKong, Apigee, Tyk, Traefik, Envoy AI Gateway, kgateway, agentgatewayKeep the one you run. Keys, quotas and a model allowlist are answered by its own AI plugin, on the routes it already owns. | present | present | not present | not present | not present | present only through another product | present | present | not present | not present |
| The cloud's ownBedrock Guardrails, Azure API Management, Model ArmorA single-cloud shop whose verifier reads the account's logs from inside the account. Everything it covers, it covers for that one cloud. | present | present | present | not present | present | not present | present | present | not present | not present |
| A detectorPresidio, Lakera, Prisma AIRS, Guardrails AI, NeMo GuardrailsAny content the process on the path cannot recognise on its own: injection, jailbreaks, toxicity. Buy the detector, then decide separately what holds the connection. | not present | not present | present | present only through another product | present only through another product | not present | not present | present | not present | not present |
| A governance platform's SDKCredo AI, Holistic AI, watsonx.governance, OneTrustOne application, one supported language, no agents talking to tools directly. It stops working at the first service that does not embed it. | not present | not present | not present | not present | not present | not present | not present | present | not present | not present |
| pistraThe whole path, and the two stages past the cut: a record signed on the node that decided, a check somebody outside the system can run, and a second ledger for the traffic that never arrived. | present | present | present | present | present | present | present | present | present | present |
Every position acts somewhere in the first eight stages, and a deployment that needs only what one of them does there is well served by the row that names it. Two of those eight are already thin: the tool result nothing else on the path reads, and the tool call an MCP plugin reaches without reading its arguments. Every product writes something down at the eighth, which is why that column is full and why a record on its own settles nothing.
The line is cut after it. The last two stages are not moments in a request, they are a check run later and a reconciliation run daily, and that is the cell pistra was built for: a record signed on the node that decided it, a check that runs without trusting the store it reads, and a second ledger for the traffic that never arrived. They start to matter at the first question about what a prompt contained, or whether a rule ran, and by then the quarter being asked about has already been forwarded.
Ask about the evidence
Each question asks about a position instead of about anybody's product, so the answers keep for longer than a feature table does. Ask them of any vendor on the figure, and of us.
- Which node signed this record?
- What chains it to the one before?
- Which party, besides the store the records sit in, has to be honest for that check to hold?
A product that has an answer to all three keeps a record you can verify. A product that has an answer to the first two keeps a record that is tamper-evident, as long as nobody cut it short. A product with an answer to none keeps a log, and a log is fine until somebody asks. We are not going to fill these in for anyone else. Ask, and read what comes back.
Our answers
- Which node signed this record?Every record pistra writes is signed with the key of the node that made the decision.
- What chains it to the one before?Each record is chained to the previous one on that node.
pistra audit verifyreads a trail, in any order and with anything interleaved, and reports every record that was altered, removed from the middle, moved or forged, by sequence number. - Which party, besides the store the records sit in, has to be honest for that check to hold?A quorum of your own cluster. A chain cannot show it was not cut at the end, so each node offers its signed head to the raft cluster about once a minute, and
pistra audit verify -headsreports a trail that stops short of a witnessed head. Raft holds the heads and never the records; the records go to your collector, in your account. That answer assumes a quorum, so what it takes to have one, and what stops when it goes, is written down.What a cluster survives
Two limits belong beside that answer. A key used by somebody other than the node is not something a trail can show. It proves what the key signed, and keeping the key where only the node reaches it is the deployment's job. And admitted requests are absent from the trail, on purpose, because the record is bounded and says so.
As of 28 August 2026
The grid is the part of the argument kept current. A post describes the day it was written. The reasoning behind each position is a post of its own in Where control lives, eleven of them, starting at Where AI governance came from and ending with Comparing the six positions. The whole series is on the blog.