95d6068860
run 21 的 GDD 是 133 行,而 file.read 的默认 maxLines 是 120,于是被迫分成 1-120 / 121-133 两页。模型把第二页读了两遍,把三个 actionId 全提交上去, validate_fast_gdd_file_read_coverage 排序后严格走 `start_line == next_line`: 1-120 → next_line = 121 ✓ 121-133 → next_line = 134 ✓ 121-133 → 121 != 134 ✗「必须从第 1 行无缺口、无重叠地覆盖到文件末尾」 连吃三次 agent.acceptance_update 拒绝,第四次才猜对该交哪两个 id。 同一页读两遍不削弱证据,不该判成重叠。覆盖检查前先按完全相同的 (startLine, endLine, contentSha256) 折叠——内容 SHA 在上一步已经要求全体一致, 折叠掉的确实是同一页的重复回执。真缺口与部分重叠照旧拒绝,有用例钉住。 顺带把取证指令和 playbook 第 5 步改成「每次都传 maxLines=240(上限),尽量一页 读完;确实需要第二页时从上一页的下一行开始,不要重复读同一段」,让典型 GDD 根本 不进分页逻辑。 另记一笔本次排查暴露的可观测性缺口(未修):agent.acceptance_update 的拒绝理由只 回灌给模型,durable receipt 是 detailUnavailable=true / safeDetail=null,事后在 日志和 agent.db 里都查不到,这类拒绝无法复盘。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>