Kill the 77 pass 3 survivors and uncovered mutants in os-sdlc system_model #1704

Closed
opened 2026-11-11 23:11:29 +00:00 by jared · 2 comments
Owner

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.tsv lists 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 1
  • lib/os_sdlc/system_model/extractor/parameters.rb (8 survived): arithmetic 3, return_nil 2, condition_false 1, boolean_connector 1, negation_removal 1
  • lib/os_sdlc/system_model/extractor/predicate.rb (4 survived): boolean_literal 3, return_nil 1
  • lib/os_sdlc/system_model/extractor/frame.rb (4 survived): boolean_connector 2, return_nil 2
  • lib/os_sdlc/system_model/extractor/io_call.rb (3 survived): condition_true 2, return_nil 1
  • lib/os_sdlc/system_model/extractor/entry_scan.rb (3 survived): statement_removal 2, condition_true 1
  • lib/os_sdlc/system_model/extractor/branching.rb (3 survived): condition_true 1, statement_removal 1, condition_false 1
  • lib/os_sdlc/system_model/extractor/data_declaration.rb (2 survived): return_nil 1, boolean_literal 1
  • lib/os_sdlc/system_model/extractor/definition.rb (2 survived): boolean_connector 1, arithmetic 1
  • lib/os_sdlc/system_model/run.rb (2 survived): return_nil 2
  • lib/os_sdlc/system_model/extractor/fact_scan.rb (2 survived): condition_false 1, condition_true 1
  • lib/os_sdlc/system_model/pattern_site/diagram/route.rb (2 survived): condition_false 1, condition_true 1
  • lib/os_sdlc/system_model/extractor/mixin_call.rb (2 survived): condition_true 1, boolean_connector 1
  • lib/os_sdlc/system_model/extractor/self_sends.rb (2 survived): return_nil 2
  • lib/os_sdlc/system_model/extractor/scripts.rb (2 survived): boolean_literal 2
  • lib/os_sdlc/system_model/extractor/result_expression.rb (2 survived): boolean_connector 1, condition_true 1
  • lib/os_sdlc/system_model/base_namespaces/push_dir_scan.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/pattern_site/example_run.rb (0 survived, 1 uncovered): return_nil 1
  • lib/os_sdlc/system_model/child_process.rb (0 survived, 1 uncovered): return_nil 1
  • lib/os_sdlc/system_model/shape/forwarder.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/pattern/rule/undispatched_accept.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/pattern/rule/stray_construct.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/extractor/process_exit.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/class_facts/call.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/class_facts/construct.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/extractor/module_declaration.rb (1 survived): boolean_literal 1
  • lib/os_sdlc/system_model/distance_gauge/report.rb (1 survived): condition_false 1
  • lib/os_sdlc/system_model/distance_gauge/sweep.rb (1 survived): condition_false 1
  • lib/os_sdlc/system_model/extractor/forwarding.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/drift_check/card_index.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/extractor/class_new_declaration.rb (1 survived): return_nil 1
  • lib/os_sdlc/system_model/element_titles.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/extractor/body.rb (1 survived): condition_true 1
  • lib/os_sdlc/system_model/extractor.rb (1 survived): arithmetic 1

Reproduce

n/a: the mutants come from a whole pass. Verify with os-sdlc-mutation-pass packet after 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.md on each file. The --test list of a packet holds every test that .mutineer/pass-coverage.json maps to the source lines, plus every paired test/<lib path>_test.rb. Pass 3 ran with the matrix off, so pass.json has no killed_by field. Kill each survivor with a paired test. Delete dead code (ruling 107). Rule an equivalent mutant with os-sdlc-mutation-rule and 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

  1. Given a packet over each file listed, with all operators that the whole pass uses, when the packet ends, then it shows 0 unruled survivors and 0 unruled uncovered mutants.
  2. Given a deleted dead-code candidate, when the suite runs, then it is green and no caller of the deleted code remains.

Origin

  • Trigger: whole mutation pass 3, 2026-11-11 (docs/research/mutation-testing/2026-11-11-third-pass/, commit 6f6dfa75b)
  • Improvised this session: none
  • Chain: survivors ← no test kills the mutant ← pass 2 packets did not create tier-2 mutants and left out some files (pass 3 README, "Why 203 pass 2 survivors survive again") ← DESIGN (lib/os_sdlc/mutation_test/pass/packet.rb)
  • Root candidate: none found; searched mutation, survivor, mutant, system_model
  • Where: lib/os_sdlc/system_model/
  • Session: 2677aa00-1973-4df6-b9c5-e317088f3ea3
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/2677aa00-1973-4df6-b9c5-e317088f3ea3.jsonl

VERDICT: CREATE (ticket-skeptic, 2026-11-11): no open ticket has the same mechanism.

## 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.tsv` lists 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 1 - `lib/os_sdlc/system_model/extractor/parameters.rb` (8 survived): arithmetic 3, return_nil 2, condition_false 1, boolean_connector 1, negation_removal 1 - `lib/os_sdlc/system_model/extractor/predicate.rb` (4 survived): boolean_literal 3, return_nil 1 - `lib/os_sdlc/system_model/extractor/frame.rb` (4 survived): boolean_connector 2, return_nil 2 - `lib/os_sdlc/system_model/extractor/io_call.rb` (3 survived): condition_true 2, return_nil 1 - `lib/os_sdlc/system_model/extractor/entry_scan.rb` (3 survived): statement_removal 2, condition_true 1 - `lib/os_sdlc/system_model/extractor/branching.rb` (3 survived): condition_true 1, statement_removal 1, condition_false 1 - `lib/os_sdlc/system_model/extractor/data_declaration.rb` (2 survived): return_nil 1, boolean_literal 1 - `lib/os_sdlc/system_model/extractor/definition.rb` (2 survived): boolean_connector 1, arithmetic 1 - `lib/os_sdlc/system_model/run.rb` (2 survived): return_nil 2 - `lib/os_sdlc/system_model/extractor/fact_scan.rb` (2 survived): condition_false 1, condition_true 1 - `lib/os_sdlc/system_model/pattern_site/diagram/route.rb` (2 survived): condition_false 1, condition_true 1 - `lib/os_sdlc/system_model/extractor/mixin_call.rb` (2 survived): condition_true 1, boolean_connector 1 - `lib/os_sdlc/system_model/extractor/self_sends.rb` (2 survived): return_nil 2 - `lib/os_sdlc/system_model/extractor/scripts.rb` (2 survived): boolean_literal 2 - `lib/os_sdlc/system_model/extractor/result_expression.rb` (2 survived): boolean_connector 1, condition_true 1 - `lib/os_sdlc/system_model/base_namespaces/push_dir_scan.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/pattern_site/example_run.rb` (0 survived, 1 uncovered): return_nil 1 - `lib/os_sdlc/system_model/child_process.rb` (0 survived, 1 uncovered): return_nil 1 - `lib/os_sdlc/system_model/shape/forwarder.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/pattern/rule/undispatched_accept.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/pattern/rule/stray_construct.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/extractor/process_exit.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/class_facts/call.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/class_facts/construct.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/extractor/module_declaration.rb` (1 survived): boolean_literal 1 - `lib/os_sdlc/system_model/distance_gauge/report.rb` (1 survived): condition_false 1 - `lib/os_sdlc/system_model/distance_gauge/sweep.rb` (1 survived): condition_false 1 - `lib/os_sdlc/system_model/extractor/forwarding.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/drift_check/card_index.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/extractor/class_new_declaration.rb` (1 survived): return_nil 1 - `lib/os_sdlc/system_model/element_titles.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/extractor/body.rb` (1 survived): condition_true 1 - `lib/os_sdlc/system_model/extractor.rb` (1 survived): arithmetic 1 ## Reproduce n/a: the mutants come from a whole pass. Verify with `os-sdlc-mutation-pass packet` after 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.md` on each file. The `--test` list of a packet holds every test that `.mutineer/pass-coverage.json` maps to the source lines, plus every paired `test/<lib path>_test.rb`. Pass 3 ran with the matrix off, so `pass.json` has no `killed_by` field. Kill each survivor with a paired test. Delete dead code (ruling 107). Rule an equivalent mutant with `os-sdlc-mutation-rule` and 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 1. Given a packet over each file listed, with all operators that the whole pass uses, when the packet ends, then it shows 0 unruled survivors and 0 unruled uncovered mutants. 2. Given a deleted dead-code candidate, when the suite runs, then it is green and no caller of the deleted code remains. ## Origin - Trigger: whole mutation pass 3, 2026-11-11 (`docs/research/mutation-testing/2026-11-11-third-pass/`, commit 6f6dfa75b) - Improvised this session: none - Chain: survivors ← no test kills the mutant ← pass 2 packets did not create tier-2 mutants and left out some files (pass 3 README, "Why 203 pass 2 survivors survive again") ← DESIGN (`lib/os_sdlc/mutation_test/pass/packet.rb`) - Root candidate: none found; searched mutation, survivor, mutant, system_model - Where: lib/os_sdlc/system_model/ - Session: 2677aa00-1973-4df6-b9c5-e317088f3ea3 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/2677aa00-1973-4df6-b9c5-e317088f3ea3.jsonl VERDICT: CREATE (ticket-skeptic, 2026-11-11): no open ticket has the same mechanism.
Author
Owner

Work started on branch ticket-1704 (survivor loop).

Work started on branch ticket-1704 (survivor loop).
Author
Owner

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 b7db907ab on 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

## 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 b7db907ab on 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 <!-- os-backlog kind: resolution -->
jared closed this issue 2026-11-12 07:28:48 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#1704
No description provided.