|
| 1 | +# Cycle 16 Findings - 2026-06-04 |
| 2 | + |
| 3 | +## Scope |
| 4 | + |
| 5 | +- Repository: `SwiftFloris` |
| 6 | +- Baseline: clean worktree at pushed `master` `caf6bea` |
| 7 | + (`docs: refresh cycle 15 research queue`), described as |
| 8 | + `v1.8.246-4-gcaf6bea`. |
| 9 | +- Sync: `git pull --rebase` fast-forwarded the local checkout to the pushed |
| 10 | + Cycle 15 docs state before this cycle. |
| 11 | +- Constraint: research/docs only. No feature source, tests, build files, |
| 12 | + manifests, assets, or generated outputs were edited. |
| 13 | + |
| 14 | +## Anti-Duplicate Checks |
| 15 | + |
| 16 | +- Did not duplicate R12-1, R13-1, or R14-1. Those rows already cover personal |
| 17 | + n-gram durability, stats/reset serialization, and TSV token safety. |
| 18 | +- Did not duplicate R15-1. The Honeycomb parser diagnostic row remains the |
| 19 | + focused parser/degradation handoff. |
| 20 | +- Did not reopen `switchToNextSubtype` / `switchToPrevSubtype`. The 2026-06-02 |
| 21 | + audit records those fallback paths as fixed; this cycle isolates the still-open |
| 22 | + `switchToSubtypeById` double-read path. |
| 23 | +- Did not add new platform/API rows for Android 17 subtype limits, Play target |
| 24 | + SDK policy, or 16 KB page-size enforcement. Existing roadmap/dependency rows |
| 25 | + already track API 37, native dependency, release, and device-gated work. |
| 26 | +- Did not propose networked, closed-source, or incompatible-licensed keyboard |
| 27 | + features. Those remain outside `:app` invariants or existing addon/sibling-repo |
| 28 | + decision rows. |
| 29 | + |
| 30 | +## Local Evidence |
| 31 | + |
| 32 | +- `SubtypeManager.kt:276-278` snapshots `subtypes` inside `getSubtypeById(id)`. |
| 33 | +- `SubtypeManager.kt:402-404` first checks `subtypes.any { it.id == id }`, then |
| 34 | + calls `getSubtypeById(id)!!`, which reads the subtype list again and asserts |
| 35 | + non-null. |
| 36 | +- `SelectSubtypePanel.kt:83` calls `subtypeManager.switchToSubtypeById(it.id)` |
| 37 | + from the subtype chooser UI. |
| 38 | +- `docs/AUDIT_2026-05-28.md:61-63` records the deferred TOCTOU/NPE finding and |
| 39 | + recommends reading the subtype once. |
| 40 | +- `docs/AUDIT_2026-06-02.md:37` records the closed next/previous subtype fallback |
| 41 | + fix, not a closure for `switchToSubtypeById`. |
| 42 | +- `app/src/test/.../ime/core` has focused subtype preset/classifier/per-app |
| 43 | + memory tests, but no visible switch-by-id regression test. |
| 44 | + |
| 45 | +## External Landscape Sources Reviewed |
| 46 | + |
| 47 | +1. Android `InputMethodSubtype` API: https://developer.android.com/reference/android/view/inputmethod/InputMethodSubtype |
| 48 | +2. Android `InputMethodManager` API: https://developer.android.com/reference/android/view/inputmethod/InputMethodManager |
| 49 | +3. Android `InputMethod` API: https://developer.android.com/reference/android/view/inputmethod/InputMethod |
| 50 | +4. Android `InputConnection` API: https://developer.android.com/reference/android/view/inputmethod/InputConnection |
| 51 | +5. Android `EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING`: https://developer.android.com/reference/android/view/inputmethod/EditorInfo#IME_FLAG_NO_PERSONALIZED_LEARNING |
| 52 | +6. Android 17 behavior changes for all apps: https://developer.android.com/about/versions/17/behavior-changes-all |
| 53 | +7. Google Play target API policy: https://developer.android.com/google/play/requirements/target-sdk |
| 54 | +8. Android 16 KB page-size support: https://developer.android.com/guide/practices/page-sizes |
| 55 | +9. Android security bulletin overview: https://source.android.com/docs/security/bulletin/asb-overview |
| 56 | +10. Kotlin null safety and `!!`: https://kotlinlang.org/docs/null-safety.html |
| 57 | +11. Kotlin `StateFlow`: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-state-flow/ |
| 58 | +12. Kotlin `MutableStateFlow`: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-mutable-state-flow/ |
| 59 | +13. Android Compose accessibility semantics: https://developer.android.com/develop/ui/compose/accessibility/semantics |
| 60 | +14. Android package visibility: https://developer.android.com/training/package-visibility |
| 61 | +15. Android custom permission element: https://developer.android.com/guide/topics/manifest/permission-element |
| 62 | +16. Android `SigningInfo`: https://developer.android.com/reference/android/content/pm/SigningInfo |
| 63 | +17. Android `Locale`: https://developer.android.com/reference/java/util/Locale |
| 64 | +18. IANA Language Subtag Registry: https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry |
| 65 | +19. Unicode Emoji technical report: https://unicode.org/reports/tr51/ |
| 66 | +20. Unicode latest version page: https://www.unicode.org/versions/latest/ |
| 67 | +21. CLDR downloads: https://cldr.unicode.org/index/downloads |
| 68 | +22. Unicode LDML keyboards: https://www.unicode.org/reports/tr35/tr35-keyboards.html |
| 69 | +23. Keyman Android engine: https://help.keyman.com/developer/engine/android/ |
| 70 | +24. Keyman source repository: https://github.com/keymanapp/keyman |
| 71 | +25. FlorisBoard v0.6.0-alpha02 release: https://github.com/florisboard/florisboard/releases/tag/v0.6.0-alpha02 |
| 72 | +26. HeliBoard releases: https://github.com/HeliBorg/HeliBoard/releases |
| 73 | +27. AnySoftKeyboard releases: https://github.com/AnySoftKeyboard/AnySoftKeyboard/releases |
| 74 | +28. FUTO Keyboard v0.1.29 release: https://github.com/futo-org/android-keyboard/releases/tag/0.1.29 |
| 75 | +29. FUTO Swipe dataset: https://huggingface.co/datasets/futo-org/swipe.futo.org |
| 76 | +30. OpenBoard repository: https://github.com/openboard-team/openboard |
| 77 | +31. AOSP LatinIME source: https://android.googlesource.com/platform/packages/inputmethods/LatinIME/ |
| 78 | +32. Rime input method engine: https://github.com/rime/librime |
| 79 | +33. Mozc source repository: https://github.com/google/mozc |
| 80 | +34. Mozc for Android F-Droid package: https://f-droid.org/en/packages/org.mozc.android.inputmethod.japanese/ |
| 81 | +35. F-Droid reproducible builds: https://f-droid.org/docs/Reproducible_Builds/ |
| 82 | +36. SQLCipher 4.16.0 release: https://www.zetetic.net/blog/2026/05/12/sqlcipher-4.16.0-release/ |
| 83 | +37. SQLCipher Android repository: https://github.com/sqlcipher/sqlcipher-android |
| 84 | +38. AndroidX `MimeTypeFilter`: https://developer.android.com/reference/androidx/core/content/MimeTypeFilter |
| 85 | + |
| 86 | +## Roadmap Changes Fed |
| 87 | + |
| 88 | +- R16-1: Collapse subtype switch-by-id to a single nullable lookup. The |
| 89 | + implementation should avoid proving existence against one subtype-list |
| 90 | + snapshot and then force-unwrapping a second lookup from a later snapshot. |
| 91 | + Missing or concurrently removed subtype ids should no-op, while valid ids keep |
| 92 | + the current manual activation path. |
| 93 | + |
| 94 | +## Rejected / Deferred Ideas |
| 95 | + |
| 96 | +- Android 17 subtype-count validation: relevant, but no current live code path |
| 97 | + showed SwiftFloris approaching the 1500-subtype platform cap. Keep this under |
| 98 | + the existing API 37/Android 17 compatibility follow-up instead of adding a |
| 99 | + duplicate. |
| 100 | +- HeliBoard/FUTO glide and gesture ideas: already represented by F9/F21 and |
| 101 | + device/ML-gated rows; no new in-tree feature should bypass the Apache-2.0, |
| 102 | + no-network, and no-closed-blob constraints. |
| 103 | +- Keyman/Rime/Mozc engine integration: useful landscape context, but adding |
| 104 | + engines would introduce native/runtime scope or license/product decisions |
| 105 | + larger than a focused SwiftFloris build-machine item. Keep such work in |
| 106 | + external addon/sibling-repo decision lanes if it ever becomes active. |
| 107 | + |
| 108 | +## Non-Adds |
| 109 | + |
| 110 | +- No source fix was made in this cycle. |
| 111 | +- No new permission, network, telemetry, export/import, or storage behavior was |
| 112 | + proposed. |
| 113 | +- No product decision is required for R16-1; it is a local crash-hardening and |
| 114 | + test-coverage item. |
0 commit comments