Everything except the validation lives in the shared useEditCommit — the same instance the formula input uses — so the two fields cannot drift. What differs is only what a "value" is (text, validated by UseInputFieldOptions.onValidate, instead of a parsed formula) and what a "session" is (focus, instead of engagement on the reference-mode bus). There is no external producer writing into this field, so ending a session never moves focus — the caret stays where the user left it.
The headless text field — a plain value-controlled
<input>with the SAME edit contract as the formula field: live vs commit channels (changeOn), a two-level Escape, commit-then-tab, an invalid state that blocks every accept, and imperativecommit/cancel/revertfor host-driven commit points a blur can't see.