You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: RESEARCH_REPORT.md
+22-4Lines changed: 22 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# SwiftFloris Research Report
2
2
3
-
This report summarizes current research conclusions. The full 2026-05-25 research plan is archived at `docs/archive/research/RESEARCH_FEATURE_PLAN_2026-05-25.md`. Deep-research pass refreshed **2026-06-03** (post-v1.8.204), with 2026-06-04 freshness notes through Cycle 12 and v1.8.246 implementation notes.
3
+
This report summarizes current research conclusions. The full 2026-05-25 research plan is archived at `docs/archive/research/RESEARCH_FEATURE_PLAN_2026-05-25.md`. Deep-research pass refreshed **2026-06-03** (post-v1.8.204), with 2026-06-04 freshness notes through Cycle 13 and v1.8.246 implementation notes.
constructor stdout logging is removed, aggregate helper semantics are documented
@@ -38,6 +38,13 @@ must remain local generated output rather than review evidence.
38
38
AndroidX Core `1.19.0` remains blocked on the API 37 behavior-gate because the
39
39
published `core-1.19.0.aar` metadata declares `minCompileSdk=37`.
40
40
41
+
2026-06-04 Cycle 13 note: after the Cycle 12 docs push, `master` is clean at
42
+
`3df1e5b` (`v1.8.246-1-g3df1e5b`). Cycle 13 rechecked the deferred
43
+
`totalEntryCount()` / `resetAndAwait()` audit against live personal bigram and
44
+
trigram stores plus the typing-stats UI. This cycle adds R13-1: serialize
45
+
personal n-gram stats counting with reset cleanup so a stats refresh cannot
46
+
reload or report stale locales around a reset.
47
+
41
48
2026-06-04 Cycle 12 note: after the Cycle 11 docs push, `master` is clean at
42
49
`8b68d3e` (`v1.8.238-1-g8b68d3e`). Cycle 12 rechecked the personal n-gram
43
50
persistence data-loss audit against live `PersonalBigramStore`,
@@ -196,6 +203,7 @@ Top opportunities (one line each):
196
203
24.**Editor content-generation lifecycle** — delayed start/selection content jobs are cancelled or superseded across reset/finishInput and input-connection switches before they can publish state or touch a captured `InputConnection` (R10-1). [Closed]
197
204
25.**Preference-store init splash recovery** — async `initAndroid` failures now stage a crash report, unblock the splash wait, and redirect to crash recovery before normal Settings content renders (R11-1). [Closed]
198
205
26.**Personal n-gram file replacement** — bigram/trigram flush fallback deletes the live file before a successful replacement exists (R12-1, P2). [Verified]
206
+
27.**Personal n-gram stats/reset serialization** — `totalEntryCount()` can enumerate/load persisted bigram/trigram locales outside the reset lock while `resetAndAwait()` clears and deletes those files (R13-1, P2). [Verified]
199
207
200
208
No Critical or Major reliability/security defects were found that are not already on the roadmap or in the deferred audit lists. The remaining heavy work (glide model training, Vosk addon, F-Droid submission, device-only visual verification) stays maintainer-gated as the existing roadmap records.
201
209
@@ -277,7 +285,9 @@ Privacy-first multilingual IME. `:app` is Apache-2.0-ceiling, no network permiss
277
285
-**Personal n-gram persistence (partial):** locale-scoped flushes and
278
286
concurrency guards are in place, but bigram/trigram file replacement still
279
287
deletes the destination before a second rename attempt. R12-1 keeps the
280
-
last-known-good n-gram file until replacement succeeds. [Verified]
288
+
last-known-good n-gram file until replacement succeeds. R13-1 adds the
289
+
adjacent stats/reset consistency gap: `totalEntryCount()` should not reload or
290
+
report stale locales around `resetAndAwait()` cleanup. [Verified]
281
291
- Established surfaces (autocorrect/SymSpell, glide classifier, clipboard, addons, voice handoff, sync, MCP, hardware-keyboard import) are covered by `COMPLETED.md` and the audits; no net-new gap surfaced beyond what the roadmap already tracks.
282
292
283
293
## Competitive Landscape
@@ -316,6 +326,10 @@ Privacy-first multilingual IME. `:app` is Apache-2.0-ceiling, no network permiss
316
326
-**[Medium] Personal n-gram atomic replacement** → R12-1. Replace bigram and
317
327
trigram TSV files without deleting the live destination before a successful
318
328
replacement exists.
329
+
-**[Medium] Personal n-gram stats/reset serialization** → R13-1. Move
330
+
bigram/trigram `totalEntryCount()` file enumeration and `ensureLoaded()` under
331
+
the reset-safe boundary, or compute counts from a reset-safe snapshot, so
332
+
Settings stats cannot resurrect or display stale learning counts after reset.
319
333
-**[Closed v1.8.219] Remaining diagnostic `printStackTrace()` paths** → R2-2. `RestoreScreen` failure diagnostics now use `flogError`, restore UI copy falls back to the existing "Unknown error" string for null/blank throwable messages, and `CrashUtility.writeToFile` logs through `LogTopic.CRASH_UTILITY`.
320
334
-**[High] Local release ledger drift** → R3-1. Three code-fix commits after
321
335
the v1.8.225 docs marker are untagged and absent from the release ledger.
@@ -407,7 +421,9 @@ Privacy-first multilingual IME. `:app` is Apache-2.0-ceiling, no network permiss
centralizes leave/mutation/transfer gates. v1.8.232 keeps that policy and
413
429
adds a visible response when Compose back handling blocks the gesture during
@@ -420,7 +436,7 @@ Privacy-first multilingual IME. `:app` is Apache-2.0-ceiling, no network permiss
420
436
421
437
## Security / Privacy / Data Safety
422
438
423
-
No net-new permission or data-egress finding. The settings-search additions are display/navigation only; the no-results Browse all settings action (RA-2), synonym keyword coverage (RA-3), and query-change scroll reset (RA-10) do not weaken the no-network posture. R2-1 and R2-2 closed as local diagnostic-safety work without adding network, telemetry, or broad file export. R11-1 closes the async side of startup diagnostics by surfacing preference-store init failures through the existing local crash recovery path without adding storage, permissions, or outbound data. R12-1 is local personal-prediction durability hardening and does not change dictionary retention, export, permissions, or outbound data. R3-2 is also local-only clipboard filtering. R3-3 closed as sync-crypto contract hardening before transport activation, with no new permission or native dependency. R4-1/R4-2/R4-3/R4-4 are closed local correctness/a11y/API-contract work. WS12 and WS10/WS15 are docs/resource-only and do not change permissions, retention, or storage behavior. R5-1 closed as trust-boundary hardening for optional addon APKs: it keeps the no-network addon screen but requires explicit trust before non-co-signed packages become active. R6-1 is local editor critical-section hardening and does not change storage, permissions, or outbound data. R7-1 closed as privacy posture hardening for the existing incognito mode and `FLAG_SECURE` contract, not a permission change. R9-1 is privacy-state hardening for existing local suggestion and smart-compose paths: it keeps the no-network posture and ensures `IME_FLAG_NO_PERSONALIZED_LEARNING` / incognito decisions are request-scoped across async work. R10-1 is local editor-session lifecycle hardening and does not change storage, permissions, or outbound data. R8-1 is UI feedback for an already-blocked dictionary operation path and does not change data retention, dictionary mutation, or export/import permissions. WS13 now explicitly includes the deferred `StickerMediaProvider.openFile` SAF allow-list validation so forged encoded sticker URIs are rejected without broadening file access. The deferred audit lists (`docs/AUDIT_2026-06-02.md`) remain the authority for crypto/parsing/lifecycle hardening; this pass does not duplicate them.
439
+
No net-new permission or data-egress finding. The settings-search additions are display/navigation only; the no-results Browse all settings action (RA-2), synonym keyword coverage (RA-3), and query-change scroll reset (RA-10) do not weaken the no-network posture. R2-1 and R2-2 closed as local diagnostic-safety work without adding network, telemetry, or broad file export. R11-1 closes the async side of startup diagnostics by surfacing preference-store init failures through the existing local crash recovery path without adding storage, permissions, or outbound data. R12-1 is local personal-prediction durability hardening and does not change dictionary retention, export, permissions, or outbound data. R13-1 is local stats/reset consistency hardening for the same personal n-gram files and likewise does not change retention, export, permissions, or outbound data. R3-2 is also local-only clipboard filtering. R3-3 closed as sync-crypto contract hardening before transport activation, with no new permission or native dependency. R4-1/R4-2/R4-3/R4-4 are closed local correctness/a11y/API-contract work. WS12 and WS10/WS15 are docs/resource-only and do not change permissions, retention, or storage behavior. R5-1 closed as trust-boundary hardening for optional addon APKs: it keeps the no-network addon screen but requires explicit trust before non-co-signed packages become active. R6-1 is local editor critical-section hardening and does not change storage, permissions, or outbound data. R7-1 closed as privacy posture hardening for the existing incognito mode and `FLAG_SECURE` contract, not a permission change. R9-1 is privacy-state hardening for existing local suggestion and smart-compose paths: it keeps the no-network posture and ensures `IME_FLAG_NO_PERSONALIZED_LEARNING` / incognito decisions are request-scoped across async work. R10-1 is local editor-session lifecycle hardening and does not change storage, permissions, or outbound data. R8-1 is UI feedback for an already-blocked dictionary operation path and does not change data retention, dictionary mutation, or export/import permissions. WS13 now explicitly includes the deferred `StickerMediaProvider.openFile` SAF allow-list validation so forged encoded sticker URIs are rejected without broadening file access. The deferred audit lists (`docs/AUDIT_2026-06-02.md`) remain the authority for crypto/parsing/lifecycle hardening; this pass does not duplicate them.
424
440
425
441
## UX & Accessibility
426
442
@@ -448,6 +464,8 @@ The keyboard surface already has a strong a11y baseline (`ACCESSIBILITY.md`, `To
448
464
the async failure contract is covered by focused JVM/Robolectric tests.
449
465
7. R12-1 needs a focused file-replacement/flush test; no maintainer product
450
466
decision is required.
467
+
8. R13-1 needs a focused personal n-gram stats/reset test; no maintainer
0 commit comments