I've built the FY2025 revenue bridge and written the commentary note. The script reconciled to the cent: FY2024 plus timing, loss, decline, upsell and new equals FY2025.

FY2025 revenue was $11.2M against $11.2M in FY2024, a change of ($5K), or (0.04%). Revenue was flat, but there was heavy movement underneath:

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

- **Losses:** Fenwick Legal (($686K)) and Birchway Foods (($503K)) account for most of the loss. Four customers were lost in total.
- **Offsets:** Upsell across 23 customers and six new customers made up nearly all of that loss and decline.
- **Causes:** The note names no causes, because the data doesn't show why customers left or grew.

The note's figures are copied from the script's display strings, and its data line gives the file, 48 rows and the sha256 prefix.

Files are in `/tmp/spb-revenue-bridge-fy25-claude-b7cz48li/output/`:
- `bridge.json`
- `bridge-note.md`