Ceded reinsurance is audited from the outside in. The external auditor samples recoverables and asks for the bill. The reinsurer's claims team asks when they were told. The regulator asks for Schedule F and then for the support behind a line. In each case the question is not only “what is the number” but “who decided, on what, and when”.

Once agents prepare part of that work, the question gets a new branch: which parts did a machine prepare, at what level of authority, and which did a person approve? InsightCede answers it by refusing to let an agent do anything that is not written down.

Three records for every piece of work

Every time an agent runs, whatever happens, a run row is written: who it ran as, at what level and what limited it, the prompt it read, the model, tokens, cost, latency, the trace id and the outcome. If it found something for a person, it writes a decision row: the subject, the money, the evidence, the proposal and the explanation. And when a person answers, the answer is written back to the decision and recorded as feedback against the agent and action, which is what the autonomy roll-up reads.

erDiagram
    AGENT_RUN ||--o| AGENT_DECISION : prepares
    AGENT_DECISION ||--o| HELD_MESSAGE : "holds a send"
    AGENT_DECISION ||--o| PULLBACK_WINDOW : "opens at L3"
    AGENT_DECISION ||--o| FEEDBACK : "answered as"
    FEEDBACK }o--|| AGENT_STATS : "rolled up into"
    AGENT_RUN {
        string agent_code
        string autonomy_level
        string limited_by
        string prompt_version
        string model
        float cost_usd
        string trace_id
    }
    AGENT_DECISION {
        string title
        string evidence_json
        string proposal_json
        float amount
        string decision_status
        string decided_by
        string delta_json
    }
How the records join. The run carries the model and the cost; the decision carries the evidence, the proposal and the answer; the held message carries what would leave. A decision without a run does not exist.

Every row the agent writes during the run is also stamped. The run happens inside an acting context: created_by and modified_by become agent:<code>, and the row's properties carry the full actor — the agent, its level, and, when a person's acceptance applied the proposal, who approved it and on whose behalf. The listener fires only while an agent identity is current, so a person's own request is never re-stamped. An in-process call the agent makes is made with a short-lived token carrying an act claim, minted by the identity package and never taken from a request.

What one run looks like

This is a real run record from the demo programme — a demo US property-casualty carrier, not a customer — read from the live API. It is the collections agent's chaser to Munich Reinsurance America for $15,730,529.

FieldValueWhat it answers
agent_code · actioncollections_agent · send_chaserWhich agent, doing what
trigger · actorschedule · jobsWhy it ran: the scheduled settlement step, not a person
level · limited_byL2 · agentThe authority it had, and that the agent's own setting was the binding limit
prompt_name · prompt_version · prompt_sourcecollections.chaser · db-v1 · dbWhich instructions it read, and that they came from the product's own row
model · llm_callsus.anthropic.claude-haiku-5-5 · 1Which model wrote the explanation and draft
tokens · cost_usd · latency_ms501 in, 1,251 out · 0.000676 · 6,850What it cost and how long it took
trace_idnoneNo Lense trace: the exporter is off in the demo
outcome · decision_guidprepared · f6b663e9…It stopped and asked; the decision it wrote
50agent runs on the demo ledger
46with a model call
$0.0276recorded model cost across all of them
0with a Lense trace id
Admin · Agents · Agent
One agent's page: its summary, actions and checkpoints, the model it uses, the cost of its recent runs, and a list of runs where one is opened to its trace with model, prompt, tokens, cost and duration
Open a run, then read the key facts block. Model, prompt name and version, model calls, tokens in and out, cost and how long it took — the same fields as the table above, drawn from the run row.

The decision row, and its states

A decision row is what a person reads and answers. Its evidence is a list of label, value and source — every figure with the ledger table it came from and a link into the ledger where there is one. Its proposal says what accepting does: a send with recipients and a draft, a strike, a programme fix with steps, a credit proposal, a Schedule F draft. Its amount is the money at stake and the queue's first sort key; its deadline depends on the step, from two days for erosion notices to fourteen for programme work.

StatusHow a decision gets there
openPrepared and waiting for a person
accepted · changed · rejectedA person's answer, with decided_by, decided_at, and for a change the delta they made
askedNot used as a final state: an Ask appends the question to the note and the decision stays open, with no feedback recorded
actedActed at L3 or L4; for L3, after the pull-back window closed
notedExplained, nothing for a person to answer — a clean cession is noted on the event, not queued
supersededA later run prepared a different proposal for the same subject; an unchanged one is left alone
expiredStill open fourteen days past its deadline, so the queue stays honest; the agent prepares anew

A decision pulled back inside its window does not get a status of its own: the held message is cancelled, the decision reopens at L2, and the note says who pulled it back. A send that fails on release is parked the same way, back with a person, never retried blind.

Decision record
A collections decision record: the agent and level, the recommendation with the amount, the evidence grouped by source table, the drafted chaser held in the outbox, and the four answers
The header line is governance. Agent, lifecycle step, level, how long ago it was prepared, and a dry-run badge when it was one. Below it, every figure in the evidence names its source table.

The dial is a record too

Changing what an agent may do is written down the same way. Setting a level or switching an agent off needs a manager or an administrator and a reason; the request is refused without one. The autonomy row keeps who set it, when and why, and an automatic demotion is written by the roll-up under its own name with the sentence that justified it — “People agreed with only 13 of 22 answers (59%) in 30 days” — so a level that moved without a person is distinguishable from one a person moved. Accepting a promotion records the recommendation it accepted. The ceiling is the one setting that is not on the page: it is the deployment's environment, changed by whoever changes the deployment.

One flow, end to end

Use case detailsA person answers a prepared decision
TriggerA person presses Accept, Change, Reject or Ask on an open decision
Actor(s)The analyst or manager answering; the agent whose proposal is applied
AgentWhichever prepared it; the act on acceptance runs as that agent, approved by the person
Grounded inThe decision's own evidence and proposal, as prepared
PreparesNothing new: the answer applies or cancels what was prepared
Checkpoint & default levelThe decision's level. At L1 accepting applies nothing unless the person asks it to act; at L2 it applies
What a person decidesThe answer, a reason code, a note, and for a change the field they changed
What is recordedThe answer on the decision; feedback against the agent, action and line (not for Ask); the held message released or cancelled; every row written stamped as the agent, approved by the person

When the model did not write it

If the model is switched off, unreachable or over its daily budget, the run still completes on the facts alone and the explanation ends with a sentence that says so: “(The model did not write this explanation: … The evidence stands on its own.)”. The step records a deterministic stand-in call. Nobody reading the record can mistake a template for the model's words.

A figure comes from a committed row or it is not in the record. A contact comes from the reinsurer master or the draft has no addressee.

What it does not do

  • The prose is instructed, not checked figure by figure. Every agent's prompt says to use only the evidence and cite it, and the evidence and amount come from the ledger. But the platform's grounding guard — which throws away model text containing any number not in the facts — is not yet called by Cede's agents. In the demo, the counterparty agent's explanation states that Munich's excess over the 25% limit is “about $2,621,755”, a figure it calculated. It is right ($15,730,529.10 less $13,108,774.25), and nothing checked it.
  • The demo has no traces and no released prompts. The Lense exporter is off unless an endpoint is set, so trace_id is empty, and InsightPrompts is not configured, so every run read the product's own prompt row (db-v1).
  • The prompt text itself is not kept. Traces carry no prompt or response text unless capture is switched on. What the model saw is reconstructed from the evidence and the prompt version, not read back verbatim.
  • Model and cost live on the run, not the decision. They join on the run guid. A report on decisions alone will not show what they cost.
  • The dial's own history is short. An autonomy row records who set it, when and why, and keeps its last twenty changes in its properties; anything older is in the audit of the change, not on the row.

Talk to us about audit and controls →

← All posts   Request a demo