Summary
Under two-thumb spacing (manual-spacing / combining grace), a tapped short word never auto-commits — it stays the open composing word — so the next swipe merges into it as multi-part composition, producing garbage. E.g. tap do, then swipe the next word → do's tap-points fuse with the swipe and recognize as long nonsense (disownment, disparagements, disestablishmentarian).
Repro
- Two-thumb spacing mode on (manual spacing or combining grace).
- Tap a short word, e.g.
do.
- Swipe the next word without an explicit space first.
- The swipe merges into
do → garbage instead of two separate words.
Root cause (traced from debug log)
In InputLogic.onStartBatchInput, a new gesture extends the open composing word whenever:
extendComposingWord = (mGestureManualSpacing || wasInCombiningMode) && cursorAtEndOfComposingWord
A tapped word like do is still the open composing word (it never auto-committed), so cursorAtEndOfComposingWord is true and the swipe extends it via the merged-trail (extend-base) path. Log shows composingBefore=do extendBase=true usedMergedTrail=true repeatedly across different garbage outputs.
This is multi-part composition working as designed (same mechanism as tap te + swipe chnology → technology) — there's just no notion of "this open word looks finished, commit it instead of merging."
Confirmed NOT the extend-base leak (PR AsafMah#61) and NOT the casing fix (#6): every merge in the log had a real composing word; no fresh word inherited a stale base.
Options
- A — commit-before-extend heuristic (scoped): before extending, if the open word is a complete dictionary word and the new input is a fresh swipe, commit it first instead of merging. Uses the
complete signal from the spacing-policy design.
- B — only extend fragments, not finished tap-words: don't merge a tap-built word into a following swipe unless explicitly joined (JOIN_NEXT).
- C — spacing policy (long-term home): ties into the B6a/B6b signal-driven commit work.
Starting with option A.
Summary
Under two-thumb spacing (manual-spacing / combining grace), a tapped short word never auto-commits — it stays the open composing word — so the next swipe merges into it as multi-part composition, producing garbage. E.g. tap
do, then swipe the next word →do's tap-points fuse with the swipe and recognize as long nonsense (disownment,disparagements,disestablishmentarian).Repro
do.do→ garbage instead of two separate words.Root cause (traced from debug log)
In
InputLogic.onStartBatchInput, a new gesture extends the open composing word whenever:A tapped word like
dois still the open composing word (it never auto-committed), socursorAtEndOfComposingWordis true and the swipe extends it via the merged-trail (extend-base) path. Log showscomposingBefore=do extendBase=true usedMergedTrail=truerepeatedly across different garbage outputs.This is multi-part composition working as designed (same mechanism as tap
te+ swipechnology→technology) — there's just no notion of "this open word looks finished, commit it instead of merging."Confirmed NOT the extend-base leak (PR AsafMah#61) and NOT the casing fix (#6): every merge in the log had a real composing word; no fresh word inherited a stale base.
Options
completesignal from the spacing-policy design.Starting with option A.