Three rounds of perfect deploys reaching nobody. A service worker had been serving a months-old cached file the entire time.
Opened the session to clean up capture-draft — the small PWA that turns raw input into voice-aligned essence drafts. Plan was tight. Swap the model to Opus 4.7. Add the web_search tool for fact-checking. Rewrite all three prompts (brief, blog, newsletter) around voice plus a co-equal fact-check notes section. Right-size max_tokens per route.
Shipped that. Tested blog with an Allwork.Space piece on AI apprenticeship. Got back a draft that broke first person ("Sat's instinct") and skipped fact-check notes entirely.
Three rounds of prompt revisions. Each one tighter. Each one more explicit about identity framing — "you ARE Sat, writing in first person," explicit IDENTITY RULE blocks forbidding third-person references, fact-check notes pulled out of the task list and promoted to a mandatory co-equal OUTPUT STRUCTURE. Each one shipped clean. Each one deployed clean. Each one came back with the same two failures.
Right-clicked, view page source. The prompts in the browser were the original prompts. Not v2. Not v3. Not anything shipped that day. The service worker registered to capture-draft had been serving a months-old cached index.html no matter how many times Wrangler said the deploy succeeded.
Three rounds of prompt tuning, reaching nobody. The model never saw the work. The model was fine. The deploys were fine. The cache was the whole story.
Killed the service worker with a self-destruct sw.js — unregisters on activate, clears all caches, reloads all open clients. Added a belt-and-suspenders page-side unregister block in index.html. New v3 test in incognito passed both conditions clean: first person held, fact-check notes appeared with ten substantive bullets including a stale-figure flag.
Tool is live and reliable. Lesson: if a PWA doesn't need offline support, the service worker is risk without benefit. And if you're iterating on a deployed file, view page source before the next round.