The brief. Cartwright Re's cover note says "risk-adjusted rate change circa +5%". Verify that against the data: the 2026 and 2027 submissions are both on the mesh, layer by layer. Implement
RateChangeso the battery goes green — then decide whether the broker's "circa +5%" is honest.
The point of this drill is that a rate change is per layer. The blend (premium totals 1,005,000 → 1,056,000 = +5.07%) happens to say +5% here, but it mixes two different moves: Layer 1 +4.0% and Layer 2 +6.25% — the cedent is paying up disproportionately for the top layer. The battery makes you produce all three numbers.
The rules
RateChange(oldRol, newRol)returns the relative change, e.g.0.04for +4%.- Layer 1: 7.5% → 7.8% must yield +4.00%. Layer 2: 3.2% → 3.4% must yield +6.25%.
- Subject premium 120m → 127.5m must yield +6.25% through the same function.
Your workbench
using MeshWeaver.Layout;
using MeshWeaver.Layout.Composition;
using MeshWeaver.Layout.DataGrid;
using MeshWeaver.Utils;
record Row(string Item, double Y2026, double Y2027, double Change, double Expected, string Result);
// YOUR DIFF — the relative change from the 2026 figure to the 2027 figure.
static double RateChange(double y2026, double y2027)
=> 0.0; // TODO: (new − old) / old.
(string Item, double Y2026, double Y2027, double Expected)[] moves =
[
("Layer 1 RoL (7m xs 3m)", 0.075, 0.078, 0.04),
("Layer 2 RoL (15m xs 10m)", 0.032, 0.034, 0.0625),
("Subject premium", 120_000_000, 127_500_000, 0.0625),
];
var rows = moves.Select(m =>
{
var c = RateChange(m.Y2026, m.Y2027);
return new Row(m.Item, m.Y2026, m.Y2027, c, m.Expected, Math.Abs(c - m.Expected) < 1e-9 ? "✓" : "✗");
}).ToArray();
var premChange = RateChange(1_005_000, 1_056_000);
Controls.Stack
.WithView(Controls.H4($"Rate-change battery — {rows.Count(r => r.Result == "✓")}/{rows.Length} rows green"))
.WithView(Controls.DataGrid(rows)
.WithColumn(new PropertyColumnControl<string> { Property = nameof(Row.Item).ToCamelCase() }.WithTitle("Item"))
.WithColumn(new PropertyColumnControl<double> { Property = nameof(Row.Y2026).ToCamelCase() }.WithTitle("2026").WithFormat("G6").WithAlign("end"))
.WithColumn(new PropertyColumnControl<double> { Property = nameof(Row.Y2027).ToCamelCase() }.WithTitle("2027").WithFormat("G6").WithAlign("end"))
.WithColumn(new PropertyColumnControl<double> { Property = nameof(Row.Change).ToCamelCase() }.WithTitle("Change").WithFormat("P2").WithAlign("end"))
.WithColumn(new PropertyColumnControl<double> { Property = nameof(Row.Expected).ToCamelCase() }.WithTitle("Must be").WithFormat("P2").WithAlign("end"))
.WithColumn(new PropertyColumnControl<string> { Property = nameof(Row.Result).ToCamelCase() }.WithTitle("Result"))
.Resizable(false))
.WithView(Controls.Markdown(
$"**Premium @100% moves** 1,005,000 → 1,056,000 = **{premChange:P2}** — the broker's \"circa +5%\" blends a +4.00% and a +6.25% move. True per the blend, silent about the shape."))
The habit to build: when a cover note gives you one number for the year, open the two submission nodes and diff them per layer before you nod.
Battery green? Reveal the solution — and what to write back to Cartwright Re.