Drop the assistant-side "Try another response" control and its version
pager, leaving "Edit and re-send" on the user message as the single way
to fork a turn. Fork positions are now computed only for persisted user
messages, and ForkControls collapses to that one purpose.
The server's fork and branch APIs are unchanged, so a session that
already holds re-sampled replies keeps them; only the transcript's way
back to them is gone.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Retry re-samples a reply as a sibling of the one already there, and editing
a sent message re-asks it as a sibling prompt. A `‹ 2/3 ›` pager switches
between the forks of a turn.
Transcript messages become a tree: `chat_messages.parent_id` plus
`chat_sessions.active_leaf_id`, which picks the branch on screen. Harness CLIs
mint a new session id per turn, so each user message records the id its turn
started from (`base_native_session_id`) and each reply the id it ended at
(`result_native_session_id`) — re-sampling resumes from the recorded start and
branches the harness's own history instead of extending a sibling's.
A `user_version`-guarded backfill chains existing transcripts and hands each
session's newest message its live harness id, so a turn recorded before this
change keeps its conversation when forked.
Forks share the session's git worktree, so a re-sampled turn starts from
whatever files the previous one left behind.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>