Part of #16. Depends on the A3 harness (most bug-prone area).
Today two backspace-pop mechanisms coexist: tryFragmentBackspace (manual spacing) and the combining whole-word delete. Model each input (tap/fragment/gesture-word) as a pushed input-unit with revert metadata; backspace pops one unit and restores composing/committed state. Migrate both onto the stack and delete the parallel paths (the area that produced the corruption PR #11 hand-fixed).
Acceptance: backspace predictable across manual/combining/default; corpus + unit tests green.
Part of #16. Depends on the A3 harness (most bug-prone area).
Today two backspace-pop mechanisms coexist: tryFragmentBackspace (manual spacing) and the combining whole-word delete. Model each input (tap/fragment/gesture-word) as a pushed input-unit with revert metadata; backspace pops one unit and restores composing/committed state. Migrate both onto the stack and delete the parallel paths (the area that produced the corruption PR #11 hand-fixed).
Acceptance: backspace predictable across manual/combining/default; corpus + unit tests green.