Make mutation-pass packet use the tier-2 operators of the whole pass #1700
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#1700
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
os-sdlc-mutation-pass packetdoes not create the mutants of the tier-2 operators (condition_true,condition_false,negation_removal). The whole pass creates them. The survivor loop closes a ticket when each packet shows 0 unruled survivors, so a ticket can close while its tier-2 survivors stay alive. Whole pass 3 found 155 pass 2 survivors that survived again for this reason, after their tickets closed.Observed
MutationTest::Pass::Command#operatorsreturns the operators of.mutineer.ymlplusTIER_TWO_OPERATORS(lib/os_sdlc/mutation_test/pass/command.rb, line 25, since #1636 on 2026-11-08). The packet command uses only the operators of.mutineer.yml. One cop file, one test:mutineer runwith the whole-pass optionsos-sdlc-mutation-pass packetThe 5 extra survivors are all tier 2, for example
f14935dfb65b, line 27,return [] unless roottoreturn [] unless (true).Reproduce
The first line prints
# 9 survivors of 37. The whole pass reports 53 mutants and 14 survivors for the same file.Approach
The packet and the whole pass take their operator list from one owner, so the two lists cannot differ.
Required work: none beyond the acceptance criteria.
Acceptance criteria
os-sdlc-mutation-pass packetruns on it, then the packet lists that survivor.Owner sketch
MutationTest::Pass::Packet::Command#to_spasses no--operatorsflag today, so Mutineer uses only the.mutineer.ymllist. One object owns the operator list of a pass; the whole-passCommandand the packetCommandboth read it.Origin
docs/research/mutation-testing/2026-11-11-third-pass/README.md, commit6f6dfa75b)TIER_TWO_OPERATORSadded only to the whole-pass command in #1636 ← DESIGN (lib/os_sdlc/mutation_test/pass/command.rb)VERDICT: CREATE (ticket-skeptic, 2026-11-11): no open ticket has the same mechanism.
Work started on branch ticket-1700 through /os-sdlc:implement (poodr-ticket-implementation).
Resolution
Done: Pass::Operators owns the operator list; the whole-pass and packet commands both read it, so a packet now creates the tier-2 mutants.
Evidence: Commits
4da4baf82(implementation 280, all gates pass, survivors gate exit 0) and5bfa52a35. Reproduction re-run: packet on cops/dry/duplicated_statement_sequence.rb now prints '# 14 survivors of 53', the same as the whole pass (before: 9 of 37).Follow-ups: none