Design the cop-message formula so lint rules teach instead of obstruct #450
Labels
No labels
P0
P1
P2
P3
bug
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
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#450
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?
Context
On 2026-08-20, while building #439, rubocop's stock Metrics/ParameterLists flagged a
six-keyword-argument constructor with a threshold-only message: "Avoid parameter lists
longer than 4 parameters. [6/4]". The main-loop assistant reasoned from that message to
the wrong conclusion — it proposed configuring the cop away (CountKeywordArgs: false)
with an invented rationale about positional-argument safety, at 80% confidence. The user
corrected it: the rule is a Sandi Metz idea, and a long parameter list means the object
holds a responsibility nobody has named yet. The right fix was extracting a NodeSpec
value object (decision D8, commit
329a90a).The repo's own Sdlc/Structural/* cops do not cause this failure. Their messages name
the offender, name the smell, and prescribe the extraction with a candidate class name.
Agents obey them without argument. Nothing enforces that shape — plugins/os-sdlc/lib/os_sdlc/cops/
currently holds 30 cop files, and only 2 (parameter_list_signals_missing_object.rb,
hand_rolled_fetch.rb) define an explicit MSG constant; skills/mine-lints/references/implement-cop.md
documents mechanics only, nothing about message content.
Full background
Read docs/handoffs/2026-08-20-lint-message-guidance.md before starting. It records what
happened, why the message caused it, what was already built, and the open questions. Do
not re-derive the mechanism findings — they are settled there.
What to do
(good) and PathHolder (weak, describes mechanism not concept) are mechanically
generated today.
so a prescription is never confidently wrong.
is worth its cost, and whether it should be a shared helper.
design-pointed MSG (evidence + smell + prescription), committed as
ae0f188under thisticket's own number — confirm it satisfies the agreed formula once settled, rather than
treating it as an untouched placeholder.
Notes
removed --auto-gen-config's ability to raise the limit. Removing an automated escape
hatch proved more effective than arguing against it in prose.
Origin
Body corrected 2026-08-23 from code-probe verification (agent a7132caa5ab303d6b, claude-sonnet-5).
Change log:
ae0f188under this ticket's own number on the day it was filed. It is not an untouched placeholder — step 7 is now "confirm it matches the agreed formula," not "replace it."Reason: steps 1-6 and the corrected step 8 audit remain open work; nothing here closes the ticket, but the scope and step-7 status were stale relative to code already shipped.