f86693c2f9
Desktop edit / regenerate / restore-checkpoint send truncate_before_user_ordinal on prompt.submit. The handler rewrote session['history'] first, then called replace_messages, and on failure only printed to stderr and still started the turn. When the durable write fails, in-memory history is already truncated and history_version is bumped while state.db still holds the pre-edit tail. The agent flush is append-only for history-dict identities, so the new exchange is appended on top of the 'undone' turns — durable zombie history. Fix: persist first; only then mutate memory. On failure return 5008 and leave memory/DB unchanged. Based on #72876 by @necoweb3. Adapted: the handler moved from tui_gateway/server.py to tui_gateway/methods_prompt.py since the PR's base.