os-sdlc: per-ticket mutation survivor gate (mutation testing increment 1) #1638
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#1638
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
The os-sdlc gate does not show which changed lines no test protects. A surviving mutant on a changed line shows a missing test or dead code. The Mutineer pilot showed that Mutineer measures this suite at changed-line scope.
Reproduce
n/a: feature ticket.
Approach
Source:
docs/research/mutation-testing/plan-v1-2026-11-08.md, table "Increments, in order", row 1. The section "Rulings" is binding; do not re-decide it.mutineerto theGemfiletest group.tests/mutation_helper.rb. It loads the normal helper withoutminitest/parallel_forkand adds theProcess._forkhook fromdocs/research/mutation-testing/2026-11-07-pilot-evidence/test_helper-fork-hook.rb. Do not edittests/test_helper.rb..mutineer.ymlas in the plan (capture_timeout: 1800).lib/os_sdlc/gate/(or where the architecture lens places it). It runs Mutineer with--since <base> --coverage-from <capture> --format json. It foldsboolean_literalinto the siblingstatement_removal, dropsignore:ids, and returns survivor rows with id, file:line, and diff. No agent reads raw Mutineer JSON.Rejected: file scope — the plan rules line scope for the gate. Mutant — license. Heckle — does not run on Ruby 4.0.2.
Origin
docs/research/mutation-testing/plan-v1-2026-11-08.md(commitb90d8253), ruled by Jared 2026-11-07 and 2026-11-08docs/research/mutation-testing/plan-v1-2026-11-08.md)VERDICT: CREATE
Decompose routed to /os-sdlc:ticket-takedown (new object, more than one subsystem).
a. One change: a new gate step runs Mutineer at changed-line scope and adds survivor rows to the gate reply. Gate::Reply#to_h (lib/os_sdlc/gate/reply.rb:6) has no survivor field and no non-blocking warning field today.
b. Owner: none exists. New object: a Gate adapter whose secret is Mutineer's JSON shape, the boolean_literal fold, the ignore: filter, and the 500 s slowdown warning.
Facts for takedown:
Design: docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md (
f0e172b7,f9d79c14). Slice 1 (gem, tests/mutation_helper.rb, .mutineer.yml) done in8e28c94e.Children, in order:
Part C filed as #1641 (survivors gate step, slow-step warning). The map edit (survivor-check and survivor-tests nodes) is orchestrator work after #1641 merges; see the design doc, slice 7.
Resolution
Done: Mutation testing increment 1 built: Project::BaseBranch#merge_base and Project::Changes#since (#1639); MutationTest with switch, runner and scope roles, MutineerRunner, os-sdlc-survivors CLI (#1640); gate survivors of type survivor with the non-blocking 500 s slow-step warning (#1641); poodr-ticket-implementation map routes suite-check pass through new nodes survivor-check and survivor-tests (
d10d4c2e).Evidence: Children #1639, #1640, #1641 closed and merged to main. Map wiring commit
d10d4c2e: Map::Document.load passes (16 nodes), tests/map/document_test.rb 22 runs 0 failures, full suite 3535 runs 0 failures 61.8 s. First real survivor list: lib/os_sdlc/offense_directive.rb:28 abfd2fb825c1 (return_nil), 559f08c32fd1 (statement_removal). Design: docs/system-design-format/proof/2026-11-08-os-sdlc-mutation-survivors.md (slice 7 done).Follow-ups: Increments 2-5 are open as #1634-#1637. Design change at wiring: Map::Check required a bound on the new loop, so survivor-check fail has bound 2 (doc updated). The first ticket run on the map after this merge is the first live run of the survivor nodes.