tdd: a test that replays real inputs must keep the input feature it is meant to cover
- [x] I've read SCOPE.md and checked .out-of-scope/ **Skill:** tdd **What went wrong** 1. End-to-end tests were written to replay the real arguments of existing production call sites against a fixture. 2. One real argument (a flag whose value must be a path to an existing directory) was dropped from the replayed command because creating the directory was inconvenient. 3. Two production call sites combine that flag with the feature under test. A production bug lost the feature's output exactly in that combination. 4. The tests passed. An external adversarial review found the bug. 5. Red-proofing (reintroduce the bug, expect failures) only produced failing tests after the dropped argument was restored with a real fixture. The tests were green because they were blind to the failing combination, not because the code was right. 6. A second instance, a day later in another change: a replay loop rewrote a shell-variable argument to a literal, so the variable was never assigned in the test and its precondition was vacuous. A maintainer review flagged it. 7. Harness: Claude Code. Model: not recorded in my notes. Related, not duplicates: #1210 and #1221 (the red must fail on the bug's behaviour, not a missing symbol) and #1209 (prove a forced mutation applied). This is the input-side counterpart: a red or green only means something if the test input still contains the condition that triggers the bug. **Proposed change** In `skills/engineering/tdd/tests.md`, add a "Bad Tests" entry next to "Tautological tests": > **Normalised-input tests**: The test takes a real input (a production call, a captured request, a real file) but alters it so it is easier to run, and the alteration removes the feature under test. The test passes in the combination that matters because it never exercises it. > Fix the fixture, not the input: keep the real argument and build whatever it needs. If an argument must be dropped, name the real invocations the test is now blind to. Check that any replay that rewrites its own precondition (for example a variable replaced by a literal) is not vacuous. In `skills/engineering/tdd/SKILL.md` Anti-patterns, add one bullet: > - **Normalised-input**: a test derived from a real input strips or rewrites part of it to make it runnable, and the stripped part is what triggers the bug. The tell: removing the fix does not turn the test red. Optional: under "Red before green", one clause: "Confirm the red once per distinct input shape, not once per test."