Audit every Sdlc cop against the zero-false-positive standard #1325
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#1325
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Jared's standard for a cop: "We want the solution to always be correct so we know the correction is warranted and we can reduce flags to zero. Otherwise we would always have unresolved violations. We need to know exactly what shape triggers that fix and that the fix is always correct for that shape, as well as exactly when the shape could trigger a false positive and why it is false so we can carve those out and avoid flagging them."
No one has checked the existing Sdlc/* cops against this standard. Example: the CollaboratorConstructionInInitialize lesson tells the agent to report composition-root false positives to the human. That is a known false positive that the cop does not carve out.
Reproduce
n/a: audit.
Approach
For every Sdlc/* cop, record four facts: the shape, the fix, whether the fix is always correct, and the known false positives with the reason each is false.
Carve-outs live in the cop matcher, by shape. No config Exclude lists. No test-path exclusions.
Output: one ticket per cop that fails the standard. Use /os-backlog:capture for each ticket.
The cop list: every RuboCop cop class defined under plugins/os-sdlc/lib/os_sdlc/cops/*.rb whose cop name starts with
Sdlc/(on 2026-10-25, about 45 cops in Sdlc/Structural, Sdlc/Dry, Sdlc/Minitest, Sdlc/Sequel). Do not count the base classes RecordingCop, ClassSiteCop, and CopSource. Recording cops (for example Sdlc/Structural/RescueSite) prescribe no fix; record that, and judge only their record.The 2 cops that #1321 and #1322 add already have this record in their smell analyses (docs/plans/class-length-family/). Link those records; do not repeat them.
For each cop, read its source, its tests, and its lesson in plugins/os-sdlc/lint-lessons/ if one exists. A lesson that tells the agent to report a false positive to a human, or to file a false-positive ticket, names a known false positive.
Required work:
## Recordsindocs/plans/class-length-family/sdlc-cop-audit.mdAcceptance criteria
Owner sketch
Investigation. No Ruby object changes. File written: docs/plans/class-length-family/sdlc-cop-audit.md, with a
_Last updated:_line and a## Recordstable, one row per cop: cop name, source file, shape, fix, fix always correct (yes / no and why), known false positives with the reason each is false, verdict (meets / fails), ticket number.Tools: read the cop sources; sample a cop's hits with
rubocop --only <cop> --config plugins/os-sdlc/.rubocop.yml plugins(plugins/os-sdlc/bin/lint-sweep runs only the cops in .rubocop-sweep.yml); /os-backlog:capture for each ticket.Origin
VERDICT: CREATE
Input for this audit (found 2026-10-25 during #1321): Sdlc/Structural/UnusedPrivateMethod reads one file only, so it flags a private method on a parent class that subclasses call. New hit: Backlog::CLI::Commands#tracker_command (plugins/os-backlog/lib/backlog/cli/commands.rb, called from IssueCommands and ProjectCommands). Same mechanism already on main in that file: issue_service, cli_options, require_issue_number!. Counts as a false positive under the zero-false-positive standard.
Work started on branch ticket-1325 (AFK run approved 2026-10-25).
Resolution
Done: Audited all 46 Sdlc cops against the zero-false-positive standard in docs/plans/class-length-family/sdlc-cop-audit.md (shape, fix, fix-always-correct, false positives, verdict, ticket). 2 meet, 44 fail; each failing cop has a ticket or an occurrence.
Evidence: Commit
7d251603on ticket-1325. New tickets #1345-#1385 (41, filed-by/agent, each skeptic VERDICT: CREATE). Occurrences on #1008 (RawFileContentAssertion), #1091 (UnusedPrivateMethod), #1102 (BooleanControlParameter). 44 of 44 failing rows carry a ticket cell.Follow-ups: Captured as the 41 per-cop tickets #1345-#1385. #1367 (RequireInMethod autocorrect deletes one-line methods) is P1. Dropped: cross-link #226 from #1354 and #917 from #1362; each new ticket's Origin block already names the related ticket. Note: the new tickets lack the Acceptance criteria and Owner sketch sections that implementation-open needs, so each needs /os-backlog:ticket-decompose before it is worked.