docs: record the device run, the r8 and label fixes and the push crash it found

This commit is contained in:
Linus Rath
2026-09-24 22:16:46 +02:00
parent e5659ed5e8
commit 949bb10ac5
3 changed files with 49 additions and 27 deletions
+4 -4
View File
@@ -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
+44 -22
View File
@@ -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] <a id="u7"></a>**U7 · P3 · S: Back in Files selection mode switches to the Mail tab instead of
clearing the selection.** Fixed in `8d7fbfc`, `4fdf39a`.
- **Verified.**
- [ ] <a id="u8"></a>**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] <a id="u8"></a>**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.**
- [ ] <a id="pf9"></a>**PF9 · P2 · M: the APK is 42.8 MB (arm64) with R8 off.**
- [x] <a id="pf9"></a>**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.**
+1 -1
View File
@@ -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`.