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 RateChange so 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

  1. RateChange(oldRol, newRol) returns the relative change, e.g. 0.04 for +4%.
  2. Layer 1: 7.5% → 7.8% must yield +4.00%. Layer 2: 3.2% → 3.4% must yield +6.25%.
  3. 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.

← Lesson 1 exercises · Lesson 1 — The submission

Reconnecting…
The connection to the server was interrupted. Trying to restore it…
Trying again…
The connection could not be restored. Reloading the page…
The server was updated. Reloading the page to pick up the latest version.