Skip to content

feat(context): 微压缩引入按工具差异化的重要性感知摘要#329

Merged
phantom5099 merged 12 commits into
1024XEngineer:mainfrom
wynxing:main
Apr 17, 2026
Merged

feat(context): 微压缩引入按工具差异化的重要性感知摘要#329
phantom5099 merged 12 commits into
1024XEngineer:mainfrom
wynxing:main

Conversation

@wynxing

@wynxing wynxing commented Apr 16, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • 新增 ContentSummarizer 函数类型,允许按工具注册摘要策略,替代原有的统一清除占位
  • 实现 7 个内置工具摘要器(bash / read_file / write_file / edit / grep / glob / webfetch),保留约 200 字符关键上下文
  • 通过 MicroCompactSummarizerSource 接口解耦 context 包与 tools 包,遵循"不内嵌工具逻辑"架构规则
  • 无 summarizer 的工具自动回退到原有 [Old tool result content cleared] 行为,完全向后兼容

涉及文件

操作 文件
新建 internal/tools/micro_compact_summarizer.go
新建 internal/tools/micro_compact_summarizers_builtin.go
新建 internal/tools/micro_compact_summarizer_test.go
新建 internal/context/microcompact_summarizer_test.go
修改 internal/tools/registry.go
修改 internal/tools/manager.go
修改 internal/context/types.go
修改 internal/context/builder.go
修改 internal/context/microcompact.go
修改 internal/context/microcompact_test.go
修改 internal/app/bootstrap.go
修改 internal/runtime/runtime_test.go
修改 internal/runtime/runtime_remaining_branches_test.go

Test plan

  • 内置 summarizer 单元测试:正常路径 + 缺失 metadata + 输出 <= 200 rune
  • Registry 注册/查询测试:RegisterSummarizer 存取 + nil 移除 + 未知工具返回 nil
  • context 集成测试:有 summarizer 生成摘要、无 summarizer 回退清除、混合 span、空摘要回退
  • 现有 microcompact 测试全部通过(补充 nil 参数)
  • runtime stub 测试适配新接口方法
  • go build ./... && go test ./... 全绿
  • gofmt -w ./cmd ./internal 格式化通过
  • /review 审查完成,修复 3 个问题
  • /simplify 审查完成,修复 2 个问题
    `

旧工具结果在 micro-compact 时统一被替换为"[Old tool result content cleared]",
丢失关键调试上下文(如 bash 错误输出、read_file 文件路径、grep 匹配结果)。

引入 ContentSummarizer 机制,为每个内置工具注册约 200 字符的摘要策略:
- bash: 保留退出状态 + 末尾 5 行 + 工作目录
- read_file: 保留文件路径 + 行数 + 首尾行片段
- write_file: 保留文件路径与写入字节数
- edit: 保留编辑路径与替换范围
- grep: 保留搜索根目录 + 匹配计数 + 前几个文件名
- glob: 保留匹配计数与前几个文件名
- webfetch: 保留 URL 与截断标记

无 summarizer 的工具维持原有清除行为,完全向后兼容。
fennoai[bot]

This comment was marked as outdated.

@wynxing

wynxing commented Apr 16, 2026

Copy link
Copy Markdown
Collaborator Author

/code 解决合并冲突

@fennoai

fennoai Bot commented Apr 16, 2026

Copy link
Copy Markdown
Contributor

已完成

已按你的指令完成合并冲突修复,并推送到当前 PR 分支 Yumiue:main

处理结果

  • 复现并解决与 origin/main 的冲突文件:
    • internal/context/microcompact.go
    • internal/context/microcompact_test.go
  • 同步修复 Content -> Parts 迁移导致的冲突后编译问题:
    • internal/context/microcompact_summarizer_test.go
  • 冲突解决策略:保留本 PR 的 summarizer 设计(按工具摘要),并兼容主分支的 Parts 消息结构。

验证

  • go test ./internal/context/... 通过
  • go test ./... 全量通过

提交与推送

  • Commit: 193f7b6
  • 已推送:fork HEAD -> main

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
@wynxing

wynxing commented Apr 16, 2026

Copy link
Copy Markdown
Collaborator Author

/simplify

@fennoai

fennoai Bot commented Apr 16, 2026

Copy link
Copy Markdown
Contributor

处理结果

已完成你要求的三件事:检查历史评论、修复值得修复的问题、并使用 code-simplifier 做简化后提交推送。

已完成项

  1. 处理未解决 review 评论(可直接落地项)
  • 修复 webfetchSummarizermetadata.url 的错误依赖(该字段不会进入持久化 metadata)。
  • 现在仅使用可稳定持久化的标记(如 truncated),避免测试与真实运行路径不一致。
  1. 使用 code-simplifier 简化代码
  • 简化 internal/context/builder.go:抽取通用构造逻辑,去掉重复的 prompt source 装配代码。
  • 简化 internal/tools/micro_compact_summarizers_builtin.go:改为表驱动注册内置 summarizer。
  • 简化 internal/tools/micro_compact_summarizer_test.go:抽取通用断言函数,减少重复断言模板。
  1. 验证
  • gofmt -w ./cmd ./internal
  • go test ./...
  • go build ./...
  1. 提交与推送
  • Commit: bad8bba
  • Pushed: fork HEAD -> main(已更新当前 PR 分支)

说明

  • 历史评论中关于“默认启用 summarizer 的安全边界”属于策略/产品决策层问题(需要开关策略或系统级脱敏策略设计),本次 /simplify 未做行为级策略改动,仅修复了可确认的不一致问题并做低风险简化。

View job run

@codecov

codecov Bot commented Apr 16, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.44604% with 21 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...nternal/tools/micro_compact_summarizers_builtin.go 90.60% 7 Missing and 7 partials ⚠️
internal/context/microcompact.go 93.50% 2 Missing and 3 partials ⚠️
internal/tools/registry.go 90.47% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
@fennoai fennoai Bot mentioned this pull request Apr 16, 2026
@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/review

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/simplify

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/review

fennoai[bot]

This comment was marked as outdated.

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

完成结果

已按要求完成:检查历史评论中的未解决项、修复值得修复的问题、并使用 code-simplifier 子代理做简化审视后落地低风险优化。

本次修复

  1. 处理未解决审查意见
  • bashSummarizer 改为仅保留结构化元信息(exit/workdir/lines/chars),不再回灌原始命令输出。
  • readFileSummarizer 不再保留 first/last 内容片段,仅保留稳定元信息(path/lines/chars)。
  • 修复 read_file 行数统计边界:末尾换行不再额外计为一行。
  • writeFileSummarizereditSummarizer 统一纳入 truncateRunes(..., summaryMaxRunes)
  • microcompact 中消除重复渲染:先提取一次可压缩文本,再复用于摘要,避免同消息重复 renderDisplayParts
  1. code-simplifier 审视与落地
  • 采纳了低风险建议:
    • 删除冗余分支(nil map 显式判断)。
    • 提升可读性(提取 callID 变量后复用)。
    • 抽取 appendTextStats 复用统计拼装逻辑。
    • 测试中统一使用 summaryMaxRunes,并抽取 assertEmptySummary 降低重复断言。
  1. 测试与构建
  • go test ./... 通过
  • go build ./... 通过

提交与推送

  • Commit: e1f2250
  • 已推送到当前 PR 分支:Yumiue:main

未做事项

  • 未引入新的策略开关(例如“摘要默认关闭”);本次只做可确认的低风险修复与简化。

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
fennoai[bot]

This comment was marked as outdated.

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/simplify

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/review

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

完成结果

已按本次 /simplify 指令完成:先检查历史评论并评估可修复项,再执行代码简化代理审视,最后提交并推送到当前 PR 分支。

本次处理

  1. 历史评论检查与修复评估
  • 已读取历史评论日志与仓库规则(CLAUDE.md / AGENTS.md)。
  • 未发现新的未处理人工 review 线程;针对此前 Codecov 暴露的分支覆盖缺口,补充了可验证且低风险的测试。
  1. 落地改动(测试与简化)
  • internal/tools/manager_test.go
    • 新增 MicroCompactSummarizer 分支测试(nil manager / 无能力 executor / 正常透传)。
    • 按简化建议合并重复 stub,避免测试实现重复。
  • internal/tools/micro_compact_summarizer_test.go
    • 补充 RegisterBuiltinSummarizers(nil)RegisterSummarizer 名称归一化、nil registry、truncateRunes 边界、stableLineCount 边界测试。
    • 按简化建议拆分“归一化 + nil registry”混合断言为两个独立测试,提升失败定位。
  • internal/context/builder_test.go
    • 补充 NewBuilderWithToolPoliciesAndSummarizers 构造路径覆盖测试。
    • 按简化建议将关键位置断言改为命名索引常量,提升可读性。
  • internal/context/microcompact_summarizer_test.go
    • 补充 isToolCallSpan 边界与 compactableToolCallIDs(nil, nil) 分支测试。
  1. 代码简化代理
  • 已执行简化代理审视并采纳低风险建议(去重 stub、拆分混合测试、增强断言可读性)。
  1. 验证
  • gofmt -w ./cmd ./internal 通过
  • go test ./... 通过
  • go build ./... 通过
  • 关键新增路径覆盖已补齐(如 NewBuilderWithToolPoliciesAndSummarizersMicroCompactSummarizerRegisterSummarizer/stableLineCount 边界等)
  1. 提交与推送
  • Commit: 47cf4bc
  • 已推送到当前 PR 分支:Yumiue:main

未做事项

  • 未改动运行时业务逻辑与摘要策略本身,仅做测试覆盖与低风险可维护性简化。

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
fennoai[bot]

This comment was marked as outdated.

fennoai[bot]

This comment was marked as outdated.

fennoai[bot]

This comment was marked as outdated.

fennoai[bot]

This comment was marked as outdated.

fennoai[bot]

This comment was marked as outdated.

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/simplify

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/review

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

完成结果

已按本次触发评论执行:先检查历史评论中的未解决 review 项,评估后修复可低风险落地的问题,并完成一次简化整理后提交推送。

本次修复

  1. internal/context/microcompact.go
  • 修正注释与当前行为不一致问题(由“仅清理”改为“优先摘要,失败回退清理”)。
  • 消除重复渲染:将“是否可压缩”与“可压缩内容提取”合并为一次扫描缓存,压缩阶段复用内容,避免二次 renderDisplayParts
  1. internal/tools/micro_compact_summarizers_builtin.go
  • readFileSummarizer 改为基于原始内容统计 lines,修复空行文件边界统计。
  • stableLineCount 修正为“末尾换行不额外计数”,并保持空文本返回 0
  • grepSummarizer / globSummarizer 从全量 Split 改为按行前缀扫描,减少大输出下额外分配。
  • 增加摘要 token 净化(移除控制字符并裁剪长度),降低摘要回灌注入风险。
  1. internal/tools/micro_compact_summarizer_test.go
  • 补充 read_file 空行计数边界测试。
  • 补充 grep/glob 预览净化与空白控制字符跳过测试。
  • 补充 stableLineCount 末尾换行与仅空行场景测试。

代码简化说明

  • 已执行一次子代理简化尝试(code-simplifier 代理),但该次调用返回上游 502,未拿到有效结果。
  • 已在主流程中完成等价低风险简化(去重扫描、抽取行扫描与净化函数),并通过全量验证。

本轮未改动

  • 未引入“是否默认启用内置 summarizer”的配置开关(该项属于策略层设计变更,风险高于本轮“低风险修复/简化”范围)。

验证

  • go test ./internal/tools ./internal/context 通过
  • go test ./... 通过
  • go build ./... 通过

提交与推送

  • Commit: 54bf046
  • 已推送到当前 PR 头分支:Yumiue:mainfork/main

View job run

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/simplify

…eviews

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
fennoai[bot]

This comment was marked as outdated.

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

完成结果

已按本次触发要求完成:先读取历史评论并定位未解决 review,修复可落地问题,再执行“代码简化”审视(子代理两次 502,已由主流程完成等价简化审查),最后提交并推送到当前 PR 分支。

本次修复

  1. 修复 metadata 注入面(internal/tools/micro_compact_summarizers_builtin.go
  • workdir/path/root/relative_path 统一走净化入口 metadataToken(...),避免控制字符/换行直接进入摘要。
  • 保留原有摘要语义,仅增强输入清理与长度约束。
  1. 修复 grep 文件名前缀解析(Windows 路径兼容)
  • extractUniqueMatchFiles 改为通过 parseGrepFilePrefix 识别 path:line:content 结构。
  • 支持 C:\... 这类含盘符冒号的路径,避免误截断。
  1. 优化 micro-compact 热路径
  • microCompactMessagesWithPolicies 中,先进行“是否有可压缩消息”的轻量判定(hasCompactableToolMessage),仅对实际需要压缩的 span 构建 compactableContents 映射,减少不必要分配。
  1. 测试补齐
  • 新增 metadata 净化测试(bash/read_file/grep root)。
  • 新增 Windows grep 路径解析测试。
  • 新增 hasCompactableToolMessage 分支测试。

验证

  • go test ./internal/tools ./internal/context
  • go test ./...
  • go build ./...

提交与推送

  • Commit: 5fec8da
  • 已推送到当前 PR 分支:fork-pr-329-1776389508

未完成项

  • code-simplifier 子代理调用两次均返回上游 502,未获得子代理输出;本次已在主流程完成等价的低风险简化审查并落地。

View job run

wynxing added 2 commits April 17, 2026 10:11
旧工具结果在 micro-compact 时统一被替换为"[Old tool result content cleared]",
丢失关键调试上下文(如 bash 错误输出、read_file 文件路径、grep 匹配结果)。

引入 ContentSummarizer 机制,为每个内置工具注册约 200 字符的摘要策略:
- bash: 保留退出状态 + 末尾 5 行 + 工作目录
- read_file: 保留文件路径 + 行数 + 首尾行片段
- write_file: 保留文件路径与写入字节数
- edit: 保留编辑路径与替换范围
- grep: 保留搜索根目录 + 匹配计数 + 前几个文件名
- glob: 保留匹配计数与前几个文件名
- webfetch: 保留 URL 与截断标记

无 summarizer 的工具维持原有清除行为,完全向后兼容。
- 统一 builder 构造逻辑,使用 newDefaultBuilder 和 newPromptSources 辅助函数
- 优化 summarizeOrClear 实现,避免重复渲染内容
- 合并并增强测试覆盖,补充边界条件和回归场景
- 改进内置摘要器实现,使用结构化统计信息替代原始内容
- 新增辅助函数提升代码可维护性和安全性(sanitization)

所有测试通过,覆盖率符合项目要求。
@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/review

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/simplify

fennoai[bot]

This comment was marked as outdated.

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

完成结果

已按本次触发要求执行:检查历史评论并定位未解决 review,修复可落地问题,尝试 code-simplifier 子代理后完成主流程等价简化审视,最后提交并推送到当前 PR 头分支。

已处理内容

  1. 修复未解决 review 评论
  • internal/context/microcompact.go
    • summarizeOrClear(...) 的最终回灌边界新增统一安全兜底:控制字符净化 + 最大长度裁剪。
    • 新增 sanitizeMicroCompactSummarytruncateSummaryRunes,并在净化后为空时回退 microCompactClearedMessage
  • internal/tools/micro_compact_summarizers_builtin.go
    • 对内置摘要中的 metadata 字段统一走净化入口,不再直接插入原始 workdir/path/relative_path/root
    • 新增 metadataToken(...),复用 sanitizeSummaryToken 并限制 token 长度。
  1. 测试补齐
  • internal/context/microcompact_summarizer_test.go
    • 新增摘要回灌净化与截断测试。
    • 新增“净化后为空回退占位”测试。
  • internal/tools/micro_compact_summarizer_test.go
    • 新增 metadata 净化测试:bash/read_file/write_file/edit/grep
  1. code-simplifier 执行情况
  • 子代理第一次调用返回上游 502
  • 第二次调用返回空结果(无可用建议)。
  • 已在主流程完成等价低风险简化审视并落地上述必要改动。

验证

  • go test ./internal/context ./internal/tools
  • go test ./...
  • go build ./...

提交与推送

  • Commit: 35956b8
  • 已推送到当前 PR 头分支:Yumiue:main

未执行项

  • create-or-update-pr.sh 在本场景下返回 No commits between main and main(当前为已存在的 fork main -> upstream main PR,无需新建 PR)。

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/review

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

发现 2 个需要处理的问题(1 个性能,1 个注释/约束一致性),另有 1 个文档同步缺口(见下)。

补充:本 PR 改变了 micro-compact 的语义("优先摘要,失败回退清理"),建议同步更新 docs/context-compact.md,避免文档与实现脱节。

Comment thread internal/context/microcompact.go Outdated
continue
}
if !hasCompactableToolContent(cloned, span, compactableIDs) {
compactableContents := compactableToolMessageContents(cloned, span, compactableIDs)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里在判断是否属于“最近保留的 tool span”之前,就先调用 compactableToolMessageContents 渲染并缓存整段内容。对于默认保留的最近 2 个 span,这些计算随后会在 retainedCompactableSpans < retainedToolSpans 分支被直接丢弃,形成额外 CPU/分配开销。建议先做 retained 判断,再在需要压缩时提取内容。

}

// RegisterBuiltinSummarizers 将所有内置工具的内容摘要器注册到 Registry。
// 应在所有工具注册完成后调用一次。

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

注释写的是“应在所有工具注册完成后调用一次”,但当前接入点在 internal/app/bootstrap.go 中是 memo 工具注册前调用。实现本身也没有“必须最后且仅一次”的硬约束。建议统一语义:要么调整调用时机,要么放宽注释为“启动装配阶段注册内置摘要器,可重复调用覆盖同名条目”。

@pionxe

pionxe commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator

@xgopilot 仔细审查给定的 PR 代码变更。这个 PR 的核心目的是在保留大模型关键上下文的同时,对各种工具的长文本输出进行压缩(约 200 字符)。你的核心任务是寻找可能导致内存泄漏(Memory Leaks)、中文字符截断乱码(UTF-8 破坏)、接口依赖设计不当以及边缘场景崩溃的逻辑缺陷。不要关注琐碎的语法格式。

Review Checkpoints (重点审查清单)

请严格按照以下清单对代码进行检查:

  1. 字符串内存与切片陷阱 (Memory & String Handling) - 🌟 最重要:

    • 大字符串内存泄漏防范: Go 的字符串切片(如 str[:200])会与原字符串共享底层字节数组。如果工具(如 read_filewebfetch)返回了 10MB 的长文本,仅仅截取前 200 字符会导致整个 10MB 内存无法被 GC 回收!检查代码是否使用了 strings.Clone(str[:200]) 或类似机制重新分配了内存。
    • UTF-8 安全截断: 如果按字节截断(str[:200]),极容易将一个中文字符或 Emoji 劈成两半,导致乱码传递给 LLM。检查代码是否将字符串转换为了 []rune 后再进行截断,或者使用了能正确处理宽字符的截断函数。
  2. 架构解耦与依赖方向 (Architecture & Decoupling):

    • 接口定义位置: PR 提到通过 MicroCompactSummarizerSource 接口解耦。根据 Go 语言 "Accept interfaces, return structs" 的最佳实践,检查该接口是否定义在使用方(即 context 包)中,而不是定义在 tools 包中。
    • 循环依赖 (Circular Dependency): 确认 internal/context 是否存在反向导入 internal/tools 的情况。
  3. 工具特异性摘要逻辑 (Tool-Specific Summarization):

    • 截断策略的合理性: 200 个字符对于不同工具的价值不同。
      • read_file: 是截取前 200 字,还是采用更智能的 [开头100字 ... 结尾100字] 策略?(通常看文件头尾更有用)。
      • grep: 是否优先保留了匹配行的信息?
      • bash: 如果执行失败(有 stderr),摘要器是否优先保留了报错信息而不是无关的 stdout
    • 无实际内容的防范: 如果工具本身的输出非常短(< 200 字符),检查代码是否做了前置判断,避免不必要的切片或克隆操作。
  4. 向后兼容与稳定性 (Fallback & Stability):

    • Nil 安全: 对于未注册 Summarizer 的新工具,检查 fallback 机制是否绝对安全。如果 summarizer == nil,是否能稳定回退到 [Old tool result content cleared] 而不会触发 Nil Pointer Dereference (panic)。
    • 并发注册安全: 如果 ContentSummarizer 允许在运行时动态注册/注销,对应的 registry.gomanager.go 中是否添加了 sync.RWMutex 保护?

Output Format

请以 Markdown 格式输出你的审查报告。要求直奔主题,结构如下:

  1. 🛑 严重缺陷 (Blockers): 指出存在内存泄漏风险(字符串切片底层数组逃逸)、乱码风险(非 UTF-8 安全截断)、导致 Panic 的边缘场景的代码行,并给出修复方案。
  2. ⚠️ 逻辑漏洞与优化 (Suggestions): 指出特定工具摘要策略不够智能的地方,或者可以优化的性能点(如避免不必要的 rune 转换)。
  3. ✅ 架构合规项 (Passed): 简要列出 PR 中接口解耦、Fallback 向后兼容等做得好的地方。

如果你在上述清单中未发现问题,请在报告中明确回复“针对 [第 X 项],代码已通过审查,未发现问题”。

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

🛑 严重缺陷 (Blockers)

  1. Registry 的 summarizer 读写没有并发保护,存在运行时 concurrent map read and map write 崩溃风险。
  • 位置:internal/tools/registry.go:107-125RegisterSummarizer / MicroCompactSummarizer
  • 问题:新增公开接口允许动态注册/注销,但底层 map[string]ContentSummarizersync.RWMutex,并且同时 runtime 侧会在构建上下文时读取 summarizer。
  • 风险:一旦后续引入热更新注册、插件动态注册或并发初始化,直接 panic(属于边缘场景崩溃)。
  • 修复建议:在 Registry 增加 sync.RWMutex,对 tools/microCompactPolicies/microCompactSummarizers 的读写统一加锁(至少覆盖 Register/Get/Supports/MicroCompactPolicy/RegisterSummarizer/MicroCompactSummarizer)。

⚠️ 逻辑漏洞与优化 (Suggestions)

  1. 对“保留窗口内不压缩”的 span 也会先渲染并缓存完整工具输出,造成不必要的大文本遍历与暂存。
  • 位置:internal/context/microcompact.go:53-59
  • 说明:compactableToolMessageContents(...) 在判断 retainedCompactableSpans < retainedToolSpans 之前执行;对于最近保留的工具块,计算结果会被直接丢弃。
  • 建议:先判断是否在保留窗口,再决定是否收集 compactableContents,可减少大输出场景下的 CPU/瞬时内存压力。
  1. bashSummarizerisError 分支在当前微压缩路径上不可达。
  • 位置:internal/context/microcompact.go:157, internal/tools/micro_compact_summarizers_builtin.go:42-46
  • 说明:compactableToolMessageContent 过滤了 message.IsError == true,导致传给 summarizer 的 isError 总是 false。如果后续目标是“失败时优先保留 stderr 关键信息”,当前路径无法实现。
  • 建议:明确策略二选一:
    • 要么保持错误输出不压缩并删除 isError 分支(避免误导);
    • 要么允许错误消息进入 summarizer,并在 bashSummarizer 中优先抽取错误上下文。
  1. read_file 摘要策略当前仅保留统计信息,不保留头尾上下文。
  • 位置:internal/tools/micro_compact_summarizers_builtin.go:60-75
  • 说明:会丢失“文件开头声明 + 文件结尾返回/错误处理”这类常见关键信息。
  • 建议:可改成头尾片段策略(例如 head + ... + tail,各 80~100 rune,且继续保留 UTF-8 安全截断)。

✅ 架构合规项 (Passed)

  • 针对检查点 1(UTF-8 安全截断):已通过审查,未发现中文截断乱码问题。truncateRunestruncateSummaryRunes 都按 []rune 截断(internal/tools/micro_compact_summarizers_builtin.go:160-170, internal/context/microcompact.go:228-239)。
  • 针对检查点 1(大字符串切片泄漏):内置 summarizer 路径未发现把大文本子切片直接长期回灌的逻辑;摘要输出在净化/拼装路径会形成新字符串。
  • 针对检查点 2(接口定义位置):已通过审查,MicroCompactSummarizerSource 定义在使用方 context 包(internal/context/types.go:39-42)。
  • 针对检查点 2(循环依赖):已通过审查,未发现 internal/tools 反向导入 internal/context
  • 针对检查点 4(fallback 与 nil 安全):已通过审查,summarizers == nilsummarizer == nil、摘要为空都稳定回退到 [Old tool result content cleared],未见空指针风险(internal/context/microcompact.go:179-201)。

补充:本地已执行 go test ./...,全部通过。

View job run

@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/simplify

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

Result

Completed the requested flow: checked unresolved review comments, applied worthwhile fixes, attempted code-simplifier agent, and pushed changes.

What was fixed

  • internal/context/microcompact.go
    • moved retained-span gating ahead of full compactable content-map extraction.
    • added hasCompactableToolMessage(...) so retained spans avoid unnecessary map build/allocation work.
  • internal/tools/micro_compact_summarizers_builtin.go
    • corrected RegisterBuiltinSummarizers comment to match actual startup usage and idempotent overwrite behavior.
  • internal/tools/registry.go
    • added sync.RWMutex protection for summarizer register/read path to avoid concurrent map access risk.
  • tests
    • added TestHasCompactableToolMessage.
    • added TestRegisterSummarizerConcurrentAccess.

Simplifier agent

  • Tried code-simplifier sub-agent twice; both failed with upstream 502.
  • Performed equivalent low-risk simplification directly in the main flow.

Verification

  • gofmt -w on touched files
  • go test ./internal/context ./internal/tools
  • go test ./...
  • go build ./...

Commit & Push

Not done

  • No behavior-level policy changes (e.g., default summarizer enable/disable strategy); only low-risk fix/simplify updates requested in this run.

View job run

xgopilot and others added 2 commits April 17, 2026 03:53
Generated with [codeagent](https://github.com/qbox/codeagent)

Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
fix(context/tools): resolve unresolved simplify review items
@wynxing

wynxing commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator Author

/code 解决冲突

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

处理结果

已完成“解决冲突”,并推送到当前 PR 分支 Yumiue:main

具体操作

  • origin/main 合入当前 PR 分支时出现 1 处冲突:internal/tools/manager.go
  • 冲突解决策略:
    • 保留主分支中的权限/能力增强相关变更
    • 同时保留本 PR 的 MicroCompactSummarizer(name string) ContentSummarizer 接口能力
  • 已完成 merge commit 并推送:4de12bd

验证

  • go test ./... 通过
  • PR 合并状态已变更为 CLEAN

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com>
@phantom5099 phantom5099 merged commit bbea126 into 1024XEngineer:main Apr 17, 2026
2 checks passed
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.

4 participants