Move lint-worklist batch to concept roots per roles-lint-worklist.md #783

Closed
opened 2026-09-27 23:05:37 +00:00 by jared · 3 comments
Owner

Problem

Lint-worklist files sit in role directories with no concept root.
The role table in roles-lint-worklist.md names the moves to consolidate scattered lint-worklist concepts.

Reproduce

n/a: structure-only refactor from a role-morph table.

Approach

Apply the move map in roles-lint-worklist.md with git mv; rename constants; update every caller in lib/, bin/, hooks/, agents/, skills/; move tests to mirror the new paths; update lib/os_sdlc.rb inflections and lint/inward_dependencies.rb tables as needed. Rulings adopted: WorklistReport splits into a LintWorklist controller (controller/) and Worklist::Listing presenter; WorklistTarget becomes Project::LintTarget with a load class method; read-only shell-outs stay Adapters; WorklistRubocopConfig stays top-level; CopPhase nests under Worklist; LintOffense, LintViolations, LintFeedback nest under Brief, Gate, Gate. Decide by the lens heuristics (skills/lens-architecture, lens-tactics, lens-principles); where an Accepted ADR conflicts with a lens rule, follow the lens and record the deviation in docs/crc/os-sdlc/deviations.md.

Required work:

  1. Every row of the move map in roles-lint-worklist.md applied, or a one-line reason in deviations.md for each row skipped — check: git diff --stat main -- plugins/os-sdlc/lib
  2. Suite green — check: cd plugins/os-sdlc && ruby tests/all.rb
  3. Inward-dependency lint not above baseline — check: plugins/os-sdlc/bin/lint-inward-dependencies
  4. bin/ script stdout byte-identical on the commands the batch touches — check: diff against recorded output

Acceptance criteria

  1. Given the move map in roles-lint-worklist.md, when the branch is diffed against main, then each listed file is at its proposed path with its proposed constant, or deviations.md names it.
  2. Given the suite, when run, then it passes with zero failures and no new tests.
  3. Given the bin scripts the batch touches, when run against fixtures, then stdout is byte-identical to before.

Owner sketch

class OsSdlc::LintWorklist; end
class OsSdlc::Worklist::Listing; end

Non-goals

No behavior change. No new tests. Dead-code deletion is ticket A.

Origin

  • Trigger: CRC session 13 role-morph pass, docs/crc/os-sdlc/roles-lint-worklist.md
  • Improvised this session: none
  • Chain: scattered concepts ← per-file role rename (#737, ADR-0222) ← DESIGN (ADR-0222; corrected by ROLE-MORPH-BRIEF.md "decide the role per concept")
  • Root candidate: this ticket
  • Where: plugins/os-sdlc/lib/os_sdlc/ (files listed in roles-lint-worklist.md)
  • Session: e64808e4-7c0b-4664-9d13-177acbbc143c
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-pass-os-sdlc/e64808e4-7c0b-4664-9d13-177acbbc143c.jsonl
## Problem Lint-worklist files sit in role directories with no concept root. The role table in roles-lint-worklist.md names the moves to consolidate scattered lint-worklist concepts. ## Reproduce n/a: structure-only refactor from a role-morph table. ## Approach Apply the move map in roles-lint-worklist.md with git mv; rename constants; update every caller in lib/, bin/, hooks/, agents/, skills/; move tests to mirror the new paths; update lib/os_sdlc.rb inflections and lint/inward_dependencies.rb tables as needed. Rulings adopted: WorklistReport splits into a LintWorklist controller (controller/) and Worklist::Listing presenter; WorklistTarget becomes Project::LintTarget with a load class method; read-only shell-outs stay Adapters; WorklistRubocopConfig stays top-level; CopPhase nests under Worklist; LintOffense, LintViolations, LintFeedback nest under Brief, Gate, Gate. Decide by the lens heuristics (skills/lens-architecture, lens-tactics, lens-principles); where an Accepted ADR conflicts with a lens rule, follow the lens and record the deviation in docs/crc/os-sdlc/deviations.md. Required work: 1. Every row of the move map in roles-lint-worklist.md applied, or a one-line reason in deviations.md for each row skipped — check: git diff --stat main -- plugins/os-sdlc/lib 2. Suite green — check: cd plugins/os-sdlc && ruby tests/all.rb 3. Inward-dependency lint not above baseline — check: plugins/os-sdlc/bin/lint-inward-dependencies 4. bin/ script stdout byte-identical on the commands the batch touches — check: diff against recorded output ## Acceptance criteria 1. Given the move map in roles-lint-worklist.md, when the branch is diffed against main, then each listed file is at its proposed path with its proposed constant, or deviations.md names it. 2. Given the suite, when run, then it passes with zero failures and no new tests. 3. Given the bin scripts the batch touches, when run against fixtures, then stdout is byte-identical to before. ## Owner sketch ```ruby class OsSdlc::LintWorklist; end class OsSdlc::Worklist::Listing; end ``` ## Non-goals No behavior change. No new tests. Dead-code deletion is ticket A. ## Origin - Trigger: CRC session 13 role-morph pass, docs/crc/os-sdlc/roles-lint-worklist.md - Improvised this session: none - Chain: scattered concepts ← per-file role rename (#737, ADR-0222) ← DESIGN (ADR-0222; corrected by ROLE-MORPH-BRIEF.md "decide the role per concept") - Root candidate: this ticket - Where: plugins/os-sdlc/lib/os_sdlc/ (files listed in roles-lint-worklist.md) - Session: e64808e4-7c0b-4664-9d13-177acbbc143c - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-pass-os-sdlc/e64808e4-7c0b-4664-9d13-177acbbc143c.jsonl
Author
Owner

Commits: c27fe148, c227d325, 52ce20e6, 1fb71a79, 15db3713, 2a76e2ea, b1129fd0 (crc-pass-os-sdlc branch); suite 1300 runs/0 failures throughout, bin/lint-worklist byte-identical on --new-project error path.
Rows applied: 11/11 (8 move-map rows + 3 renamed-not-relocated rows: CopPhase, RubocopReportFetcher, WorklistGate+Burndown, WorklistTarget+WorklistTargetLoader, WorklistReport split (LintWorklist/Worklist::Listing)+AssignmentFile fold, LintOffense, LintViolations, LintFeedback). WorklistRubocopConfig and FlayCheckTarget left untouched per ticket (flagged-shared adapter; not in this move map).
Rows deviated: 0 skipped; 1 flagged tension (not reverted, ruling stands): Project::LintTarget.load fetching Project::Yaml puts a fetch inside a model root, against lens A11 -- logged in docs/crc/os-sdlc/deviations.md. lint-inward-dependencies moved 63->65 (informational only, exits 0, no baseline gate).

Commits: c27fe148, c227d325, 52ce20e6, 1fb71a79, 15db3713, 2a76e2ea, b1129fd0 (crc-pass-os-sdlc branch); suite 1300 runs/0 failures throughout, bin/lint-worklist byte-identical on --new-project error path. Rows applied: 11/11 (8 move-map rows + 3 renamed-not-relocated rows: CopPhase, RubocopReportFetcher, WorklistGate+Burndown, WorklistTarget+WorklistTargetLoader, WorklistReport split (LintWorklist/Worklist::Listing)+AssignmentFile fold, LintOffense, LintViolations, LintFeedback). WorklistRubocopConfig and FlayCheckTarget left untouched per ticket (flagged-shared adapter; not in this move map). Rows deviated: 0 skipped; 1 flagged tension (not reverted, ruling stands): Project::LintTarget.load fetching Project::Yaml puts a fetch inside a model root, against lens A11 -- logged in docs/crc/os-sdlc/deviations.md. lint-inward-dependencies moved 63->65 (informational only, exits 0, no baseline gate).
Author
Owner

Reversed the A11 fold in commit 4f7b9b30: LintWorklist controller now loads the project, Project::LintTarget only decides.

Reversed the A11 fold in commit 4f7b9b30: LintWorklist controller now loads the project, Project::LintTarget only decides.
Author
Owner

Resolution

Done: lint-worklist batch moved to concept roots per roles-lint-worklist.md: LintWorklist controller, Worklist::Listing/CopPhase/Report/AssignmentFile, LintGate and LintGate::Ledger, Project::LintTarget, Brief::LintOffense, Gate::LintViolations, Gate::LintFeedback; 11 of 11 rows; LintTarget.load fold reversed under A6/A11 so the controller loads and the model decides.

Evidence: Commits c27fe148..4f7b9b30 on crc-pass-os-sdlc; suite 1300 runs 0 failures; bin/lint-worklist stdout byte-identical; inward lint exit 0.

Follow-ups: none

## Resolution **Done:** lint-worklist batch moved to concept roots per roles-lint-worklist.md: LintWorklist controller, Worklist::Listing/CopPhase/Report/AssignmentFile, LintGate and LintGate::Ledger, Project::LintTarget, Brief::LintOffense, Gate::LintViolations, Gate::LintFeedback; 11 of 11 rows; LintTarget.load fold reversed under A6/A11 so the controller loads and the model decides. **Evidence:** Commits c27fe148..4f7b9b30 on crc-pass-os-sdlc; suite 1300 runs 0 failures; bin/lint-worklist stdout byte-identical; inward lint exit 0. **Follow-ups:** none
jared closed this issue 2026-09-28 01:18:18 +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#783
No description provided.