Task: Health review 1 — sprint 26 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
A System 2 health review of sprint 26 at its close: the six dimensions measured and challenged, the bookkeeping repaired, the sprawling stories reworked and split, and one overall verdict with the evidence behind it.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Sprint health review — System 2 analysis |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-10-05 |
3. Acceptance
- Every number the review states is a measurement with the command that produced it and the commit it was taken at, or is marked as an estimate with its basis.
- Every dimension the skill names — goal alignment, sprint load, PR velocity, story and task balance, focus signal and velocity — carries a verdict and the evidence behind it, and the overall verdict follows the skill's RAG rule.
- Every sprawling story is reworked and split, or carried STARTED with its
reason recorded; every DONE task carries its branch, its PR row and
Nothing.inNow,Waiting onandNext, and the audit's remaining findings are recorded with their reason. - The sprint's
* Health Reviewtable carries the summary row.
4. Plan
- Branch
feature/sprint-26-health-review-1from main and scaffold the review story and its task. - Gather the six dimensions: read the sprint, its stories and its tasks; measure the commit load, the PR velocity and the census; regenerate the four charts.
- Challenge every reading with the skill's System 2 questions.
- Apply the close policy: rework each sprawling story to the scope it delivered, close it DONE, and move its remainder to a new story. Carry a story STARTED only when its remainder is small and a split does not fit.
- Repair the bookkeeping drift the shape pass and the audit surface.
- Write the Result, add the sprint's summary row, close the story and the task, and raise the PR.
5. Measurements
Every number this task claims about a tree, with the command that produced it
and the commit it was measured at. A number without both is not a measurement,
because a clean-up record describes a tree and trunk moves under a branch: a
consumer count, a gate's component count and a suite's size all change with no
code changing, and the reader of a bare number cannot tell which tree it came
from. Where the raw output matters, put it in an evidence/ file beside the
task and name that file in the Command column.
| What | Value | Command | Commit |
|---|---|---|---|
| Commits since 2026-09-23 | 3921 | git log --oneline --since=2026-09-23, counted |
ac422ea148 |
| Commits per day | 95, 1, 0, 1018, 644, 307, 370, 268, 305, 224, 265, 301, 123 | git log --since=2026-09-23 --format=%ad --date=short, grouped by day |
ac422ea148 |
| Merged PRs since 2026-09-23 | 519 | gh pr list --state merged --search "merged:>=2026-09-23" --limit 1000 |
ac422ea148 |
| PR cycle times | median 0.3 h, p90 3.9 h, max 24.9 h | build/output/sprint_26/pr_cycle_times.csv, written by compass sprint charts |
ac422ea148 |
| Stories by state | 126: 95 DONE, 14 STARTED, 16 BACKLOG, 1 ABANDONED | State histogram over doc/agile/versions/v0/sprint_26/**/story.org |
ac422ea148 |
| Tasks by state | 482: 368 DONE, 90 BACKLOG, 15 DISCOVERED, 5 STARTED, 1 BLOCKED, 3 ABANDONED | State histogram over doc/agile/versions/v0/sprint_26/**/task_*.org |
ac422ea148 |
| Audit findings | 58: 6 open tasks with merged PRs, 52 closed documents with prose in Now |
./compass.sh sprint audit, saved in evidence/sprint_audit_2026-10-05.txt |
ac422ea148 |
6. Notes
7. 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 |
|---|---|---|
8. PRs
| PR | Title |
|---|---|
| #2654 | [agile] Sprint 26 health review 1 — RED |
9. Review
PR #2654, comment 5993658629 (the on-demand @claude review).
| # | Comment summary | File | Decision | Notes |
|---|---|---|---|---|
| 1 | _table_bounds finds the heading with startswith("* Tasks"), which also matches * Tasks and notes |
projects/ores.compass/src/compass.py |
Accept | The match is now the exact heading or the heading plus a space, so a lookalike such as * Tasks: notes no longer matches. test_a_lookalike_heading_is_not_the_tasks_table covers it. The reviewer's own note that a missing table now returns None is the intended, safer behaviour. |
| 2 | A hard-coded cap in _sc_get_merged_prs will truncate silently again; warn when the result length equals the limit |
projects/ores.compass/src/compass.py |
Accept | A warning now names the truncated data when the list reaches 1000. The same class of defect had already truncated the release-notes collector at 500 against 516 PRs merged since the v0.0.25 tag; its cap is raised to 1000 with the same warning. |
| 3 | The regression test does not cover the placeholder-row restore path when the last row is removed | projects/ores.compass/tests/test_task_move_row_scope.py |
Accept | test_restores_the_placeholder_when_the_last_row_is_removed added; the file now runs three tests, all passing. |
| 4 | #+environment differs per new story (bright_faraday, eager_maxwell, solid_dirac) against the PR's brave_hopper |
the successor stories | Decline | Intentional: the field records the worktree that minted the document, and the three successors were minted in other worktrees during earlier sessions. |
| 5 | Confirm the three other regenerated charts are committed, since only line_churn.png appeared in the file list |
doc/agile/versions/v0/sprint_26/*.png |
Accept | Verified: git diff --name-status shows all four added by this PR — line_churn.png, pr_cycle.png, prs_commits.png and stories_done.png. |
10. Result
10.1. Review on 2026-10-05 (day 13 of 7)
Sprint 26 was scheduled from 2026-09-23 to 2026-09-30. This review runs on
2026-10-05, day thirteen, and the sprint is still in flight. Every number
below is a measurement at ac422ea148 plus this branch's own document
changes; the command that produced each one is in * Measurements.
10.1.1. Goal alignment
The mission has three passes, run in order: sync codegen and clear drift, analyse the user journeys, then build the UX. All three have real work, and none is uncovered.
| Goal | Coverage | Stories (DONE / STARTED / BACKLOG) | Verdict |
|---|---|---|---|
| Sync codegen and clear drift | The clean-standard programme and its component stories. Four components are still in flight (dq, scheduler, reporting, synthetic) and three wait in the backlog (diff, eventing, history). The marketdata story is DONE, but the component stays outside COMPONENTS_UNDER_TEST until its three remaining items close. |
26 / 4 / 3, 1 abandoned | AMBER |
| Analyse the user journeys | The extraction programme, with 3 of its 16 tasks done. Journey documents were also written and re-verified inside the UX group stories. | 0 / 1 / 0 | AMBER |
| Build the UX | The five journey groups of ores.web are DONE. The record screens, the operations journeys and the refdata journeys are in flight. |
5 / 3 / 1 | AMBER |
Verdict AMBER: each goal advanced, and each still holds an open remainder.
10.1.2. Sprint load
| Metric | Value | Target | Status |
| Commits since 2026-09-23 | 3921 | ≤ 1000 for the sprint | RED |
| Commits per day | 95, 1, 0, 1018, 644, 307, 370, 268, 305, 224, 265, 301, 123 | — | — |
| Average | ≈ 302 per day over 13 days | ≤ 143 per day (1000 over 7) | RED |
| Window | day 13 of a planned 7 | 7 days | RED |
The tree carries about four times the commit ceiling. The load is uneven: two near-idle days (2026-09-24 and 09-25) sit before a burst of 1018 commits on 09-26. After the burst the rate never falls below 123 commits on an active day. This is the shape of an overrun sprint, not of a stall: work continued on every day to the review.
10.1.3. PR velocity
| Metric | Value | Notes |
| Merged PRs since 2026-09-23 | 519 | The sprint's target band is 100–120: 4.3 to 5.2 times it. |
| Merge cycle | median 0.3 h, p90 3.9 h, max 24.9 h | build/output/sprint_26/pr_cycle_times.csv |
| Open PRs | 2 (#2646, #2644) | Both raised on 2026-10-05, hours before this review. |
| Long-open WIP | none | No pull request waited more than a day for its merge. |
Verdict RED: the velocity is the load's twin. The sprint merged about five times the planned PR count, and no WIP piled up. A merged pull request never sat waiting.
10.1.4. Story and task balance
| Metric | Value | Notes |
| Stories | 126: 95 DONE, 14 STARTED, 16 BACKLOG, 1 ABANDONED | After the rework-and-split below. |
| DONE : open | 95 : 30 ≈ 3.2 | The skill's line is 0.5. |
| Tasks | 482: 368 DONE, 90 BACKLOG, 15 DISCOVERED, 5 STARTED, 1 BLOCKED, 3 ABANDONED | |
| Undecomposed stories | 5 | BACKLOG with zero tasks: the work is opaque until decomposed. |
The five undecomposed stories:
- Add proper curve support to ores.marketdata
- Record trade activities, their participants and trade links
- Model operational authorisation and the client-facing agreement
- Model trade structures
- Observe a run while it works
Verdict AMBER: the ratio is comfortably green, but five backlog stories carry no tasks at all, so no one can see their shape.
10.1.5. Focus signal
| Metric | Value | Verdict |
| STARTED stories | 14 | RED: the skill's red line is 6. |
| Before the split | 18 | The review closed four (below). |
| Themes | clean standards (4), journeys and UX (4), reporting and compute (3), shell and Qt removal (2), workflow (1) | Mixed. |
The fourteen in flight: clean-dq, clean-reporting, clean-scheduler,
clean-synthetic, extract-user-journeys, exercise-workflow,
full-report-pipeline, acme-report-grid-smoke-test,
build_approvals_and_notifications, implement-operations-journeys,
implement_refdata_journeys, standardise_the_record_screens,
remove_the_legacy_qt_remnants and
pattern_language_for_service_interaction.
Verdict RED: fourteen stories in flight across five themes. The split cut the count from eighteen, and each carried story now holds a small, honest remainder, but the sprint still closes with fourteen open fronts.
10.1.6. Velocity
| Metric | Value | Notes |
| Stories closed | 95 of 126 | 75%. |
| Tasks closed | 368 of 482 | 76%. |
| Commits | 3921 | In 13 days. |
| PRs merged | 519 | |
| Window | day 13 of 7 | The sprint overran its planned window. |
Verdict AMBER: throughput was high and converged to the last day — 123 commits and two fresh pull requests on the review day — but the sprint closes with a quarter of its stories and tasks open, after running to nearly twice its planned length.
10.1.7. The rework-and-split (executed at this review)
The close policy: rework and split is the default. When a story has delivered a large part of its scope, reword the story and its acceptance to the work that shipped, close it DONE, and give the remainder a new, more focused story. Carry a story STARTED only when its remainder is small and a split does not make sense.
Each source story now states what it delivered, and its traceability paragraph names its successor. The other fourteen STARTED stories were carried, each with its small remainder.
10.1.8. Bookkeeping repairs
- 62 DONE tasks brought to shape:
#+branch:and#+pr:where missing, a* PRsrow where missing, and 37Waiting onandNextcells cleared to exactlyNothing. - 5 hotfix story files repaired from a literal
+#+prefix. - 9
sprint.orgrows fixed to the table's shape. - The
compass task moverow-scope defect found while splitting: it matched a task's link in a StatusNextcell before the* Tasksrow. Fixed incompass.py, with a regression test (test_task_move_row_scope.py, 1 passed). The one move it damaged (task 859762E0) was repaired in both stories, and the stale row it left in the access story was deleted. - Task 49B3C660's invalid
StateIN PROGRESSrepaired toSTARTED. - The merged-PR chart fetch fixed (
--limit 1000) and the four charts regenerated. - The duplicate scan over the sprint's stories found no duplicates.
- 366 local branches of merged pull requests deleted. Five branches stay
because other worktrees hold them:
feature/add-the-pattern-document-type-and-hub(bright_faraday),feature/close-the-marketdata-test-coverage(prime_origin),feature/generate-the-remaining-shell-surfaces(solid_dirac),feature/implement-access-journeys(swift_curie) andfeature/rename-the-anchor-to-trade(merry_newton).
10.1.9. Audit record
./compass.sh sprint audit at ac422ea148: 58 findings, saved in full
beside this task in evidence/sprint_audit_2026-10-05.txt.
- 6 open tasks whose pull requests have all merged. The audit flags a task
that stays open while every pull request it names is merged. Each was
read: all six are genuinely open, and each names its remainder.
- Model the handcrafted ores.dq code and generate the artefact tables
(
686E9BB0, clean dq) - Bring ores.scheduler to the clean standard (
49B3C660) - Bring ores.synthetic to the clean standard (
8063C1A9) - Default the shell facet on at the profile level (
9B53C333, BLOCKED; now in the successor story) - Add the identity workflow and the commands that drive it (
0442FD13) - Remove the presentation keys no template reads (
54AEFA10)
- Model the handcrafted ores.dq code and generate the artefact tables
(
- 52 closed documents whose
Nowis not exactlyNothing.The audit wants the bare word. Each holds its close prose: "All tasks done.", "Merged as <sha>.", or a summary of the result. That prose is the historical record, so this review records the drift and does not rewrite it.
The documents this review closed — the four reworked source stories, this
task and its story — carry exactly Nothing. in Now, Waiting on and
Next, so none of them appears in either list.
10.1.10. Overall verdict
| Dimension | Verdict |
| Goal alignment | AMBER |
| Sprint load | RED |
| PR velocity | RED |
| Story and task balance | AMBER |
| Focus signal | RED |
| Velocity | AMBER |
| Overall | RED |
Sprint 26 does not have a stalling problem; it has a scale problem. It carried about four times the commit ceiling and about five times the PR band, and it ran to day thirteen of a planned seven. All three goals advanced, but fourteen stories are still in flight and five backlog stories carry no tasks. The widest fix, the rework-and-split, is now executed: four sprawling stories became honest DONE records with named successors. Lowering the STARTED count further, one story at a time, is the next lever. Sprint load and PR velocity are RED together, so the overall verdict is RED.
10.1.11. The close (2026-10-05)
The review ran at the sprint's close, and the close itself landed on this same branch. What the close changed, read against the review above:
- The four rework-and-splits this review executed mid-analysis were joined by seven more: eleven stories closed DONE at the scope they delivered, each reworded so its Goal and Acceptance describe only what shipped, with its remainder in a successor story in the product backlog inbox.
- The nineteen other open stories were carried whole to the inbox by file move, identifiers intact. The sprint table marks each of their rows ABANDONED with the close date, and the fourteen STARTED stories it names are no longer open fronts: none of them starts sprint 27 in flight.
- The sprint table's 127 rows now read 107 DONE and 20 ABANDONED — the last DONE row is this review's own story, which the table did not carry — and the sprint carries its achievements, its retrospective and its release notes.
- The 51 closed documents this review recorded as carrying prose in
Nowwere repaired: the prose moved to* ResultandNowset to exactlyNothing..compass sprint auditreports no findings. release_notes.orgwas generated from the 519 merged PRs and edited into the sprint's record;version.orgrecords the sprint as closed.- Four pull requests merged while the close branch was open: #2652, the approvals and notifications service; #2644, the currency, desk group and currency pair screens; #2655, the split of my profile from the People screens; and #2646, the holiday calendar screen, which completed the refdata journeys story and retired the successor it had been given. The close absorbed their seven closed tasks back into the sprint's stories and reworded those stories and their successors to record the completions.
The verdict stands: the sprint was RED on load and velocity, and the close does not change that. It records it honestly instead.