24e4c6fbf6
A context-compaction handoff is persisted as an ordinary history message but is not a real turn. The ACP history replay streamed it as a bare user/agent message chunk, dropping the in-process _compressed_summary marker, so ACP frontends (editors, vscode-hermes) rendered the entire handoff as a regular message. Tag replayed summary chunks under _meta.hermes (ACP's extensibility channel), covering all three persistence shapes the compressor emits: - standalone role="user" handoff -> compactionSummary: true - standalone role="assistant" handoff (alternation-driven role pick) -> compactionSummary: true - merge-into-tail message (preserved tail content + appended summary) -> containsCompactionSummary: true, a distinct key so clients that collapse standalone summaries cannot hide the preserved real content Detection honors the in-process metadata flag and falls back to a new ContextCompressor.classify_summary_content() content classifier (standalone/merged/None), so it also works for a DB-reloaded session that lost the in-memory flag. _is_context_summary_content is now a thin wrapper over the classifier, keeping existing callers unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>