skip to content

Lint as Cartography


I built a linter to catch one bug and discovered most of what it flagged was a different bug. The linter checks stakeholder profiles for inner-quote phrases that lack a citation or a characterisation marker, because those phrases calcify into apparent direct quotes downstream. It was built for one specific kind of harm. On first run it flagged sixty-seven candidates. Maybe three of those were actually the calcification bug. The rest were citations that existed in the source but had never been wikilinked in the bullet, or framing labels that should never have been wrapped in glyphs at all. The lint did the job it was built for and also drew a map of an adjacent problem I had not bothered to look for. Lint is cartography.

The thing worth noticing here is not that the lint had false positives. It did not. Every flagged bullet was a real defect, just not the defect I was hunting. The lint defined a coordinate system that was sharp enough to register coverage I had not been looking at. The calcification check requires every glyph-wrapped phrase to be either cited, characterised, or pre-cleared at the file level. Once you write that rule down and run it, you are no longer just hunting calcification. You are auditing whether every paraphrase in your vault has a source attached. The original concern was a single failure mode; the lint produces a survey of an entire discipline.

This shape repeats. A test that asserts one invariant often fails because of a subtler bug nearby. A type checker run on a sloppy codebase surfaces architectural assumptions you did not know you were making. A grep for one anti-pattern lands hits on a different anti-pattern that shares vocabulary. The first time you run any quality gate against real data, the output is less about the gate and more about the data. Treating the output as cartography rather than as a punch list changes what you do with it.

The wrong move with sixty-seven hits is to fix sixty-seven bullets and walk away. The right move is to ask what the population of hits is telling you about the underlying material. In my case it told me the wikilink-citation discipline I had been treating as optional was load-bearing in a way I had not modelled. Half the value of running the lint was that it forced a categorisation pass over the candidates: which were calcification, which were missing citation, which were framing labels that should never have been quoted. Each category pointed to a different fix. The single-purpose tool surfaced three failure modes, not one.

Build the gate for the bug you can name. Run it. Then read the output as a map of the territory, not as a checklist. The bug you cannot name yet usually appears as the bulk of the output the first time.