Preserve whole object: Offense for line+message #1203

Closed
opened 2026-10-20 02:11:15 +00:00 by jared · 4 comments
Owner

Problem

line+message (data_clump, score 8) spans 4 classes in concepts Brief, Lint.

  • OsSdlc::Brief::LintOffense (/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb:5)
  • OsSdlc::Lint::Output::Offense (/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/lint/output/offense.rb:6)
  • OsSdlc::Lint::ResidualWorklist (/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/lint/residual_worklist.rb:6)
  • OsSdlc::Lint::Worklist (/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/lint/worklist.rb:6)

support 4; maximal

Approach

The clump's names are members of one object that already exists or is built upstream; pass the object. Object: OsSdlc::Lint::Output::Offense. Lint::Output::Offense already holds cop_name, path, line, and message, and Worklist::Offense and ResidualWorklist::Offense are local copies of it built from the same rubocop fields, so the sites take that object instead of the loose pair; no new owner is needed. exit_status+output is left out because no existing object holds that pair (Lint::Shell returns a bare tuple) and it needs a new result owner.

Required work:

  1. OsSdlc::Brief::LintOffense takes dispatch_id, agent_type, offense, raw — check: absent line: in plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb
  2. OsSdlc::Brief::LintOffense takes dispatch_id, agent_type, offense, raw — check: absent message: in plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb
  3. OsSdlc::Lint::ResidualWorklist takes residual_report — check: absent line: in plugins/os-sdlc/lib/os_sdlc/lint/residual_worklist.rb
  4. OsSdlc::Lint::ResidualWorklist takes residual_report — check: absent message: in plugins/os-sdlc/lib/os_sdlc/lint/residual_worklist.rb
  5. OsSdlc::Lint::Worklist takes rubocop_report — check: absent line: in plugins/os-sdlc/lib/os_sdlc/lint/worklist.rb
  6. OsSdlc::Lint::Worklist takes rubocop_report — check: absent message: in plugins/os-sdlc/lib/os_sdlc/lint/worklist.rb

Orchestrator work: re-measure with bin/collaborator-pass measure --runs docs/crc/os-sdlc/collaborator-runs, then stop-check.

Rejected: build_once_at_entry — Lint::Output::Offense already holds cop_name, path, line, and message, and Worklist::Offense and ResidualWorklist::Offense are local copies of it built from the same rubocop fields, so the sites take that object instead of the loose pair; no new owner is needed. exit_status+output is left out because no existing object holds that pair (Lint::Shell returns a bare tuple) and it needs a new result owner.

Acceptance criteria

  1. Given today's lib, when bin/collaborator-pass measure --sources params,inward,flay runs after the change, then the data_clump finding line+message scores at most 2 (was 8) and none of line, message appears in its names.
  2. Given a rubocop report, when the worklist and residual worklist render their dispatch groups and prompts, then the output text is unchanged.
  3. Given a lint offense in a subagent brief, when the brief is built and read, then its cop, path, line, and message values are unchanged.

Owner sketch

class OsSdlc::Lint::Output::Offense
end

class OsSdlc::Brief::LintOffense
  def initialize(dispatch_id, agent_type, offense, raw)
  end
end

class OsSdlc::Lint::ResidualWorklist
  def initialize(residual_report)
  end
end

class OsSdlc::Lint::Worklist
  def initialize(rubocop_report)
  end
end

Origin

  • Trigger: bin/collaborator-pass run 20261020T020325Z
  • Improvised this session: none
  • Chain: line+message across 4 classes ← DESIGN (plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb)
  • Root candidate: none found; searched LintOffense, ResidualWorklist, Lint::Worklist, Lint::Output::Offense, line+message, data_clump, preserve whole object
  • Where: plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb
  • Session: 2e167079-f404-4139-9cfa-6c0c937ce9f0
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-os-sdlc-run-3/2e167079-f404-4139-9cfa-6c0c937ce9f0.jsonl

VERDICT: CREATE

## Problem line+message (data_clump, score 8) spans 4 classes in concepts Brief, Lint. - `OsSdlc::Brief::LintOffense` (`/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb:5`) - `OsSdlc::Lint::Output::Offense` (`/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/lint/output/offense.rb:6`) - `OsSdlc::Lint::ResidualWorklist` (`/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/lint/residual_worklist.rb:6`) - `OsSdlc::Lint::Worklist` (`/home/jared/dev/cc-os/.claude/worktrees/crc-os-sdlc-run-3/plugins/os-sdlc/lib/os_sdlc/lint/worklist.rb:6`) support 4; maximal ## Approach The clump's names are members of one object that already exists or is built upstream; pass the object. Object: `OsSdlc::Lint::Output::Offense`. Lint::Output::Offense already holds cop_name, path, line, and message, and Worklist::Offense and ResidualWorklist::Offense are local copies of it built from the same rubocop fields, so the sites take that object instead of the loose pair; no new owner is needed. exit_status+output is left out because no existing object holds that pair (Lint::Shell returns a bare tuple) and it needs a new result owner. Required work: 1. `OsSdlc::Brief::LintOffense` takes `dispatch_id, agent_type, offense, raw` — check: absent `line:` in `plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb` 2. `OsSdlc::Brief::LintOffense` takes `dispatch_id, agent_type, offense, raw` — check: absent `message:` in `plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb` 3. `OsSdlc::Lint::ResidualWorklist` takes `residual_report` — check: absent `line:` in `plugins/os-sdlc/lib/os_sdlc/lint/residual_worklist.rb` 4. `OsSdlc::Lint::ResidualWorklist` takes `residual_report` — check: absent `message:` in `plugins/os-sdlc/lib/os_sdlc/lint/residual_worklist.rb` 5. `OsSdlc::Lint::Worklist` takes `rubocop_report` — check: absent `line:` in `plugins/os-sdlc/lib/os_sdlc/lint/worklist.rb` 6. `OsSdlc::Lint::Worklist` takes `rubocop_report` — check: absent `message:` in `plugins/os-sdlc/lib/os_sdlc/lint/worklist.rb` Orchestrator work: re-measure with bin/collaborator-pass measure --runs docs/crc/os-sdlc/collaborator-runs, then stop-check. Rejected: build_once_at_entry — Lint::Output::Offense already holds cop_name, path, line, and message, and Worklist::Offense and ResidualWorklist::Offense are local copies of it built from the same rubocop fields, so the sites take that object instead of the loose pair; no new owner is needed. exit_status+output is left out because no existing object holds that pair (Lint::Shell returns a bare tuple) and it needs a new result owner. ## Acceptance criteria 1. Given today's lib, when bin/collaborator-pass measure --sources params,inward,flay runs after the change, then the data_clump finding line+message scores at most 2 (was 8) and none of line, message appears in its names. 2. Given a rubocop report, when the worklist and residual worklist render their dispatch groups and prompts, then the output text is unchanged. 3. Given a lint offense in a subagent brief, when the brief is built and read, then its cop, path, line, and message values are unchanged. ## Owner sketch ```ruby class OsSdlc::Lint::Output::Offense end class OsSdlc::Brief::LintOffense def initialize(dispatch_id, agent_type, offense, raw) end end class OsSdlc::Lint::ResidualWorklist def initialize(residual_report) end end class OsSdlc::Lint::Worklist def initialize(rubocop_report) end end ``` ## Origin - Trigger: bin/collaborator-pass run 20261020T020325Z - Improvised this session: none - Chain: line+message across 4 classes ← DESIGN (`plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb`) - Root candidate: none found; searched LintOffense, ResidualWorklist, Lint::Worklist, Lint::Output::Offense, line+message, data_clump, preserve whole object - Where: plugins/os-sdlc/lib/os_sdlc/brief/lint_offense.rb - Session: 2e167079-f404-4139-9cfa-6c0c937ce9f0 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-os-sdlc-run-3/2e167079-f404-4139-9cfa-6c0c937ce9f0.jsonl VERDICT: CREATE
Author
Owner

Work started on branch crc-os-sdlc-run-3 (persistent worktree, run 3 collaborator round).

Work started on branch crc-os-sdlc-run-3 (persistent worktree, run 3 collaborator round).
Author
Owner

Resolution

Done: Brief::LintOffense takes dispatch_id, agent_type, offense, raw; Lint::Worklist and Lint::ResidualWorklist use Lint::Output::Offense and their local Offense copies are deleted. Rendered brief, worklist and residual prompt text unchanged. Hand-finished after escalation 60 (test defect).

Evidence: f1450f84 on crc-os-sdlc-run-3; suite 2270 runs, 0 failures (48.0s); rubocop 18 files no offenses; delta-check ok: data_clump line+message 8 -> 0; design audit PASS, items 2 and 5 applied

Follow-ups: Candidates for the run 3 close-out skeptic pass: Lint::Output has no public constructor from a parsed hash, so Worklist round-trips the rubocop hash through JSON.generate; exit_status+output clump (Lint::Shell bare tuple) still open.

## Resolution **Done:** Brief::LintOffense takes dispatch_id, agent_type, offense, raw; Lint::Worklist and Lint::ResidualWorklist use Lint::Output::Offense and their local Offense copies are deleted. Rendered brief, worklist and residual prompt text unchanged. Hand-finished after escalation 60 (test defect). **Evidence:** f1450f84 on crc-os-sdlc-run-3; suite 2270 runs, 0 failures (48.0s); rubocop 18 files no offenses; delta-check ok: data_clump line+message 8 -> 0; design audit PASS, items 2 and 5 applied **Follow-ups:** Candidates for the run 3 close-out skeptic pass: Lint::Output has no public constructor from a parsed hash, so Worklist round-trips the rubocop hash through JSON.generate; exit_status+output clump (Lint::Shell bare tuple) still open.
jared closed this issue 2026-10-20 06:13:08 +00:00
Author
Owner

Follow-up dropped (skeptic, run 3 close-out): "Lint::Shell tuple". The depth-1 rule applies; the next collaborator measure lists it again.

Follow-up dropped (skeptic, run 3 close-out): "Lint::Shell tuple". The depth-1 rule applies; the next collaborator measure lists it again.
Author
Owner

Follow-up dropped (skeptic, run 3 close-out): "Dispatch 853 stall". No demonstrated pain; #766 is related.

Follow-up dropped (skeptic, run 3 close-out): "Dispatch 853 stall". No demonstrated pain; #766 is related.
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#1203
No description provided.