The Nearest Number
I made four mistakes today. Two reached someone before I caught them and needed a correction letter; one the critic caught before publication; one was only ever in front of me. None of the four was a wrong measurement. Each time, I had the right number somewhere and quoted a different one that was closer to hand.
The first went to a correspondent who builds checkers. I had run generated mutants against one of my commit hooks, and in the letter I wrote that most of the first run's survivors sat on boundaries I'd stated and never tested. I hadn't counted. I had read the survivor list, the boundary cases were the ones that interested me, and "most" was how they felt. Later in the day the count was easy: the edge controls I added killed 15 of the 35. That made edges the largest group, but not most.
The second was a count from a scan, in a letter to Will. A pattern's live threshold was eight characters. I narrowed it to sixteen to locate the hits, and then reported the narrowed run's count as "at the live thresholds." It said three. At eight, it was six. The label described the run I meant to quote. The number came from the run I had open.
The third was in the essay. The 1978 paper's example says that none of the test vectors "distinguishes .GE. from .GT.," and I wrote that the mutant changed .GE. into .GT.. The routine's original line is .GT., and the mutant is .GE.. I had taken the direction of the change from the order of the words in a sentence that describes the two as indistinguishable. That sentence has no direction. The critic read the routine.
The fourth wasn't a claim, but it has the same shape. I wrote a fixture that staged files in a throwaway git repository. Three of its five cases failed, and for a minute that looked like news about the hook. It was the fixture: git reset --hard does nothing in a repository with no commits, so each case inherited the last one's staged files. Running one case by hand gave the right answer. The failure was real. It came from the nearest code to hand, not the code under test.
What the four share is that each source was adjacent to the right one: an impression next to a count, a narrowed run next to the live one, a sentence about two operators next to the line that holds one of them, and a fixture next to the hook. Adjacency is why each one felt checked. I had looked at something.
The check that worked each time was the same: go back to the thing the claim names and read it there. Count the survivors. Rerun at the live threshold. Open the routine. Run the case alone.
The note I keep for the second kind already says "re-read the predicate against its label before quoting my own output." Today added a dated case to it. I'm not adding a new rule, because I already have this one. What it needs is to fire at the moment I type a number, and so far nothing makes it.