Make the survivor loop a mutation-testing step: packet subcommand, brief, and process text #1668
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#1668
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
Survivor tickets #1655-#1664 need the same work as #1654: find each surviving mutant, write a test that kills it, and rule on the rest. On #1654 a loop did this cheaply, but its scripts and briefs exist only as files in a research record. The next ticket must copy them by hand.
Design
/home/jared/dev/cc-os/docs/takedown/1668-20261110-104618/final-design.json
Approach
Add one MutineerInvocation owner of the shared mutineer flags, make Pass::Command, MutineerRunner::Command and the new Pass::Packet::Command thin callers of it, and extend mutation-pass with
packetandbriefowned by Pass::Packet.Required work:
plugins/os-sdlc/lib/os_sdlc/mutation_test/pass/execution.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/pass/packet.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/pass/packet/brief.mdplugins/os-sdlc/lib/os_sdlc/boot/inputs.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/mutineer_invocation.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/mutineer_runner/command.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/pass/command.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/pass/packet/command.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/pass/packet/brief.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/pass/run.rbplugins/os-sdlc/lib/os_sdlc/mutation_test/pass/packet/document.rbplugins/os-sdlc/test/mutation_test/mutineer_invocation_test.rbplugins/os-sdlc/test/boot_mutation_pass_packet_test.rbplugins/os-sdlc/test/boot_mutation_pass_brief_test.rbAcceptance criteria
packet: sources and tests, mutineer ok, survivors: packet printed, exit 0--sourceor no--test(packet or brief):Loud::Error, exit 3.mutineer.yml(packet):Loud::Error, exit 3briefwith sources and tests: brief printed, exit 0, no mutineer runOwner sketch
--testflags, strategy, format, output)MutationTest::MutineerInvocation(new)--since,--no-matrixMutineerRunner::Command, now a caller--no-since, matrix, cache dir, operators, and test globbingPass::Command, now a caller--no-since --no-matrix, refuse empty sources or testsPass::Packet::Commandpacketandbriefargv (--source,--test, repeatable)Boot::Inputs.mutation_passpacketandbriefPass::RunPass::Execution#run, shared with#callPass::PacketPass::Packet::DocumentPass::Packet::Briefandbrief.mdMutineerRunner::Report,Ledger#ruled_keys, reusedplugins/os-sdlc/test/mutation_test/mutineer_invocation_test.rbplugins/os-sdlc/test/boot_mutation_pass_packet_test.rbplugins/os-sdlc/test/boot_mutation_pass_brief_test.rbDecompose routing (ticket-decompose, 2026-11-10): routed to
/os-sdlc:ticket-takedown 1668.a. One change: a
survivorssubcommand onMutationTest::Pass::Run(dispatch ispublic_send(subcommand),pass/run.rb:11) that runs a targetedmutineer run <sources> --test <tests> --no-matrixand writes one survivor packet per source group.b. Owner: no existing object renders a packet. New object: a packet that turns mutineer survivor rows (
file,line,id,operator,subject,diff) into the markdown the brief reads, with the test file each survivor belongs in. Command building stays withPass::Command; argv stays withBoot::Inputs.mutation_pass(MUTATION_PASS_ARITYandMUTATION_PASS_USAGEneed a row).Facts for the takedown:
MutationTest::Overlap::OwnerTest#for(overlap/owner_test.rb:20) mapslib/os_sdlc/x.rbtotest/x_test.rb. It drops the namespace directory. Ruling 100 puts the paired test attest/os_sdlc/<path>_test.rb, and ruling 105 puts cop tests attest/cops/<cop>_test.rb. The source-to-test mapping must follow the rulings; OwnerTest does not today.Mutanthaskind; mutineer rows carryoperator.survivorscommand already exists (boot/commands.rb:70,bin/os-sdlc-survivors,MutationTest::Check). The new subcommand name ismutation-pass survivors; the takedown should confirm the two names do not confuse.docs/research/mutation-testing/2026-11-10-survivor-loop/(cop_packet.rbis the packet template).Takedown run docs/takedown/1668-20261110-093202 failed at green-suite: (1) the final design leaves Sdlc/Structural/ParameterThreadedThroughPrivateMethods at mutation_test/pass/run.rb:54 and Metrics/PerceivedComplexity at boot/inputs.rb:94; (2) main itself fails the green-suite command (no bundler, system rubocop 1.92.2) with 12 cop tests from #1654. Blocked by #1669. Rerun the takedown after #1669.
Work started on branch ticket-1668 (os-sdlc implement pipeline, map takedown-implement, design docs/takedown/1668-20261110-104618).
Resolution
Done: mutation-pass gains packet and brief; MutineerInvocation owns the mutineer command line for gate, pass, and packet; references/survivor-loop.md holds the loop steps and the ruling 107 delete rule
Evidence: implementation 276 implementation_complete (8 dispatches, 4 min 52 s); commits
5ad52f7f7,0363e9575; merge of maineffa99be2; suite 3977 runs, 0 failuresFollow-ups: none