Notes
The rules the product follows, the versions that broke them, and what is deliberately not built. Condensed from the changelog, which has the measurements. Nothing here is a roadmap.
The rule that produced most of the others: zero is a valid outcome. There is no floor, no fallback move, no minimum count and no ceiling. Every failure class this project has recorded came from something that guaranteed a non-empty row.
Rules, and the failure behind each
Never fake output
Earlier builds fell back to canned suggestions when the API failed, which made a broken integration look like a working one. Degraded states now say what actually happened: a limit reached, a parse failure, a network error.
Clicking is the only input
There is no box to type into anywhere in the product. Material you have to supply becomes a <paste here> slot inside the written prompt, which you fill in the message box before sending.
One move, one verb
Within a single move, if a bullet could be sent on its own as a complete request, it is a second job and does not belong there. Between moves the rule inverts, deliberately: every move must stand alone as a complete request. That is the difference between a menu and a checklist, and it is the whole point of the row.
No categories or personas
An earlier version tagged suggestions by lens (sharpen, explore, constrain). It made the output feel like a taxonomy exercise instead of a colleague talking. Removed.
One control, one job
The trigger and a type-it-yourself chip once shared a row and did different things, which needed a rule to keep them apart. The second control is gone; the rule it needed is why a second one should not return without a reason better than convenience.
Selectors degrade quietly
If claude.ai's page structure changes, the extension goes silent rather than breaking the page. The selectors are pinned constants at the top of the content script.
By version, newest first
0.9.70- On phones, a browser's force-dark mode was inverting the mascot's face. It inverts flat fills darker than one brightness threshold, and gradient fills (SVG paint servers) only when brighter than a higher one, which dark ink never reaches. A scan of all 16,777,216 sRGB colours found no flat colour that holds 4.5:1 against the white of the eye in all four render modes (no force-dark, and the cielab, hsl and rgb inversions); the best possible was 3.13:1. So the escape was the role, not the colour: the pupils, mouth and whisper now paint through single-colour gradients, and every pixel of ink is byte-identical across all four modes. The test suite asserts the rule in both directions.
0.9.69- A field screenshot from a phone showed washed-out pupils, so 0.9.69 darkened the ink. The next screenshot from the same phone had no pupils at all and a white mouth: darker in, lighter out. A fix pointed the wrong way, and the direction of the failure was the diagnosis. 0.9.70 has it.
0.9.67- The action gate's drops were read for the first time, from a live tail of the worker across ten sessions, half of them in Serbian. 36 moves came back and 14 were dropped; nine of the drops were doable clicks the verb list did not know. The gate fails closed, so an unknown verb does not degrade a row, it empties one. Verbs were added; 0.9.68 added one more, found by verifying that release.
0.9.66- A third gate, which required a spread of sources across the row, was removed after measurement: one run in six was emptied by it, and every row it took was good.
0.9.64- An empty row started saying which kind of empty it is. Three causes had drawn one identical card: the model earning nothing (the product working), the action gate finding no verb it knew, and the spread gate dropping an all-reply row. Only the first is honest. The diagnostics were console-only, and the product is field-tested on a phone, which has no console, so the card now carries the reason. The same release moved the result cache out of the service worker, which Chrome tears down at will; a second press under the same reply had been a fresh sample.
0.9.59- The field test reached a phone: 0.9.58 sideloaded on Android with an own key, and mobile worked with nothing changed. The defect it found: on a short session with a long enumerative reply, the row transcribed the reply's own list of options, and the evidence gate scored that as flawless. The gate built to prevent invention was quietly selecting for transcription. The prompt now names copying the reply's list as the most seductive failure.
0.9.58- The history-mining pivot. It stopped reading the reply for a question and started reading your own messages across the whole session for an idea: up to four independent moves, each send-ready. The click-to-answer interview, its pagination, the free-text box, the fifth chip, and the three-generation schema negotiation were deleted, 4,222 lines in all. The first message was pinned and the oldest middle ones made to drop first, whole messages only. Grounding widened to your messages plus the reply; checked against the reply alone, a working product would have reported itself broken.
0.9.55- The mascot became the trigger: a real button with the label "What now?", a hover bubble that can never intercept a click, a fade instead of a pop-in under reduced motion.
0.9.53- The model call stopped happening for every reply and started happening on the press. Before, every completed reply spent a call, so a twenty-message conversation could exhaust the day without a single click. The larger consequence was a side effect: nothing about the conversation leaves the page until a deliberate click. Capture of the reply stayed eager, because it is free and the page is settled at that moment; only the call moved.
0.9.31- The Chrome Web Store approves updates on its own clock, so no deploy order avoids a window in which old and new clients hit the same backend. The worker learned to serve two client generations at once. A bug caught by its own test: a parser that read one key only would have turned every legacy call into "the model earned nothing", a total outage wearing the mask of correct behaviour.
0.9.30- The product became a click-to-answer interview: one question at a time, numbered options, a free-text "Something else". All of it was deleted at 0.9.58.
Not built
- A prompt library, or templates with variables.
- Cross-device sync. It would need accounts, and the device token is anonymous by design.
Status
Version 0.9.70 is the number in the extension's manifest and in the worker's BUILD constant; the worker's /v1/health reports it with the model and the limit, so a deploy can be told from a no-op. The shipped model on both paths is claude-sonnet-5. The open question of the field test is how often a press earns nothing.