
On Device A (fresh install, Frank skin): add a pet → log first feed → confirm sheet does NOT appear during 7s undo → confirm sheet appears within ~1s after undo closes → verify Frank-voice copy ("Want this for everyone else?" + "Frank's home screen widget stays up to date when the household logs anything. Want that?") → tap [Not now] → verify iOS system Allow dialog does NOT appear → background+foreground app: sheet does not re-appear → invite Device B; on B redeem invite → on A: sheet re-appears once (1→2 member transition, D-17) → tap [Not now] again, no further re-asks. Repeat on Miles skin (different account or skin switch): "Allow live updates?" + "The household refreshes Miles' status across every device — invisibly. Allow that?" + [Later] secondary CTA. Permission denial path: deny via iOS dialog → Phase 3 surfaces ZERO UI (D-16) → silent pushes from B still update A's widget (NOTIF-05).
Step-by-step subjective UX flow on physical hardware including iOS system dialogs (SpringBoard probe is structurally tested but the actual dialog suppression is hardware-only). The harness flag XCTSkipUnless gating means automated UITests are deferred to Phase 6. The Bible-voice subjective pass ("would this make a tired pet owner feel understood?") is a founder gut-check that no automated test can substitute.
.planning/uat-evidence/phase-3-uat-02-push-permission-ux/ and reference them in the test's evidence array.Pick yourself, then claim, comment, drop a screenshot, or close. Each action opens a PR against master; site reflects after merge + next /franks-fed-status-publish run. Mutations are audit-logged.
The mutable state lives in .planning/uat-state.json. Easiest path is to ask Claude Code in the project repo:
"Assign phase-3-uat-02-push-permission-ux to Treth and add a comment: 'Setting up two iPhones tonight, will start the 24h window from 19:00.'"
Or hand-edit .planning/uat-state.json directly. Drop screenshot evidence into .planning/uat-evidence/phase-3-uat-02-push-permission-ux/ and reference the filename in the evidence array. Once the test passes or fails, set status to pass or fail with completed_at + a closing comment, then run /franks-fed-status-publish. The skill will write a closure record to .uat-pending-resolutions.json with a one-paste prompt that updates the originating VERIFICATION.md.
.planning/phases/03-widgets-apns-fan-out/03-VERIFICATION.md · verification index: 1 · SC: NOTIF-04
.planning/uat-state.json.