Mechanical reformat — no logic changes. 398 files changed, 19125 insertions(+), 16457 deletions(-). Prettier 3.8.4 with .prettierrc (singleQuote:true, semi:true, tabWidth:2, trailingComma:all, printWidth:100). Isolated per D-13-08 for reviewability.
6.4 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | requirements | must_haves | |||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 260610-ka9 | 01 | execute | 1 |
|
true |
|
|
Purpose: Android UAT confirmed delivery (FCM 201) but silent presentation; this is the user-facing fix. iOS is unaffected and must stay working.
Output: Edited apps/pwa/src/sw.ts and apps/pwa/src/components/InstructionSheet.tsx, with passing typecheck + build.
<execution_context> @$HOME/.claude/gsd-core/workflows/execute-plan.md @$HOME/.claude/gsd-core/templates/summary.md </execution_context>
@./CLAUDE.md @apps/pwa/src/sw.ts @apps/pwa/src/components/InstructionSheet.tsx Task 1: Enrich showNotification options to fix silent Android push apps/pwa/src/sw.ts In the `push` event handler, modify ONLY the `self.registration.showNotification(title, {...})` options object (the call wrapped in `event.waitUntil(...)`, currently `{ body, tag, data: { url } }`). Add four keys alongside the existing ones, keeping `body`, `tag`, and `data: { url }` exactly as they are: - `icon: '/icon-192.png'` (asset exists at apps/pwa/public/icon-192.png) - `badge: '/icon-192.png'` (asset exists; Android masks it to a monochrome status-bar glyph) - `renotify: true` (re-alert even when the tag is reused — the key fix for silent updates; requires a non-empty tag, which is always set here: default 'familysync-notification' or payload-derived) - `vibrate: [200, 100, 200]` (ensures vibration/heads-up on Android)Do NOT set silent (it must stay falsy/absent). Do NOT touch the payload parsing, the iOS-18.4+ declarative-vs-legacy branch, the try/catch fallback, event.waitUntil, or the notificationclick handler. iOS ignores these added options, so its path is unchanged.
TS caveat: renotify and vibrate are valid NotificationOptions members but some lib.dom TS versions omit/deprecate them on ServiceWorkerRegistration.showNotification. If typecheck errors on these keys, resolve it MINIMALLY: declare a const options: NotificationOptions = { ... } and pass it (with a narrow as NotificationOptions cast only if still required). Do NOT broaden suppression or silence unrelated errors. Build success is the load-bearing gate.
pnpm --filter @familysync/pwa typecheck && pnpm --filter @familysync/pwa build && test -f apps/pwa/dist/sw.js && grep -q "renotify" apps/pwa/dist/sw.js
showNotification options include icon, badge, renotify:true, and vibrate; body/tag/data unchanged; silent absent; typecheck passes; vite build succeeds and emits apps/pwa/dist/sw.js containing the renotify option.
<success_criteria>
- sw.ts showNotification call includes icon, badge, renotify:true, vibrate; body/tag/data and all parsing/waitUntil logic unchanged; no
silentkey. - InstructionSheet ANDROID_STEPS is browser-agnostic (Chrome or Edge).
- typecheck + build + test all pass; dist/sw.js emitted with the fix. </success_criteria>