Task: Health review 2 — sprint 25 close 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.
1. Goal
Produce a System 2 health review of sprint 25 at close (day 52). Cover
goal alignment, sprint load, PR velocity, story and task balance, focus
and velocity. Write the full analysis into * Result and add a summary
row to the * Health Review table in sprint.org.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Sprint health review — System 2 analysis |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-09-23 |
3. Acceptance
- Full analysis under
* Resultcovers all six dimensions. - Summary row added to the
* Health Reviewtable in sprint.org.
4. Plan
- Read sprint.org and the previous health review.
- Get story and task state from
compass sprint statusandcompass sprint audit. - Get commit and PR data from git and GitHub for 2026-08-03 onward.
- Get the age of unmerged branches from each worktree.
- Analyse each dimension. Write the findings into
* Result. - Add the summary row to sprint.org.
5. Notes
Data sources, all read on 2026-09-23 at origin/main ff7937cd22:
git log --since=2026-08-03 origin/mainfor commits per day.gh pr list --state merged --search "merged:>=2026-08-03"for PRs.compass sprint statusandcompass sprint auditfor story state.git -C <worktree>for unmerged work in each worktree.
This review records findings only. The bookkeeping fixes it lists are work for the sprint close, not for this task.
6. Test Scenarios
Manual QA scenarios (scaffolded via compass add test_scenario)
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 |
|---|---|---|
7. PRs
| PR | Title |
|---|---|
| #2134 | [agile] Close sprint 25: health review, story reset, release notes |
8. Review
| # | Comment summary | File | Decision | Notes |
|---|---|---|---|---|
| 1 | The PR count here (319) does not visibly tie out with the release notes (316). | task_health_review_2.org |
Accepted | Added a reconciliation under PR velocity: different windows, 319 - 5 + 2 = 316. |
| 2 | The downloads row labels a .zip link "DEB". |
doc/downloads.org |
Declined | Every existing row uses the same label for the same artefact; changing the convention is out of scope here. |
9. Result
9.1. Review on 2026-09-23 (day 52 of 7)
Concerns written down before the data was read:
- The sprint was planned for 7 days and is now on day 52. Is this one sprint, or two or three sprints in one document?
- The mission names drift and IR curves. The recent merges are about ores.web, TypeScript and the removal of Qt. Did the mission stop being true?
- 31 STARTED stories will make this sprint close look like a carry-over, not a finish.
The data confirms all three concerns.
9.1.1. Goal alignment
Sprint mission: "Resolve sprint drift on as many components as possible and progress IR curves work."
| Goal | Coverage | Stories (DONE/STARTED/BACKLOG) | Verdict |
|---|---|---|---|
| Resolve drift | Strong | 11 / 5 / 4 | GREEN |
| Progress IR curves | Weak after 2026-08-12 | 2 / 4 / 0 | AMBER |
| No mapped goal | Large | See below | RED |
Drift. The program story (Entity classification and drift baseline across all components) is DONE. Four components are drift-free and closed: dq, iam, synthetic and compute. This review listed trading as a fifth; that is wrong. A measurement on 2026-09-26 finds 1751 files of drift in ores.trading, and the sprint 25 story said the component could not join the drift gate. The release notes count five drift-free components because they also count analytics, which is drift-free while its story stays STARTED, as the next sentence says. The redundant-properties pass is also DONE. analytics and reporting have all tasks DONE, but their stories are still STARTED. marketdata is in flight. database, scheduler, workflow and workspace are in BACKLOG. The codegen template fixes, the systemic gap fixes and the has_parent_id fix also serve this goal. This goal is well served.
IR curves. The FOMC short end (DONE) and the oresmd quote-type coverage (DONE) shipped by 2026-08-11. After that date, the IR stories moved slowly:
- IR curve bootstrapping + official curve republish: 5/8 tasks, carried from sprint 24. The engine, the official curve republish (#1879) and the lineage shipped. The open tasks are Qt UI tasks.
- IR Rates synthetic data: 11/20 tasks, carried from sprint 24.
- Add new stochastic processes: 3/11 tasks. Five of its BACKLOG tasks have a merged PR (#1932). The real progress is higher than the file shows.
- IR curve follow-ups: 6/6 tasks DONE, story still STARTED.
The headline deliverable (a bootstrapped curve that is republished as an official stream) shipped before sprint 25 started. In sprint 25 the IR goal got the FOMC short end, six new process engines with no wiring, and bookkeeping that lagged behind the work.
No mapped goal. From 2026-09-19, the work moved to a new direction: Retire Qt, Integrate ores.web, Prototype bootstrap in ores.web, IAM entities in the web client, IAM journeys, canonical NATS entity protocol and the two TypeScript protocol stories. This is a large, strategic change: the product lost its desktop client. It is good work, but sprint 25's mission does not mention it. The skills catalogue (21/51 tasks), the trade entry prototype and the ORE v17 update also have no mapped goal.
Challenge: some of the web work uses codegen, so it is possible to say that it "serves drift". That mapping is wishful. The web pivot is a different goal. It needs its own sprint mission.
9.1.2. Sprint load
| Metric | Value | Target | Status |
|---|---|---|---|
| Commits since 2026-08-03 | 2855 | ≤ 1000 | RED |
| Days elapsed | 52 | 7 | RED |
| Commits/day (average) | 55 | — | — |
| Commits, days 1–10 (08-03 to 08-12) | 1225 | ≤ 1000 | AMBER |
| Commits, days 11–32 (08-13 to 09-03) | 169 | — | lull |
| Commits, days 33–52 (09-04 to 09-23) | 1461 | ≤ 1000 | RED |
The average hides the shape of the sprint. There are three phases:
- Days 1–10: a normal, heavy sprint. 1225 commits. This phase alone is slightly over the target.
- Days 11–32: a lull of 22 days with 169 commits. On 8 of these days there were 0 commits, and on 7 days there were 1 to 8.
- Days 33–52: a second heavy phase with 1461 commits. This phase alone is over the target.
Phases 1 and 3 are each a full sprint. The sprint did not close at the lull, so the second phase went into the same document. This is the root cause of most other findings in this review.
9.1.3. PR velocity
| Metric | Value | Notes |
|---|---|---|
| PRs merged | 319 | 288 human, 31 bot |
| Target | 100–120 | For 7 days |
| PRs/day | 6.1 | Average over 52 days |
| PRs, ISO week 32 (08-03 to 08-09) | 123 | Normal sprint pace |
| PRs, weeks 34–35 (08-17 to 08-30) | 8 | Lull |
| PRs, weeks 36–39 (08-31 to 09-23) | 135 | Second phase |
| Cycle time, median | 1.9 h | Open to merge |
| Cycle time, p90 | 9.8 h | — |
| Open PRs | 1 | #2132, the nightly format bot |
| Unmerged branch, merry_newton | 6 commits | Last commit 2026-08-25, 1608 behind main |
| Unmerged branch, solid_dirac | 3 commits | Last commit 2026-09-19 |
The release notes count 316 PRs; this review counts 319. Both are right for their window. The 319 is every PR merged on or after 2026-08-03, read before #2132 and #2133 merged. The release notes count PRs merged into main after the v0.0.24 tag (2026-08-03 16:05): that excludes #1810 to #1813, merged earlier that day for the sprint 24 close, and #2084, merged into a feature branch, and it includes #2132 and #2133. 319 - 5 + 2 = 316.
PRs merge fast. The median cycle time is under 2 hours, and there is no queue of open PRs. The total is 319 against a target of 100–120, so the verdict is RED. The cause is the sprint length, not the merge process.
WIP signal. merry_newton has 6 unmerged commits on
feature/identity-core-series-and-bindings. They are 29 days old and
1608 commits behind main. They belong to Adopt oresmd as the native market data identity
(2/9 tasks). A rebase of this branch will be expensive. Decide at
close: rebase it, or abandon it and record why.
9.1.4. Story and task balance
| Story | State | Tasks | Age (days) | Notes |
|---|---|---|---|---|
| Refactor ores.codegen C++ generation | STARTED | 11/22 | 116 | Since 2026-05-30. Sprawling. |
| Unify the LLM skills catalogue | STARTED | 21/51 | — | No start date. Sprawling. |
| Redesign ores.trading on data-oriented principles | STARTED | 12/20 | — | No start date. Sprawling. |
| IR Rates synthetic data | STARTED | 11/20 | — | Carried from sprint 24. Sprawling. |
| Acme Corporation follow-ups | STARTED | 10/11 | 51 | One task left. |
| Collapse NATS config passthrough | STARTED | 6/9 | 50 | — |
| Port trading instruments to codegen | STARTED | 3/4 | 49 | Its open task has a merged PR (#2035). |
| Documentation improvements | STARTED | 7/10 | 50 | Open-ended by design. |
| Add new stochastic processes | STARTED | 3/11 | 43 | 5 BACKLOG tasks have a merged PR. |
| Adopt oresmd as native identity | STARTED | 2/9 | 43 | Stale branch on merry_newton. |
| IR curve bootstrapping | STARTED | 5/8 | — | Carried from sprint 24. |
| Update ORE to v17 | STARTED | 4/6 | — | No start date. |
| Asset-class-agnostic Market Simulator client | BACKLOG | none | — | Not decomposed. The UI it describes was removed with Qt. |
| Sized, realistic trade populations | BLOCKED | 1/2 | 16 | Sits in the Hotfixes table, but it is not a hotfix. |
| Metric | Value |
|---|---|
| Stories in sprint | 102 |
| DONE | 63 (39 product, 24 hotfix) |
| STARTED | 31 |
| BLOCKED | 1 |
| BACKLOG | 7 |
| DONE / (STARTED + BLOCKED + BACKLOG) | 63 / 39 = 1.62 |
| STARTED with every task DONE | 8 |
| BACKLOG with every task DONE | 2 |
| Stories without tasks | 1 |
The ratio is GREEN. The story files are not. compass sprint audit
reports 99 findings:
- 10 stories have every task DONE but are not closed: Absorb PR checks locally, analytics bind, reporting bind, eventing flake hotfix, harden eventing chain, feed lifecycle harmonization, generate every protocol message as TypeScript, IR curve follow-ups, the provisioning bundle hotfix and verify compute-grid flows from the UI.
- 12 open tasks have all their PRs merged.
- 11 rows in the sprint table do not agree with the story file.
- 1 DONE story (Compass QoL follow-ups) has 3 BACKLOG tasks.
- The other findings are closed documents with a
Nowthat is not "Nothing.".
Sprawling stories. Four stories are over the sprawl threshold. Apply
the split test to each one at close. Read its * Acceptance and
compare each open task to it. Do not close a story only because most
tasks are DONE.
- Refactor ores.codegen C++ generation: open for 116 days and over three sprints. The drift program now does most of its work. It is probably a close-and-split candidate.
- Unify the LLM skills catalogue: 30 open tasks. It is probably two
stories: the part that shipped (the
compass-namespace), and a remainder. - Redesign ores.trading and IR Rates synthetic data: check against acceptance. They possibly carry forward.
Challenge: the Market Simulator client story describes a Qt window
(MarketSimulatorWindow, IrCurveEditor). Qt is gone. This story is
not only undecomposed. Its premise is out of date. Move it back to the
product backlog, or abandon it.
9.1.5. Focus signal
| Metric | Value | Verdict |
|---|---|---|
| STARTED stories | 31 | RED |
| STARTED, after closing the 8 finished ones | 23 | RED |
| Worktrees that own STARTED stories | 7 | — |
| Distinct themes in flight | 8+ | RED |
Themes in flight: codegen drift, TypeScript and ores.web, NATS protocol, IR curves and quant, market data identity, trading data model, CI and eventing hardening, skills and documentation, and the ORE v17 update.
The mid-sprint review found 7 STARTED stories and rated focus AMBER. The count is now 31. Part of the cause is bookkeeping: 8 STARTED stories have every task DONE, and 12 open tasks have merged PRs. The real WIP is smaller than 31, but the documents do not show its size. That is a focus problem too.
9.1.6. Velocity
| Metric | Value | Notes |
|---|---|---|
| Stories DONE | 63 | 1.2 per day over 52 days |
| Product stories DONE | 39 | — |
| Hotfix stories DONE | 24 | 38% of DONE stories |
| Hotfixes for Windows or MSVC | 11 | The largest single cause |
| Continuous Windows red | 2026-09-04 to 2026-09-17 | 13 days |
| Continuous Linux gcc red | 2026-09-11 to 2026-09-15 | After -Wall and -Wextra landed |
| PRs merged | 319 | — |
Delivery is high. 39 product stories closed, and some are large: the removal of Qt, ores.web, five drift-free components, oresmd coverage, and the FOMC short end. But 24 hotfixes is a warning. Most came from code that compiled on Linux clang and failed on MSVC, gcc or macOS. The local-checks story (Absorb PR checks locally) has every task DONE. Check at close whether its checks include MSVC and gcc. If not, file a capture for a cross-compiler check before merge.
The * Achievements section in sprint.org is empty. The * Captures
section is empty. The release notes will have to come from the PR list
only.
9.1.7. Overall verdict
| Dimension | Verdict |
|---|---|
| Goal alignment | AMBER. Drift is strongly served. IR curves stalled after day 10. A web-client pivot with no mapped goal. |
| Sprint load | RED. 2855 commits over 52 days. Two full sprints and a 22-day lull. |
| PR velocity | RED on total (319). Merge flow is healthy: 1.9 h median, no queue. One stale branch (merry_newton, 29 days). |
| Story and task balance | AMBER. Ratio 1.62, but 10 closeable stories, 4 sprawling stories and 99 audit findings. |
| Focus signal | RED. 31 STARTED stories over 8+ themes. |
| Velocity | AMBER. 63 stories DONE, 24 of them hotfixes. |
| Overall | RED |
Sprint 25 delivered a lot of work. But it ran as two sprints in one document: a drift and IR sprint in August, a 22-day lull, and a web and TypeScript sprint in September. The mission stayed the same through all three phases. Because the sprint did not close at the lull, the load, PR and focus numbers are all RED, and the documents show 31 STARTED stories where the real WIP is much smaller. The most important concern is that the documents no longer describe the work. The one fix that helps most is a full bookkeeping pass before the close: close the 10 finished stories, apply the split test to the 4 sprawling stories, decide on the merry_newton branch, and give sprint 26 a mission that names the web-client direction. After that, keep to a 7-day close, so that a lull ends a sprint instead of stretching it.