Triage
Confirmed on main @ 6c58362. Automatic Claude compaction still has no in-progress Compacting… state. This is the gap #7652 originally named; #9293 only covered the explicit /compact command.
What the code does today
- Claude's
SDKStatusMessagestatus:"compacting"is mapped to runtime"waiting"inClaudeAdapter.ts(session.state.changed). - Ingestion then collapses
"waiting"to orchestration"running"(orchestrationSessionStatusFromRuntimeState). By the time the session reaches the client, compacting and a normal turn are the same value. OrchestrationSessionhas nostatusDetail/compactingSince.RuntimeSessionStatehas no"compacting".- Web (
ChatView.tsx) and mobile (use-thread-composer-state.ts) setisCompactingonly when a user message is exactly/compactwith no attachments. Auto-compaction never produces that message, so the timeline stays onThinking/Working for N. compact_boundarystill becomes the completedcontext-compactiondivider after the fact. The silent interval while compaction runs is unmarked.
Codex contextCompaction item start events and OpenCode session.time.compacting are also unused for in-progress UI. Completion-only signals (thread.state.changed / session.compacted) already feed the divider.
Related
- #7652 — closed as fixed by #9293. The close covered the
/compactchrome and the result row, not auto-compaction while it is running. - #9293 — merged. Manual
/compact→Compacting…→ completed divider. - #7714 — closed unmerged as superseded by #9293. That supersession was incomplete for the automatic path.
- #7589 and #10724 are different bugs (stuck session after
/compact; queue rejected during/compact).
No open PR implements automatic compaction status.
Decision
Accept as a remaining gap left by #9293. Do not reopen #7714 as-is.
#7714 is an XL stacked PR (DB migrations, decider settle changes, per-adapter wiring, composition with still-open #7591). Current main already has the #9293 Compacting… UI and completion row. Reopening that branch would fight the tree we have now.
Reuse #7714's overlay idea in a new, smaller change:
- Optional
statusDetail: "compacting"(plus acompactingSinceclock) onOrchestrationSession. Keepstatusasrunningso lifecycle / settling stay unchanged and older clients keep decoding. - Stop flattening Claude
status:"compacting"; raise and clear the overlay from that signal. Later: CodexcontextCompactionstarted and OpenCodesession.time.compacting. - Web + mobile:
isCompacting= existing/compactheuristic orsession.statusDetail === "compacting".
Cursor and Grok have no ACP compaction start signal — treat as not supported, same as #7652.
Leaving this issue open as the home for that work. Not reopening #7652 or #7714.