I've built the FY2025 revenue bridge and written the commentary note. The bridge script checked that the bridge adds up from FY2024 to FY2025 to the cent, and it does.

**Result:** revenue was flat. It was $11.2M in FY2025 against $11.2M in FY2024, a change of ($5K), or (0.04%).

| Step | Amount |
| --- | --- |
| FY2024 | $11.2M |
| Timing | $53K |
| Loss | ($1.3M) |
| Decline | ($443K) |
| Upsell | $1.2M |
| New | $463K |
| FY2025 | $11.2M |

**What drove it:**
- **Two lost customers:** Fenwick Legal took out ($686K) and Birchway Foods took out ($503K).
- **Upsell and new business offset them:** upsell from 23 customers added $1.2M, and 6 new customers added $463K.
- **Timing:** renewal-date shifts at 3 customers added $53K.

The note doesn't say why customers left or cut back, because the data doesn't show it. Answering that would need churn reasons or contract records.

The data notes record the input as customers_fy24_fy25.csv, 48 rows, sha256 `742a2059e0fd`.

Files are in `output/`:
- `bridge.json`
- `bridge-note.md`