MODEL → REQUEST → RESPONSE → ACTION
One chain, because the risk moves along it.
A prompt that leaks a customer identifier, a completion that carries an instruction planted in a retrieved document, and a tool call that writes to a system of record are not three products. They are four positions on the same call, and the decision at each of them is taken by the same decision core against the same policy.
Step 01 · Model Which models may be called
Every model is a registry row with a status: pending review, approved, restricted, deprecated or blocked. A model policy carries allowed and blocked model lists, a maximum risk tier and a tier above which approval is required. Approving a model writes who approved it and when.
Models discovered by Shadow AI can be promoted into the registry, and they land as pending review — governed, but not yet approved.
status · risk_tier · approved_by · approved_at Step 02 · Request What may be sent
The prompt is a governed surface, not a log line. Policy is authored against llm.chat.request, whose arguments carry the messages and the model name. Detectors run over the content: secrets are redacted, sensitive data and regulated identifiers are masked, and prompt injection is a deny-class signal because it cannot be safely rewritten.
llm.chat.request Step 03 · Response What may come back
The completion is inspected on the way back, against llm.chat.response. Where the response is the output of a governed retrieval call, an operator can declare it untrusted retrieved content, and the indirect-injection detector inspects it as a payload rather than as an answer — never inferred from a tool name, only from operator configuration or an explicit declaration.
llm.chat.response · retrieved_untrusted Step 04 · Action What may then happen
What the model said becomes a tool call, and that is the action seam. The same core decides it: allow, deny, hold for approval, or narrow the arguments and re-verify them against the exact payload before dispatch. The verdict, its rule and its evidence entry are written to the same hash-chained record as the three decisions before it.
POST /api/v1/gateway/execute Why one chain The registry is the record of approval. The seam is where a call is refused. Models are approved, restricted or blocked at the seam — the registry holds the governance state, the reviewer and the timestamp, and the decision at the call is what actually stops it. Every usage record carries the decision that was reached, and the agent-to-model link is a durable declared association rather than an inference from recent traffic, so a quiet agent does not silently lose its edge in the governance graph.