CRC open rows: the progress table counts open and blocked detector rows, not only raw rows #1279

Closed
opened 2026-10-23 19:43:07 +00:00 by jared · 2 comments
Owner

Problem

The CRC progress table counts every row of each wave 0 detector TSV. It does not separate rows that a structure ruling already kept from rows that are still open. In CRC run 4 the table showed holders 662 -> 667 and cycle-edges 2 -> 2, but 649 holders rows have the fact verdict=keep, and the one cycle (S11) waits on a revisit ruling. The table showed no progress, and it hid where the open work is.

Reproduce

n/a: design gap. Run the ProgressTable command in crc-refactor SKILL.md phase 1 on docs/crc/os-sdlc; every count is a raw row count.

Approach

Add Crc::OpenRows. It joins each detector row to wave0/structure-rulings.tsv and to a new file wave0/structure-governs.tsv. ProgressTable adds the columns Kind, Open, and Blocked. Delta measures open rows.

Join from detector to ruling detector value and subject:

Detector TSV Ruling detector Subject of the row
cycle-edges cycle <from_concept><-><to_concept>, either order
reach-through reach the chain fact; a ruling subject matches when the chain equals it or starts with it plus .
holders promote, demote the constant fact
error-lineage error the constant fact, with or without the OsSdlc:: prefix

A row is a candidate when the detector is not holders, or when its verdict fact is not keep. A candidate row is closed when a ruling for its subject has decision keep, or when the ruling id is in structure-governs.tsv and that line lists the subject. structure-governs.tsv has the header id governs; governs is a ;-separated list of subjects. A closed row is not open. A row is blocked when a file it names (path, the file fact, or the files fact without :line) is listed in wave0/revisit-files.txt. A blocked row counts in Blocked, not in Open. Kind is inventory for holders and error-lineage, defect for the others. baseline.json stores the open counts under the key open at the first render. When baseline.json has no open key, the Delta cell is -.

Do not add a column to structure-rulings.tsv. Another session appends rows to it.

Required work:

  1. Add the OpenRows class, with open_paths (the files of every open row, for the census scope ticket) — check: present class OpenRows in plugins/os-sdlc/lib/os_sdlc/crc/open_rows.rb
  2. ProgressTable renders the Open column — check: present "Open" in plugins/os-sdlc/lib/os_sdlc/crc/progress_table.rb
  3. crc-refactor SKILL.md phase 1 names wave0/structure-governs.tsv and says when to add a line to it — check: present structure-governs.tsv in plugins/os-sdlc/skills/crc-refactor/SKILL.md

Acceptance criteria

  1. Given a cycle-edges TSV with the edges Dispatch->Implementation and Brief->Dispatch, and a ruling cycle Brief<->Dispatch keep, when the table renders, then the cycle-edges row shows Now 2 and Open 1.
  2. Given a holders row with fact verdict=keep, when the table renders, then that row does not count in Open.
  3. Given a holders row with fact verdict=promote for constant Project::Config, when no ruling names Project::Config, then it counts in Open; when a promote Project::Config keep ruling exists, then it does not.
  4. Given an error-lineage row for OsSdlc::Loud::Error and a structure-governs.tsv line S31 Loud::Error;Lint::Error where S31 has decision keep, when the table renders, then that row does not count in Open.
  5. Given a reach-through row with chain @result.report.call and a ruling reach @result.report keep, when the table renders, then that row does not count in Open.
  6. Given a reach-through row whose file fact is listed in wave0/revisit-files.txt, when the table renders, then the row counts in Blocked and not in Open.
  7. Given the table renders, then the Kind cell is inventory for holders and error-lineage and defect for cycle-edges and reach-through.
  8. Given a baseline.json with no open key, when the table renders, then each Delta cell is -; given one with open counts, then Delta is Open now minus Open at baseline.
  9. Given no structure-rulings.tsv and no revisit-files.txt, when the table renders, then Open equals the candidate count and Blocked is 0.

Owner sketch

module OsSdlc
  module Crc
    class OpenRows
      def initialize(run_path)
      def open(name)
      def blocked(name)
      def open_paths
    end
  end
end

ProgressTable builds one OpenRows from its run_dir and calls open(name) and blocked(name) per detector.

Origin

  • Trigger: CRC run 4 close-out (docs/crc/os-sdlc/HANDOFF.md, Review 2026-10-23); Jared asked why the detector counts did not move
  • Improvised this session: a one-off join script estimated open counts (holders ~6, reach ~23, cycle 0 open and 2 blocked)
  • Chain: flat detector counts ← ProgressTable#counts counts raw rows ← DESIGN (plugins/os-sdlc/lib/os_sdlc/crc/progress_table.rb)
  • Root candidate: none found; searched ProgressTable, progress_table, OpenRows, open_rows, structure-rulings, structure-governs, revisit-files
  • Where: plugins/os-sdlc/lib/os_sdlc/crc/progress_table.rb
  • Session: c1bedec6-7e01-45ab-b9db-22d63652c19f
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-os-sdlc-run-4/c1bedec6-7e01-45ab-b9db-22d63652c19f.jsonl

VERDICT: CREATE

## Problem The CRC progress table counts every row of each wave 0 detector TSV. It does not separate rows that a structure ruling already kept from rows that are still open. In CRC run 4 the table showed holders 662 -> 667 and cycle-edges 2 -> 2, but 649 holders rows have the fact `verdict=keep`, and the one cycle (S11) waits on a revisit ruling. The table showed no progress, and it hid where the open work is. ## Reproduce n/a: design gap. Run the ProgressTable command in crc-refactor SKILL.md phase 1 on `docs/crc/os-sdlc`; every count is a raw row count. ## Approach Add `Crc::OpenRows`. It joins each detector row to `wave0/structure-rulings.tsv` and to a new file `wave0/structure-governs.tsv`. ProgressTable adds the columns Kind, Open, and Blocked. Delta measures open rows. Join from detector to ruling `detector` value and subject: | Detector TSV | Ruling detector | Subject of the row | |---|---|---| | cycle-edges | cycle | `<from_concept><-><to_concept>`, either order | | reach-through | reach | the `chain` fact; a ruling subject matches when the chain equals it or starts with it plus `.` | | holders | promote, demote | the `constant` fact | | error-lineage | error | the `constant` fact, with or without the `OsSdlc::` prefix | A row is a candidate when the detector is not holders, or when its `verdict` fact is not `keep`. A candidate row is closed when a ruling for its subject has decision `keep`, or when the ruling id is in `structure-governs.tsv` and that line lists the subject. `structure-governs.tsv` has the header `id governs`; `governs` is a `;`-separated list of subjects. A closed row is not open. A row is blocked when a file it names (`path`, the `file` fact, or the `files` fact without `:line`) is listed in `wave0/revisit-files.txt`. A blocked row counts in Blocked, not in Open. Kind is `inventory` for holders and error-lineage, `defect` for the others. `baseline.json` stores the open counts under the key `open` at the first render. When `baseline.json` has no `open` key, the Delta cell is `-`. Do not add a column to `structure-rulings.tsv`. Another session appends rows to it. Required work: 1. Add the OpenRows class, with `open_paths` (the files of every open row, for the census scope ticket) — check: present `class OpenRows` in `plugins/os-sdlc/lib/os_sdlc/crc/open_rows.rb` 2. ProgressTable renders the Open column — check: present `"Open"` in `plugins/os-sdlc/lib/os_sdlc/crc/progress_table.rb` 3. crc-refactor SKILL.md phase 1 names `wave0/structure-governs.tsv` and says when to add a line to it — check: present `structure-governs.tsv` in `plugins/os-sdlc/skills/crc-refactor/SKILL.md` ## Acceptance criteria 1. Given a cycle-edges TSV with the edges Dispatch->Implementation and Brief->Dispatch, and a ruling `cycle Brief<->Dispatch keep`, when the table renders, then the cycle-edges row shows Now 2 and Open 1. 2. Given a holders row with fact `verdict=keep`, when the table renders, then that row does not count in Open. 3. Given a holders row with fact `verdict=promote` for constant `Project::Config`, when no ruling names `Project::Config`, then it counts in Open; when a `promote Project::Config keep` ruling exists, then it does not. 4. Given an error-lineage row for `OsSdlc::Loud::Error` and a `structure-governs.tsv` line `S31 Loud::Error;Lint::Error` where S31 has decision keep, when the table renders, then that row does not count in Open. 5. Given a reach-through row with chain `@result.report.call` and a ruling `reach @result.report keep`, when the table renders, then that row does not count in Open. 6. Given a reach-through row whose `file` fact is listed in `wave0/revisit-files.txt`, when the table renders, then the row counts in Blocked and not in Open. 7. Given the table renders, then the Kind cell is `inventory` for holders and error-lineage and `defect` for cycle-edges and reach-through. 8. Given a `baseline.json` with no `open` key, when the table renders, then each Delta cell is `-`; given one with `open` counts, then Delta is Open now minus Open at baseline. 9. Given no `structure-rulings.tsv` and no `revisit-files.txt`, when the table renders, then Open equals the candidate count and Blocked is 0. ## Owner sketch ```ruby module OsSdlc module Crc class OpenRows def initialize(run_path) def open(name) def blocked(name) def open_paths end end end ``` ProgressTable builds one OpenRows from its `run_dir` and calls `open(name)` and `blocked(name)` per detector. ## Origin - Trigger: CRC run 4 close-out (docs/crc/os-sdlc/HANDOFF.md, Review 2026-10-23); Jared asked why the detector counts did not move - Improvised this session: a one-off join script estimated open counts (holders ~6, reach ~23, cycle 0 open and 2 blocked) - Chain: flat detector counts ← ProgressTable#counts counts raw rows ← DESIGN (plugins/os-sdlc/lib/os_sdlc/crc/progress_table.rb) - Root candidate: none found; searched ProgressTable, progress_table, OpenRows, open_rows, structure-rulings, structure-governs, revisit-files - Where: plugins/os-sdlc/lib/os_sdlc/crc/progress_table.rb - Session: c1bedec6-7e01-45ab-b9db-22d63652c19f - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-os-sdlc-run-4/c1bedec6-7e01-45ab-b9db-22d63652c19f.jsonl VERDICT: CREATE
Author
Owner

Work started (session c1bedec6). Branch crc-os-sdlc-run-4 in worktree .claude/worktrees/crc-os-sdlc-run-4 (persistent mode: the session runs inside that worktree). #1280 follows after this ticket merges. The revisit-rows session must not edit progress_table.rb, open_rows*, or census*.

Work started (session c1bedec6). Branch crc-os-sdlc-run-4 in worktree .claude/worktrees/crc-os-sdlc-run-4 (persistent mode: the session runs inside that worktree). #1280 follows after this ticket merges. The revisit-rows session must not edit progress_table.rb, open_rows*, or census*.
Author
Owner

Resolution

Done: Crc::OpenRows and OpenRows::Row added; ProgressTable renders Kind, Open, Blocked, and Delta (open) columns; SKILL.md phase 1 names wave0/structure-governs.tsv.

Evidence: Commit 27213351 on crc-os-sdlc-run-4, implementation 140 (10 dispatches, 11 min 28 s), suite gate green. Real-data render on docs/crc/os-sdlc: reach-through open 17 blocked 5, holders open 5 blocked 1.

Follow-ups: #1281 (revisit check before ruling check; structure-rulings is not a detector)

## Resolution **Done:** Crc::OpenRows and OpenRows::Row added; ProgressTable renders Kind, Open, Blocked, and Delta (open) columns; SKILL.md phase 1 names wave0/structure-governs.tsv. **Evidence:** Commit 27213351 on crc-os-sdlc-run-4, implementation 140 (10 dispatches, 11 min 28 s), suite gate green. Real-data render on docs/crc/os-sdlc: reach-through open 17 blocked 5, holders open 5 blocked 1. **Follow-ups:** #1281 (revisit check before ruling check; structure-rulings is not a detector)
jared closed this issue 2026-10-23 19:56:19 +00:00
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#1279
No description provided.