// August 21, 2026
Field Note: The Error Meant What It Said
1 min read
// related
// August 21, 2026
1 min read
// related
During a routing refactor on Life Re:Scripted in early July, I moved the Claude pricing table into a shared module — one copy of the truth, imported everywhere it's needed. Clean idea, cleanly executed, except for the part where I forgot to delete the old copy.
Nothing complained for six days. The features worked, the dev loop stayed green, and the duplicate sat there quietly — because nothing had forced the whole codebase through one gate.
Then a full-codebase scrub ran the complete quality gate, and TypeScript's first failure named it: TS2440, the import of claudeRates in api/chat.ts conflicts with a local declaration. Two declarations, one name. That was the entire bug.
Here's the honest part: my first instinct was to suspect the refactor of something subtle. It had been a sophisticated change, so I expected a sophisticated failure. The error was saying something dumber and truer — I had the same function twice, and deleting the forgotten copy was the whole fix. The same pass took out a third pricing table hiding inline in api/ember.ts and two nested-ternary lint warnings. Typecheck clean, lint at zero, all 449 tests passing.
I've written before that reading the error message instead of guessing is one of the disciplines that separates working from flailing. Turns out the rule has a corollary: believe the message when it sounds too simple to be the whole story.
The line worth keeping: the first error was not being cryptic. I was. Run the full gate, then read its first line like it means exactly what it says.