Task: Health review 1 — sprint 29 overrun 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

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:

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 * Result of 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 * Captures table.
  • 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.

Emacs 29.3 (Org mode 9.6.15)