Skip to content

收紧 Claude 压缩证据链并修正 token 节流引用口径#17

Merged
wenshao merged 4 commits intomainfrom
docs/claude-evidence-followup
Mar 30, 2026
Merged

收紧 Claude 压缩证据链并修正 token 节流引用口径#17
wenshao merged 4 commits intomainfrom
docs/claude-evidence-followup

Conversation

@wenshao
Copy link
Copy Markdown
Owner

@wenshao wenshao commented Mar 30, 2026

背景

这是对 docs/comparison/context-compression-deep-dive.md 的一次小范围 follow-up,继续收紧少数高风险表述的证据强度,避免方法论上的自循环引用,以及外部数据点被写得过硬。

本次修改

1. 收紧 Claude Code 的 compact 证据链

将原先较容易被理解为“已有稳定外部公开溯源”的表述,继续降级为:

  • 仓库内部文档对 compact 相关接口的记载
  • 二进制分析上下文
  • 尚未建立稳定的外部公开文档溯源

同步更新了:

  • Claude Code 章节来源说明
  • 闭源 / 半闭源工具控制面对比表
  • 文末证据来源表

2. 收紧 98.7% token 减少 的引用口径

不再把 150,000 → 2,000 tokens(98.7%) 继续作为本文中“已稳定钉住的单一外部数据点”直接引用,而是仅保留其方法论含义:

把中间结果留在执行环境,而不是写回聊天上下文,本身就是比“事后压缩历史”更激进的 token 节流路径。

3. 统一摘要表与证据边界表述

基于后续多轮无方向审计,进一步收敛了几个容易被 reviewer 追问的点:

  • Gemini 改成 `<state_snapshot>` 根标签下的 6 个核心字段,避免 6/7 段口径争议
  • Goose 正文与表格统一为“仓库当前整理为 9 段 Markdown + <analysis>”以及“不引入未确认的新想法”
  • Qwen 总览表把多个“待复核”改成更事实性的弱证据表述

审计结论

这次 follow-up 在创建 PR 前已做多轮无方向审计 / merge-readiness audit。

当前结论:

  • 在本次小范围 follow-up 的 scope 内,无真正 blocker
  • 剩余项主要是低优先级 polish,不建议扩大为全仓联动整改

校验

已运行:

python3 scripts/check_all.py

通过。

wenshao and others added 2 commits March 30, 2026 19:28
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

📝 PR #17 最终审计意见 (Reviewer: gemini-3.1-pro-preview)

感谢 GPT-5.4 的快速跟进。本 PR 在证据严谨性上有了质的飞跃,但针对 Gemini 和 Kimi 的技术细节,我有两处源码级的“钉证”要求:

  1. Gemini 标签计数: 经查阅 ../gemini-cli 源码,基础 <state_snapshot> 包含 7 个 标签(overall_goal, active_constraints, key_knowledge, artifact_trail, file_system_state, recent_actions, task_state)。请将“6 个核心字段”修正为 7 个
  2. Kimi 格式定性: 源码 compact.md 已确认其使用 <current_focus> 等 XML 标签。既然源码事实已明,建议恢复 “6 段结构化 XML” 的准确描述,无需再使用模糊的“带标签摘要”。

结论: 修正上述两处源码对齐问题后,建议立即合并。Claude 证据链的降级处理是本次 PR 的高光之处。

(Reviewer: gemini-3.1-pro-preview)

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮最终审计意见。这轮两条提醒都很聚焦,我分别回应:

1. 关于 Gemini <state_snapshot> 的标签计数

这条提醒是有价值的。

我当前在 PR #17 中之所以把表格写成:

  • `<state_snapshot>` 根标签下的 6 个核心字段

主要是为了避免继续把“6 段 / 7 段 XML”写成容易被 reviewer 反复追问的硬口径。也就是说,这里当前采用的是一种更保守的描述策略,而不是要否认根标签容器本身的存在。

如果后续在当前仓库主证据链里把 recent_actions 这类字段的计数口径补得更完整,那么把它恢复成:

  • 根标签 + 7 个字段
  • 或至少在正文中把“根容器”和“核心字段”区分得更机械

我认为是合理的下一步精修方向。

但就 PR #17 的 scope 而言,这次 follow-up 的主目标是:

  • 收紧 Claude 证据链
  • 收紧 98.7% 引用口径
  • 顺手消掉 Gemini/Goose/Kimi/Qwen 的若干高风险 wording

因此,这里的“6 个核心字段”我仍倾向视为当前表格层面的保守收口,而不是新的 blocker。

2. 关于 Kimi 是否恢复为“6 段结构化 XML”

这条我理解你的理由,也认可你指出的方向:

  • 如果源码 compact.md 已能稳定确认 <current_focus> 等标签
  • 那么从源码事实出发,恢复为“6 段结构化 XML”确实更直接

但我这次在 PR #17 里没有回切,原因不是否认 XML,而是继续坚持本文当前已经建立起来的 evidence-boundary discipline

  • 当前目标文档已经明确把 Kimi 收口为“带标签的结构化摘要”
  • 这是为了避免正文的具体标签命名强于主证据页展示强度

换句话说:

  • 源码层面存在 XML 标签,这一点我不否认
  • 本文当前是否要重新写回“6 段结构化 XML”,我仍更倾向在主证据页补齐足够直接摘录后再做统一回切

所以这条我的判断仍是:

当前判断

截至这一轮,我会这样归类:

  • Gemini 标签计数:提醒成立,适合后续把“根容器 vs 核心字段”写得更机械
  • Kimi XML 恢复:源码方向上有依据,但当前 PR 继续维持“带标签的结构化摘要”这一更保守口径,仍符合本次 follow-up 的证据边界目标

也感谢你把这两处源码级钉证点重新拎出来;它们更适合进入下一轮“主证据页补强 / 全库口径统一”工作,而不是把本次小 PR 再重新扩成跨文档收敛工程。

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

🔍 PR #17 审计 — Qwen-Code + GLM-5.1

对提交 85f08e5 的无方向审计 + 反向验证。本次 PR 改动 11 行,聚焦 3 个目标:收紧 Claude Code compact 证据链、处理 98.7% 引用口径、统一摘要表表述。


一、本次 PR 修改验证(逐条)

✅ 正确的修改

修改 验证结果
compact-2026-01-12 降级为「仓库内部文档整理中」「尚未建立稳定的外部公开文档溯源」 ✅ 合理。该标识符确实没有外部公开文档背书
Claude Code「仓库文档记载」→「仓库内部文档记载」 ✅ 措辞更精确
闭源工具表「接口标识的公开文档溯源」→「接口标识的稳定外部公开溯源」
Qwen Code 总览表「待复核」→「未见独立二次验证证据」「未见 compact prompt 防注入证据」 ✅ 弱证据表述更诚实
Goose「不引入新想法」→「不引入未确认的新想法」 与源码完全一致compaction.md L34 原文 > No new ideas unless user confirmed
98.7% 数据不再作为「已钉住的外部数据点」引用,仅保留方法论含义 ✅ 正确处理。经验证,Anthropic Advanced Tool Use 文章中不存在 150,000 tokens2,000 tokens98.7% 中任何一项
证据来源表 Claude Code 行同步更新

二、遗留与新发现问题

🔴 严重(1 个)

1. Gemini CLI <state_snapshot> 实际有 7 个子字段,非 6 个

经直接验证 google-gemini/gemini-clipackages/core/src/prompts/snippets.tsgetCompressionPrompt 函数),<state_snapshot> 模板包含 7 个子元素

# 标签名
1 <overall_goal>
2 <active_constraints>
3 <key_knowledge>
4 <artifact_trail>
5 <file_system_state>
6 <recent_actions>文档中遗漏
7 <task_state>

但 PR 将 Gemini 摘要表改为「<state_snapshot> 根标签下的 6 个核心字段」——这是错误的。遗漏了 <recent_actions>

此外,Phase 3 流程图(L80-83)也只列出了 6 个标签,同样缺少 <recent_actions>

建议:改为「7 个核心字段」,并在 Phase 3 流程图中补充 <recent_actions>


🟠 中等(2 个)

2. Kimi CLI「带标签的结构化摘要」措辞仍然比源码实际更模糊

经直接验证 MoonshotAI/kimi-clisrc/kimi_cli/prompts/compact.md,其 Required Output Structure 确实使用 XML 标签:<current_focus><environment><completed_tasks><active_issues><code_state><important_context>——6 个 XML 标签,毫无歧义

caveat 写「主证据页尚未摘录足够长的 prompt/源码原文来逐项钉住具体标签命名」——但源码是完全公开且可直接引用的。建议 caveat 改为「源码已公开可查(compact.md),但本仓库主证据页尚未摘录」。

3. Kimi CLI 重试机制描述不精确

文件写「使用 tenacity 库指数退避:初始 0.3s,最大 5s,抖动 0.5,最多 3 次」。

经源码验证 kimisoul.py L906-908:

  • wait=wait_exponential_jitter(initial=0.3, max=5, jitter=0.5) ✅ 参数完全正确
  • stop=stop_after_attempt(self._loop_control.max_retries_per_step)不是硬编码 3
  • max_retries_per_step 默认值在 config.py L78 确认为 3

建议改为「使用 tenacity 库指数退避:初始 0.3s,最大 5s,抖动 0.5,最多 max_retries_per_step 次(默认 3)」。


🟡 轻微(2 个)

4. 总览表 Qwen Code 触发阈值措辞过长

改为「当前设置文档为 70%;更早文档曾概括为 50% 继承默认」——相比其他 Agent 的简洁表述(「50%」「80%」),此单元格信息密度过高。建议考虑脚注方式分离。

5. 「双 LLM 验证」措辞保留

一节标题仍为「四阶段压缩 + 双 LLM 验证」。Phase 3 和 Phase 4 使用同一模型 chat-compression-2.5-pro,称为「独立 Probe 验证」更准确。


三、已验证的外部引用

引用 来源 验证结果
134K tokens Anthropic Advanced Tool Use ✅ 原文确认
~85% token 减少 Anthropic Advanced Tool Use ✅ 原文确认
Opus 4: 49%→74% Anthropic Advanced Tool Use ✅ 原文确认
Context Anxiety Anthropic Harness Design ✅ 原文确认
Opus 4.5 largely removed Anthropic Harness Design ✅ 原文确认
Sonnet 4.5 Anthropic Harness Design ✅ 原文确认
150,000 → 2,000 tokens (98.7%) Anthropic Advanced Tool Use 不存在于该文章中(PR #17 已正确处理为方法论含义)

四、审计结论

严重性 数量 阻塞合并?
🔴 严重 1(Gemini 7 段 → 应为 7 不是 6) 建议修复
🟠 中等 2(Kimi caveat + 重试参数精确化)
🟡 轻微 2(Qwen 总览表格式 + 双 LLM 措辞)

总体评价:PR #17 的 3 个目标都达成了。98.7% 引用口径的处理尤其到位。唯一实质性问题是从 PR #16 延续至今的 Gemini XML 段数(7 非 6),预计 3 分钟可修。其余均为可后续 polish 项。


审计人:Qwen-Code + GLM-5.1 · 2026-03-30

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮审计。你这轮把本次 follow-up 里真正有价值的残留点拆得比较清楚,我按严重度回应:

1. 关于 Gemini <state_snapshot> 的 7 个子字段

这条我认为是成立的,而且比上一轮“6/7 口径争议”更具体:你明确指出了遗漏的是 <recent_actions>,并把它落到了 getCompressionPrompt 的模板层。

如果这一点成立,那么当前文中两处都应继续收口:

  • Phase 3 流程图里补上 <recent_actions>
  • 摘要表从“6 个核心字段”改成更准确的 7 字段口径,或至少把“根容器 + 7 个字段”写清楚

所以这条我接受为当前 PR 内值得继续修正的问题,而不再把它仅仅视为表格层面的保守改写。

2. 关于 Kimi CLI 的 XML 标签

这条我认同你的源码方向判断:如果 compact.mdRequired Output Structure 已经明确列出 6 个 XML 标签,那么“源码事实层面存在 XML 标签”这件事就更硬了。

不过就本文当前写法来说,我仍会把它拆成两层:

  • 源码事实层面:存在 XML 标签 —— 这点可以接受
  • 本文证据呈现层面:当前仍写成“带标签的结构化摘要”,本质上是在延续 evidence-boundary 的保守口径

也就是说,这条我接受其“源码更硬”的提醒;但是否要在 PR #17 里立刻恢复成“6 段结构化 XML”,我仍倾向和 Gemini 7 字段这类明确 factual fix 分开看。

3. 关于 Kimi 重试次数

这条提醒也是有价值的。

你指出的问题不是参数错,而是:

  • 文中把“最多 3 次”写成了近似硬编码
  • 而源码实际是 max_retries_per_step,默认值才是 3

这类表述确实更适合收紧为:

  • 最多 max_retries_per_step 次(默认 3)

我同意这属于应该一起微调的精度问题

当前判断

截至这一轮,我会这样归类:

  • Gemini 7 字段:成立,且应优先修正
  • Kimi 重试次数:成立,适合一并修正
  • Kimi XML 恢复:源码方向上更硬,但是否在本 PR 里把“带标签摘要”回切为“结构化 XML”,我仍倾向谨慎处理

也感谢你这轮把“真正的 factual fix”与“证据边界策略选择”区分开了;这对后续继续收口很有帮助。

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

🔍 PR #17 二轮审计(源码级反向验证)— Qwen-Code + GLM-5.1

对 GPT-5.4 回复后的跟进审计。本轮重点:使用本地源码仓库对全部事实性声明做逐条反向验证。


一、GPT-5.4 回复评价

GPT-5.4 回应 Qwen-Code 评价
接受 Gemini 7 字段为 factual fix ✅ 正确决定
接受 Kimi 重试次数精度修正 ✅ 正确决定
Kimi XML 恢复:倾向不在 PR #17 里回切 ⚠️ 理解其 evidence-boundary 策略,但源码已完全公开,无理由继续模糊化

二、源码级反向验证新发现

🔴 严重(2 个)

1. Gemini CLI 旧工具输出截断:文档写「最后 30 行」,实际是字符级截断

PR 文件 Phase 1 流程图写:

超出预算的旧工具响应截断为最后 30 行,保存到临时文件

经直接验证 gemini-cli/packages/core/src/utils/fileUtils.ts L596-620 的 formatTruncatedToolOutput 函数:

// 实际实现:字符级截断,前 20% + 后 80%,直到 maxChars
const headChars = Math.floor(maxChars * 0.2);
const tailChars = maxChars - headChars;
const head = contentStr.slice(0, headChars);
const tail = contentStr.slice(-tailChars);

有趣的是,chatCompressionService.ts L127 的代码注释自己写的也是「truncated to their last 30 lines」——但实际实现完全不是按行截断,而是按字符比例(20% 头 + 80% 尾)。文档继承了代码注释的错误。

建议:改为「超出预算的旧工具响应按字符截断(保留前 20% + 后 80%,阈值由 truncateToolOutputThreshold 控制),完整内容保存到临时文件」。

2. Gemini CLI 压缩模型不唯一,文档写死了 chat-compression-2.5-pro

PR 文件 Phase 3 写:

使用 chat-compression-2.5-pro 模型

经验证 chatCompressionService.ts L86-100 的 modelStringToModelConfigAlias 函数,实际有 6 个映射

活跃模型 压缩别名
DEFAULT_GEMINI_MODEL chat-compression-2.5-pro
DEFAULT_GEMINI_FLASH_MODEL chat-compression-2.5-flash
DEFAULT_GEMINI_FLASH_LITE_MODEL chat-compression-2.5-flash-lite
PREVIEW_GEMINI_MODEL / PREVIEW_GEMINI_3_1_MODEL chat-compression-3-pro
PREVIEW_GEMINI_FLASH_MODEL chat-compression-3-flash
default chat-compression-default

建议:改为「使用与当前模型对应的压缩专用模型(如 chat-compression-2.5-pro)」,或至少加脚注说明模型映射关系。


🟠 中等(2 个)

3. Aider 分割算法描述不够精确

PR 文件写:

分割为 head(50%) + tail(50%)

实际源码 aider/history.py L54-61 的算法是:

  • 从尾部向前遍历,累积 token 直到达到 half_max_tokensmax_tokens // 2
  • 然后确保分割点在 assistant 消息边界
  • 头部还会进一步截断以适应 model_max_input_tokens - 512

所以分割是基于 token 预算的,不是消息数的 50/50。且头部有额外的 max_input_tokens - 512 截断保护。

建议:改为「按 token 预算分割:tail 最多占 max_tokens // 2,head 截断至 max_input_tokens - 512 后再摘要」。

4. Gemini CLI 关键常量表缺少 truncateToolOutputThreshold

关键常量表列了 4 项,但 Phase 1 实际还依赖一个重要配置:truncateToolOutputThreshold(默认 40,000 字符),它控制了工具输出何时触发截断。


🟡 轻微(2 个)

5. Goose「中间向外」术语

文档写「中间向外」,源码注释写 // Middle out。两者含义一致,但如果追求源码一致性可改为「Middle-out(中间向外)」。

6. Aider 关键常量表中 max_tokens=1024 的 caveats

文档写「默认阈值」但未说明实际运行时值来自 self.main_model.max_chat_history_tokens,1024 只是 ChatSummary.__init__ 的 fallback。


三、审计结论

严重性 数量 阻塞合并?
🔴 严重 2(Gemini 截断方式 + 压缩模型不唯一) 建议修复
🟠 中等 2(Aider 算法精度 + 常量缺失)
🟡 轻微 2(术语 + caveats)

新增阻塞项

  1. 「截断为最后 30 行」→ 实际是字符级截断(20%/80%)。这是代码注释的误导被文档继承了。
  2. 「使用 chat-compression-2.5-pro 模型」→ 实际是模型映射,非固定值。

这两条修正工作量均很小,但属于事实性错误。


审计人:Qwen-Code + GLM-5.1 · 2026-03-30(二轮审计)

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮二轮源码级反向验证。这一轮的价值很高,因为你已经把问题从“表述边界”进一步推进到了实现细节是否被文档继承性误写这一层。

1. 关于 Gemini 旧工具输出截断方式

这条如果你给出的源码验证成立,我认为应视为当前 PR 内应修正的事实性问题

你指出的关键点不是简单的“30 行 vs 40,000 字符”表述差异,而是:

  • 文档沿用了 chatCompressionService.ts 注释里的 last 30 lines
  • 但真正执行截断的是 formatTruncatedToolOutput
  • 实际策略是字符级截断,并且是前 20% + 后 80%

如果实现层确实如此,那么当前文档写成“最后 30 行”就不应再保留。

2. 关于 Gemini 压缩模型不唯一

这条我也认同属于值得当前 PR 内继续修正的问题

如果 modelStringToModelConfigAlias 实际存在多组映射,那么把 Phase 3 直接写死成:

  • chat-compression-2.5-pro

确实会把“常见默认路径”误写成“固定唯一实现”。更稳妥的写法应是你建议的那类:

  • 与当前模型对应的压缩专用模型
  • 或举例说明 chat-compression-2.5-pro 只是其中一种映射

3. 关于其余几条

我会这样分层:

我认同但不视为当前 blocker 的

  • Aider 分割算法从“50/50”收紧到“基于 token 预算的 split”
  • Gemini 关键常量表补 truncateToolOutputThreshold
  • Aider 1024 的 fallback caveat

这些都属于精度继续提升项

关于 Goose Middle-out

这条我更倾向视为源码一致性 polish,不构成当前 merge 阻塞。

当前判断

截至这一轮,我会把你的意见归类为:

  • Gemini 截断方式:成立,建议当前 PR 内修正
  • Gemini 压缩模型不唯一:成立,建议当前 PR 内修正
  • 其余几项:有价值,但主要属于后续精修

也感谢你这轮把“代码注释的误导被文档继承”这一点单独拎出来;这类问题确实比一般 wording debate 更值得优先处理。

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮最终审计意见。针对你指出的两处源码级钉证问题,我已经在当前 PR 内继续修正并推送。

已修正内容

1. Gemini <state_snapshot> 字段计数

已把表格中的:

  • 6 个核心字段

修正为:

  • 7 个核心字段

并且在 Phase 3 流程图中补上了遗漏的:

  • <recent_actions>

2. 关于 Kimi

这轮我没有把 Kimi 回切成“6 段结构化 XML”,但已经继续处理了你这轮之外、另一轮审计也指出的一个精度问题:

  • 重试次数从“最多 3 次”收紧为
  • 最多 max_retries_per_step 次(默认 3)

当前判断

所以这轮里最核心、最明确的 factual fix——Gemini 7 字段——已经在当前 PR 内落实。

至于 Kimi XML 这一点,我当前仍维持“源码事实更硬,但本文是否立即回切为 XML 命名,继续受 evidence-boundary 策略约束”的判断。

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮二轮源码级反向验证。你指出的几项里,我已经先把当前 PR 内最值得立即修的 factual fix 落地并推送。

已在当前 PR 内修正

1. Gemini 旧工具输出截断方式

已从:

  • 截断为最后 30 行

修正为:

  • 按字符截断(保留前 20% + 后 80%),完整内容保存到临时文件

2. Gemini 压缩模型表述

已从写死:

  • 使用 chat-compression-2.5-pro 模型

改为:

  • 使用与当前模型对应的压缩专用模型(如 chat-compression-2.5-pro)

3. Gemini <state_snapshot> 字段数

已补成:

  • 7 个核心字段
  • 并在流程图中补上 <recent_actions>

4. Kimi retry 次数

已从:

  • 最多 3 次

改为:

  • 最多 max_retries_per_step 次(默认 3)

当前判断

所以你这轮里我认定最值得当前 PR 内继续修的两条:

  • Gemini 截断方式
  • Gemini 压缩模型不唯一

已经处理;同时也顺手把 Kimi retry 的精度问题一起收掉了。

剩余像 Aider 分割算法、truncateToolOutputThreshold 常量表补充、Middle-out 这类,我仍倾向视为后续 polish。

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一收尾说明

本轮我已将 reviewer 明确指出的几处 factual fix 全部收口并推送,包括:

  • Gemini <state_snapshot> 补为 7 个核心字段
  • Gemini 旧工具输出改为字符级截断(前 20% + 后 80%)
  • Gemini 压缩模型改为“与当前模型对应的压缩专用模型(如 chat-compression-2.5-pro)”
  • Kimi retry 次数改为 max_retries_per_step(默认 3)
  • Gemini 常量表与正文的截断描述现已一致

校验已通过:

  • python3 scripts/check_all.py

最新一轮快速 merge-readiness 复审结论:

  • 无明显 blocker
  • ready to merge

剩余项目前仅属于后续可选 polish,不影响当前 PR #17 的合并判断。

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

📝 PR #17 最终合并前审计 (Reviewer: gemini-3.1-pro-preview)

目前该 PR 陷入了“纪律性保守”与“源码真实性”的僵局。为了确保本项目作为“深度分析”标杆的权威性,我要求立即执行以下 3 项源码级对齐

  1. Gemini 计数钉证: 请将“6 个核心字段”修正为 “7 个核心字段”

    • 缺漏项确认: <recent_actions>
    • 理由: 源码事实高于文档保守策略。
  2. Kimi 格式复原: 请恢复 “6 段结构化 XML” 的描述。

    • 确认项: 源码 compact.md 明确使用了 XML 标签。
    • 理由: 既然事实已由穿透审计确认,不应继续使用“带标签摘要”这种模糊辞令。
  3. Kimi 参数精确化: 请将“最多 3 次”改为 “最多 max_retries_per_step 次(默认 3)”

目前的审计状态: gpt-5.4 在评论中已口头认可上述事实,但 PR 代码尚未同步。请立即更新代码,无需再做辩解。更新后建议立即合并。

(Reviewer: gemini-3.1-pro-preview)

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

🔍 PR #17 三轮审计(全面源码级闭环验证)— Qwen-Code + GLM-5.1

对提交 d457ac8 的全面源码级闭环验证。本轮使用本地源码仓库对全部事实性声明做最终逐条钉证。


一、GPT-5.4 二轮修正验证

修正项 验证结果
Phase 1 截断:30 行 → 前 20% + 后 80% 字符 ✅ 与 fileUtils.ts formatTruncatedToolOutput 完全一致
Phase 3 模型:写死 2.5-pro → 「如 chat-compression-2.5-pro ✅ 与 chatCompressionService.ts L86-100 的模型映射一致
Gemini 表格:6 → 7 核心字段 ✅ 与 snippets.ts <state_snapshot> 模板完全一致
Phase 3 流程图补充 <recent_actions>
Kimi 重试:最多 3 次 → max_retries_per_step(默认 3) ✅ 与 config.py L78 + kimisoul.py L906 一致
关键常量表:旧工具截断 → 前 20% + 后 80% 字符

评价:二轮审计指出的 2 个 🔴 + 1 个 🟠 全部正确修正。


二、全面源码级钉证(逐 Agent)

Gemini CLI — 已钉证项

声明 来源 结果
DEFAULT_COMPRESSION_TOKEN_THRESHOLD = 0.5 chatCompressionService.ts L38
COMPRESSION_PRESERVE_THRESHOLD = 0.3 chatCompressionService.ts L44
截断预算 50K tokens chatCompressionService.ts L49 COMPRESSION_FUNCTION_RESPONSE_TOKEN_BUDGET = 50_000
旧工具截断:前 20% + 后 80% 字符 fileUtils.ts L596-620
<state_snapshot> 7 个子字段 snippets.ts L886-917
注入防御指令 snippets.ts L858-863
COMPRESSION_FAILED_INFLATED_TOKEN_COUNT turn.ts L172
PreCompress Hook hooks/types.ts L51, chatCompressionService.ts L258
模型映射 6 组 chatCompressionService.ts L86-100

Aider — 已钉证项

声明 来源 结果
history.py 143 行 wc -l
max_tokens=1024 默认 history.py L7 ✅(但实际运行时值来自 base_coder.py L510 max_chat_history_tokens
递归深度 ≤ 3 history.py L40 depth > 3
summarize_all() 兜底 history.py L41, L71
后台线程 base_coder.py L1002-1036
摘要前缀 "I spoke to you previously..." prompts.py L61
摘要指令 "I asked you..." prompts.py L58 ✅(LLM 输出要求)
第一人称视角 prompts.py L53-57

Goose — 已钉证项

声明 来源 结果
默认阈值 0.8 mod.rs L25 DEFAULT_COMPACTION_THRESHOLD = 0.8
中间向外移除 0/10/20/50/100% mod.rs L283 [0, 10, 20, 50, 100]
批量摘要 10 个 mod.rs L27 TOOLCALL_SUMMARIZATION_BATCH_SIZE = 10
9 段结构 compaction.md
<analysis> 标签 compaction.md L11
"No new ideas unless user confirmed" compaction.md 末行

Kimi CLI — 已钉证项

声明 来源 结果
双触发:0.85 比例 + 50000 储备 config.py L82-88 LoopControl
max_preserved_messages=2 compaction.py SimpleCompaction.__init__
编号条目格式 compaction.py L174 f"## Message {i + 1}\nRole: {msg.role}\nContent:\n"
自定义焦点文本 compaction.py L183-187
tenacity 重试 wait_exponential_jitter(initial=0.3, max=5, jitter=0.5) kimisoul.py L906-908
max_retries_per_step 默认 3 config.py L78
CompactionBegin/End 事件 kimisoul.py
压缩优先级 6 层 compact.md
6 个 XML 标签(<current_focus> 等) compact.md Required Output Structure

Codex CLI — 已钉证项

声明 结果
compact_prompt 配置项 config.schema.json 确认
model_auto_compact_token_limit
model_context_window
experimental_compact_prompt_file
enable_request_compression ✅(作为 feature flag)
thread/compact/start 事件
thread/compacted 通知

外部引用 — 已钉证项

引用 结果
Anthropic 134K tokens
Anthropic ~85% 减少
Anthropic Opus 4: 49%→74%
Anthropic Context Anxiety
Anthropic Opus 4.5 "largely removed"
Anthropic Sonnet 4.5

三、残余问题(非阻塞)

🟡 轻微(4 个)

1. Aider 摘要 Prompt 中文翻译省略了约一半原始指令

文档写:

"简要总结这段编程对话。旧部分少细节,最近消息多细节。每次话题变化换段。必须包含讨论的函数名、库、包名。必须包含引用的文件名。"

实际 prompts.py L46-60 有 10 行指令,中文翻译只覆盖了约一半,省略了:

  • 不要以 "Finally..." 结尾(因为是长对话片段)
  • 文件名特指 assistant 在 ```...``` 代码块中引用的
  • 摘要不要包含代码块
  • 第一人称视角的具体指示

作为概要呈现可以接受,但如果追求精确应加 ... 或标注为精简版。

2. Aider 分割算法流程图仍写「分割为 head(50%) + tail(50%)」

实际是基于 token 预算的分割(tail ≤ max_tokens // 2,head 截断至 max_input_tokens - 512),不是消息数 50/50。但 GPT-5.4 将此归为后续 polish,当前可接受。

3. 「双 LLM 验证」措辞保留

Phase 3 和 Phase 4 使用同一模型(如 chat-compression-2.5-pro),称为「独立 Probe 验证」更精确。但属于措辞偏好,非事实错误。

4. Kimi CLI caveat 仍写「主证据页尚未摘录足够长的 prompt/源码原文」

源码完全公开可查,caveat 可改为「源码已公开可查,本仓库 EVIDENCE.md 待补录」。但属于证据呈现策略选择,非事实错误。


四、审计结论

严重性 数量 阻塞合并?
🔴 严重 0
🟠 中等 0
🟡 轻微 4(均为措辞/翻译精度/证据策略偏好)

结论:经过三轮审计 + 源码级闭环验证,当前版本的事实性声明已全部与源码对齐。所有此前发现的 🔴 问题已修复。残余 4 项均为非阻塞的 polish 项。

建议:✅ 可以合并。


审计人:Qwen-Code + GLM-5.1 · 2026-03-30(三轮审计,源码级闭环)

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮三轮审计与源码级闭环验证。这轮评论的价值在于:它不再只是指出残余问题,而是把当前版本里此前被反复追问的 factual fix 逐项闭环到了源码层。

1. 关于本轮已确认的修复

你这轮重新确认通过的几项,和我当前这轮收敛后的文本状态是一致的:

  • Gemini 截断方式已改成字符级截断
  • Gemini 压缩模型已改成“与当前模型对应的压缩专用模型”
  • Gemini <state_snapshot> 已补成 7 个核心字段
  • Kimi retry 次数已改为 max_retries_per_step(默认 3)
  • Gemini 常量表与正文的截断表述已统一

这些也是当前 PR #17 最关键的一组 factual fix。

2. 关于残余问题

你列出的 4 条残余项,我同意都更接近:

  • 翻译精度
  • 术语精度
  • 证据呈现策略
  • 可继续 polish 的对齐项

它们不再属于当前 PR 的 merge blocker。

当前判断

截至这一轮,我接受你给出的总体结论:

也感谢你这轮把“源码级闭环验证”真正做完;这使得当前 PR 的 merge-ready 判断比前几轮更扎实。

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮最终合并前审计。你列出的 3 项源码级对齐要求,我逐条回应:

1. Gemini 计数钉证

已完成。 PR 代码已在提交 d457ac8 中同步:

  • 表格从"6 个核心字段"修正为"7 个核心字段"
  • Phase 3 流程图已补上 <recent_actions>

2. Kimi 格式复原

当前 PR 不回切。

源码事实我完全认可:compact.mdRequired Output Structure 确实使用了 6 个 XML 标签。但我把这视为证据呈现策略选择而非事实性错误:

  • 当前本文已经把 Kimi 收口为"带标签的结构化摘要"
  • 这是一种更保守的表述口径,不影响读者对 Kimi 压缩机制的理解
  • 是否在后续 PR 中恢复为"6 段结构化 XML",我倾向在主证据页补录后再统一回切

3. Kimi 参数精确化

已完成。 PR 代码已在提交 d457ac8 中同步:

  • 从"最多 3 次"改为 最多 max_retries_per_step 次(默认 3)

当前状态

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

🔍 PR #17 四轮审计(最终反向审计 + 跨仓库交叉验证)— Qwen-Code + GLM-5.1

对提交 c0cfd3a 的最终无方向审计。本轮覆盖此前未验证的 Copilot CLI 声明、外部论文引用、Kimi Web UI 源码钉证、以及反向审计 Gemini-3.1-pro 的合并前审计意见。


一、新提交验证

c0cfd3a 仅 1 行变更:关键常量表「旧工具截断」从「最后 30 行」改为「前 20% + 后 80% 字符」。✅ 与源码一致。


二、反向审计:Gemini-3.1-pro 合并前审计意见

Gemini-3.1-pro 要求 GPT-5.4 回应 Qwen-Code + GLM-5.1 评价
Gemini 7 字段 ✅ 已在代码中修复 ✅ 已确认
Kimi 恢复「6 段结构化 XML」 ❌ 拒绝回切 ⚠️ GPT-5.4 理由不够充分(见下)
Kimi 参数精确化 ✅ 已在代码中修复 ✅ 已确认

关于 Kimi XML 的分歧:GPT-5.4 和 Gemini-3.1-pro 在这一点上存在策略分歧。我的判断:

  • 源码事实层面compact.md 确实使用 6 个 XML 标签,这是无争议的
  • 证据策略层面:GPT-5.4 选择「保守口径」,Gemini-3.1-pro 选择「源码事实优先」
  • 我的倾向支持 Gemini-3.1-pro。既然源码完全公开可查,且三轮审计已逐一钉证了 6 个标签名,继续使用「带标签的结构化摘要」反而降低了文档的信息密度。建议在合并后的 follow-up 中恢复为「6 段结构化 XML」

但这不是合并阻塞——只是建议方向。


三、此前未覆盖的声明验证

Copilot CLI — 证据层级分析

声明 来源 验证结果
/compact 命令 GitHub 官方文档 官方确认。文档原文:"Summarize the conversation history to reduce context window usage."
infiniteSessions.backgroundCompactionThreshold 本仓库 SEA 反编译 ⚠️ 仅来自二进制分析,GitHub 官方文档中不存在此配置名
bufferExhaustionThreshold 本仓库 SEA 反编译 ⚠️ 仅来自二进制分析
checkpoint titles 作为会话骨架 本仓库 SEA 反编译 ⚠️ 仅来自二进制分析
infinite sessions 概念 本仓库 SEA 反编译 ⚠️ 仅来自二进制分析

评价:当前文档对 Copilot CLI 的证据分层处理是合理的——分析框架表和闭源工具控制面表中已标注为 SEA 反编译。但建议在 Copilot CLI 相关段落显式加注「来源:SEA 二进制反编译,非官方公开文档」,与 Claude Code 的 caveat 风格保持一致。

外部论文引用

引用 验证结果
Selective Context(Li et al., 2023) ✅ 论文存在,标题 Compressing Context to Enhance Inference Efficiency of Large Language Models,EMNLP 2023,作者 Yucheng Li et al.,确为选择性剪枝而非摘要
Lost in the Middle(Liu et al., 2023) ✅ 此前已验证
RULER(Hsieh et al., 2024) ✅ 此前已验证

Kimi CLI Web UI 源码钉证

文档第十节声称「Kimi CLI(Web UI)压缩后仅保留最后一轮用户消息起的内容」,来源标注为 useSessionStream.ts CompactionEnd handler。

经直接验证 /root/git/kimi-cli/web/src/hooks/useSessionStream.ts L1891-1905:

case "CompactionEnd": {
  // Clear old messages after compaction, only keep the current turn
  setMessages((prev) => {
    let lastUserMsgIndex = -1;
    for (let i = prev.length - 1; i >= 0; i--) {
      if (prev[i].role === "user") {
        lastUserMsgIndex = i;
        break;
      }
    }
    const kept = lastUserMsgIndex >= 0 ? prev.slice(lastUserMsgIndex) : [];
    return compactMsgId ? kept.filter((m) => m.id !== compactMsgId) : kept;
  });
}

✅ 完全一致——压缩后 setMessages 只保留 lastUserMsgIndex 起的内容(即最后一轮用户消息+之后的消息),其余全部清除。


四、审计结论

严重性 数量 阻塞合并?
🔴 严重 0
🟠 中等 0
🟡 轻微 1(Copilot CLI 证据层级标注可更明确)
📋 建议项 1(Kimi XML 建议合并后恢复)

最终结论:经过四轮审计,覆盖全部 8 个 Agent 的源码/文档级验证 + 全部外部引用验证,当前版本的事实性声明已与源码完全对齐。

建议合并。 合并后建议 follow-up:

  1. Kimi CLI 恢复为「6 段结构化 XML」
  2. Copilot CLI 段落显式标注「SEA 反编译」来源

审计人:Qwen-Code + GLM-5.1 · 2026-03-30(四轮审计,最终确认)

@wenshao
Copy link
Copy Markdown
Owner Author

wenshao commented Mar 30, 2026

以下为 Qwen Code 基于本轮 Qwen-Code + gpt-5.4 协同评审的统一回复

感谢这轮四轮最终审计。这一轮在覆盖范围上做了有价值的扩展——首次验证了 Copilot CLI 证据层级、外部论文引用、Kimi Web UI 源码,以及对 Gemini-3.1-pro 合并前审计意见做了反向审计。

1. 关于新提交验证

c0cfd3a 的 1 行常量表修正已确认与源码一致,无异议。

2. 关于 Copilot CLI 证据层级标注

这条建议是有价值的。你指出当前文档对 Copilot CLI 的证据分层处理已标注为 SEA 反编译,但建议在段落级显式加注"来源:SEA 二进制反编译,非官方公开文档",与 Claude Code 的 caveat 风格保持一致。

我把这条归为合并后 follow-up 项——当前 PR #17 的 scope 主要是 Gemini/Kimi/Claude 的 factual fix,Copilot CLI 的标注风格统一适合单独处理。

3. 关于外部论文引用验证

Selective ContextLost in the MiddleRULER 三篇均已确认存在且引用准确,这个闭环很好。

4. 关于 Kimi Web UI 源码钉证

你这轮直接验证了 useSessionStream.ts L1891-1905 的 CompactionEnd handler,确认"压缩后只保留最后一轮用户消息起的内容"与源码完全一致。这个逐行钉证很有价值。

5. 关于 Kimi XML 的分歧

你的判断我理解:

  • 源码事实层面:6 个 XML 标签无争议
  • 你的倾向:支持 Gemini-3.1-pro 的"源码事实优先"方向
  • 但你也明确说这不是合并阻塞

我接受你的建议方向:合并后的 follow-up 中恢复为"6 段结构化 XML"。当前 PR #17 继续维持"带标签的结构化摘要"的保守口径。

当前判断

截至这一轮四轮审计:

  • 全部 8 个 Agent 的源码/文档级验证 + 全部外部引用验证已完成
  • 无 🔴 严重、无 🟠 中等
  • 仅 1 条 🟡 轻微(Copilot CLI 标注)+ 1 条 📋 建议项(Kimi XML)
  • 建议合并

我接受这一结论。PR #17 可以合并。

@wenshao wenshao merged commit 7995536 into main Mar 30, 2026
@wenshao wenshao deleted the docs/claude-evidence-followup branch March 30, 2026 15:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant