From ce6b5d33bb83051df2686b8715d5d583a7e2ca57 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 29 Mar 2026 01:05:56 +0800 Subject: [PATCH 1/3] Add post-compaction UI behavior analysis: clear vs retain (+67 lines) context-compression-deep-dive.md (+64 lines): - Claude Code: binary analysis v2.1.86 confirms clear-screen behavior (pendingPostCompaction flag, isCompactSummary + isVisibleInTranscriptOnly) - 6-agent comparison table: Claude Code + Kimi CLI clear; others retain - Design tradeoff: state accuracy vs visual continuity - Code evidence from binary decompilation claude-code/07-session.md (+3 lines): - Add post-compact UI behavior description to session management docs Sources: Claude Code v2.1.86 binary strings analysis, Gemini CLI compressCommand.ts, Qwen Code (fork), Aider base_coder.py, Codex CLI compact.rs, Kimi CLI useSessionStream.ts Co-Authored-By: Claude Opus 4.6 (1M context) --- .../context-compression-deep-dive.md | 64 +++++++++++++++++++ docs/tools/claude-code/07-session.md | 4 +- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/docs/comparison/context-compression-deep-dive.md b/docs/comparison/context-compression-deep-dive.md index 4c694946..412feb41 100644 --- a/docs/comparison/context-compression-deep-dive.md +++ b/docs/comparison/context-compression-deep-dive.md @@ -257,6 +257,70 @@ Anthropic 工程团队在长任务 harness 开发中发现:**模型在上下 --- +## 压缩后的 UI 行为:清屏 vs 保留 + +压缩不仅是后端操作——**用户看到什么**直接影响对 Agent 状态的认知。各 Agent 在压缩后的 UI 处理策略差异显著。 + +### Claude Code:压缩后清屏 + 显示摘要标记 + +从 v2.1.86 二进制分析,Claude Code 压缩后的 UI 流程: + +``` +compact_start → 显示 "Compacting conversation" 旋转器 + → 压缩完成 + → us() 设置 pendingPostCompaction = true + → LU$() 重新追加会话元数据 + → 旧消息替换为 isCompactSummary + isVisibleInTranscriptOnly 标记的摘要消息 + → 屏幕清空旧对话,仅显示 "Summarized conversation" 标记 + → compact_end → 清除旋转器 +``` + +**关键代码(反编译提取)**: + +```javascript +// 压缩后的消息标记 +F$({ + content: summary, + isCompactSummary: true, // ← 标记为压缩摘要 + isVisibleInTranscriptOnly: true, // ← 仅在 transcript 视图中可见 + summarizeMetadata: { + messagesSummarized: originalCount + } +}) + +// UI 渲染:检测到 summarizeMetadata 时显示特殊组件 +if (message.summarizeMetadata) { + // 渲染 "Summarized conversation" 标记(非完整对话历史) +} +``` + +**设计原因**: +1. **状态一致性**——屏幕显示的内容与模型上下文保持同步,避免用户引用"模型已忘记"的消息 +2. **心理重置**——视觉清空给用户一个"干净起点"信号,与 Anthropic 描述的 Context Reset 理念一致 +3. **减少误导**——如果保留旧消息,用户会以为模型"记得"全部细节,但实际上只有压缩摘要 + +### 各 Agent 压缩后 UI 行为对比 + +| Agent | 压缩后清屏? | 用户看到什么 | 来源 | +|------|------------|------------|------| +| **Claude Code** | **是** | "Summarized conversation" 标记 + 新的空白对话区域 | 二进制分析 v2.1.86 | +| **Kimi CLI**(Web UI) | **是** | 仅保留最后一轮用户消息起的内容 | 源码:`useSessionStream.ts` L1891-1907 | +| **Gemini CLI** | 否 | 内联显示 "Chat history compressed from X to Y tokens" | 源码:`compressCommand.ts` → `ui.addItem()` | +| **Qwen Code** | 否 | 继承 Gemini(内联压缩状态消息) | 源码:`compressCommand.ts`(分叉) | +| **Aider** | 否 | 后台静默替换消息列表,无可见变化(verbose 模式下显示一行日志) | 源码:`base_coder.py` L1002-1034 | +| **Codex CLI** | 否 | 显示警告:"Long threads and multiple compactions can cause the model to be less accurate" | 源码:`compact.rs` → `WarningEvent` | + +### 设计权衡分析 + +| 策略 | 优势 | 劣势 | +|------|------|------| +| **清屏**(Claude Code、Kimi) | 状态一致、心理重置、防误导 | 用户失去视觉上下文回溯、可能中断思路 | +| **保留**(Gemini、Qwen、Aider、Codex) | 视觉连续性、可回溯历史、不中断流程 | 用户可能误以为模型"记得"全部内容 | + +> **核心洞察**:清屏与否反映了两种不同的设计哲学——**状态准确性**(显示的 = 模型知道的)vs **视觉连续性**(保留用户的阅读上下文)。Claude Code 和 Kimi CLI 选择了前者,其他 Agent 选择了后者。没有绝对的对错——这取决于用户对 Agent 状态感知的期望。 + +--- + ## 工具定义膨胀:134K tokens 的教训(来源:[Anthropic Engineering Blog](https://www.anthropic.com/engineering/advanced-tool-use),2025-11-24) 上下文压缩不仅要处理对话历史——**工具定义本身就是上下文膨胀的主要来源**: diff --git a/docs/tools/claude-code/07-session.md b/docs/tools/claude-code/07-session.md index e1bed2e6..d32eeb5a 100644 --- a/docs/tools/claude-code/07-session.md +++ b/docs/tools/claude-code/07-session.md @@ -4,10 +4,12 @@ ### 上下文压缩 当对话历史接近上下文窗口限制时,Claude Code 自动压缩早期对话内容,保留关键信息: -- 自动触发:接近 token 上限时 +- 自动触发:接近 ~95% token 上限时 - 手动触发:`/compact` 命令 - Hook 支持:PreCompact/PostCompact 事件允许自定义压缩前后行为 +**压缩后 UI 行为**(二进制分析 v2.1.86):压缩完成后,Claude Code **清空屏幕上的旧对话**,仅显示 "Summarized conversation" 标记。旧消息被标记为 `isCompactSummary: true` + `isVisibleInTranscriptOnly: true`——屏幕内容与模型上下文保持同步,防止用户引用"模型已忘记"的消息。这是与 Gemini CLI / Qwen Code(保留旧消息不清屏)的关键行为差异。 + ### 会话恢复 ```bash # 恢复最近会话 From 0ade4190c6137d7426846593a3a2846fcc01609b Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 29 Mar 2026 01:33:53 +0800 Subject: [PATCH 2/3] Add Goose + Copilot CLI to post-compact UI table (marked as unknown) Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/comparison/context-compression-deep-dive.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/comparison/context-compression-deep-dive.md b/docs/comparison/context-compression-deep-dive.md index 412feb41..4b547027 100644 --- a/docs/comparison/context-compression-deep-dive.md +++ b/docs/comparison/context-compression-deep-dive.md @@ -309,6 +309,8 @@ if (message.summarizeMetadata) { | **Qwen Code** | 否 | 继承 Gemini(内联压缩状态消息) | 源码:`compressCommand.ts`(分叉) | | **Aider** | 否 | 后台静默替换消息列表,无可见变化(verbose 模式下显示一行日志) | 源码:`base_coder.py` L1002-1034 | | **Codex CLI** | 否 | 显示警告:"Long threads and multiple compactions can cause the model to be less accurate" | 源码:`compact.rs` → `WarningEvent` | +| **Goose** | 未知 | 未找到压缩后 UI 行为的源码证据 | — | +| **Copilot CLI** | 未知 | 未找到压缩后 UI 行为的源码证据 | — | ### 设计权衡分析 From 5dc822edceb01325fb6f39762e16ef60ee22dec7 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 29 Mar 2026 06:30:59 +0800 Subject: [PATCH 3/3] Fix 5 issues from Qwen-Code + GLM-5.1 R2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add section numbers: 八 (UI behavior) + 九 (tool bloat) 2. Add decompilation confidence note: minified names vs strings-extracted names 3. Kimi CLI: replace line numbers with handler name (less fragile) 4. Codex CLI: "源码:" → "二进制分析:" (consistent with Claude Code) 5. 07-session.md: condense to one-liner + cross-reference (remove duplication) Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/comparison/context-compression-deep-dive.md | 14 ++++++++------ docs/tools/claude-code/07-session.md | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/comparison/context-compression-deep-dive.md b/docs/comparison/context-compression-deep-dive.md index 4b547027..963fb2f8 100644 --- a/docs/comparison/context-compression-deep-dive.md +++ b/docs/comparison/context-compression-deep-dive.md @@ -257,7 +257,7 @@ Anthropic 工程团队在长任务 harness 开发中发现:**模型在上下 --- -## 压缩后的 UI 行为:清屏 vs 保留 +## 八、压缩后的 UI 行为:清屏 vs 保留 压缩不仅是后端操作——**用户看到什么**直接影响对 Agent 状态的认知。各 Agent 在压缩后的 UI 处理策略差异显著。 @@ -265,11 +265,13 @@ Anthropic 工程团队在长任务 harness 开发中发现:**模型在上下 从 v2.1.86 二进制分析,Claude Code 压缩后的 UI 流程: +> **注**:`us()`、`LU$()`、`F$()` 为混淆后的函数名(逆向推断),`isCompactSummary`、`isVisibleInTranscriptOnly`、`pendingPostCompaction` 为 strings 提取的确定性属性名,可信度更高。 + ``` compact_start → 显示 "Compacting conversation" 旋转器 → 压缩完成 - → us() 设置 pendingPostCompaction = true - → LU$() 重新追加会话元数据 + → 设置 pendingPostCompaction = true + → 重新追加会话元数据 → 旧消息替换为 isCompactSummary + isVisibleInTranscriptOnly 标记的摘要消息 → 屏幕清空旧对话,仅显示 "Summarized conversation" 标记 → compact_end → 清除旋转器 @@ -304,11 +306,11 @@ if (message.summarizeMetadata) { | Agent | 压缩后清屏? | 用户看到什么 | 来源 | |------|------------|------------|------| | **Claude Code** | **是** | "Summarized conversation" 标记 + 新的空白对话区域 | 二进制分析 v2.1.86 | -| **Kimi CLI**(Web UI) | **是** | 仅保留最后一轮用户消息起的内容 | 源码:`useSessionStream.ts` L1891-1907 | +| **Kimi CLI**(Web UI) | **是** | 仅保留最后一轮用户消息起的内容 | 源码:`useSessionStream.ts` `CompactionEnd` handler | | **Gemini CLI** | 否 | 内联显示 "Chat history compressed from X to Y tokens" | 源码:`compressCommand.ts` → `ui.addItem()` | | **Qwen Code** | 否 | 继承 Gemini(内联压缩状态消息) | 源码:`compressCommand.ts`(分叉) | | **Aider** | 否 | 后台静默替换消息列表,无可见变化(verbose 模式下显示一行日志) | 源码:`base_coder.py` L1002-1034 | -| **Codex CLI** | 否 | 显示警告:"Long threads and multiple compactions can cause the model to be less accurate" | 源码:`compact.rs` → `WarningEvent` | +| **Codex CLI** | 否 | 显示警告:"Long threads and multiple compactions can cause the model to be less accurate" | 二进制分析:`compact.rs` → `WarningEvent` | | **Goose** | 未知 | 未找到压缩后 UI 行为的源码证据 | — | | **Copilot CLI** | 未知 | 未找到压缩后 UI 行为的源码证据 | — | @@ -323,7 +325,7 @@ if (message.summarizeMetadata) { --- -## 工具定义膨胀:134K tokens 的教训(来源:[Anthropic Engineering Blog](https://www.anthropic.com/engineering/advanced-tool-use),2025-11-24) +## 九、工具定义膨胀:134K tokens 的教训(来源:[Anthropic Engineering Blog](https://www.anthropic.com/engineering/advanced-tool-use),2025-11-24) 上下文压缩不仅要处理对话历史——**工具定义本身就是上下文膨胀的主要来源**: diff --git a/docs/tools/claude-code/07-session.md b/docs/tools/claude-code/07-session.md index d32eeb5a..2aac121d 100644 --- a/docs/tools/claude-code/07-session.md +++ b/docs/tools/claude-code/07-session.md @@ -8,7 +8,7 @@ - 手动触发:`/compact` 命令 - Hook 支持:PreCompact/PostCompact 事件允许自定义压缩前后行为 -**压缩后 UI 行为**(二进制分析 v2.1.86):压缩完成后,Claude Code **清空屏幕上的旧对话**,仅显示 "Summarized conversation" 标记。旧消息被标记为 `isCompactSummary: true` + `isVisibleInTranscriptOnly: true`——屏幕内容与模型上下文保持同步,防止用户引用"模型已忘记"的消息。这是与 Gemini CLI / Qwen Code(保留旧消息不清屏)的关键行为差异。 +**压缩后 UI 行为**:压缩完成后清空屏幕旧对话,仅显示 "Summarized conversation" 标记——屏幕内容与模型上下文保持同步。详见[压缩后 UI 行为分析](../../comparison/context-compression-deep-dive.md)。 ### 会话恢复 ```bash