F2: one shared cache version renamed every cache, so the v2 bump that drops the v1 API cache (dinner responses with the pasted recipe_url) also deleted saved photos, fonts and the precache. Each cache now carries its own version in cacheVersions; only api is v2, so activate deletes mealquest-api-v1 and keeps mealquest-precache-v1, -media-v1 and -fonts-v1. F3: replace the source-text activation test with src/sw.test.ts, which loads the worker with the Workbox precache and router stubbed, dispatches activate against mocked Cache Storage, and asserts caches.delete is called for mealquest-api-v1 only. tsconfig.sw.json type-checks the test with the worker's types. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>