Mirror each os-sdlc test file to its source path, a ledger pass #1644

Open
opened 2026-11-08 21:19:27 +00:00 by jared · 2 comments
Owner

Problem

Ruby convention and Mutineer pairing expect lib/foo/bar.rb to pair with test/foo/bar_test.rb. In os-sdlc only 180 of 1,120 lib files have a test at the mirrored path, and 168 test files sit flat at the top of the test directory. Tests were never moved during the four CRC refactor runs that moved their sources. Mutineer autopair fails for most files, so the survivor gate and the whole-codebase pass carry explicit test lists as a workaround (ruling 86, 2026-11-08).

Reproduce

n/a: structure ticket, no behavior change.

Approach

A ledger pass like crc-refactor over the test files, not the sources. One ledger row per test file naming the source it exercises. Evidence order: the whole-codebase kill matrix (os-sdlc-mutation-pass run ., which shows the source files each test kills mutants in), then the constant under test. Then git mv in green batches with suite and rubocop after each batch. A test that exercises several sources is split or placed with the primary owner and noted in the ledger. Same pass for os-backlog, os-git, os, os-adr, os-aidd-lint after os-sdlc. Blocked by: branch tests-to-test (the tests/ to test/ rename) merging first.

Required work: none beyond the acceptance criteria.

Origin

  • Trigger: Jared's question why tests do not match their source files, 2026-11-08, after Mutineer's one-liner failed on tests/
  • Improvised this session: none
  • Chain: Mutineer autopair finds no tests ← test files not at mirrored paths ← CRC runs 1-4 moved sources, never tests ← no placement rule for tests (lens-testing T2 says placement is a habit). End: DESIGN (no rule; ruling 86 now sets one)
  • Root candidate: none found; searched mirror, autopair, tests-to-test, test file, test placement, Mutineer
  • Where: plugins/os-sdlc/test (618 files)
  • Session: 3a7fee87-6b61-41ba-83dc-7170ffaa40f9
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/3a7fee87-6b61-41ba-83dc-7170ffaa40f9.jsonl

VERDICT: CREATE

## Problem Ruby convention and Mutineer pairing expect `lib/foo/bar.rb` to pair with `test/foo/bar_test.rb`. In os-sdlc only 180 of 1,120 lib files have a test at the mirrored path, and 168 test files sit flat at the top of the test directory. Tests were never moved during the four CRC refactor runs that moved their sources. Mutineer autopair fails for most files, so the survivor gate and the whole-codebase pass carry explicit test lists as a workaround (ruling 86, 2026-11-08). ## Reproduce n/a: structure ticket, no behavior change. ## Approach A ledger pass like crc-refactor over the test files, not the sources. One ledger row per test file naming the source it exercises. Evidence order: the whole-codebase kill matrix (`os-sdlc-mutation-pass run .`, which shows the source files each test kills mutants in), then the constant under test. Then `git mv` in green batches with suite and rubocop after each batch. A test that exercises several sources is split or placed with the primary owner and noted in the ledger. Same pass for os-backlog, os-git, os, os-adr, os-aidd-lint after os-sdlc. Blocked by: branch `tests-to-test` (the `tests/` to `test/` rename) merging first. Required work: none beyond the acceptance criteria. ## Origin - Trigger: Jared's question why tests do not match their source files, 2026-11-08, after Mutineer's one-liner failed on `tests/` - Improvised this session: none - Chain: Mutineer autopair finds no tests ← test files not at mirrored paths ← CRC runs 1-4 moved sources, never tests ← no placement rule for tests (lens-testing T2 says placement is a habit). End: DESIGN (no rule; ruling 86 now sets one) - Root candidate: none found; searched mirror, autopair, tests-to-test, test file, test placement, Mutineer - Where: plugins/os-sdlc/test (618 files) - Session: 3a7fee87-6b61-41ba-83dc-7170ffaa40f9 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/3a7fee87-6b61-41ba-83dc-7170ffaa40f9.jsonl VERDICT: CREATE
Author
Owner

Evidence ready: first whole-codebase kill matrix, 2026-11-08. Record and TSVs in docs/research/mutation-testing/2026-11-08-first-whole-codebase-pass/ (60f373a4c). overlap.tsv sole_foreign_killer and many_killers name the test files that kill each source file's mutants; use them as the owner evidence for the ledger. The tests/ to test/ rename is merged (c8deb07b), so this ticket is unblocked.

Evidence ready: first whole-codebase kill matrix, 2026-11-08. Record and TSVs in docs/research/mutation-testing/2026-11-08-first-whole-codebase-pass/ (60f373a4c). overlap.tsv sole_foreign_killer and many_killers name the test files that kill each source file's mutants; use them as the owner evidence for the ledger. The tests/ to test/ rename is merged (c8deb07b), so this ticket is unblocked.
Author
Owner

Rulings 100 and 101 (predicted, 2026-11-09): the mirror target is test/os_sdlc/_test.rb, because Mutineer pairs lib/os_sdlc/x.rb only with test/os_sdlc/x_test.rb (commit 543eade6 put the new map check tests there). The last acceptance criterion is a suite-level check that each lib file has a paired test or a ledger row naming its owner test. No baseline.

Rulings 100 and 101 (predicted, 2026-11-09): the mirror target is test/os_sdlc/<path>_test.rb, because Mutineer pairs lib/os_sdlc/x.rb only with test/os_sdlc/x_test.rb (commit 543eade6 put the new map check tests there). The last acceptance criterion is a suite-level check that each lib file has a paired test or a ledger row naming its owner test. No baseline.
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#1644
No description provided.