Fable review returned DO NOT MERGE. Two blockers, both correct, both now fixed in c3b40ed.
Reviewed by claude-fable-5 per AGENTS.md's highest-available-capability rule, read as one diff. I verified both blockers independently before acting rather than taking the review at face value; both held up.
B1 — the whole-row-click fix was a no-op, and its measurement was a false record.
rastrillo v0.22.0's own tokens.css, which this app serves live via ui.TokensCSS(), already ships all of it: [rst-row] has position: relative (:500), [rst-row]:hover has the --rst-surface-2 tint (:515), and [rst-row-main] > a::after has content:"" ; inset: 0 (:558), under rastrillo's own comment — "The name link's overlay makes the whole row clickable without nesting one anchor inside another." Our markup already matched that selector. The row was already fully clickable, already hover-tinted, already past 24x24 without leaning on SC 2.5.8's Spacing exception.
The "7% clickable" figure came from getBoundingClientRect on the anchor, which reports an element's own box and cannot see an absolutely positioned pseudo-element. Worse, the hit test that later "confirmed" the fix was hitting rastrillo's overlay — it would have passed identically before the change. The check that was never run is the one against the pre-change state. That is precisely the failure shape AGENTS.md names, and it had produced a fix for a defect that did not exist and very nearly written it into the permanent record.
Removed the rules, the attributes, the @media (hover: hover) gate (which could not have worked anyway — rastrillo's :hover is un-gated and still applies on touch), and the test. Left a comment in list.html recording why, so the next reader measuring 268x16 does not reach for the same non-fix. Re-verified after removal: all six probe points across the 990x61 row open the document; hover still resolves to --rst-surface-2.
B2 — PRODUCT.md asserted a security property this app does not have. It said, present tense, that content is encrypted in SQLite under a DEK and that a plaintext byte-grep test enforces it. Store.Text's own doc comment says sealing is out of scope for the plan that built it, and no such test exists in the repo. Rewritten as the spec commitment it is, with an explicit instruction not to describe an instance as encrypting content at rest.
Also taken: S2 (the icon test checked template bytes, so the head-block wiring could vanish while it stayed green — now asserts the rendered page), S3 ("passkeys are ruled out" narrowed to instance-local; §8.1.1's suite path keeps them), and three factual nits.
So one of the five "defects" was never a defect. The remaining four — the back link, the sign-in measure, the mobile header, the favicon — Fable read as sound, and they are unchanged and re-verified after the removal.
Gate exits 0. A confirmation pass is with Fable now; I will not merge until it returns MERGE.