From 949bb10ac58fac31266e10070b244d089639b5df Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Thu, 24 Sep 2026 22:16:38 +0200 Subject: [PATCH] docs: record the device run, the r8 and label fixes and the push crash it found --- PARITY_CHECKLIST.md | 8 +-- docs/audit-2026-09.md | 66 ++++++++++++++++--------- docs/parity/08-settings-push-i18n-ui.md | 2 +- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/PARITY_CHECKLIST.md b/PARITY_CHECKLIST.md index afbb5754..c6542d1e 100644 --- a/PARITY_CHECKLIST.md +++ b/PARITY_CHECKLIST.md @@ -81,8 +81,8 @@ The native audit of 2026-09-22 ([docs/audit-2026-09.md](docs/audit-2026-09.md)) spot-checked this list and found 14 ticks that were broken or overstated and 11 open items that were already done. The 2026-09-24 fix pass fixed 13 of the 14 (their ticks now also name the fixing commit; the date-locale item is open -again), dropped three obsolete items and ticked what it completed: 379 of 415 -items are done, 36 open. What still needs a device check or a decision is in +again), dropped three obsolete items and ticked what it completed: 380 of 415 +items are done, 35 open. What still needs a device check or a decision is in the audit's "Fix pass, 2026-09-24" section. ## Areas @@ -96,9 +96,9 @@ the audit's "Fix pass, 2026-09-24" section. | 05 | Calendar and tasks | [docs/parity/05-calendar.md](docs/parity/05-calendar.md) | 50 | 43 | 7 | 5 | 20 | 25 | | 06 | Contacts and address books | [docs/parity/06-contacts.md](docs/parity/06-contacts.md) | 50 | 46 | 4 | 1 | 18 | 31 | | 07 | Filters (Sieve), vacation responder, Files | [docs/parity/07-filters-vacation-files.md](docs/parity/07-filters-vacation-files.md) | 32 | 29 | 3 | 3 | 8 | 21 | -| 08 | Settings, sync, push, i18n, themes, updates, misc UI | [docs/parity/08-settings-push-i18n-ui.md](docs/parity/08-settings-push-i18n-ui.md) | 46 | 37 | 9 | 0 | 14 | 32 | +| 08 | Settings, sync, push, i18n, themes, updates, misc UI | [docs/parity/08-settings-push-i18n-ui.md](docs/parity/08-settings-push-i18n-ui.md) | 46 | 38 | 8 | 0 | 14 | 32 | | 09 | JMAP client core, live sync, offline, security, S/MIME | [docs/parity/09-jmap-core-sync-security.md](docs/parity/09-jmap-core-sync-security.md) | 56 | 54 | 2 | 7 | 23 | 26 | -| | **Total** | | **415** | **379** | **36** | **32** | **138** | **244** | +| | **Total** | | **415** | **380** | **35** | **32** | **138** | **244** | Counts are of the `- [ ]` and `- [x]` items per file as of 2026-09-24. Done and Open split them by tick; the P columns count the priority tags on those items diff --git a/docs/audit-2026-09.md b/docs/audit-2026-09.md index 70fdc771..0cfcdc48 100644 --- a/docs/audit-2026-09.md +++ b/docs/audit-2026-09.md @@ -92,21 +92,35 @@ suspected, or cosmetic. ## Fix pass, 2026-09-24 One orchestrating session and one fix agent per area, each in its own git worktree; their -commits were cherry-picked onto `main` (`ee04e95..main`, about 170 commits). `npx tsc --noEmit` -and `npx vitest run` passed after every merge (1,886 tests at `b7a5953`). Nothing has run on a -device yet: a ticked box means the fix landed with unit tests, not that it was checked on the -emulator, and the startup numbers in PF2 come from `npx expo export`, not from device timings. A -device build and smoke test are in progress. +commits were cherry-picked onto `main` (`ee04e95..main`, about 200 commits). `npx tsc --noEmit` +and `npx vitest run` passed after every merge (2,028 tests at `e5659ed`). A ticked box means the +fix landed with unit tests; the startup numbers in PF2 come from `npx expo export`, not device +timings. A release build (x86_64, R8, `-PallowDebugSignedRelease=true`) was built and +smoke-tested on the `Bulwark_Pixel7_API35` emulator up to the sign-in screen: every Kotlin, XML, +Gradle, Babel and Metro change compiles, cold start in light and dark mode is clean, the share +and `mailto:` intents are accepted cold and warm, the QR scanner opens, and `versionCode` is +10062. No test account was available, so nothing behind sign-in has run on a device. -Result: of the 93 bug, UI, performance and webmail-gap items, 80 are ticked, 8 are fixed in part -and 5 are open (B2, PF9, the viewer's undo-send bar, Tabler icons, the password hand-off). 13 of -the 14 stale parity entries are resolved; `dateLocale` is still missing. +The device run also found two push bugs that predate this pass, now fixed: a downgraded FCM +message or a UnifiedPush message crashed the app on Android 12+ with +`BackgroundServiceStartNotAllowedException` (`fef23e4`, falls back to a JobScheduler job), and +every push held a wake lock for 30 s because the new architecture never registered the +headless-task "finished" module (`5ddc2df`). + +Result: of the 93 bug, UI, performance and webmail-gap items, 83 are ticked, 7 are fixed in part +and 3 are open (B2, Tabler icons, the password hand-off). 13 of the 14 stale parity entries are +resolved; `dateLocale` is still missing. ### Check on a device or server -- **Android intents (B9–B11):** the Kotlin was reviewed but never compiled. Check `SEND` with a - `content://` image, `SENDTO mailto:` with extras on a cold and a warm start, and - `VIEW mailto:alice+news@partner.example`. +- **Android intents (B9–B11):** they compile and the app accepts them, but the composer only + opens after sign-in. Signed in, check `SEND` with a `content://` image, `SENDTO mailto:` with + extras on a cold and a warm start, and `VIEW mailto:alice+news@partner.example`. +- **R8 (`5e3cbf2`):** the signed-out screens run clean under R8. Push registration (FCM and + UnifiedPush encryption), client certificates and the signed-in screens have not run under R8 + yet. Releases now carry the R8 mapping for decoding stack traces (`e5659ed`). +- **Push fallback (`fef23e4`):** tested with simulated FCM and UnifiedPush deliveries; confirm with + a real downgraded FCM message and a real distributor (e.g. ntfy). - **First build:** `063432b` adds `babel.config.js` and `metro.config.js`, so start Metro once with `npx expo start --clear`. The AsyncStorage limit from `24849ba` only applies after a native rebuild. @@ -172,7 +186,6 @@ the 14 stale parity entries are resolved; `dateLocale` is still missing. - Unified Inbox: it still has the inline `renderItem` pattern that `ebd8dac` removed from the folder list, shows no attachment chips, and its `patchRows` duplicates the keyword-patch helper. - Mail: the webmail's opt-in "All unread" and "All starred" views are missing. -- Composer: the undo-send bar only exists on the list screen, so a quick reply can't be undone. - Composer: drafts can't be saved offline (B16 now says so instead of dropping the text). - Composer: `findReceivingIdentity` scans identities in list order; no "remove text colour". - Startup: the date-fns main barrel still adds about 300 modules; the 4.3 MB of catalogs stay in @@ -189,14 +202,17 @@ the 14 stale parity entries are resolved; `dateLocale` is still missing. the forward limit (`maxNumberRedirects`) or the auto-reply length warning (webmail `f3aec163`); `fileinto` lingers in `require`. - Settings: the search doesn't index sidebar apps; theme names and descriptions aren't translated. -- i18n pass 2: hard-coded English (and, in the calendar, missing screen reader labels, U8) is left - in the viewer, calendar, email store, drawer, Unified Inbox and `App.tsx`; then top up the - translations (`node scripts/rn-missing-translations.mjs`). +- i18n: some `toLocaleDateString()` calls (settings panes, Files, contact detail) format in the + device language, not the app's; `formatDelta` keeps its "d/h/min" units, like the webmail. +- Push: React Native's own `HeadlessJsTaskService` can still start a task before the JS engine is + ready when several high-priority pushes arrive during startup; that task then only ends at its + 30 s timeout. The job fallback from `fef23e4` avoids this. +- Release: keep each release's `…-mapping.txt` (attached since `e5659ed`); decoding a user's + stack trace needs the matching one. - Release workflow: the `workflow_dispatch` hint "leave empty to skip upload" doesn't match what the workflow does (older than this pass). - Upstream: GitHub `main` has `c2584c2` and `5b8c435` (PR #53, links in event descriptions), which local `main` lacks. -- `src/lib/mdn.ts`: the top comment still names `sendMdn`. ## Bugs @@ -220,6 +236,8 @@ the 14 stale parity entries are resolved; `dateLocale` is still missing. (code -1)` at 18:42:55 and again (11663) at 18:45:42, both on composer close. - The app survives, but the cause is unknown. - **Verified** (log only). + - 2026-09-24: not reproduced; the composer is only reachable after sign-in and no test account + was available for the device run. ### Data correctness @@ -454,10 +472,10 @@ the 14 stale parity entries are resolved; `dateLocale` is still missing. - [x] **U7 · P3 · S: Back in Files selection mode switches to the Mail tab instead of clearing the selection.** Fixed in `8d7fbfc`, `4fdf39a`. - **Verified.** -- [ ] **U8 · P3 · M: icon buttons and switches have no accessibility label.** - Partly: the mail list, compose button, composer, Files, contacts and settings got labels in - `9c0c35c`, `771558d`, `aab29da`, `d59c571`, `cb5c152`, `c1e5cd6`; the calendar header buttons - and the task checkbox still have none. +- [x] **U8 · P3 · M: icon buttons and switches have no accessibility label.** + Fixed in `9c0c35c`, `771558d`, `aab29da`, `d59c571`, `cb5c152`, `c1e5cd6` (mail list, compose + button, composer, Files, contacts, settings) and `13cba64`, `b3a82f1`, `84fef14`, `b178ee8` + (viewer, calendar header, calendar sheets and task checkbox, tab bar, unified inbox, drawer). - Unlabeled controls: - mail list: hamburger, select-all, filter; - compose FAB; @@ -577,7 +595,10 @@ compare against each other, not as phone numbers. selection change; `src/screens/ComposeScreen.tsx:2276-2277`. - `htmlToPlainText` and a `JSON.stringify` snapshot also run on every render. - **Suspected.** -- [ ] **PF9 · P2 · M: the APK is 42.8 MB (arm64) with R8 off.** +- [x] **PF9 · P2 · M: the APK is 42.8 MB (arm64) with R8 off.** Fixed in + `5e3cbf2`: on the x86_64 build the APK went from 44.7 to 38.0 MB, dex from 30.4 MB in 4 files + to 11.3 MB in 2, and classes from 27,631 to 16,724. The rest is native libraries (ML Kit alone + 5.9 MB) and the JS bundle, which R8 doesn't touch. - Where: `android/app/build.gradle:72` and `:126-129`. - Contents: 25.85 MB of unminified dex, 24,621 classes; the ML Kit barcode scanner accounts for 5.83 MB. The UnifiedPush work in progress adds 3,009 classes (Tink, protobuf). @@ -723,7 +744,8 @@ wrongly). Items already listed under Bugs are only cross-referenced here. - [x] **P3 · S · diverges: quick replies carry no signature.** Fixed in `3faac98`. - Where: `src/components/email/QuickReplyBox.tsx:79-90`. - **Suspected.** -- [ ] **P3 · S · partial: the undo-send snackbar exists only on the list screen.** +- [x] **P3 · S · partial: the undo-send snackbar exists only on the list screen.** Fixed in + `e3501f9`: the bar is hosted once per stack screen, and quick replies record their hold. - A reply sent from the viewer can't be undone. - Where: `src/screens/EmailListScreen.tsx:1563`. - **Suspected.** diff --git a/docs/parity/08-settings-push-i18n-ui.md b/docs/parity/08-settings-push-i18n-ui.md index 964b924a..f3a62ea1 100644 --- a/docs/parity/08-settings-push-i18n-ui.md +++ b/docs/parity/08-settings-push-i18n-ui.md @@ -314,7 +314,7 @@ RN toggles that are stored but never read (fix: either wire them or remove the c - What RN does: `OfflineBanner.tsx:22-29` hard-codes "You are offline" with an English plural; network-store logic itself is sound (`network-store.ts:16-22` treats `isInternetReachable === null` as online) and App.tsx retries the session on reconnect (`:245-252`). - Fix hint: `t('common.offline', ...)` and reuse plural helper once interpolation exists. -- [ ] **Accessibility labels almost absent** — `P3` — `partial` — done in my files (RadioGroup/Select roles, Dialog header, Settings back button, ToastHost, UpdateBanner, AccountSettings, security key rows); the mail list, composer, Files, contacts, sign-in and settings switches followed in 9c0c35c, 771558d, aab29da, d59c571, 5801d6c, cb5c152 and c1e5cd6 (audit U8); the calendar screens are still unlabelled +- [x] **Accessibility labels almost absent** — `P3` — `partial` — done in my files (RadioGroup/Select roles, Dialog header, Settings back button, ToastHost, UpdateBanner, AccountSettings, security key rows); the mail list, composer, Files, contacts, sign-in and settings switches followed in 9c0c35c, 771558d, aab29da, d59c571, 5801d6c, cb5c152 and c1e5cd6, and the viewer, calendar, tab bar, unified inbox and drawer in 13cba64, b3a82f1, 84fef14 and b178ee8 (audit U8) - What WEB does: aria-labels on icon buttons, `role="checkbox"`, screen-reader improvements (changelog 1.8.0 Navigation). - What RN does: `accessibilityLabel`/`Role` appear in 8 of 94 `.tsx` files (FilesScreen 4, EmailListScreen 3, login 4, EmailThreadScreen 2, ToggleSwitch 1). Icon-only `Pressable`s in settings (`SettingsScreen.tsx:217-222` back button, `SidebarAppsSettings.tsx:91-96`, `SmimeSettings.tsx:91-106`, `UpdateBanner.tsx:40`), the tab bar badge and the `RadioGroup`/`Select` in `settings-section.tsx` have none. - Fix hint: give every icon-only Pressable an `accessibilityLabel` + `accessibilityRole="button"`, `ToggleSwitch` `accessibilityRole="switch"` + `accessibilityState`, `RadioGroup` options `radio`.