Collaborator pass: build the signals runner (stages 1-4) #1083
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#1083
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
The CRC refactor settled each class's name and placement. The next step, the collaborator pass, needs a mechanical signal stage before any class is changed. Today the signals exist only as one-off runs in a scratchpad: the
Sdlc/Structural/InwardDependencycop reports 70 edges, a Prism script showsrootentering 79 classes, Flay reports one group of six identicalCommand.runmethods scoring 576, and Reek reports smells that no one has filtered. Nothing joins these with the CRC ledger, classifies them by shape, or traces where a primitive first enters. Without that stage the pass cannot run without a human in the loop.Reproduce
n/a: new tooling; the current signals are reproduced by the commands in the Approach.
Approach
Build the signals runner as one tool under
plugins/os-sdlc, stages 1 to 4 of the collaborator pass loop. Design brief to follow in a comment.liband emit signal rows: the inward cop, a Prism parameter-name tally overinitialize,Data.define, andStruct.newwith co-occurring names, Flay groups, and Reek smells filtered to DataClump, LongParameterList, TooManyInstanceVariables, FeatureEnvy.docs/crc/os-sdlc/ledger.tsvby the Zeitwerk loader's expected constant, carrying role and job sentence. Also emit rows where the ledger constant differs from the loader constant.data_clump,data_bag_builds,model_does_io,copied_entry,name_collision. Threshold N is config.data_clump, the entry points where the name first enters as a primitive and the family of classes each entry feeds.Output is machine-readable TSV or YAML. Flay and Reek become development dependencies of the plugin unless an ADR forbids it.
Required work: none beyond the acceptance criteria.
Orchestrator work: /os-adr:find on the Gemfile and bin before the first edit; build directly with subagents, not through the implement pipeline, per Jared's instruction this session.
Acceptance criteria
plugins/os-sdlc/liband ledger, when the runner executes, then the highest-scored finding is theroot,lib_root,test_rootdata clump across thecrc_census,crc_records, andcrc_sweepfamilies.copied_entryof six identicalCommand.runmethods incrc_*/command.rb.roottakers that are rubocop cops holding an AST node are reported as aname_collision, not as members of the clump.Non-goals
Recipe catalog, rulings file, dispatch, and the loop driver (stages 5 to 8) are follow-on tickets. No class in
libis corrected under this ticket.Origin
roottally, Flay, and Reek all ranked the six crc_* command files first.Build note, 2026-10-17. The brief's clump rule (D7: merge two clumps when one class is in both families) over-merged on real data into two blobs of 33 and 37 classes chained through generic names (
path,line,name). Replaced with maximal itemsets: a clump is a maximal set of 2+ names co-occurring in full in >= N classes; no merge. Scoring unchanged: sites x concepts.Real top findings on today's lib (params, inward, flay):
Acceptance criteria 1 and 2 were predictions of one merged clump at ~102. They are amended to the requirement: the crc family's clump ranks first, the copied entry is in the top three, the path trio exists for the crc family, and no copied_entry lists the new Command. Criterion 3 (cops' AST
rootas name_collision) is moot: the loader does not knowcops/, so they are outside the measured set. Criterion 4 (mismatch count) is not asserted;join.tsvcarries a status per row.Open for Jared: whether sub-clumps of one family (root+run_dir, paths+root, lib_root+root+test_root) should be grouped by site overlap in the report. Left as maximal sets for now.
Resolution
Done: bin/collaborator-pass and OsSdlc::CollaboratorPass built: inward cop, Prism parameter tally with use classification, Flay, Reek; join with the CRC ledger by loader constant; five shapes classified; clump traces to entry points. Clumps are maximal itemsets; the brief's merge rule over-merged. Reek 6.6 added as a development dependency; 36 ledger rows added. The inward cop moved to the sweep tier with zero Excludes in the same branch.
Evidence: Branch ticket-1083 commits
f4280332,976639f0,41f871ac. Acceptance test tests/collaborator_pass_test.rb: 4 runs, 0 failures. Suite: 1874 runs, 0 failures. Rubocop clean on all new files. Real run on lib: top findings data_clump root+run_dir (54, six crc concepts), data_clump argv+cwd+err+out (49), copied_entry six identical Command.run (36). bin/lint-sweep lib: 70 InwardDependency offenses, no Excludes.Follow-ups: #1084 loop driver stages 5-8 (filed-by/user); #1085 parameter cop counts Data/Struct members (filed-by/user); #1086 crc family pilot (filed-by/user). Ruling for Jared, in the handoff: whether sub-clumps of one family should group by site overlap in the report. Cop LedgerPath is now CWD-relative so bin/lint-sweep can run; noted in the handoff.