Kill the 77 pass 3 survivors and uncovered mutants in os-sdlc system_model #1704
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#1704
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
Whole mutation pass 3 (2026-11-11, main
9a1895a1f) left 59 survivors and 18 uncovered mutants in 34 files under system_model. None has a ledger row in.sdlc/mutation-rulings.tsv, and none is a known visible mutant (ruling 137). A survivor is a changed behavior that the suite does not see. 32 of these mutants use a tier-2 operator (condition_true,condition_false,negation_removal). 27 also survived pass 2.Observed
docs/research/mutation-testing/2026-11-11-third-pass/unruled.tsvlists each mutant with its ID, line, operator, and tier. Each line below gives the file, its counts, and the operators.lib/os_sdlc/system_model/recorder/trace.rb(0 survived, 16 uncovered): statement_removal 4, condition_false 3, condition_true 3, return_nil 3, boolean_connector 2, comparison 1lib/os_sdlc/system_model/extractor/parameters.rb(8 survived): arithmetic 3, return_nil 2, condition_false 1, boolean_connector 1, negation_removal 1lib/os_sdlc/system_model/extractor/predicate.rb(4 survived): boolean_literal 3, return_nil 1lib/os_sdlc/system_model/extractor/frame.rb(4 survived): boolean_connector 2, return_nil 2lib/os_sdlc/system_model/extractor/io_call.rb(3 survived): condition_true 2, return_nil 1lib/os_sdlc/system_model/extractor/entry_scan.rb(3 survived): statement_removal 2, condition_true 1lib/os_sdlc/system_model/extractor/branching.rb(3 survived): condition_true 1, statement_removal 1, condition_false 1lib/os_sdlc/system_model/extractor/data_declaration.rb(2 survived): return_nil 1, boolean_literal 1lib/os_sdlc/system_model/extractor/definition.rb(2 survived): boolean_connector 1, arithmetic 1lib/os_sdlc/system_model/run.rb(2 survived): return_nil 2lib/os_sdlc/system_model/extractor/fact_scan.rb(2 survived): condition_false 1, condition_true 1lib/os_sdlc/system_model/pattern_site/diagram/route.rb(2 survived): condition_false 1, condition_true 1lib/os_sdlc/system_model/extractor/mixin_call.rb(2 survived): condition_true 1, boolean_connector 1lib/os_sdlc/system_model/extractor/self_sends.rb(2 survived): return_nil 2lib/os_sdlc/system_model/extractor/scripts.rb(2 survived): boolean_literal 2lib/os_sdlc/system_model/extractor/result_expression.rb(2 survived): boolean_connector 1, condition_true 1lib/os_sdlc/system_model/base_namespaces/push_dir_scan.rb(1 survived): condition_true 1lib/os_sdlc/system_model/pattern_site/example_run.rb(0 survived, 1 uncovered): return_nil 1lib/os_sdlc/system_model/child_process.rb(0 survived, 1 uncovered): return_nil 1lib/os_sdlc/system_model/shape/forwarder.rb(1 survived): condition_true 1lib/os_sdlc/system_model/pattern/rule/undispatched_accept.rb(1 survived): condition_true 1lib/os_sdlc/system_model/pattern/rule/stray_construct.rb(1 survived): condition_true 1lib/os_sdlc/system_model/extractor/process_exit.rb(1 survived): condition_true 1lib/os_sdlc/system_model/class_facts/call.rb(1 survived): condition_true 1lib/os_sdlc/system_model/class_facts/construct.rb(1 survived): condition_true 1lib/os_sdlc/system_model/extractor/module_declaration.rb(1 survived): boolean_literal 1lib/os_sdlc/system_model/distance_gauge/report.rb(1 survived): condition_false 1lib/os_sdlc/system_model/distance_gauge/sweep.rb(1 survived): condition_false 1lib/os_sdlc/system_model/extractor/forwarding.rb(1 survived): condition_true 1lib/os_sdlc/system_model/drift_check/card_index.rb(1 survived): condition_true 1lib/os_sdlc/system_model/extractor/class_new_declaration.rb(1 survived): return_nil 1lib/os_sdlc/system_model/element_titles.rb(1 survived): condition_true 1lib/os_sdlc/system_model/extractor/body.rb(1 survived): condition_true 1lib/os_sdlc/system_model/extractor.rb(1 survived): arithmetic 1Reproduce
n/a: the mutants come from a whole pass. Verify with
os-sdlc-mutation-pass packetafter the packet operator ticket from pass 3 is fixed; before that fix, a packet does not create the tier-2 mutants.Approach
Run
plugins/os-sdlc/references/survivor-loop.mdon each file. The--testlist of a packet holds every test that.mutineer/pass-coverage.jsonmaps to the source lines, plus every pairedtest/<lib path>_test.rb. Pass 3 ran with the matrix off, sopass.jsonhas nokilled_byfield. Kill each survivor with a paired test. Delete dead code (ruling 107). Rule an equivalent mutant withos-sdlc-mutation-ruleand a reason that holds for every input. Leave a mutant on a real process call visible (ruling 137). The orchestrator re-runs each packet before it closes the ticket. Do not run a whole pass.Required work: none beyond the acceptance criteria.
Acceptance criteria
Origin
docs/research/mutation-testing/2026-11-11-third-pass/, commit6f6dfa75b)lib/os_sdlc/mutation_test/pass/packet.rb)VERDICT: CREATE (ticket-skeptic, 2026-11-11): no open ticket has the same mechanism.
Work started on branch ticket-1704 (survivor loop).
Resolution
Done: 62 system_model survivors went to 0: 74 tests, 2 dead-code deletions (ruling 107), 2 equivalent rulings. 18 uncovered mutants stay visible under ruling 137: 16 in the Recorder::Trace TracePoint callback (#1694 class), plus 8392cc0587b8 (ChildProcess#call) and dd427c7fceb6 (PatternSite::ExampleRun#printed), both Open3 adapter calls.
Evidence: Commit
b7db907abon ticket-1704. Orchestrator packet re-run: 0 survivors of 640, 18 uncovered (all visible). Full suite 5275 runs, 0 failures. Sonnet review: 2 points; process_exit tests now assert the full entry; Scripts card field tests kept (public card fields read by pattern rules).Follow-ups: none