Step 1: 读 Issue(只理解,不改代码)
✅ 仔细阅读 issue 描述
✅ 理解问题现象
✅ 理解预期行为
❌ 不要凭记忆猜测
❌ 不要急着看代码
Issue #56: summary 变量覆盖问题
问题:
- compress() 循环中 summary 变量被覆盖
- 只保留最后一个工具的摘要
- 前面的全部丢失
预期:
- 所有工具的摘要都要保留
- 合并输出
【任务类型】Bug 修复 / 功能新增 / 重构 / 兼容性修复
【目标】一句话描述这次修复/新增的内容
【边界】只修改哪些文件/函数
【非目标】明确不打算改的内容
【影响范围】受影响的模块/功能
✅ 目标明确
✅ 边界清晰
✅ 非目标明确
❌ 不要模糊表述
❌ 不要说"顺便"
【任务类型】Bug 修复
【目标】修复 compress() 中 summary 变量覆盖问题
【边界】只修改 scripts/xxx.py 的 compress() 函数
【非目标】不修改 CLI、不重构其他函数、不新增文件
【影响范围】compress() 函数、输出显示
# 查看可用版本
git tag | sort -V | tail -5
# 基于 release 版本开始
git checkout v1.2.4
# 创建新文件(避免直接修改原文件)
cp scripts/xxx.py scripts/xxx_fixed.py
✅ 从官方 release 开始
✅ 创建新文件(如 xxx_fixed.py)
✅ 确认基线版本号
❌ 不要从"本地改动了一半"的版本继续
❌ 不要凭记忆重写
# 确认当前版本
git describe --tags
# 输出:v1.2.4
# 检查文件是否存在
ls -la scripts/xxx_fixed.py
【改动点 1】
位置:scripts/xxx.py 第 XX 行
修改前:<old code>
修改后:<new code>
原因:<为什么这样改>
【改动点 2】
位置:scripts/xxx.py 第 YY 行
修改前:<old code>
修改后:<new code>
原因:<为什么这样改>
✅ 只列具体改动
✅ 说明修改原因
✅ 预估改动量
❌ 不要说"重构"、"优化"等模糊词
❌ 不要列非目标改动
【改动点 1】
位置:scripts/xxx_fixed.py 第 145 行
修改前:summary = tool['summary']
修改后:summary_parts.append(tool['summary'])
原因:避免覆盖,改用列表收集
【改动点 2】
位置:scripts/xxx_fixed.py 第 150 行
修改前:print(summary)
修改后:summary = "\n".join(summary_parts); print(summary)
原因:合并列表为字符串后输出
【预估改动量】8-12 行
先复制旧代码,再局部替换,不要凭记忆重写
改函数前,先通读函数的输入、输出、副作用
涉及数据结构变化时,先搜所有使用点
不要同时改逻辑和风格
不要在 bug fix 里做重构
不要修改未被需求要求的行为
不要在没有验证前说"修好了"
不要让 release note 超前于实际代码
# 1. 复制旧代码
def compress (input_file , output_file ):
# 旧代码...
for tool in tools :
summary = tool ['summary' ] # ← 问题代码
print (summary )
# 2. 修改
def compress (input_file , output_file ):
# 旧代码...
summary_parts = [] # ← 新增
for tool in tools :
summary_parts .append (tool ['summary' ]) # ← 修改
summary = "\n " .join (summary_parts ) # ← 新增
print (summary )
✅ 最小修改原则
✅ 保留原有结构
✅ 复用已有变量
❌ 不要重写整个函数
❌ 不要改代码风格
python3 -m py_compile scripts/xxx_fixed.py
# 无输出 = 通过
python3 -c " from scripts.xxx_fixed import compress; print('OK')"
# 输出:OK
# 构造最小样例
test_data = [
{"role" : "user" , "content" : "Hello" },
{"role" : "assistant" , "content" : "World" }
]
# 调用
result = compress (test_data )
# 验证
assert 'summary' in result
assert len (result ['summary' ]) > 0
# 运行已有测试
python3 -m pytest tests/
# 手动测试核心流程
python3 scripts/xxx_fixed.py test.jsonl -o /tmp/test.jsonl
✅ 必须通过 4 层验证
✅ 每层都要有输出
❌ 不要跳过任何一层
任务类型
预期改动量
修 1 个小 bug
5–30 行
修 1 组相关 bug
20–80 行
小功能新增
30–150 行
超过 200 行
必须怀疑是否改多了
git diff --stat scripts/xxx_fixed.py
# 输出:1 file changed, 8 insertions(+), 1 deletion(-)
# 判断:8 行,符合预期
git diff scripts/xxx_fixed.py | grep " ^+" | grep -v " ^+++"
# 检查每一行,确认都是目标改动
# release note 说"修复了 summary 覆盖问题"
# diff 里必须能找到对应修改
fix: 修复 summary 变量覆盖问题
问题:
- compress() 循环中 summary 变量被覆盖
- 只保留最后一个工具的摘要
修复:
- 改用 summary_parts 列表收集
- 循环结束后合并为字符串
影响范围:
- scripts/xxx_fixed.py compress() 函数
- 第 145-155 行
验证:
- ✅ 语法检查通过
- ✅ 导入检查通过
- ✅ 行为验证通过
- ✅ 回归测试通过
非修改:
- 不修改 CLI 参数
- 不修改其他函数
- 不修改 parser 结构
Closes #56
## v1.2.4-hotfix1 (2026-03-13)
### 修复内容
- ** Bug #56 ** : 修复 summary 变量覆盖问题
- 问题:compress() 循环中 summary 变量被覆盖
- 修复:改用列表收集,最后合并
- 位置:scripts/xxx_fixed.py compress() 函数
### 影响范围
- scripts/xxx_fixed.py
- compress() 函数(第 145-155 行)
### 验证
- ✅ 语法检查通过
- ✅ 导入检查通过
- ✅ 行为验证通过
- ✅ 回归测试通过
### 已知不变更
- ❌ 不修改 CLI 参数
- ❌ 不修改其他统计逻辑
- ❌ 不新增文件
### 做得好的地方
1. ...
2. ...
### 可以改进的地方
1. ...
2. ...
### 学到的经验
1. ...
2. ...
### 做得好的地方
1. ✅ 最小修改 - 只改了 9 行代码
2. ✅ 目标明确 - 只修 Bug #56,没有夹带私货
3. ✅ 验证完整 - 4 层验证全部通过
### 可以改进的地方
1. ⚠️ 测试用例 - 可以添加单元测试
2. ⚠️ 代码注释 - 可以添加注释说明
### 学到的经验
1. 变量覆盖很隐蔽 - 在循环中赋值同一变量容易出错
2. 列表收集更安全 - 用 append() 避免 overwriting
步骤
检查项
状态
1
我理解了 issue 描述
☐
2
我写了"5行任务卡"
☐
3
我确定了基线版本
☐
4
我列出了具体改动点
☐
5
我遵守了 8 条编码纪律
☐
6
我通过了 4 层验证
☐
7
我检查了 diff(3件事)
☐
8
我写了清晰的发布说明
☐
9
我完成了复盘
☐
遵守流程,质量保证 💕