提交前确认 / Preflight
想解决什么问题 / What problem does this solve
动机
agent 调用 Write 工具时,content 参数偶尔不是实际文件内容,而是工具调用的结果确认文本:
[已写入 E:\...\xxx.go,732 字节/30 行;需要内容用 Read 查看]
服务端原样写入 → 文件被错误内容覆盖,且返回 Success=true,静默失败——用户和模型都以为写成功了,直到 Read 才发现内容不对。
触发条件(经验观察)
- 长会话(上下文大)或单次大 content 输出时更易出现
- 表现为把"调用后返回的确认信息"当成"要写入的内容"——生成侧行为退化
现状
WriteFile(tools/write_file.go)对 content 无任何校验,原样 os.WriteFile。
- 模型在特定上下文状态下,content 生成退化为元描述(占位),工具无法区分"真内容"与"占位"。
- 静默成功 → 错误内容落盘且不可察觉,污染工作区。
期望的方案 / Proposed solution
建议实现
服务端在写入前做占位检测,命中即拒绝并报错,把"静默失败"变成"响亮失败":
// isPlaceholderText:拒绝 "[已写入" 前缀(覆盖所有变体:字节数/行数/分号等)+ 精确正则
func isPlaceholderText(s string) bool {
t := strings.TrimSpace(s)
if t == "" {
return false
}
return strings.HasPrefix(t, "[已写入") || placeholderRe.MatchString(t)
}
WriteFile:空/空白 content 一并拒绝("空占位符"场景)
EditFile:new_string 走同一检测(不拒绝空串——删除操作合法)
- 正常代码/文档几乎不可能以
[已写入 开头,误伤概率≈0
备选方案 / Alternatives
No response
提交前确认 / Preflight
想解决什么问题 / What problem does this solve
动机
agent 调用
Write工具时,content参数偶尔不是实际文件内容,而是工具调用的结果确认文本:服务端原样写入 → 文件被错误内容覆盖,且返回 Success=true,静默失败——用户和模型都以为写成功了,直到 Read 才发现内容不对。
触发条件(经验观察)
现状
WriteFile(tools/write_file.go)对 content 无任何校验,原样os.WriteFile。期望的方案 / Proposed solution
建议实现
服务端在写入前做占位检测,命中即拒绝并报错,把"静默失败"变成"响亮失败":
WriteFile:空/空白 content 一并拒绝("空占位符"场景)EditFile:new_string 走同一检测(不拒绝空串——删除操作合法)[已写入开头,误伤概率≈0备选方案 / Alternatives
No response