…ion rotation
Codex-native /new and antigravity-native /clear rotate the Omnigent session
binding onto a fresh conversation but never told the abandoned one, stranding
its web view: the Working... spinner never cleared, no message linked to the
new chat, and an open client never redirected. Claude-native already posted
the three supersession events from its rotation path.
Extract claude-native's supersession notice into a shared helper
(omnigent/native/_native_supersession.py) and call it from the codex
_maybe_rotate_session_on_thread_started and antigravity
_rotate_session_for_cascade rotation paths after the terminal transfer:
idle status, a persisted notice message linking to the new conversation,
and the external_session_superseded redirect event, all best-effort.
Summary
Extracted claude-native's supersession notice into a shared helper, omnigent/native/_native_supersession.py::post_supersession_notice, and call it from the codex-native rotation path (after /new, command='/new') and the antigravity-native cascade rotation path (after /clear, command='/clear'); claude-native's _post_clear_supersession is now a thin wrapper over the same helper. The notice posts idle status, a persisted assistant message linking to /c/, and the external_session_superseded redirect event to the OLD conversation, all best-effort. Committed as 756c648 on branch fix/34731964201 for the workflow-owned publisher.
Root Cause
codex-native _maybe_rotate_session_on_thread_started and antigravity-native _rotate_session_for_cascade complete the session rotation (create the new conversation, transfer the terminal, release the old runner binding) but never post the three supersession events that claude-native's _post_clear_supersession posts, so the superseded conversation's web view is stranded: its Working… spinner never clears, no message links to the new chat, and an open client never redirects.
Validation
Demo
Recordings: none — Before: no clip from the repro run — the failure is a no-motion absence (the old view just stays on /c/ with a stuck spinner), described textually per dev/recording-lanes.md. After: the corrected outcome's driver, tests/e2e_ui/chat/test_codex_rotation_supersession_redirect.py, uses the sync Playwright
pagefixture, which the suite's OMNIGENT_E2E_RECORD_DIR video hook does not instrument (conftest._record_video patches only playwright.async_api.Browser), so the recorder cannot emit a webm for this journey. Textual before/after for the PR Demo section: BEFORE — after /new the open browser stayed on /c/?view=chat for the full 30s window (63 polls), the Working… spinner never cleared, and no notice appeared; AFTER — the browser auto-redirects to the new conversation and the old conversation carries an assistant notice 'This conversation was ended by/new' linking to /c/ (e2e_ui journey passes in ~31s including the redirect).Issues
Closes #7290
Resolves OMNI-7410