Skip to content

Commit 2076f49

Browse files
committed
docs: refresh cycle 16 research queue
1 parent caf6bea commit 2076f49

3 files changed

Lines changed: 193 additions & 3 deletions

File tree

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
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

Comments
 (0)