Task: Health review 1 — sprint 29 overrun analysis
Table of Contents
- 1. Goal
- 2. Status
- 3. Acceptance
- 4. Plan
- 5. Measurements
- 6. Notes
- 7. Test Scenarios
- 8. PRs
- 9. Review
- 10. Result
- 10.1. Review on 2026-11-08 (day 16 of 7)
- 10.1.1. Goal alignment
- 10.1.2. Sprint load
- 10.1.3. PR velocity
- 10.1.4. Story and task balance
- 10.1.5. Focus signal
- 10.1.6. Velocity
- 10.1.7. Bookkeeping found
- 10.1.8. Sprint cleanup: closes, splits and carries
- 10.1.9. Second pass: scope the live stories to what merged
- 10.1.10. What this review did not check
- 10.1.11. Overall verdict
- 10.1. Review on 2026-11-08 (day 16 of 7)
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
Measure sprint 29 eight days past its planned end and record one verdict with its evidence.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Sprint health review — System 2 analysis |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-11-08 |
3. Acceptance
- Every dimension has a measurement with its source.
- The sprint table carries the review's summary row.
4. Plan
Measure each dimension from the story files, git, GitHub and compass sprint
audit. Report the findings. Do not repair the bookkeeping in this review: the
closes and splits are decisions for the owner.
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 the sprint start | 4961, of which 4155 are not merges | git log origin/main --since-as-filter=2026-10-24T00:00:00, by committer date |
634b748b71 |
| Commits to the planned end, and after it | 3434 to 2026-10-31, 1527 after | the same log, bucketed by day | 634b748b71 |
Commits with the [agile] prefix |
1629 of the 4155 that are not merges | the same log, grouped by subject prefix | 634b748b71 |
| Merged PRs | 786 | gh pr list --state merged --search "merged:>=2026-10-24" --limit 1000, bucketed by UTC day |
634b748b71 |
PRs with an [agile], [doc] or [docs] title |
199 of 786 | the same list | 634b748b71 |
| Merge cycle | median 0.06 h, upper quartile 0.61 h, p90 3.28 h, max 79.6 h | the same list, createdAt to mergedAt |
634b748b71 |
| Open PRs | 2 (#4471, #4492) | gh pr list --state open |
634b748b71 |
| Stories | 126: 35 DONE, 38 STARTED, 51 BACKLOG, 2 ABANDONED | the State of every story.org, before this review's own story |
634b748b71 |
| Tasks | 823: 507 DONE, 250 BACKLOG, 45 STARTED, 21 ABANDONED | the State of every task_*.org, before this review's own task |
634b748b71 |
| Carried stories (an estimate) | 58: 3 DONE, 13 STARTED, 41 BACKLOG, 1 ABANDONED; tasks 127 of 332 DONE | #+created: before 2026-10-24, or a title that ends "the remaining work" |
634b748b71 |
| New stories (an estimate) | 68: 32 DONE, 25 STARTED, 10 BACKLOG, 1 ABANDONED; tasks 380 of 491 DONE | every other story | 634b748b71 |
| Undecomposed stories | 3, all BACKLOG | story.org with no task_*.org beside it |
634b748b71 |
| Stories with a blank Acceptance | 11: 3 DONE, 6 STARTED, 2 BACKLOG | the * Acceptance section of every story.org |
634b748b71 |
| Age of STARTED stories (an estimate) | median 13 days, max 32, 28 of 38 over 7 days | #+created: to 2026-11-08, because 90 of 120 sprint table rows have no Start |
634b748b71 |
| STARTED tasks last touched before the sprint | 32 of 45 | the Last touched field, or #+created: where it is blank |
634b748b71 |
| Audit findings | 105: 9 stories ready to close, 25 open tasks with all PRs merged, 15 table disagreements, 56 closed documents with a Now that is not "Nothing." | compass sprint audit |
634b748b71 |
| Stories absent from the sprint table | 6 of 126 | the :ID: of every story.org against the * Stories tables |
634b748b71 |
| Worktrees | 15 | compass fleet -f json |
634b748b71 |
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 |
|---|---|
| #4499 | [agile] Resolve the sprint 29 stories for the close |
9. Review
| # | Comment summary | File | Decision | Notes |
|---|---|---|---|---|
| 1 | The split left four evidence files behind their moved tasks | evidence/ under the normalise and rework stories |
Accept | Moved with their tasks. |
| 2 | Thirteen evidence references were already broken on main | Sprint 29 task files | Decline | This PR did not cause them. |
| 3 | Ten spelling hits in existing task text | Four sprint 29 task files | Decline | This PR did not write that text. |
| 4 | Three closed stories have a task row count that differs from their task files | let-the-plan, trade-blotter-remaining, rework | Decline | The mismatch exists on main. |
| 5 | PR #4499 review: follow-up stories and their tasks disagree on state | Inbox stories this PR carried | Accept | Every carried STARTED or BLOCKED story and task is now BACKLOG. Each keeps its Now text, branch and PR. A stale row and a DONE row with no Result are corrected from the task files. |
| 6 | PR #4499 review: empty Out of scope and uneven table padding |
Follow-up stories | Decline | Cosmetic. The owner asked for the state fix only. |
10. Result
10.1. Review on 2026-11-08 (day 16 of 7)
Sprint 29 was planned from 2026-10-24 to 2026-10-31. This review runs on
2026-11-08, day 16 and eight days past the planned end. The sprint is still
open. The * Measurements section gives the command for each number.
Concerns written down before the data was read:
- The mission repeats the mission of sprint 28, and sprint 28 did not keep it.
- Bearings lists about 36 stories in flight, and the sprint 28 review asked for a limit.
- A sprint this size drifts first in its bookkeeping.
10.1.1. Goal alignment
The mission has one goal: finish the work carried out of sprint 28 before drawing anything new from the product backlog.
| Goal | Coverage | Stories (DONE/STARTED/BACKLOG/ABANDONED) | Verdict |
|---|---|---|---|
| Finish the carried work | 58 stories, 127 of 332 tasks DONE | 3 / 13 / 41 / 1 | RED |
| Draw nothing new | 68 new stories, 380 of 491 tasks DONE | 32 / 25 / 10 / 1 | RED |
The sprint did the opposite of its mission. It finished 3 of about 58 carried
stories (5%) and 32 of 68 new stories (47%). The carried count is an estimate.
It counts a story as carried when its #+created: date is before the sprint or
its title ends "the remaining work". A cross-check supports the size: the
sprint 28 close sent 62 stories to the inbox, 37 whole and 25 split.
Some new work has a clear cause and does not break the mission. Hotfixes and CI
repairs are examples. The * Hotfixes table does not show how many: it has 34
rows, and many of them are features, such as "Support volatility surfaces" and
"Hold the session at the door". The table name does not separate unplanned
repairs from new scope.
The HTTP server arc, the volatility surfaces and the IR curves are new capability that no carried story asked for. The mission was not revised to admit them. Either the mission was wrong or the sprint ignored it.
Verdict RED.
10.1.2. Sprint load
| Metric | Value | Target | Status |
|---|---|---|---|
| Commits since 2026-10-24 | 4961 | ≤ 1000 | RED |
| Average | 310 per day over 16 days | ≤ 143 per day | RED |
| Commits to the planned end | 3434 | ≤ 1000 | RED |
| Window | day 16 of a planned 7 | 7 days | RED |
Commits per day from 2026-10-24: 234, 662, 249, 488, 536, 245, 438, 582, 411, 345, 381, 151, 19, 85, 129, 6. The last figure is a part day.
The sprint is five times over the commit ceiling, and it was three times over at its planned end. A projection has no use because the planned end has passed. The rate fell sharply after 2026-11-03: the four days from 2026-11-04 to 2026-11-07 average 96 commits. The data does not show whether work stopped or moved to unmerged branches.
Part of the count is bookkeeping: 1629 of the 4155 commits that are not merges
(39%) have the [agile] prefix. Without them the sprint is still about 2500
commits. The 2026-10-24 count includes the close of sprint 28 before sprint 29
opened at 09:16.
Verdict RED.
10.1.3. PR velocity
| Metric | Value | Notes |
|---|---|---|
| Merged PRs | 786 | Over six times the 100–120 band. The first day overlaps the sprint 28 close. |
| Rate | 49 per day | 146 at the peak on 2026-10-31, 3 at the low on 2026-11-05. |
| Days with no merge | 0 | |
| Documentation PRs | 199 of 786 | The [agile], [doc] and [docs] titles. |
| Merge cycle | median 0.06 h, p90 3.28 h, max 79.6 h | The median is about 3 minutes. |
| Open PRs | 2 | #4492 is new. #4471 opened on 2026-11-06. |
| Long-open WIP | 1 | #4471 is over a day old. Its only review came before a full rebase on 2026-11-07. |
A three-minute median is less than half of the 0.14 h of sprint 28. Most PRs merge with no time for a review before the merge. So the PR count measures how commits are grouped, and not how much change a reviewer read.
The fleet shows wider WIP than the two open PRs. Seven worktrees on a branch are 369 or more commits behind main. These figures use each worktree's last fetch. A branch with no PR is invisible to this metric.
Verdict RED on the count, AMBER on flow. The skill's rule puts a total over about 150 at RED.
10.1.4. Story and task balance
| Metric | Value | Notes |
|---|---|---|
| Stories | 126: 35 DONE, 38 STARTED, 51 BACKLOG, 2 ABANDONED | |
| DONE : open | 35 : 89 ≈ 0.39 | The skill's AMBER band is 0.3–0.5. |
| Tasks | 823: 507 DONE, 250 BACKLOG, 45 STARTED, 21 ABANDONED | 62% DONE. |
| Undecomposed stories | 3 | All BACKLOG. |
| Blank Acceptance | 11 | 3 of them are DONE, so nothing states what they promised. |
| STARTED with no task DONE | 5 | Listed below. |
The undecomposed stories:
- Bring the FX spot conventions onto the market standard
- Draw every coded value as its badge — the remaining work
- Read a batch of rows in one query in the generated services
The STARTED stories with no task DONE, all created before the sprint:
| Story | State | Tasks | Age | Notes |
|---|---|---|---|---|
| Author the report configurations on guided screens | STARTED | 7 | 20 days | 4 STARTED, 3 BACKLOG. |
| Complete the ACME report inputs and prove they run | STARTED | 9 | 26 days | 1 STARTED, 8 BACKLOG. |
| Draw the node heatmap and carry the engine run statistics | STARTED | 6 | 26 days | 2 STARTED, 4 BACKLOG. |
| Follow the child run a workflow hands off | STARTED | 2 | 22 days | 2 STARTED. |
| Scope a report by regulatory book type | STARTED | 2 | 18 days | 1 STARTED, 1 BACKLOG. |
Oldest STARTED story: "Account for the grid's usage", 32 days, 1 of 3 tasks DONE.
Sprawling stories. Each row applies the skill's split test: the open tasks are
read against the story's own Acceptance. The test used the task titles and the
Acceptance text. It did not read each task's * Result or the code, so each
row is a recommendation for the owner.
| Story | Tasks | DONE | Open | Reading | Recommendation |
|---|---|---|---|---|---|
| Rework the market data feeds | 65 | 43 | 21 | Several open tasks are the unmet Acceptance: the rename, the marks of the simulator, the screens, the shell and the side-by-side check. The sensitivity and greek ladder tasks appear in no criterion. | Partial split: move the ladders, keep the story STARTED. |
| Replace sqlgen and reflect-cpp | 62 | 58 | 3 | Removing reflect-cpp and measuring the build are Acceptance. The pgbouncer task is not. | Partial split: move pgbouncer, carry the rest. |
| Support volatility surfaces | 34 | 23 | 11 | The Acceptance asks only for the architecture and the named tasks. The open tasks are the build. | Close and split, after a check that the architecture page exists. |
| Make every configuration screen follow one standard | 27 | 21 | 6 | Sign-off of a change that alters the numbers is Acceptance. The other five open tasks are not. | Partial split. |
| Populate the ACME books | 27 | 24 | 1 | The open wizard task is in no criterion. The sprint table already says DONE and the file says STARTED. | Close and split, after a check of each criterion. |
| Prove the report grid run end to end | 26 | 25 | 1 | A run on generated trades is in no criterion. | Close and split, after a check of each criterion. |
| Carry a market-wide arrival regime | 23 | 21 | 1 | The volatility loading is in no criterion. "Let a busy market move prices" already covers that subject. | Close, and move the task. |
| Split the types that carry too many columns | 12 | 9 | 2 | Both open tasks are the "every type is split" criterion. | Carry. |
| Build the IR curves of every supported currency | 11 | 4 | 6 | The open tasks are the core deliverable. | Carry. |
Verdict AMBER by the skill's rule. To close the eight STARTED stories that have every task closed would move the ratio to about 0.53.
10.1.5. Focus signal
| Metric | Value | Verdict |
|---|---|---|
| STARTED stories | 38 | RED: the skill's red line is 6. |
| Stories with a STARTED task | 24 | 9 of these are BACKLOG stories. |
| STARTED stories over 7 days old | 28 of 38 | An estimate from #+created:. |
| STARTED with all tasks closed | 8 | They need a close, not more work. |
| STARTED tasks last touched before the sprint | 32 of 45 | Most STARTED states are stale. |
| Worktrees | 15 | |
| Themes | market data, web UX, reporting, trading, conventions, codegen, HTTP server, workflow | Divergent. |
The count rose from 27 at the sprint 28 review to 38. That review named a limit on stories in flight as the one change to make. Nothing enforced it, and the sprint started more stories.
The stale states overstate the real concurrency. Tasks touched or created since
2026-11-03 fall in 18 stories, and that is still three times the red line. This
reading is weak, because many documents do not update Last touched.
Verdict RED.
10.1.6. Velocity
| Metric | Value | Notes |
|---|---|---|
| Stories closed DONE | 35 of 126 | 28%. Sprint 28 had 48% at its review. |
| Tasks closed DONE | 507 of 823 | 62%. Sprint 28 had 58%. |
| Tasks in the sprint | 823 | 534 in sprint 28. |
| Tasks created during the sprint | 617 of 823 | By #+created:. |
| Window | day 16 of 7 | Eight days over. |
The sprint finishes tasks at a good rate and finishes stories at a poor one. It creates tasks faster than it can close its stories, so a story stays open while its scope grows. Eight stories only need a close, and that would raise the figure to 43 (34%).
The skill gives no threshold for this dimension. The verdict RED is a judgement: story closure is well below the sprint 28 figure, which that review rated AMBER, and the sprint is eight days late.
10.1.7. Bookkeeping found
This review reports these findings and repairs none of them.
| Finding | Count | Evidence |
|---|---|---|
| Audit findings | 105 | compass sprint audit. |
| STARTED stories with every task DONE | 8 | Audit, first group. It also names one BACKLOG story. |
| Open tasks whose PRs have all merged | 25 | 17 STARTED, 8 BACKLOG. A merged PR does not prove a task is finished. |
| Sprint table disagrees with the story file | 15 | Ten say BACKLOG and the file says STARTED. Four say DONE and the file says STARTED. One says BACKLOG and the file says DONE. |
| Stories absent from the sprint table | 6 | The audit does not report this. Listed below. |
| Sprint table rows with no Start | 90 of 120 | Story age cannot be read from the table. |
| Closed documents whose Now is not "Nothing." | 56 | Audit, last group. |
The stories absent from the sprint table:
- Book a trade as a draft
- Carry a large body without holding it
- Complete a structure from a screen
- Configure every seeded report from the ORE examples
- Model suppliers, sessions and feeds
- Eight columns in the trading models hold JSON blobs
"Seed a relative-time trade population with the market data it needs" is named ready to close again. Reviews of sprint 27 and sprint 28 rejected that close, because its one task only describes the story. The same reason applies.
The sprint * Status table is also stale. It says "Pick the first story" and
was last touched on 2026-10-24.
10.1.8. Sprint cleanup: closes, splits and carries
The owner asked for a cleanup to prepare the close, after this review. The numbers in the sections above are the state before the cleanup. The cleanup uses the rules of the sprint 28 close. The audit reported 105 findings before it and reports 1 after it. The 1 finding is the live story "Serve what the BFF serves, then retire it".
| Outcome | Stories | Notes |
|---|---|---|
| DONE | 61 | 36 before the cleanup, plus 20 split and 5 closed. |
| ABANDONED in the table | 60 | 58 carried to the inbox, plus the 2 already abandoned. |
| STARTED, left in place | 6 | A live branch owns each one. |
Tasks left in the sprint: 547, of which 503 DONE, 21 ABANDONED, 22 BACKLOG and 1 STARTED. The open tasks all belong to the six live stories.
Two tasks closed DONE, because their PRs merged and each Result records the work: "Put the numbers-changing engine run settings through sign-off" (#4011) and "Stand up the synthetic adapter and serve its first collection" (#4493). The other open tasks with merged PRs stayed open. Each has no Result, or its own text says the work is partial.
Twenty stories split. Each closed story keeps its done tasks and narrows its
Acceptance to them. A new story in the inbox takes its open tasks, 82 in total,
and its original Acceptance. A story that was already "the remaining work" keeps
that title, and its new folder ends in -remaining-2. Each closed story names
the new story in its Decisions. A split records what shipped. It does not claim
that the original Acceptance is met.
Five stories closed DONE on their finished tasks: "Complete a structure from a screen", "Hotfix: Keep the build warning-free on every toolchain", "Make main green after the sqlgen removal", "Model suppliers, sessions and feeds" and "Fix the nightly platform failures".
Fifty-eight stories moved to the inbox with their :ID: intact, because they
have no done task other than a scaffold, or because of the four cases below.
The audit named four stories ready to close, and this cleanup rejects them. Every task is done, but those tasks do not deliver what the story promises:
| Story | Tasks DONE | Why it is not closed |
|---|---|---|
| Let a busy market move prices, not only the clock | 2 | A document and the sampling change. The volatility channel, the tails and the control plane are not built. |
| Validate that every trade type is modelled as ORE reads it | 1 | The audit of the tests only. The contract for each type and the level check are not built. |
| Eight columns in the trading models hold JSON blobs | 2 | The basket constituents only. The Goal names eight columns. |
| Seed a relative-time trade population with the market data it needs | 1 | The one task describes the story. Reviews of sprints 27 and 28 rejected this close too. |
Six stories stay STARTED in the sprint. Each has a worktree with commits ahead of main or an open PR from the last few days, and a move would pull the story from under that branch:
| Story | Worktree | PR |
|---|---|---|
| Replace sqlgen and reflect-cpp with generated code | brave_hopper | #4492 |
| Describe every product type on one page | merry_newton | #4471 |
| Split the types that carry too many columns | bright_faraday | none |
| Serve what the BFF serves, then retire it | clever_dijkstra | none |
| Prove generated trades value against the ORE samples | swift_curie | none |
| Build the IR curves of every supported currency from public data | prime_origin | none |
The sprint table now agrees with every story file. It gained the six missing rows. Closed documents in the sprint now state "Nothing." in their Now, Waiting on and Next cells. The inbox index is regenerated.
The cleanup did not read the code behind any closed task. The closes rest on the task's state, Result and PR. Two older closed stories have fewer table rows than task files: "Let the plan state domain rows, not a bag" and "Trade Blotter — the remaining work". The closed "Rework the market data feeds" also has one row fewer than its files. This cleanup left these as they were.
10.1.9. Second pass: scope the live stories to what merged
The owner then asked for five of the six live stories to close this sprint on their merged work, with the rest in a follow-up story for the next sprint. The sqlgen story stays STARTED, because PR #4492 is still in progress.
Two PRs merged on main after the split, and the rebases record them. PR #4471 finished "Classify each product type as flow or non-flow", so that task returned to its closed story, and the table above counts it there. PR #4494 shipped part of "Seed ORE's built-in index conventions". That task stays in the follow-up story, because the database-backed test and the tenant override remain.
| Story | DONE tasks kept | Tasks moved | Follow-up holds |
|---|---|---|---|
| Describe every product type on one page | 7 | 7 | The page, the serve, the joins and the retirement of the duplicates. |
| Split the types that carry too many columns | 9 | 2 | The market series identity and the instrument parts. |
| Serve what the BFF serves, then retire it | 7 | 0 | The original Acceptance only. It needs tasks. |
| Prove generated trades value against the ORE samples | 3 | 4 | The trade builders, the seed and the references. |
| Build the IR curves of every supported currency from public data | 4 | 6 | The adapter, the calibration and the coverage. |
Each closed story narrows its Acceptance to its done tasks, so a close records what merged and does not claim the original Acceptance. Three moved tasks have unmerged work on a live branch, and their ids are unchanged: "Classify each product type as flow or non-flow" (#4471, merry_newton), "Split the market series identity by series kind" (bright_faraday) and "Seed ORE's built-in index conventions" (swift_curie). Those branches must rebase onto the moved paths.
After this pass the sprint table holds 66 DONE, 60 ABANDONED and 1 STARTED. The audit reports no finding.
Still to do for the close: resolve the sqlgen story, write the Achievements and the Retrospective, regenerate the charts, write the release notes, and mark the sprint DONE.
10.1.10. What this review did not check
- It did not read the
* Resultof each task, so the split table is a recommendation. - It did not read the 823 task files by hand. A script read their state fields.
- It did not count how many PRs had a review before merge.
- It did not check the health of CI on main.
- It did not regenerate the sprint charts. A run needs
compass sprint charts --sprint 29 --end-date 2026-11-08, because the default window stops one day after the planned end. - It did not triage the one capture in the sprint
* Capturestable. - PR counts use UTC days. The sprint 28 review used local days.
10.1.11. Overall verdict
| Dimension | Verdict |
|---|---|
| Goal alignment | RED |
| Sprint load | RED |
| PR velocity | RED (flow AMBER) |
| Story and task balance | AMBER |
| Focus signal | RED |
| Velocity | RED |
| Overall | RED |
The sprint is RED, and worse than sprint 28 on most measures. It is eight days
past its planned end, with five times the commit ceiling, six times the PR band
and 38 stories in flight. Its mission was to finish carried work, and it closed
about 5% of that work and 47% of the new work it added. Output is high and flow
is fast, but the sprint boundary, the mission and the limit on work in flight do
not constrain anything. The most important concern is that the sprint 28 review
gave the same finding and the count still rose, so a written recommendation is
not enough. The one change that would most improve health is to close this
sprint now and to enforce a limit on STARTED stories in compass, at the point
a story starts.