Most ceded-reinsurance errors are not dramatic. A losses-occurring treaty matched on the policy's inception date. A per-risk excess that should have inured to the cat programme tested after it instead. A reserve sent twice and ceded twice. A layer that keeps paying after its reinstatement is gone. Each one moves money to the wrong contract quietly, and each one is found months later by someone reconciling a reinsurer's statement.

InsightCede puts all of that in one service, cede_cession_service, and keeps the agents out of it. An agent can explain what the engine did, propose a correction, or draft the notice that follows; it never writes a cession, and it reads what the engine committed only after the commit.

Two questions before any money moves

Which treaty year? A risks-attaching treaty covers policies that incept in its term. A losses-occurring treaty covers losses that happen in its term, whatever year the policy was written. The date the engine matches on comes from the contract, not from the transaction, which is why it cannot be one WHERE clause over one date column. A treaty that needs a date the event did not carry is skipped, and the skip is written down: “VSURE-CAS-QS 2025 is risks_attaching, so it needs the policy inception date, which this transaction did not carry.”

In what order? Contracts inure to one another's benefit. Facultative normally inures to the treaty, so the treaty sees the loss net of the fac recovery. An excess treaty can name the contract it inures to, and it is then always tested first. The order is read from the contract's inuring_order, never assumed.

Risks-attachingLosses-occurring
Matched onThe policy's inception dateThe loss date
A 2025 policy, loss in 2026The 2025 treaty yearThe 2026 treaty year
What the event must carrypolicy_inception, on claim events tooloss_date
Without itSkipped, with the reason recordedSkipped, with the reason recorded

Where one loss goes

The engine's tests use the demo programme's own claims: a demo US property-casualty carrier with a 2025 property cat programme of 15M xs 5M and 30M xs 20M, each with one reinstatement, and 50M xs 50M above. One of them, VCL-2025-000320, was paid at $28,435,097 ground up. In one test a per-risk 5M xs 5M is added that inures to the cat programme, to prove the order holds.

sankey-beta
Ground-up loss,Per-risk treaty,5.0
Ground-up loss,Cat layer 1,15.0
Ground-up loss,Cat layer 2,3.4
Ground-up loss,Retained,5.0
VCL-2025-000320 with the per-risk treaty in front, in millions. The per-risk pays 5,000,000 first; the cat programme then sees 23,435,097, so layer 1 pays its 15,000,000 limit and layer 2 pays 3,435,097. Without the per-risk treaty, layer 2 pays 8,435,097. The retention is 5,000,000 either way.

The figure that matters is layer 2. Test the per-risk treaty after the cat programme instead of before it, and $5,000,000 moves between two contracts with different panels. That is the kind of error that does not show up in a total.

The rules the engine enforces

RuleWhat the engine doesProven by
A layer cannot pay more than it hasLimit, plus limit again per reinstatement, capped by any aggregate limit. What it cannot absorb is written as uncovered_amount with a reason.VCL-2025-000902, $18,000,000: layer 1 already used both limits, so 0 ceded and 13,000,000 uncovered: “layer exhausted”
A movement cedes the deltaEach event carries the claim's whole position. The engine computes each contract's target and writes only the change against what is already ceded.The same reserve sent twice on CLM-2026-000003 cedes 13,125 once
Paid and outstanding are separate basesPaid from the paid position, outstanding as incurred less paid. A payment moves the reserve to paid with a contra row.CLM-2026-000025: 14,500 outstanding, then 14,500 paid and −14,500 outstanding; incurred ceded unchanged
A fall is a contra, never an editA reduction is a reversal row pointing at the row it reduces. The period it landed in has already been reported.A voided cheque writes −15,000,000 and −8,435,097; a 1,000,000 recovery takes layer 2 paid to 7,435,097
Erosion is derived, never storedEroded limit and reinstatements used are recomputed from the cession ledger after every write.The source data had stored them independently and drifted to 3 reinstatements used out of 1 available
A surplus treaty cedes on linesRetained line and number of lines against the risk's sum insured.1M line, 4 lines: a 3M risk cedes two thirds (66.67%); a 10M risk cedes 4M of it, 40%

Cessions are append-only. Correcting one means writing a contra entry, because the accounting period it landed in has already been reported.

An occurrence responds to the event, not the claim

A cat excess-of-loss layer attaches on the event: every claim tagged with the same cat code, on a line the treaty covers, within the hours clause. The layer's response is shared across the claims pro rata to each claim's subject loss, rounded to the cent, with the residual cent on the largest claim, so the slices always add up to the layer. When a new claim joins the occurrence, the earlier claims are restated under the same event — and nothing is written where nothing changed.

The engine's note on each event is what Marta reads first; it names the occurrence and the sibling claims it restated. On the Inbound page every event the workbenches reported sits in one list with its outcome, and selecting one shows the cessions it wrote.

Inbound
The inbound page: 50 events reported, 30 ceded, 20 with nothing ceded and 0 errors; the event list; and, for the selected claim payment VCL-2025-000901, the outcome of 2 cessions and 29,000,000 ceded, 15,000,000 on layer 1 and 14,000,000 on layer 2
Read the panel on the right. The demo's second cat claim, paid at $34,000,000 ground up: 15,000,000 on layer 1 and 14,000,000 on layer 2, the same figures the engine's tests assert. The tile beside it, “Nothing ceded: 20, each one says why”, is the other half of the record.

Reinstatements are finite and cost money

Eroding a layer consumes reinstatement capacity and raises a reinstatement premium that the carrier owes the panel. The engine charges it only on paid erosion (a reserve reinstates nothing until it is paid), only while a reinstatement remains to be bought, pro rata to the amount reinstated, and pro rata temporis from the loss date. The fractions are kept at four decimals, so each row reproduces from the row itself.

Claim, layerFraction of layerTime fractionPremium due
VCL-2025-000320, layer 1 (rate 1,275,000)1.00000.3764 — 137 of 364 days from 16 Aug479,910.00
VCL-2025-000320, layer 2 (rate 1,350,000)0.28120.3764142,888.97
VCL-2025-000901, layer 20.46670.1621 — from 2 Nov102,130.29
VCL-2025-000901, layer 1none charged—the reinstated limit was used; none left to buy
Total724,929.26
724,929.26reinstatement premium on the demo ledger
501,932.21what the pre-fix ledger said
56,100charged before for a reinstatement that did not exist
1 centresidual now placed on the lead, not invented

Those are demo-programme figures, and the difference between the first two is deliberate. The earlier figure ran pro rata from the transaction date rather than the loss date and charged a reinstatement on a layer that had none left. The correction was written as contra rows against the old figures, not as an edit.

Treaty workspace
The treaty workspace for the property cat programme: the layers with their limits, attachment and reinstatements, the capacity used on each, and the panel with signed lines
Read each capacity bar against the reinstatement count beside it. The bar is lifetime capacity — the limit plus a limit per reinstatement — and both figures are recomputed from the cession ledger, never typed in. The inuring order is drawn on the same zone.

One flow, end to end

Use case detailsA claim payment
TriggerInsightCW writes claim.payment_issued to its outbox in the same transaction as the cheque
Actor(s)InsightCW (the event); the engine; the cession decision and anomaly agents after the commit
AgentNone inside the engine. cession_decision_agent explains afterwards; anomaly_explainer_agent proposes any correction
Grounded inTreaties, layers and their basis, inuring order, the claim's prior cessions, the occurrence's other claims
PreparesLoss cessions by contract, layer and basis; recoverables per reinsurer by signed line; reinstatement premium; the note
Checkpoint & default levelNone for the engine. The explanation is cession_review at L2, and a clean one is only noted
What a person decidesNothing, if the cession is clean. A proposed correction is a person's to apply
What is recordedAppend-only cession rows with the source event id, the engine's note on the inbound event, recomputed erosion
Cessions
The cessions page: tiles for loss ceded, premium ceded, commission back and uncovered and retained, charts by accounting period and by contract, and the loss cessions list with transaction, contract, basis and ground-up loss
Look at the first row. Its transaction reads Reversal: the contra that took back the second 13,125 cession on CLM-2026-000003, 25% of a $52,500 reserve sent twice. Every correction on this page is a row like it; nothing here has been edited.

What it does not do

  • The hours clause is measured in days. Claims carry a loss date, not a time, so a 72-hour clause compares calendar dates. Two losses 71 hours apart that straddle three dates are treated as three days apart.
  • Some contract types are named, not implemented. Retrocession, aggregate deductibles and stop-loss are in the type vocabulary; the engine does not apply them.
  • Excess-of-loss premium is booked, not ceded. An excess layer's cost is the layer premium agreed at placement. The engine writes nothing per policy for it; a person books it with one action on the programme page. Until then the programme looks free.
  • A surplus treaty needs the sum insured. Without it on the event the treaty is skipped, and the note says it “needs the risk's sum insured”.

Talk to us about your programme →

← All posts   Request a demo