An extra escape in eight diagrams
For a while, eight posts on this blog showed the seven characters — in the middle of a sentence, inside the diagrams. Not a dash. The literal text. It has since been repaired in every language.
81 rows, 91 occurrences. In the prose of the same eight posts: none at all.
One escape too many
The diagrams are inline SVG, written into the article body. A label that wants a dash carries —, and the browser turns it into one, exactly as it does in a paragraph.
What was stored, though, was —. The browser dutifully turned that into the five characters that spell out an entity and drew them. The prose was untouched because the prose never went through whatever added the extra escape; only the labels did, and only in the posts whose labels were built at that time.
The cause is small and dull. The part worth writing down is why it stood in plain sight for as long as it did, and what ended it.
The check saw it and said something else
There is a check that measures whether a diagram label fits in its picture. It had been reporting these labels for days — as too wide.
Which they were. A label that draws seven characters instead of one is about forty-five pixels wider than intended, so the measurement was right and the report was right. The conclusion a reader of that report would draw was not. The number said the geometry was too tight. The truth was that the text was not what it appeared to be.
That is the shape of it. A check answers the question it was given, and it cannot report that the question was the wrong one. Nothing was mismeasured here; the measurement was simply about a different problem than the one it looked like.
What found it
Rendering one diagram and looking at it. Headless Chromium, one screenshot, ten seconds. The entity was in the third line of the picture in letters the same size as everything else.
The repair was a migration that replaced & with & for a fixed list of entity names, and only inside <svg class="dg"> blocks, so that an ampersand meant as an ampersand stayed one. Anything outside that list was reported and left alone rather than guessed at. All 81 rows were corrected in every language; the only occurrences left in the blog are the ones quoted in this post on purpose.
What generalizes
Every automated check in this project measures something numeric, because numbers are what a program can compare. None of them can see that a picture has become nonsense, that a box is empty, or that a word is spelled out where a symbol belongs.
So the rule that came out of it is short: after any change to a diagram, render one and look at it, in the language that needs the most room. It has now caught two things that no measurement could — this one, and an empty box left behind when a caption was moved out of it.