Write the missing tests for 395 os-sdlc survivors in cops/structural #1654

Closed
opened 2026-11-09 22:13:07 +00:00 by jared · 1 comment
Owner

Problem

The second mutation pass (2026-11-09) left 395 survivors in 105 files under lib/os_sdlc/cops/structural/. No test kills them. A survivor means a changed behavior that the suite does not see. Ruling 100 puts a unit test for lib/os_sdlc/<path>.rb at test/os_sdlc/<path>_test.rb.

Observed

The pass ran bin/os-sdlc-mutation-pass run . on main at 38b3284d0. docs/research/mutation-testing/2026-11-09-second-pass/survivors.md lists each survivor with its original and mutated text. This ticket takes the groups that survivors.md classes as missing test. Each line below gives the file, its survivor count, and the mutation kinds.

  • lib/os_sdlc/cops/structural/resolved_path.rb (16): condition_true 5, boolean_connector 4, boolean_literal 4, statement_removal 3
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/effect.rb (11): boolean_connector 6, boolean_literal 2, condition_true 2, statement_removal 1
  • lib/os_sdlc/cops/structural/format_validation_raising_in_initialize/derived_params.rb (11): condition_true 3, return_nil 3, boolean_literal 2, condition_false 2, boolean_connector 1
  • lib/os_sdlc/cops/structural/boolean_control_parameter/condition_match.rb (10): boolean_connector 2, boolean_literal 2, condition_true 2, return_nil 2, statement_removal 2
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/selection_site.rb (10): boolean_connector 8, condition_true 1, return_nil 1
  • lib/os_sdlc/cops/structural/feature_envy/site.rb (10): condition_true 3, return_nil 3, boolean_connector 1, boolean_literal 1, comparison 1, statement_removal 1
  • lib/os_sdlc/cops/structural/simulated_polymorphism/owned_type.rb (10): boolean_literal 4, condition_true 2, statement_removal 2, condition_false 1, return_nil 1
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/caller_input.rb (9): boolean_connector 3, return_nil 2, boolean_literal 1, condition_false 1, negation_removal 1, statement_removal 1
  • lib/os_sdlc/cops/structural/unread_instance_variable/reading_call.rb (9): boolean_connector 2, return_nil 2, statement_removal 2, boolean_literal 1, condition_false 1, condition_true 1
  • lib/os_sdlc/cops/structural/adapter_scope/visibility.rb (8): boolean_connector 2, condition_true 2, return_nil 2, condition_false 1, negation_removal 1
  • lib/os_sdlc/cops/structural/array_literal_of_locals_return.rb (8): condition_true 2, return_nil 2, statement_removal 2, boolean_connector 1, condition_false 1
  • lib/os_sdlc/cops/structural/format_validation_raising_in_initialize/match_sends.rb (8): return_nil 3, statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1
  • lib/os_sdlc/cops/structural/query_method_reaches_write/write_chain_offense.rb (8): condition_true 2, return_nil 2, statement_removal 2, boolean_literal 1, condition_false 1
  • lib/os_sdlc/cops/structural/reach_through_chain/site.rb (8): boolean_literal 2, condition_true 2, return_nil 2, statement_removal 2
  • lib/os_sdlc/cops/structural/feature_envy/external_receiver.rb (7): boolean_literal 2, statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1
  • lib/os_sdlc/cops/structural/forwarding_class/initialization.rb (7): condition_true 2, boolean_connector 1, boolean_literal 1, condition_false 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/raw_file_content_assertion/raw_content_call.rb (7): return_nil 2, statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1
  • lib/os_sdlc/cops/structural/adapter_built_outside_entry/adapter_constant.rb (6): statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1, return_nil 1
  • lib/os_sdlc/cops/structural/boolean_control_parameter/def_site.rb (6): boolean_literal 2, condition_true 2, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/collaborator_construction_in_initialize.rb (6): condition_true 3, statement_removal 2, comparison 1
  • lib/os_sdlc/cops/structural/domain_operand_in_edge/second_source.rb (6): boolean_connector 3, condition_true 2, arithmetic 1
  • lib/os_sdlc/cops/structural/module_owns_instance_state/offense_subject.rb (6): return_nil 2, statement_removal 2, condition_false 1, condition_true 1
  • lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/class_mutators.rb (6): boolean_connector 3, condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/private_method_defs.rb (6): condition_true 2, return_nil 2, statement_removal 2
  • lib/os_sdlc/cops/structural/unreachable_branch_after_guard/predicate_condition.rb (6): boolean_connector 3, boolean_literal 1, condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/unused_private_method/private_defs.rb (6): condition_true 2, return_nil 2, statement_removal 2
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/if_site.rb (5): boolean_connector 2, comparison 1, condition_true 1, return_nil 1
  • lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/body_statements/statement.rb (5): boolean_connector 3, condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/private_method_defs/visibility_scan/statement_classification.rb (5): boolean_connector 4, return_nil 1
  • lib/os_sdlc/cops/structural/raw_file_content_assertion/fixture_writes.rb (5): boolean_connector 1, comparison 1, condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/raw_file_content_assertion/latest_assignment.rb (5): boolean_connector 2, condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/reach_through_chain/holdings.rb (5): condition_true 3, boolean_literal 2
  • lib/os_sdlc/cops/structural/unused_private_method/superclass_calls.rb (5): condition_true 2, condition_false 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/adapter_scope/method_table.rb (4): condition_false 1, condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/discarded_error_code/raise_site.rb (4): boolean_connector 1, condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/format_validation_raising_in_initialize.rb (4): condition_true 2, boolean_connector 1, statement_removal 1
  • lib/os_sdlc/cops/structural/module_owns_instance_state.rb (4): boolean_connector 1, condition_false 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/process_start.rb (4): return_nil 2, condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/reach_through_chain/members.rb (4): condition_true 2, condition_false 1, return_nil 1
  • lib/os_sdlc/cops/structural/simulated_polymorphism/case_dispatch.rb (4): boolean_connector 2, return_nil 2
  • lib/os_sdlc/cops/structural/static_fact_assertion/static_node.rb (4): boolean_literal 1, condition_false 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/unreachable_branch_after_guard/statements.rb (4): condition_true 2, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/discarded_error_code/variable_names.rb (3): condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/facts.rb (3): boolean_literal 1, comparison 1, condition_true 1
  • lib/os_sdlc/cops/structural/forwarding_class/constant_chain.rb (3): boolean_connector 3
  • lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/lifecycle_defs.rb (3): boolean_connector 2, condition_true 1
  • lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/lifecycle_defs/lifecycle_assignments.rb (3): condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/module_owns_instance_state/direct_defs.rb (3): condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/module_owns_instance_state/module_includers.rb (3): condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/ivar_mutation.rb (3): boolean_connector 1, condition_false 1, statement_removal 1
  • lib/os_sdlc/cops/structural/parameter_threaded_through_private_methods.rb (3): condition_false 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/primitive_obsessed_ivar/class_site.rb (3): condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/require_relative_density/top_level_requires.rb (3): condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/simulated_polymorphism.rb (3): condition_false 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/simulated_polymorphism/if_chain_dispatch/type_check_condition.rb (3): boolean_connector 3
  • lib/os_sdlc/cops/structural/unused_private_method/body_private_defs.rb (3): statement_removal 2, condition_true 1
  • lib/os_sdlc/cops/structural/unused_private_method/call_sites.rb (3): condition_true 1, return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/feature_envy/lvar_name.rb (2): boolean_literal 1, condition_true 1
  • lib/os_sdlc/cops/structural/format_validation_raising_in_initialize/validation_condition.rb (2): condition_true 2
  • lib/os_sdlc/cops/structural/forwarding_class/class_match.rb (2): boolean_connector 1, return_nil 1
  • lib/os_sdlc/cops/structural/instance_variable_assumption/class_site.rb (2): condition_false 1, statement_removal 1
  • lib/os_sdlc/cops/structural/instance_variable_assumption/ivasgn_conditionality.rb (2): return_nil 2
  • lib/os_sdlc/cops/structural/layer_ledger/layer_map.rb (2): boolean_connector 1, condition_true 1
  • lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader.rb (2): condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/attr_declarations.rb (2): boolean_connector 1, condition_true 1
  • lib/os_sdlc/cops/structural/module_owns_instance_state/module_includers/include_call.rb (2): boolean_connector 2
  • lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader.rb (2): condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/own_entry_point_spawned_in_test/script_paths.rb (2): condition_true 2
  • lib/os_sdlc/cops/structural/query_method_reaches_write.rb (2): condition_false 1, statement_removal 1
  • lib/os_sdlc/cops/structural/raw_file_content_assertion.rb (2): condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/rescue_site.rb (2): condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/rescue_site/sends.rb (2): condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/static_fact_assertion/static_fact_call.rb (2): comparison 1, return_nil 1
  • lib/os_sdlc/cops/structural/unreachable_branch_after_guard/reassignment.rb (2): return_nil 2
  • lib/os_sdlc/cops/structural/unread_instance_variable.rb (2): condition_true 1, statement_removal 1
  • lib/os_sdlc/cops/structural/unread_instance_variable/unread_assignments.rb (2): return_nil 1, statement_removal 1
  • lib/os_sdlc/cops/structural/unused_private_method/subclass_definition.rb (2): boolean_connector 1, condition_true 1
  • lib/os_sdlc/cops/structural/array_literal_of_locals_return/final_expression.rb (1): condition_true 1
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/condition.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/condition/check.rb (1): condition_true 1
  • lib/os_sdlc/cops/structural/domain_effect_in_edge/or_site.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/domain_operand_in_edge/if_verdict.rb (1): condition_true 1
  • lib/os_sdlc/cops/structural/forwarding_class/method_match.rb (1): condition_true 1
  • lib/os_sdlc/cops/structural/forwarding_class/required_libraries.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/instance_variable_assumption/branch_bodies.rb (1): arithmetic 1
  • lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/attr_lifecycle_offense.rb (1): boolean_connector 1
  • lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/body_statements.rb (1): boolean_connector 1
  • lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/mutation_details.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/own_entry_point_spawned_in_test.rb (1): condition_true 1
  • lib/os_sdlc/cops/structural/parameter_list_signals_missing_object.rb (1): boolean_connector 1
  • lib/os_sdlc/cops/structural/parameter_threaded_through_private_methods/threaded_param_offense.rb (1): comparison 1
  • lib/os_sdlc/cops/structural/precedence_in_edge/choice.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/precedence_in_edge/guard.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/private_method_defs/visibility_scan.rb (1): condition_true 1
  • lib/os_sdlc/cops/structural/private_method_defs/visibility_scan/string_value.rb (1): condition_true 1
  • lib/os_sdlc/cops/structural/query_method_reaches_write/qualified_call_name.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/reach_through_chain/chain.rb (1): condition_false 1
  • lib/os_sdlc/cops/structural/require_relative_density/node_candidate.rb (1): boolean_connector 1
  • lib/os_sdlc/cops/structural/same_file_defs.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/simulated_polymorphism/if_chain_dispatch.rb (1): return_nil 1
  • lib/os_sdlc/cops/structural/simulated_polymorphism/message.rb (1): statement_removal 1
  • lib/os_sdlc/cops/structural/unreachable_branch_after_guard.rb (1): condition_false 1
  • lib/os_sdlc/cops/structural/unreachable_branch_after_guard/guard_release.rb (1): boolean_connector 1
  • lib/os_sdlc/cops/structural/unread_instance_variable/member_generating_call.rb (1): boolean_connector 1
  • lib/os_sdlc/cops/structural/unused_private_method/superclass_definition.rb (1): condition_true 1

Reproduce

n/a: the survivors come from a whole pass. Verify with a targeted run: bin/os-sdlc-mutation-pass run <files> --no-matrix.

Approach

For each file listed, write the missing paired test at test/os_sdlc/<lib path>_test.rb (ruling 100). The test must kill each survivor of that file. When a survivor shows dead code (a branch no caller reaches), delete the code if no caller needs it, and write no test for it. When a survivor is equivalent (the mutant has the same behavior), rule it equivalent in a comment on this ticket with the reason. Then verify with a targeted --no-matrix run over the files of this ticket. Do not run a whole pass.

Required work: none beyond the acceptance criteria.

Acceptance criteria

  1. Given a targeted --no-matrix Mutineer run on the files listed in this ticket, when the run ends, then no survivor remains except ones that this ticket rules equivalent with a reason.
  2. Given a file that has a deleted dead-code candidate, when the suite runs, then it is green and no caller of the deleted code remains.

Origin

  • Trigger: second whole-codebase mutation pass, 2026-11-09 (docs/research/mutation-testing/2026-11-09-second-pass/)
  • Improvised this session: none
  • Chain: survivors ← no paired unit test for the file ← tests were written at the pipeline level, and the unit test per file (ruling 100) was never added ← DESIGN (ruling 100)
  • Root candidate: none found; searched survivor, mutation, mutineer, cops-structural, missing tests
  • Where: lib/os_sdlc/cops/structural/
  • Session: bc5ad309-36b7-4fe5-a67f-1d90187242eb
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/bc5ad309-36b7-4fe5-a67f-1d90187242eb.jsonl

VERDICT: CREATE (ticket-skeptic, 2026-11-09): no open ticket covers these survivors.

## Problem The second mutation pass (2026-11-09) left 395 survivors in 105 files under lib/os_sdlc/cops/structural/. No test kills them. A survivor means a changed behavior that the suite does not see. Ruling 100 puts a unit test for `lib/os_sdlc/<path>.rb` at `test/os_sdlc/<path>_test.rb`. ## Observed The pass ran `bin/os-sdlc-mutation-pass run .` on main at 38b3284d0. `docs/research/mutation-testing/2026-11-09-second-pass/survivors.md` lists each survivor with its original and mutated text. This ticket takes the groups that `survivors.md` classes as `missing test`. Each line below gives the file, its survivor count, and the mutation kinds. - `lib/os_sdlc/cops/structural/resolved_path.rb` (16): condition_true 5, boolean_connector 4, boolean_literal 4, statement_removal 3 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/effect.rb` (11): boolean_connector 6, boolean_literal 2, condition_true 2, statement_removal 1 - `lib/os_sdlc/cops/structural/format_validation_raising_in_initialize/derived_params.rb` (11): condition_true 3, return_nil 3, boolean_literal 2, condition_false 2, boolean_connector 1 - `lib/os_sdlc/cops/structural/boolean_control_parameter/condition_match.rb` (10): boolean_connector 2, boolean_literal 2, condition_true 2, return_nil 2, statement_removal 2 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/selection_site.rb` (10): boolean_connector 8, condition_true 1, return_nil 1 - `lib/os_sdlc/cops/structural/feature_envy/site.rb` (10): condition_true 3, return_nil 3, boolean_connector 1, boolean_literal 1, comparison 1, statement_removal 1 - `lib/os_sdlc/cops/structural/simulated_polymorphism/owned_type.rb` (10): boolean_literal 4, condition_true 2, statement_removal 2, condition_false 1, return_nil 1 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/caller_input.rb` (9): boolean_connector 3, return_nil 2, boolean_literal 1, condition_false 1, negation_removal 1, statement_removal 1 - `lib/os_sdlc/cops/structural/unread_instance_variable/reading_call.rb` (9): boolean_connector 2, return_nil 2, statement_removal 2, boolean_literal 1, condition_false 1, condition_true 1 - `lib/os_sdlc/cops/structural/adapter_scope/visibility.rb` (8): boolean_connector 2, condition_true 2, return_nil 2, condition_false 1, negation_removal 1 - `lib/os_sdlc/cops/structural/array_literal_of_locals_return.rb` (8): condition_true 2, return_nil 2, statement_removal 2, boolean_connector 1, condition_false 1 - `lib/os_sdlc/cops/structural/format_validation_raising_in_initialize/match_sends.rb` (8): return_nil 3, statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1 - `lib/os_sdlc/cops/structural/query_method_reaches_write/write_chain_offense.rb` (8): condition_true 2, return_nil 2, statement_removal 2, boolean_literal 1, condition_false 1 - `lib/os_sdlc/cops/structural/reach_through_chain/site.rb` (8): boolean_literal 2, condition_true 2, return_nil 2, statement_removal 2 - `lib/os_sdlc/cops/structural/feature_envy/external_receiver.rb` (7): boolean_literal 2, statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1 - `lib/os_sdlc/cops/structural/forwarding_class/initialization.rb` (7): condition_true 2, boolean_connector 1, boolean_literal 1, condition_false 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/raw_file_content_assertion/raw_content_call.rb` (7): return_nil 2, statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1 - `lib/os_sdlc/cops/structural/adapter_built_outside_entry/adapter_constant.rb` (6): statement_removal 2, boolean_connector 1, condition_false 1, condition_true 1, return_nil 1 - `lib/os_sdlc/cops/structural/boolean_control_parameter/def_site.rb` (6): boolean_literal 2, condition_true 2, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/collaborator_construction_in_initialize.rb` (6): condition_true 3, statement_removal 2, comparison 1 - `lib/os_sdlc/cops/structural/domain_operand_in_edge/second_source.rb` (6): boolean_connector 3, condition_true 2, arithmetic 1 - `lib/os_sdlc/cops/structural/module_owns_instance_state/offense_subject.rb` (6): return_nil 2, statement_removal 2, condition_false 1, condition_true 1 - `lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/class_mutators.rb` (6): boolean_connector 3, condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/private_method_defs.rb` (6): condition_true 2, return_nil 2, statement_removal 2 - `lib/os_sdlc/cops/structural/unreachable_branch_after_guard/predicate_condition.rb` (6): boolean_connector 3, boolean_literal 1, condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/unused_private_method/private_defs.rb` (6): condition_true 2, return_nil 2, statement_removal 2 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/if_site.rb` (5): boolean_connector 2, comparison 1, condition_true 1, return_nil 1 - `lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/body_statements/statement.rb` (5): boolean_connector 3, condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/private_method_defs/visibility_scan/statement_classification.rb` (5): boolean_connector 4, return_nil 1 - `lib/os_sdlc/cops/structural/raw_file_content_assertion/fixture_writes.rb` (5): boolean_connector 1, comparison 1, condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/raw_file_content_assertion/latest_assignment.rb` (5): boolean_connector 2, condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/reach_through_chain/holdings.rb` (5): condition_true 3, boolean_literal 2 - `lib/os_sdlc/cops/structural/unused_private_method/superclass_calls.rb` (5): condition_true 2, condition_false 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/adapter_scope/method_table.rb` (4): condition_false 1, condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/discarded_error_code/raise_site.rb` (4): boolean_connector 1, condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/format_validation_raising_in_initialize.rb` (4): condition_true 2, boolean_connector 1, statement_removal 1 - `lib/os_sdlc/cops/structural/module_owns_instance_state.rb` (4): boolean_connector 1, condition_false 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/process_start.rb` (4): return_nil 2, condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/reach_through_chain/members.rb` (4): condition_true 2, condition_false 1, return_nil 1 - `lib/os_sdlc/cops/structural/simulated_polymorphism/case_dispatch.rb` (4): boolean_connector 2, return_nil 2 - `lib/os_sdlc/cops/structural/static_fact_assertion/static_node.rb` (4): boolean_literal 1, condition_false 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/unreachable_branch_after_guard/statements.rb` (4): condition_true 2, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/discarded_error_code/variable_names.rb` (3): condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/facts.rb` (3): boolean_literal 1, comparison 1, condition_true 1 - `lib/os_sdlc/cops/structural/forwarding_class/constant_chain.rb` (3): boolean_connector 3 - `lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/lifecycle_defs.rb` (3): boolean_connector 2, condition_true 1 - `lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/lifecycle_defs/lifecycle_assignments.rb` (3): condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/module_owns_instance_state/direct_defs.rb` (3): condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/module_owns_instance_state/module_includers.rb` (3): condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/ivar_mutation.rb` (3): boolean_connector 1, condition_false 1, statement_removal 1 - `lib/os_sdlc/cops/structural/parameter_threaded_through_private_methods.rb` (3): condition_false 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/primitive_obsessed_ivar/class_site.rb` (3): condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/require_relative_density/top_level_requires.rb` (3): condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/simulated_polymorphism.rb` (3): condition_false 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/simulated_polymorphism/if_chain_dispatch/type_check_condition.rb` (3): boolean_connector 3 - `lib/os_sdlc/cops/structural/unused_private_method/body_private_defs.rb` (3): statement_removal 2, condition_true 1 - `lib/os_sdlc/cops/structural/unused_private_method/call_sites.rb` (3): condition_true 1, return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/feature_envy/lvar_name.rb` (2): boolean_literal 1, condition_true 1 - `lib/os_sdlc/cops/structural/format_validation_raising_in_initialize/validation_condition.rb` (2): condition_true 2 - `lib/os_sdlc/cops/structural/forwarding_class/class_match.rb` (2): boolean_connector 1, return_nil 1 - `lib/os_sdlc/cops/structural/instance_variable_assumption/class_site.rb` (2): condition_false 1, statement_removal 1 - `lib/os_sdlc/cops/structural/instance_variable_assumption/ivasgn_conditionality.rb` (2): return_nil 2 - `lib/os_sdlc/cops/structural/layer_ledger/layer_map.rb` (2): boolean_connector 1, condition_true 1 - `lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader.rb` (2): condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/attr_declarations.rb` (2): boolean_connector 1, condition_true 1 - `lib/os_sdlc/cops/structural/module_owns_instance_state/module_includers/include_call.rb` (2): boolean_connector 2 - `lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader.rb` (2): condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/own_entry_point_spawned_in_test/script_paths.rb` (2): condition_true 2 - `lib/os_sdlc/cops/structural/query_method_reaches_write.rb` (2): condition_false 1, statement_removal 1 - `lib/os_sdlc/cops/structural/raw_file_content_assertion.rb` (2): condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/rescue_site.rb` (2): condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/rescue_site/sends.rb` (2): condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/static_fact_assertion/static_fact_call.rb` (2): comparison 1, return_nil 1 - `lib/os_sdlc/cops/structural/unreachable_branch_after_guard/reassignment.rb` (2): return_nil 2 - `lib/os_sdlc/cops/structural/unread_instance_variable.rb` (2): condition_true 1, statement_removal 1 - `lib/os_sdlc/cops/structural/unread_instance_variable/unread_assignments.rb` (2): return_nil 1, statement_removal 1 - `lib/os_sdlc/cops/structural/unused_private_method/subclass_definition.rb` (2): boolean_connector 1, condition_true 1 - `lib/os_sdlc/cops/structural/array_literal_of_locals_return/final_expression.rb` (1): condition_true 1 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/condition.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/condition/check.rb` (1): condition_true 1 - `lib/os_sdlc/cops/structural/domain_effect_in_edge/or_site.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/domain_operand_in_edge/if_verdict.rb` (1): condition_true 1 - `lib/os_sdlc/cops/structural/forwarding_class/method_match.rb` (1): condition_true 1 - `lib/os_sdlc/cops/structural/forwarding_class/required_libraries.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/instance_variable_assumption/branch_bodies.rb` (1): arithmetic 1 - `lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/attr_lifecycle_offense.rb` (1): boolean_connector 1 - `lib/os_sdlc/cops/structural/lifecycle_ivar_behind_attr_reader/body_statements.rb` (1): boolean_connector 1 - `lib/os_sdlc/cops/structural/mutable_collection_leak_via_attr_reader/mutation_details.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/own_entry_point_spawned_in_test.rb` (1): condition_true 1 - `lib/os_sdlc/cops/structural/parameter_list_signals_missing_object.rb` (1): boolean_connector 1 - `lib/os_sdlc/cops/structural/parameter_threaded_through_private_methods/threaded_param_offense.rb` (1): comparison 1 - `lib/os_sdlc/cops/structural/precedence_in_edge/choice.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/precedence_in_edge/guard.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/private_method_defs/visibility_scan.rb` (1): condition_true 1 - `lib/os_sdlc/cops/structural/private_method_defs/visibility_scan/string_value.rb` (1): condition_true 1 - `lib/os_sdlc/cops/structural/query_method_reaches_write/qualified_call_name.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/reach_through_chain/chain.rb` (1): condition_false 1 - `lib/os_sdlc/cops/structural/require_relative_density/node_candidate.rb` (1): boolean_connector 1 - `lib/os_sdlc/cops/structural/same_file_defs.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/simulated_polymorphism/if_chain_dispatch.rb` (1): return_nil 1 - `lib/os_sdlc/cops/structural/simulated_polymorphism/message.rb` (1): statement_removal 1 - `lib/os_sdlc/cops/structural/unreachable_branch_after_guard.rb` (1): condition_false 1 - `lib/os_sdlc/cops/structural/unreachable_branch_after_guard/guard_release.rb` (1): boolean_connector 1 - `lib/os_sdlc/cops/structural/unread_instance_variable/member_generating_call.rb` (1): boolean_connector 1 - `lib/os_sdlc/cops/structural/unused_private_method/superclass_definition.rb` (1): condition_true 1 ## Reproduce n/a: the survivors come from a whole pass. Verify with a targeted run: `bin/os-sdlc-mutation-pass run <files> --no-matrix`. ## Approach For each file listed, write the missing paired test at `test/os_sdlc/<lib path>_test.rb` (ruling 100). The test must kill each survivor of that file. When a survivor shows dead code (a branch no caller reaches), delete the code if no caller needs it, and write no test for it. When a survivor is equivalent (the mutant has the same behavior), rule it equivalent in a comment on this ticket with the reason. Then verify with a targeted `--no-matrix` run over the files of this ticket. Do not run a whole pass. Required work: none beyond the acceptance criteria. ## Acceptance criteria 1. Given a targeted `--no-matrix` Mutineer run on the files listed in this ticket, when the run ends, then no survivor remains except ones that this ticket rules equivalent with a reason. 2. Given a file that has a deleted dead-code candidate, when the suite runs, then it is green and no caller of the deleted code remains. ## Origin - Trigger: second whole-codebase mutation pass, 2026-11-09 (`docs/research/mutation-testing/2026-11-09-second-pass/`) - Improvised this session: none - Chain: survivors ← no paired unit test for the file ← tests were written at the pipeline level, and the unit test per file (ruling 100) was never added ← DESIGN (ruling 100) - Root candidate: none found; searched survivor, mutation, mutineer, cops-structural, missing tests - Where: lib/os_sdlc/cops/structural/ - Session: bc5ad309-36b7-4fe5-a67f-1d90187242eb - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/bc5ad309-36b7-4fe5-a67f-1d90187242eb.jsonl VERDICT: CREATE (ticket-skeptic, 2026-11-09): no open ticket covers these survivors.
Author
Owner

Resolution

Done: Killed the cops/structural survivors through each cop's own test file (ruling 105), with a scripted survivor loop: targeted mutineer packet per cop, haiku writes snippet tests, rerun verifies, sonnet takes hard survivors. Deleted 7 dead guards (ConditionMatch, CallSites, ExternalReceiver, ModuleIncluders, StaticNode, VariableNames, MatchSends). Branch ticket-1654, commits 25a5c951b, f44103981, 22b52941d, 5cfe074ea.

Evidence: Final targeted --no-matrix run over 43 packets (load 2.19, 160 s): 1,977 mutants, 1,926 killed, 51 survived, 0 timeouts, 0 errors, score 97.4. Survivors left: 47 equivalent (truthiness-only predicates, no-op guards, memo guards), 4 hang-only (WriteChain visited-set guard in query_method_reaches_write). Full suite 3,856 runs green; rubocop --cache false clean on every changed file. Record: docs/research/mutation-testing/2026-11-10-survivor-loop/ (final_summary.tsv, README classification).

Follow-ups: #1668 makes the survivor loop a fixed mutation-testing step (filed with a ticket-skeptic CREATE verdict). The 4 hang-only mutants and the equivalent-mutant classes need a ruling from Jared; they are in the session handoff, not a ticket.

## Resolution **Done:** Killed the cops/structural survivors through each cop's own test file (ruling 105), with a scripted survivor loop: targeted mutineer packet per cop, haiku writes snippet tests, rerun verifies, sonnet takes hard survivors. Deleted 7 dead guards (ConditionMatch, CallSites, ExternalReceiver, ModuleIncluders, StaticNode, VariableNames, MatchSends). Branch ticket-1654, commits 25a5c951b, f44103981, 22b52941d, 5cfe074ea. **Evidence:** Final targeted --no-matrix run over 43 packets (load 2.19, 160 s): 1,977 mutants, 1,926 killed, 51 survived, 0 timeouts, 0 errors, score 97.4. Survivors left: 47 equivalent (truthiness-only predicates, no-op guards, memo guards), 4 hang-only (WriteChain visited-set guard in query_method_reaches_write). Full suite 3,856 runs green; rubocop --cache false clean on every changed file. Record: docs/research/mutation-testing/2026-11-10-survivor-loop/ (final_summary.tsv, README classification). **Follow-ups:** #1668 makes the survivor loop a fixed mutation-testing step (filed with a ticket-skeptic CREATE verdict). The 4 hang-only mutants and the equivalent-mutant classes need a ruling from Jared; they are in the session handoff, not a ticket. <!-- os-backlog kind: resolution -->
jared closed this issue 2026-11-10 13:32:05 +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#1654
No description provided.