Task: Health review 1 — sprint 25 mid-sprint analysis
Table of Contents
This page documents a task in the Sprint health review — System 2 analysis story. It captures the goal, current status, acceptance, and any notes or results.
Goal
Produce a System 2 health review of sprint 25 at mid-sprint (day 5),
covering goal alignment, sprint load, PR velocity, story/task balance,
focus signal, and bookkeeping hygiene. Write the full analysis into
* Result and add a summary row to sprint.org's * Health Review table.
Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Sprint health review — System 2 analysis |
| Now | Complete. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-08-07 |
Acceptance
- Full analysis written under
* Resultcovering all six dimensions. - Summary row added to sprint.org's
* Health Reviewtable.
Plan
- Read sprint.org, every story.org and task file under sprint_25.
- Gather git commit and PR data from GitHub.
- Analyse across six dimensions: goal alignment, load, PR velocity, story/task balance, focus signal, bookkeeping hygiene.
- Write findings into
* Resultwith tables and narrative. - Add summary row to sprint.org's
* Health Reviewtable. - Flag bookkeeping issues found; fix in accompanying commits.
Notes
Test Scenarios
Manual QA scenarios (scaffolded via compass add test_scenario, run
through the QA Validation Runner panel) that verify this task. Link
new ones here as they're created; the scenario doc itself links back
via its "Verifies task" field.
| Scenario | State | Notes |
|---|---|---|
PRs
| PR | Title |
|---|---|
Review
| Comment summary | File | Decision | Notes |
|---|---|---|---|
Result
Review on 2026-08-07 (day 5 of 7)
Goal alignment
Sprint mission: "Resolve sprint drift on as many components as possible and progress IR curves work."
| Goal | Coverage | Stories | Verdict |
|---|---|---|---|
| Resolve sprint drift | Covered — 7 DONE, 4 STARTED | Refactor codegen C++ (STARTED, 21 tasks), Entity classification (BACKLOG, 1), Compass QoL (DONE, 8), Backlog deep refinement (DONE, 1), Systemd resource mgmt (DONE), Reduce DB pool (DONE, 4), Review CLI/shell (DONE, 1), sync_host_envelope (DONE, 1), Fix codegen template drift (BACKLOG, 4), Close systemic codegen gaps (BACKLOG, 2), Investigate grants (STARTED, 1/1 DONE) | GREEN — drift is the dominant theme |
| Progress IR curves | Covered | IR curve bootstrapping (STARTED, 7 tasks), IR rates (STARTED, 19), IR curve follow-ups (BACKLOG, 3) | GREEN — active IR curve work |
| Unmapped stories | Several stories have no clear link to either goal | Holding company treasury, Docs improvements, Normalise NATS protocol, NATS passthrough, Synthetic data scope, Injectable env provider, Fix MSVC, Fix Windows setenv | AMBER — 8 stories don't clearly serve either goal |
Challenge: "Progress IR curves" is covered but the IR curve bootstrapping story has been STARTED since sprint 24 (carried forward) — the sprint table says BACKLOG while the story file says STARTED. Are we actually making forward progress on IR curves, or has momentum stalled? The IR rates story has 19 tasks (some DONE from prior sprints) but is STARTED with no end date — progress is opaque.
The unmapped stories are not noise — they're substantive: holding company treasury (6 tasks, 4 DONE), NATS config passthrough (9 tasks), synthetic data scope (4 tasks). They advance the product but don't serve the sprint mission. This is characteristic of a sprint that pulled in backlog items opportunistically rather than staying focused. Not harmful at day 5 given the drift goal is well-served, but worth watching at close.
Sprint load
| Metric | Value | Target | Status |
|---|---|---|---|
| Commits | 383 | ≤ 1000 | GREEN |
| Days elapsed | 5 | 7 | — |
| Commits/day | 76.6 | — | — |
| Projected total | 536 | ≤ 1000 | GREEN |
The commit rate is sustainable — no signs of bursts followed by stalls. Day-over-day rate has been consistent. The load target is easily met.
PR velocity
| Metric | Value | Notes |
|---|---|---|
| PRs merged | ~50 (from sprint table count) | Includes bot PRs (nightly format ×3) |
| PRs/day | 10 | Healthy pace |
| Projected total | ~70 | Under the 100–120 target |
| Open PRs (fleet) | 1 (#1886, prime_origin) | Filter Market Simulator — 1 day old, not stalled |
| Long-open WIP | None detected | — |
Verdict: GREEN. Merge rate is healthy and there's no WIP accumulation. The projected total of 70 is under the 100–120 soft target, which may reflect the sprint being front-loaded with smaller, focussed PRs rather than a genuine velocity problem.
Story and task balance
| Story | State | Tasks | DONE | Age (days) | Notes |
|---|---|---|---|---|---|
| Open sprint 25 | DONE | 1 | 1 | 1 | — |
| Acme Corporation follow-ups | DONE | 5 | 5 | 2 | — |
| FX Spot wire-codec root cause | DONE | 2 | 2 | 1 | — |
| Holding company treasury | STARTED | 6 | 4 | 2 | 2 BACKLOG tasks remain |
| Refactor ores.codegen C++ | STARTED | 21 | ~10 | 69 | Carried from sprint 24; sprawling |
| Entity classification | BACKLOG | 1 | 0 | — | Undecomposed |
| Systemd resource mgmt | DONE | 3 | 3 | 5 | — |
| IR curve bootstrapping | STARTED | 7 | ~3 | 69 | Carried from sprint 24 |
| IR Rates synthetic data | STARTED | 19 | ~14 | 69 | Carried from sprint 24; sprawling |
| Documentation improvements | STARTED | 6 | 1 | 3 | Only scaffold task done |
| Collapse NATS config | STARTED | 9 | ~5 | 3 | — |
| Synthetic data scope | STARTED | 4 | 2 | 69 | Carried from sprint 24 |
| Injectable env provider | BACKLOG | 2 | 0 | — | — |
| Reduce DB connection pool | DONE | 4 | 4 | 1 | — |
| Review CLI/shell divergence | DONE | 1 | 1 | 1 | — |
| Compass QoL follow-ups | DONE | 8 | 8 | 3 | — |
| JWT test hotfix | DONE | 2 | 2 | 1 | — |
| NATS fallback hotfix | DONE | 2 | 2 | 1 | — |
| Fix MSVC scope label | BACKLOG | 1 | 0 | — | Hotfix story |
| Fix Windows setenv | BACKLOG | 1 | 0 | — | Hotfix story |
| sync_host_envelope | DONE | 1 | 1 | 1 | — |
| Backlog deep refinement | DONE | 1 | 1 | 2 | — |
| Investigate grants | DONE | 1 | 1 | 2 | Closed in bookkeeping pass |
| Normalise NATS protocol | DONE | 1 | 1 | 1 | Closed in bookkeeping pass |
| Fix codegen template drift | BACKLOG | 4 | 0 | 1 | New, undecomposed |
| Close systemic codegen gaps | BACKLOG | 2 | 0 | 1 | New, undecomposed |
| IR curve follow-ups | BACKLOG | 3 | 0 | 1 | New, undecomposed |
DONE/BACKLOG+STARTED ratio: 13 DONE / (7 STARTED + 7 BACKLOG) = 0.93 → GREEN on ratio.
However, three concerns:
- Sprawling stories: Refactor codegen C++ (21 tasks, STARTED for 69 days) and IR Rates (19 tasks, STARTED for 69 days) are classic sprawling stories — many tasks DONE but the story itself not closed. Both were carried from sprint 24. The DONE work is real and delivered, but keeping them STARTED makes the sprint look like it has more open work than it actually does. Both should be evaluated against their Acceptance criteria — if the DONE tasks satisfy the criteria, close them and split remaining tasks into new stories.
- Ready-to-close stories closed: Investigate grants (1/1 DONE) and Normalise NATS protocol (1/1 DONE) were closed in the bookkeeping pass accompanying this review — both now DONE in story files and sprint table.
- New undecomposed stories: Fix codegen template drift, Close systemic codegen gaps, IR curve follow-ups, Entity classification, and two hotfix stories were added to the sprint table but not decomposed into tasks — they show BACKLOG with no tasks at all. This is acceptable for stories promoted late in the sprint but they count as undecomposed work.
Focus signal
| Metric | Value | Verdict |
|---|---|---|
| Simultaneously STARTED stories | 7 | AMBER |
| Cross-cutting themes | Holding company treasury (finance), IR curves (quant), codegen (infra), docs, NATS config, NATS protocol — 6 distinct themes | RED |
| brave hopper's STARTED stories | 1 (Docs improvements) | Normalise NATS closed, Backlog deep refinement DONE |
7 simultaneously STARTED stories (was 9; 2 closed in bookkeeping pass) across 6 distinct themes far exceeds the GREEN threshold of 1–3. Several are owned by other environments (bright faraday has 3, solid dirac has 1, swift curie has 1, festive dijkstra has 2, prime origin has 1). The fleet is spread thin — brave hopper alone has 1 STARTED story (Docs improvements) after the bookkeeping pass.
This is the sprint's most significant risk. Focus is sacrificed incrementally — each "just one more" story compounds context-switching cost. The diversity of themes (finance, quant, infra, docs, NATS) means no one person can hold the full sprint in their head.
Bookkeeping hygiene
| Finding | Count |
|---|---|
| Stories ready to close (all tasks DONE) | 2 |
| Sprint table ≠ story file state | 5 |
| Closed docs with non-empty Now | 12 |
The 5 table disagreements are a pattern: stories that were promoted or started mid-sprint had their story files updated but the sprint table wasn't synced. Three of the 5 are carried-forward stories (IR curve, IR rates, synthetic data scope) whose sprint table entries were never updated when the stories were carried. The 12 stale Now fields on closed docs are a known pattern — DONE stories often have a summary in Now that isn't cleared to "Nothing."
Overall verdict
| Dimension | Verdict |
|---|---|
| Goal alignment | AMBER — drift well-served, IR curves present but momentum unclear; 8 unmapped stories |
| Sprint load | GREEN — 383 commits, projected 536 |
| PR velocity | GREEN — 10 PRs/day, no WIP accumulation |
| Story and task balance | AMBER — 2 sprawling stories carried from sprint 24, 2 ready-to-close stories not closed |
| Focus signal | AMBER — 7 STARTED stories across 6 themes (was RED at 9; improved by bookkeeping pass) |
| Bookkeeping | AMBER — 5 table disagreements, 12 stale Now fields |
| Overall | AMBER |
The sprint is productive — drift resolution is happening at pace (50 PRs, 383 commits). The focus signal improved from RED to AMBER during the accompanying bookkeeping pass (2 stories closed, STARTED count 9→7). The most important remaining fix: evaluate the two sprawling stories (Refactor codegen C++, IR Rates) for split-and-close. The 5 sprint table disagreements and stale Now fields have been resolved.