Plainsight is ten reading tools in one free Chrome extension, and the new project page is here. This is the part of building it that was worth writing down.
At the end of the second build the numbers looked finished. Unit suite 55 of 55. Mutation testing 41 of 41 mutants killed, a 100 percent kill rate. Fifty-two assertions in real headful Chromium with the extension loaded unpacked. A privacy gate scanning every shipped file for network calls. A pre-ship gate at 10 of 10. And every one of those gates had itself been proven to fail on a seeded defect first, so none of them was a rubber stamp.
Then I read the build as three people who were not me: someone hard to please, someone who thinks about how a tool feels on a bad day, and someone who wants to know what should be cut. They found three things that made the product not work.
Three ship-blockers behind six green gates
Run on every site could never succeed. The options page asked Chrome for permission on <all_urls>. The manifest declared http://*/* and https://*/*. Chrome refuses a permission the manifest does not name, and it refuses it by resolving false rather than by throwing, so there was no error anywhere. The button did nothing, on every install, silently. The JavaScript was correct. The manifest was valid. They disagreed with each other, and nothing in the chain was looking at both.
The master on/off shortcut was a no-op. It wrote to chrome.storage.sync. The profile it was toggling lives in chrome.storage.local. Two different stores with an identical API: the write succeeds, the reader never sees it, nothing reports a problem.
Text size compounded. The size multiplier applied at every level of nesting instead of once. On real Wikipedia list markup that produced 1,210 pixels of text. The slider said 2.2 times. It was 85.7 times. It now renders at 31 pixels, which is what the slider says.
The stress battery found a different class
Four isolated shards, each with its own copy of the extension, its own browser profile and its own port, run against pages built to be hostile. They found things no test I would have written was looking for. A family emoji is one grapheme built from several code points joined by zero-width joiners; splitting it for fixation bolding produced three separate people. Sites that recycle row elements as you scroll kept the marker saying a block was already decorated while replacing the content underneath, so forty rows out of forty stayed untouched forever.
And the instrument was broken before the product was. The performance shard reported an identical 356 milliseconds for every configuration: tools off, tools on, everything on. That is not a fast product, it is a stopped clock. Rewritten to time the real function in-page over a fixed corpus, with an assertion that the configurations must produce different numbers, it separated six configurations across 191 to 1,564 microseconds.
What I did instead of cutting two tools
The verdict on the syllable splitter and the word look-up was to cut them: a heuristic that is wrong 40 percent of the time is a liability rather than a feature, and it really was wrong that often on common words.
Both were rebuilt to decline rather than guess, and to publish their own accuracy inside the product. The syllable splitter uses only rules that are safe and leaves the rest whole: 100 percent coverage, 97 percent accurate. The parts-of-speech tagger colours 77 percent of words and is right on 96 percent of those, and leaves the rest uncoloured rather than mislabelled. Both numbers are measured against hold-out sets asserted to share no words with the tables the product ships with, so the measurement is not circular.
The thing I keep relearning
Every gate in that chain was real, and every one of them was proven able to fail before I trusted it. That is the right discipline and I would not drop any of it. But a gate answers the question it was written to ask. None of them asked whether a person could use the thing, and the plan I had written actually named the two passes that would have: an accessibility review of the extension’s own interface, and a first-run walkthrough by someone with no context. Both were in the plan. Neither ran. The run reached the end and reported nine phases complete.
Six green gates and three blockers is not a testing failure. It is a coverage hole that green numbers are very good at hiding.
Plainsight is free, has no account and no paid tier, and shows the evidence grade beside every switch, including the one where the evidence says the feature does not work. The project page is here, and the privacy detail is on the same page.
