Gaps in an outwards programme are rarely decisions. Someone loaded the new surplus treaty before the last 5% line was signed. The underwriting team launched a cyber product in June and the reinsurance team heard about it in the board pack. Last year’s quota share was never marked as expired, so a late-reported risk matched it. Nothing about any of these is hard to fix. What is hard is noticing, because none of them produces an error: the cession engine does exactly what the programme says, and the programme is wrong.
The first time most carriers notice is a large loss on a line they thought was protected, or a bordereau that bills a reinsurer for a share nobody signed. The programme gap agent exists to make that the second time.
Six checks, one record
Every twelve hours, in the programme step, the agent reads the active treaties, their layers and their panels, and the recent policy transactions the engine could not cede. It looks for six kinds of gap and writes them into one decision about the outwards programme as a whole:
| Gap | What it means | The fix proposed |
|---|---|---|
| No panel | An active treaty with no participations: anything ceded to it is owed by nobody | Add the participations — reinsurer and signed line |
| Panel not 100% | A treaty or layer whose signed lines total more or less than 100% | Complete the panel, or record the unplaced share as retained |
| Overlapping cover | Two proportional treaties covering the same line, in force at the same time, at the same inuring order: a risk can be ceded twice | Set the inuring order, or scope one of them |
| Expired but active | A treaty year past its expiry date still marked active, so the engine keeps matching it | Expire the year, or extend it |
| Unscoped | A treaty with no line-of-business scope, so it applies to every line | Scope it to the lines the slip names |
| Unprotected line | Policies on a line no active treaty covers were bound and kept gross, with the premium retained | Scope a treaty to the line, or confirm it is meant to be retained |
flowchart TD
T["Active treaties · layers · panels"] --> C1["No panel"]
T --> C2["Panel not 100%"]
T --> C3["Overlapping
proportional cover"]
T --> C4["Expired
but active"]
T --> C5["Unscoped"]
E["Policy events the engine
could not cede"] --> C6["Unprotected
line"]
C1 --> D["One decision: the gaps, the fixes, the money at stake"]
C2 --> D
C3 --> D
C4 --> D
C5 --> D
C6 --> D
D --> M["A manager decides, and edits the programme where it is maintained"]
M --> N["Next run: the gap is gone, or still there"]
The overlap check is the one that needs a word of explanation. Contracts in a programme respond in an order — the inuring order — so that a facultative certificate or a quota share takes its share first and the excess of loss above it sees what is left. Two quota shares on the same line, in force at the same time and at the same place in that order, each take their share of the same gross premium and the same loss. Nobody intends that; it happens when a new treaty is loaded without its order set, or when one of the two was meant to be scoped to a different line and was not.
The money on the decision is the sum of what each gap puts at risk: the estimated premium income of a treaty with no panel, the unplaced share of a short panel’s premium, the retained premium on an unprotected line. Expired and unscoped treaties carry no amount of their own; they are about which contract responds, not how much. If a model is reachable it writes the explanation and may reorder or reword the steps; the gaps themselves are found before it is asked, and its catalogue entry forbids it to propose a change to a contract term.
Two of the six also become tasks without the agent. The ledger’s own sync opens a task in the managers’ queue for each unscoped treaty and each panel that is not 100%, on a business-hours clock, and closes it when the programme no longer shows the gap. The Programme page’s Gaps in cover card reads unscoped treaties, short panels and business that found no cover straight from the ledger, so those are visible even when nobody opens the queue.
Use case details
| Programme gaps | |
|---|---|
| Trigger | Scheduled, every 12 hours (the programme step), over the whole outwards programme |
| Actor(s) | Head of reinsurance or a reinsurance manager; underwriting for a line’s intent; the broker for an unsigned line |
| Agent | programme_gap_agent, action gap_fix |
| Grounded in | cede_treaty, cede_treaty_layer, cede_participation, and cede_inbound_event policy events with nothing ceded |
| Prepares | One decision listing every gap with its evidence, the proposed fix for each, and the premium at risk |
| Checkpoint & default level | gap_fix at L1 Draft |
| What a person decides | Which gaps are real, which are intended, and how each real one is fixed in the programme |
| What is recorded | The run, the decision with each gap as evidence, the answer and any change as feedback; separately, the managers’ tasks for unscoped treaties and short panels |

The demo programme: five lines with nothing above them
The demo ledger’s treaties are clean on the first five checks: every active treaty is scoped, every panel adds to 100%, nothing has expired while still active. The sixth check finds five lines that were written and kept gross, with $12,482,900 of retained premium between them.
pie showData
title Demo: retained gross premium ($K)
"Medical malpractice" : 8444.9
"D&O" : 1625
"Cyber" : 1388
"General liability" : 750
"E&O" : 275
The model’s explanation ranks medical malpractice first at about 68% of the total, says the
evidence holds no retentions, limits or counterparties so no terms for new cover are proposed,
and asks for each line to be either scoped to a treaty or confirmed as retained, with the
approver and the date. That is the right shape of answer. But one of the five is probably not a
gap in cover at all. The casualty quota share is scoped to general_liability and
GL; the policies arrived from underwriting as general liability, with a
space. The line is matched as text, so the engine kept the premium gross and the agent reported
an unprotected line. The fix there is a vocabulary — scope the treaty with the code
underwriting actually sends — and only a person who knows both systems will see that.

Two of the three gaps took a phone call and a correction. The third was a decision that had already been made and never written down, and the agent cannot know that — which is the first limitation below.
What it does not do
- It cannot record “retained on purpose”. There is no flag for a line kept gross by design. An intended retention is reported on every run that finds no open decision for it; leaving the latest one unanswered keeps it quiet until it expires after fourteen days.
- It does not edit the programme, and neither does Cede. There is no screen in this build to add a participation, scope a treaty or expire a year: the programme is loaded from the carrier’s own programme record, and that is where a fix is made. Accepting the decision records agreement, not a change.
- Lines are matched as text. Case is ignored; spelling is not. A code that differs between underwriting and the treaty scope shows as an unprotected line, as in the demo.
- Overlaps are checked for proportional treaties only. Two excess of loss contracts on the same layer, and a vertical gap between one layer’s exhaustion and the next layer’s attachment, are not checked.
- Unprotected lines come from recent refusals. The check reads the latest 500 policy events the engine could not cede and sums each one’s premium. A line bound before that window, or written in a system that does not send events to Cede, is not seen.
Why the fix is a proposal
Every fix on this list changes which contract responds to a loss. Scoping a treaty to a new line changes what the reinsurers agreed to cover, which is a conversation with the broker and the panel, not a field in a database. The agent’s job is to make sure that conversation starts in July, not after the first cyber claim.
If you suspect your programme has a gap the cession history would show, talk to us about loading it into a demo ledger and reading the first decision together.