What "the composer" is, why an auto-rotated Claude session lands there and does nothing, and why it felt seamless when you were driving a few sessions by hand.
2026-08-28 · agent-ops / infra · confirmed from the live ccswitch source + its full git history, not a theory
Restart is not resume. When ccswitch rotates a capped session onto a healthy account, it kills the process and relaunches it with claude --resume. That reloads the whole conversation — and then stops at an empty composer. No prompt is submitted, so no work happens until someone (a human, or a script) presses Enter.
❯ line where a prompt gets typed. An empty composer means the agent is sitting there, alive, waiting for input.The two paths are identical except for the last step. Everything ccswitch already does is correct — it just stops one keystroke short.
Your memory is right: five sessions, auto-rotate, you kept working and never noticed. That is exactly what you'd expect — because you were the missing keystroke.
With a handful of sessions that you were actively driving, a restart-to-empty-composer was invisible friction. You were mid-conversation anyway, so you just typed your next message — and that message was the Enter that started the next turn. The rotation swapped the account underneath you and you resumed by typing, so it looked automatic. It never was.
This is read straight out of the installed ccswitch, not inferred. The restart is one line, and there is deliberately no keystroke after it:
The function's own docstring says it on purpose: "respawn-pane (not send-keys)." And the whole git history confirms it has never injected an Enter — a search for the tmux Enter keystroke (C-m) across every commit returns nothing. So "it worked before" was never the old code auto-continuing. It was a person.
claude — so moving a capped session to a healthy account requires a kill + relaunch. There is no in-place path.auto_restart: "idle" and never force-kills a busy pane — so a session that caps while working is deferred, not restarted, until its next stop.Killing a session quickly at a threshold is fine — it's already half-built (auto_switch: true, session_threshold: 90). The only missing piece is the auto-continue.