Tracking epic for the multi-phase refactor of two-thumb / multi-part composition. Design: docs/COMPOSING_WORD_SOURCE_OF_TRUTH.md.
Goal: make the editor text + composing region the single source of truth for the current word, and derive stroke geometry from text on demand — removing the parallel, drift-prone state (mLiveStroke, the mInputPointers-survives-reset contract, mGestureFragmentBoundaries) that causes the recurring stale-stroke / desync bugs. Unlocks mid-word cursor editing and partial deletes.
Phases (each independently shippable + on-device validated):
Related: builds on #7/#9 (fresh-word stroke reset). Primary risk: synthesized key-center strokes vs real captured strokes — validate recognition on-device at each phase.
Tracking epic for the multi-phase refactor of two-thumb / multi-part composition. Design:
docs/COMPOSING_WORD_SOURCE_OF_TRUTH.md.Goal: make the editor text + composing region the single source of truth for the current word, and derive stroke geometry from text on demand — removing the parallel, drift-prone state (
mLiveStroke, themInputPointers-survives-reset contract,mGestureFragmentBoundaries) that causes the recurring stale-stroke / desync bugs. Unlocks mid-word cursor editing and partial deletes.Phases (each independently shippable + on-device validated):
mInputPointersto the truncated word so a following swipe-extend doesn't merge with the pre-pop stroke. (Closes the fragment case the fresh-word reset in Two-thumb: gesture stroke isn't cleared on backspace — re-typing a mis-recognized word accumulates geometry (words grow each retry) #7/fix(two-thumb): clear stale stroke buffer so re-typed words don't accumulate geometry (#7) #9 doesn't cover.)getCoordinatesForCurrentKeyboard) instead ofmLiveStroke; validate re-recognition on-device; retiremLiveStroke.mGestureFragmentBoundaries.Related: builds on #7/#9 (fresh-word stroke reset). Primary risk: synthesized key-center strokes vs real captured strokes — validate recognition on-device at each phase.