Add a ticket-growth report over the pipeline DB as the baseline for pipeline realignment #1312

Closed
opened 2026-10-25 00:41:05 +00:00 by jared · 4 comments
Owner

Problem

The implement pipeline is suspected of under-building: it extends existing objects, leaves structural debt, and the debt returns as follow-up tickets. Nobody has measured this. Four charter changes are planned (seam-designer, change-auditor, ticket-decompose, reviewer). Without a baseline, no one can tell whether they reduced follow-ups or only moved them. Design record: docs/system-design-format/README.md section 4.

Reproduce

n/a: measurement harness, nothing to reproduce.

Approach

Add a report to the os-sdlc CLI that reads the pipeline DB with Sequel and prints, per closed implementation run since 2026-09-01: ticket number, map, new files in the merged diff, new classes in the merged diff, follow-up tickets captured at close (from the close comment), and objections raised. Print totals and a per-month median. Store nothing; the report is rerun before and after each charter change.
Data sources (added 2026-10-25 after escalation 70 on run 158; both were unnamed, so the run wired empty stubs):

  • Merged diff for ticket N = git log main --no-merges -p --fixed-strings --grep="(#N)" (pipeline commits end their subject with (#N)). New files = diff entries whose old side is /dev/null. New classes = added lines that declare class Name (not class << self).
  • Follow-ups for ticket N = count of #<digits> references on the **Follow-ups:** line of the last ## Resolution comment on the ticket; none or no such comment = 0. Comments are read through a read-only os-backlog issue-comments NUMBER command, reached from os-sdlc through the existing Tracker::Backlog adapter.
  • Per-month median = for each calendar month of run close, the median of each count column (new files, new classes, follow-ups, objections).

Required work:

  1. A ticket-growth report command in the os-sdlc CLI that prints the per-run table and the medians.
  2. A NewFiles counter over a merged diff that reports new files and new classes.
  3. The ticket-growth command reads the real merged diff and the real follow-ups per the Data sources above; no constant empty sources.

Orchestrator work: run the report once before any of the four charter tickets merges and paste the output on this ticket as the baseline.

Rejected: counting open tickets per month — it measures capture habits, not pipeline output.

Acceptance criteria

  1. Given a pipeline DB with closed runs, when the report runs, then it prints one row per run with new files, new classes, follow-ups, and objections.
  2. Given the same DB, when the report runs twice, then the output is identical.
  3. Given a run whose diff adds no files, when the report runs, then its new-files cell is 0.

Owner sketch

class OsSdlc::Report::TicketGrowth
  def initialize(db:, since:)
  def rows
  def medians
end

class OsSdlc::Report::NewFiles
  def initialize(diff:)
  def files
  def classes
end

Origin

  • Trigger: session review of os-sdlc agent charters on 2026-10-24; Jared: "We seem to be getting too many tickets - especially with os-sdlc. Every round is writing more."
  • Improvised this session: none
  • Chain: ticket growth per round ← minimal-path bias in change-auditor and seam-designer (plugins/os-sdlc/agents/change-auditor.md:40, seam-designer.md:17-19) ← DESIGN (those charters)
  • Root candidate: none found; searched ticket-growth, pipeline DB report, follow-up count, new files, new classes, objections, baseline, realign, median
  • Where: plugins/os-sdlc/lib/os_sdlc (new report namespace)
  • Session: 5da956dc-a39d-4933-8b16-0fa90b4bb8ca
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/5da956dc-a39d-4933-8b16-0fa90b4bb8ca.jsonl

VERDICT: CREATE

## Problem The implement pipeline is suspected of under-building: it extends existing objects, leaves structural debt, and the debt returns as follow-up tickets. Nobody has measured this. Four charter changes are planned (seam-designer, change-auditor, ticket-decompose, reviewer). Without a baseline, no one can tell whether they reduced follow-ups or only moved them. Design record: docs/system-design-format/README.md section 4. ## Reproduce n/a: measurement harness, nothing to reproduce. ## Approach Add a report to the os-sdlc CLI that reads the pipeline DB with Sequel and prints, per closed implementation run since 2026-09-01: ticket number, map, new files in the merged diff, new classes in the merged diff, follow-up tickets captured at close (from the close comment), and objections raised. Print totals and a per-month median. Store nothing; the report is rerun before and after each charter change. Data sources (added 2026-10-25 after escalation 70 on run 158; both were unnamed, so the run wired empty stubs): - Merged diff for ticket N = `git log main --no-merges -p --fixed-strings --grep="(#N)"` (pipeline commits end their subject with `(#N)`). New files = diff entries whose old side is `/dev/null`. New classes = added lines that declare `class Name` (not `class << self`). - Follow-ups for ticket N = count of `#<digits>` references on the `**Follow-ups:**` line of the last `## Resolution` comment on the ticket; `none` or no such comment = 0. Comments are read through a read-only `os-backlog issue-comments NUMBER` command, reached from os-sdlc through the existing `Tracker::Backlog` adapter. - Per-month median = for each calendar month of run close, the median of each count column (new files, new classes, follow-ups, objections). Required work: 1. A `ticket-growth` report command in the os-sdlc CLI that prints the per-run table and the medians. 2. A `NewFiles` counter over a merged diff that reports new files and new classes. 3. The `ticket-growth` command reads the real merged diff and the real follow-ups per the Data sources above; no constant empty sources. Orchestrator work: run the report once before any of the four charter tickets merges and paste the output on this ticket as the baseline. Rejected: counting open tickets per month — it measures capture habits, not pipeline output. ## Acceptance criteria 1. Given a pipeline DB with closed runs, when the report runs, then it prints one row per run with new files, new classes, follow-ups, and objections. 2. Given the same DB, when the report runs twice, then the output is identical. 3. Given a run whose diff adds no files, when the report runs, then its new-files cell is 0. ## Owner sketch ```ruby class OsSdlc::Report::TicketGrowth def initialize(db:, since:) def rows def medians end class OsSdlc::Report::NewFiles def initialize(diff:) def files def classes end ``` ## Origin - Trigger: session review of os-sdlc agent charters on 2026-10-24; Jared: "We seem to be getting too many tickets - especially with os-sdlc. Every round is writing more." - Improvised this session: none - Chain: ticket growth per round ← minimal-path bias in change-auditor and seam-designer (plugins/os-sdlc/agents/change-auditor.md:40, seam-designer.md:17-19) ← DESIGN (those charters) - Root candidate: none found; searched ticket-growth, pipeline DB report, follow-up count, new files, new classes, objections, baseline, realign, median - Where: plugins/os-sdlc/lib/os_sdlc (new report namespace) - Session: 5da956dc-a39d-4933-8b16-0fa90b4bb8ca - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/5da956dc-a39d-4933-8b16-0fa90b4bb8ca.jsonl VERDICT: CREATE
Author
Owner

Work started via /os-sdlc:implement on branch ticket-1312 (map poodr-ticket-implementation).

Work started via /os-sdlc:implement on branch ticket-1312 (map poodr-ticket-implementation).
Author
Owner

Baseline (2026-10-25, main fbda9726)

Run before any of the four charter tickets (#1313-#1316) merged. Command: plugins/os-sdlc/bin/ticket-growth. 109 closed runs. The pipeline DB starts on 2026-10-02, so no September runs exist and only one median month prints. Ticket-wide counts go on the latest closed run of a ticket; earlier runs of the same ticket show 0.

ticket	map	new files	new classes	follow-ups	objections
880	poodr-ticket-implementation	3	2	4	0
897	poodr-ticket-implementation	2	2	3	4
900	poodr-ticket-implementation	2	2	0	3
904	poodr-ticket-implementation	0	0	0	4
904	poodr-ticket-implementation	4	4	1	0
908	poodr-ticket-implementation	4	4	3	1
881	poodr-ticket-implementation	1	1	0	3
909	poodr-ticket-implementation	3	3	0	0
910	poodr-ticket-implementation	3	3	0	0
911	poodr-ticket-implementation	3	4	1	0
913	poodr-ticket-implementation	8	5	4	3
914	poodr-ticket-implementation	1	1	0	2
893	poodr-ticket-implementation	0	0	0	0
906	poodr-ticket-implementation	1	1	0	0
907	poodr-ticket-implementation	0	0	0	0
890	poodr-ticket-implementation	3	1	0	3
847	poodr-ticket-implementation	0	0	0	2
860	poodr-ticket-implementation	1	1	0	0
861	poodr-ticket-implementation	1	1	0	0
947	poodr-ticket-implementation	1	8	3	2
948	poodr-ticket-implementation	1	1	4	0
949	poodr-ticket-implementation	4	4	3	0
839	takedown-implement	1	1	0	0
989	poodr-ticket-implementation	3	3	1	1
984	takedown-implement	1	1	1	0
999	takedown-implement	1	1	2	0
996	takedown-implement	1	1	0	0
997	takedown-implement	1	2	1	0
1003	poodr-ticket-implementation	9	7	0	2
1004	poodr-ticket-implementation	7	12	1	0
1005	poodr-ticket-implementation	2	3	2	0
1009	poodr-ticket-implementation	7	10	0	4
1010	takedown-implement	5	18	2	0
1018	takedown-implement	45	9	1	0
1074	takedown-implement	7	8	3	0
1081	takedown-implement	1	1	0	0
1077	poodr-ticket-implementation	3	2	0	0
1079	poodr-ticket-implementation	6	6	0	1
1088	poodr-ticket-implementation	2	2	0	2
1106	poodr-ticket-implementation	7	15	1	1
1107	poodr-ticket-implementation	4	3	1	4
1118	poodr-ticket-implementation	11	29	0	1
1119	poodr-ticket-implementation	6	8	0	1
1142	poodr-ticket-implementation	2	3	0	3
1143	poodr-ticket-implementation	0	0	2	0
1150	poodr-ticket-implementation	0	0	0	0
1153	poodr-ticket-implementation	6	8	1	0
1072	poodr-ticket-implementation	0	0	0	0
1072	poodr-ticket-implementation	0	0	0	0
1165	structure-change	3	2	1	0
1167	poodr-ticket-implementation	0	0	0	0
1169	structure-change	1	0	1	0
1170	poodr-ticket-implementation	1	2	0	1
1172	structure-change	5	7	1	0
1171	poodr-ticket-implementation	0	0	0	0
1166	structure-change	0	1	0	0
1175	structure-change	0	0	0	0
1176	structure-change	2	4	1	0
1177	structure-change	2	3	0	0
1178	structure-change	0	0	0	0
1179	structure-change	0	0	0	0
1180	structure-change	0	0	0	0
1181	structure-change	1	3	0	0
1182	structure-change	1	17	0	0
1183	poodr-ticket-implementation	0	0	0	0
1145	structure-change	0	0	0	0
1146	structure-change	0	0	0	0
1147	structure-change	2	2	0	0
1193	poodr-ticket-implementation	0	0	0	1
1194	poodr-ticket-implementation	0	0	0	0
1195	structure-change	0	0	0	0
1196	structure-change	0	0	0	0
1197	structure-change	0	0	0	0
1198	structure-change	0	0	0	0
1201	poodr-ticket-implementation	7	3	0	2
1217	poodr-ticket-implementation	3	3	1	2
1222	poodr-ticket-implementation	1	1	0	0
1234	poodr-ticket-implementation	5	5	0	9
1242	poodr-ticket-implementation	7	8	0	0
1243	poodr-ticket-implementation	8	9	0	0
1244	poodr-ticket-implementation	12	11	1	1
1254	poodr-ticket-implementation	2	4	0	0
1245	poodr-ticket-implementation	7	6	1	0
1257	poodr-ticket-implementation	2	5	0	3
1246	poodr-ticket-implementation	8	10	3	0
1262	poodr-ticket-implementation	9	10	0	0
1264	poodr-ticket-implementation	10	7	0	1
1263	poodr-ticket-implementation	4	3	1	1
1247	poodr-ticket-implementation	10	11	2	2
1265	poodr-ticket-implementation	6	6	0	1
1250	poodr-ticket-implementation	2	4	1	0
1248	poodr-ticket-implementation	5	3	0	0
1249	poodr-ticket-implementation	6	6	0	3
1253	poodr-ticket-implementation	4	5	0	1
1279	poodr-ticket-implementation	3	4	1	1
1251	poodr-ticket-implementation	11	13	1	0
1278	poodr-ticket-implementation	10	8	1	0
1281	poodr-ticket-implementation	0	0	0	1
1283	poodr-ticket-implementation	8	5	0	0
1285	poodr-ticket-implementation	15	13	0	0
1280	poodr-ticket-implementation	3	5	2	5
1284	poodr-ticket-implementation	5	13	1	2
925	poodr-ticket-implementation	0	0	0	6
1289	poodr-ticket-implementation	3	5	1	0
1293	poodr-ticket-implementation	1	2	0	0
1291	poodr-ticket-implementation	2	1	0	0
1292	poodr-ticket-implementation	6	7	1	3
1299	poodr-ticket-implementation	2	3	0	2
1295	poodr-ticket-implementation	0	0	0	1
total		389	441	67	96
median 2026-10		2	3	0	0

## Baseline (2026-10-25, main fbda9726) Run before any of the four charter tickets (#1313-#1316) merged. Command: `plugins/os-sdlc/bin/ticket-growth`. 109 closed runs. The pipeline DB starts on 2026-10-02, so no September runs exist and only one median month prints. Ticket-wide counts go on the latest closed run of a ticket; earlier runs of the same ticket show 0. ``` ticket map new files new classes follow-ups objections 880 poodr-ticket-implementation 3 2 4 0 897 poodr-ticket-implementation 2 2 3 4 900 poodr-ticket-implementation 2 2 0 3 904 poodr-ticket-implementation 0 0 0 4 904 poodr-ticket-implementation 4 4 1 0 908 poodr-ticket-implementation 4 4 3 1 881 poodr-ticket-implementation 1 1 0 3 909 poodr-ticket-implementation 3 3 0 0 910 poodr-ticket-implementation 3 3 0 0 911 poodr-ticket-implementation 3 4 1 0 913 poodr-ticket-implementation 8 5 4 3 914 poodr-ticket-implementation 1 1 0 2 893 poodr-ticket-implementation 0 0 0 0 906 poodr-ticket-implementation 1 1 0 0 907 poodr-ticket-implementation 0 0 0 0 890 poodr-ticket-implementation 3 1 0 3 847 poodr-ticket-implementation 0 0 0 2 860 poodr-ticket-implementation 1 1 0 0 861 poodr-ticket-implementation 1 1 0 0 947 poodr-ticket-implementation 1 8 3 2 948 poodr-ticket-implementation 1 1 4 0 949 poodr-ticket-implementation 4 4 3 0 839 takedown-implement 1 1 0 0 989 poodr-ticket-implementation 3 3 1 1 984 takedown-implement 1 1 1 0 999 takedown-implement 1 1 2 0 996 takedown-implement 1 1 0 0 997 takedown-implement 1 2 1 0 1003 poodr-ticket-implementation 9 7 0 2 1004 poodr-ticket-implementation 7 12 1 0 1005 poodr-ticket-implementation 2 3 2 0 1009 poodr-ticket-implementation 7 10 0 4 1010 takedown-implement 5 18 2 0 1018 takedown-implement 45 9 1 0 1074 takedown-implement 7 8 3 0 1081 takedown-implement 1 1 0 0 1077 poodr-ticket-implementation 3 2 0 0 1079 poodr-ticket-implementation 6 6 0 1 1088 poodr-ticket-implementation 2 2 0 2 1106 poodr-ticket-implementation 7 15 1 1 1107 poodr-ticket-implementation 4 3 1 4 1118 poodr-ticket-implementation 11 29 0 1 1119 poodr-ticket-implementation 6 8 0 1 1142 poodr-ticket-implementation 2 3 0 3 1143 poodr-ticket-implementation 0 0 2 0 1150 poodr-ticket-implementation 0 0 0 0 1153 poodr-ticket-implementation 6 8 1 0 1072 poodr-ticket-implementation 0 0 0 0 1072 poodr-ticket-implementation 0 0 0 0 1165 structure-change 3 2 1 0 1167 poodr-ticket-implementation 0 0 0 0 1169 structure-change 1 0 1 0 1170 poodr-ticket-implementation 1 2 0 1 1172 structure-change 5 7 1 0 1171 poodr-ticket-implementation 0 0 0 0 1166 structure-change 0 1 0 0 1175 structure-change 0 0 0 0 1176 structure-change 2 4 1 0 1177 structure-change 2 3 0 0 1178 structure-change 0 0 0 0 1179 structure-change 0 0 0 0 1180 structure-change 0 0 0 0 1181 structure-change 1 3 0 0 1182 structure-change 1 17 0 0 1183 poodr-ticket-implementation 0 0 0 0 1145 structure-change 0 0 0 0 1146 structure-change 0 0 0 0 1147 structure-change 2 2 0 0 1193 poodr-ticket-implementation 0 0 0 1 1194 poodr-ticket-implementation 0 0 0 0 1195 structure-change 0 0 0 0 1196 structure-change 0 0 0 0 1197 structure-change 0 0 0 0 1198 structure-change 0 0 0 0 1201 poodr-ticket-implementation 7 3 0 2 1217 poodr-ticket-implementation 3 3 1 2 1222 poodr-ticket-implementation 1 1 0 0 1234 poodr-ticket-implementation 5 5 0 9 1242 poodr-ticket-implementation 7 8 0 0 1243 poodr-ticket-implementation 8 9 0 0 1244 poodr-ticket-implementation 12 11 1 1 1254 poodr-ticket-implementation 2 4 0 0 1245 poodr-ticket-implementation 7 6 1 0 1257 poodr-ticket-implementation 2 5 0 3 1246 poodr-ticket-implementation 8 10 3 0 1262 poodr-ticket-implementation 9 10 0 0 1264 poodr-ticket-implementation 10 7 0 1 1263 poodr-ticket-implementation 4 3 1 1 1247 poodr-ticket-implementation 10 11 2 2 1265 poodr-ticket-implementation 6 6 0 1 1250 poodr-ticket-implementation 2 4 1 0 1248 poodr-ticket-implementation 5 3 0 0 1249 poodr-ticket-implementation 6 6 0 3 1253 poodr-ticket-implementation 4 5 0 1 1279 poodr-ticket-implementation 3 4 1 1 1251 poodr-ticket-implementation 11 13 1 0 1278 poodr-ticket-implementation 10 8 1 0 1281 poodr-ticket-implementation 0 0 0 1 1283 poodr-ticket-implementation 8 5 0 0 1285 poodr-ticket-implementation 15 13 0 0 1280 poodr-ticket-implementation 3 5 2 5 1284 poodr-ticket-implementation 5 13 1 2 925 poodr-ticket-implementation 0 0 0 6 1289 poodr-ticket-implementation 3 5 1 0 1293 poodr-ticket-implementation 1 2 0 0 1291 poodr-ticket-implementation 2 1 0 0 1292 poodr-ticket-implementation 6 7 1 3 1299 poodr-ticket-implementation 2 3 0 2 1295 poodr-ticket-implementation 0 0 0 1 total 389 441 67 96 median 2026-10 2 3 0 0 ```
Author
Owner

Resolution

Done: Added plugins/os-sdlc/bin/ticket-growth (Report::Run, TicketGrowth, NewFiles, MergedDiff, FollowUps, Table) and os-backlog issue-comments read through Tracker::Backlog. Per closed run since 2026-09-01 it prints ticket, map, new files, new classes, follow-ups, objections, totals and per-month medians of all four counts. Baseline posted on this ticket. Hand-finished after escalation 70 on run 158; the ticket body gained a Data sources block.

Evidence: main fbda9726. ruby plugins/os-sdlc/tests/all.rb: 2514 runs, 0 failures; ruby plugins/os-backlog/tests/all.rb: 327 runs, 0 failures; rubocop on 26 changed files: no offenses; one opus design audit, every finding fixed or answered. Real run on main: 109 rows, total 389/441/67/96, median 2026-10 2/3/0/0.

Follow-ups: Pipeline defect recorded as an occurrence on existing #1113 (test-reviewer passed a disclosed wiring gap; change-auditor data-source UNKNOWNs went forward). Dropped: anchoring the (#N) grep to the subject end and file paths with spaces in NewFiles; low value for a trend baseline.

## Resolution **Done:** Added plugins/os-sdlc/bin/ticket-growth (Report::Run, TicketGrowth, NewFiles, MergedDiff, FollowUps, Table) and os-backlog issue-comments read through Tracker::Backlog. Per closed run since 2026-09-01 it prints ticket, map, new files, new classes, follow-ups, objections, totals and per-month medians of all four counts. Baseline posted on this ticket. Hand-finished after escalation 70 on run 158; the ticket body gained a Data sources block. **Evidence:** main fbda9726. ruby plugins/os-sdlc/tests/all.rb: 2514 runs, 0 failures; ruby plugins/os-backlog/tests/all.rb: 327 runs, 0 failures; rubocop on 26 changed files: no offenses; one opus design audit, every finding fixed or answered. Real run on main: 109 rows, total 389/441/67/96, median 2026-10 2/3/0/0. **Follow-ups:** Pipeline defect recorded as an occurrence on existing #1113 (test-reviewer passed a disclosed wiring gap; change-auditor data-source UNKNOWNs went forward). Dropped: anchoring the (#N) grep to the subject end and file paths with spaces in NewFiles; low value for a trend baseline.
jared closed this issue 2026-10-25 14:02:04 +00:00
Author
Owner

Checkpoint 2026-10-25 after #1313-#1316 merged (main 59f6cdb0): ticket-growth output is identical to the baseline (109 runs, total 389/441/67/96, median 2026-10 2/3/0/0). No implementation run has closed on the new charters yet, so the comparison rerun is due after the next batch of poodr-ticket-implementation runs, not now.

Checkpoint 2026-10-25 after #1313-#1316 merged (main 59f6cdb0): ticket-growth output is identical to the baseline (109 runs, total 389/441/67/96, median 2026-10 2/3/0/0). No implementation run has closed on the new charters yet, so the comparison rerun is due after the next batch of poodr-ticket-implementation runs, not now.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#1312
No description provided.