Sort the 13 mutation timeouts that remain at 8 workers into hang or real-clock wait #1714
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#1714
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) reported 37 timeouts. A check at 8 workers on 2026-11-12 sorted 24 of them, and 13 still time out. A timeout can be a real hang, which is a kill in effect. It can also be a test that waits on the real clock, which makes the mutation run slow and can hide a survivor. Nobody has sorted these 13. Ruling 138 forbids an exclusion rule, so each one needs a reason.
Observed
docs/research/mutation-testing/2026-11-11-third-pass/timeout_check.tsvlists each mutant with the resulttimeout.lib/os_sdlc/daemon/client.rb:43: 6571817b6a7flib/os_sdlc/daemon/client.rb:58: c515ad5878f4lib/os_sdlc/daemon/client.rb:69: 0cf71e82bc26, 99bab1be453c, a2a492345a91lib/os_sdlc/daemon/lsp_session/poll.rb:11: 39d00e1aaa2d, c307fedc4936lib/os_sdlc/daemon/lsp_session/symbols_request.rb:11: f8ad81143532lib/os_sdlc/daemon/lsp_session/transport.rb:21: 01d0404efc12, beac02c8fd0dlib/os_sdlc/daemon/termination.rb:12: 9fc3e4b6ddaclib/os_sdlc/cli/invocation.rb:49: c3d42a93c1cclib/os_sdlc/yaml_file.rb:9: c9b56d42c797Example of a real hang:
daemon/termination.rb:45runssleep(@poll_interval) while alive?(pid) && Time.now < deadline. With@poll_interval = nil,sleep(nil)never returns.Reproduce
From
plugins/os-sdlc, run Mutineer on the 7 files above with all test files, the pass 3 operators,--strategy redefine,--jobs 8, and--no-matrix. The 13 IDs above are timeouts.Approach
For each mutant, apply it by hand and run its covering tests with a stack dump at the hang. Sort it:
sleep(nil)that any caller would hit): no change. Record the reason in the pass 3 record.IO.selectwith a time limit): change the test to inject the clock or the interval, so the mutant fails fast. Then the mutant is killed or survives, and a survivor goes throughreferences/survivor-loop.md.No ignore list, no baseline, and no per-test time limit (rulings 92, 106, 138).
Required work: none beyond the acceptance criteria.
Acceptance criteria
--jobs 8, then the mutant is killed or ruled, not a timeout.Origin
docs/research/mutation-testing/2026-11-11-third-pass/README.mdsection "Timeout check at 8 workers".plugins/os-sdlc/references/survivor-loop.md).VERDICT: CREATE (ticket-skeptic, 2026-11-12; approved by ruling 140)
Resolution
Done: Sorted the 13 pass 3 timeouts that remain at 8 workers: 9 hangs (no action), 2 real-clock mutants on poll.rb:11 (tests no longer sleep on the real interval; killed in about 1 s), 2 hidden survivors (invocation.rb print_result guard deleted, ruling 107; yaml_file.rb tests added).
Evidence: Commit
63b1b30efmerged to main. Table in docs/research/mutation-testing/2026-11-11-third-pass/README.md. Packets: poll.rb 0 of 15, invocation.rb + yaml_file.rb 0 of 31, no timeouts. Suite 5,369 runs, 0 failures, 7.5 s; rubocop clean.Follow-ups: none