fix(send): 修复链接校验与轮次重复发送 - #1600
Conversation
|
你好,你的 PR #1600 评审群已自动创建,维护者和多个 reviewer 会在群内进行评审讨论。请点击以下飞书群链接申请加入评审群(链接一年有效): 另外,当前自动拉群名单暂时没能关联上你的飞书账号(自动邀请不可见,所以没能直接拉你入群)。方便的话可以把 GitHub 账号与飞书信息补录到名单文档:https://bytedance.larkoffice.com/wiki/WJ1nwWbtxi89erkNGNbcgkt9nUe ,补录后后续评审会自动把你拉进群。 本条为自动评审流程发出的消息,最终结论以维护者审阅为准,谢谢! |
|
自动评审初步意见(最终以维护者审阅为准)。整体设计扎实:ledger 的 final 指纹栅栏 + 稳定 P2 建议修改1. 纯文件发送被无条件整体读入内存,>512MiB 附件会直接失败(回归)
改动前纯文件发送是按路径流式上传、从不读内容。现在:
建议:仅当 2. 文档评论轮的非 final 发送会以隐晦报错失败
3. in-flight 卡死之后没有人工恢复入口(可作 follow-up) 文档评论某分块响应未知时,fail-closed 是对的,但该 turn 之后所有重试都会永远报 P3 nit(可不阻塞)
验证记录(评审方本地)
|
|
第二轮评审(双审收敛,自动评审意见,最终以维护者为准)。首审那条评论(#5882191483)的基础上,复审独立复现了行为对比并发现两处更重的回归;我这边对每条都做了独立探针复现(非复述),双方一致认为以下清单项建议合码前收敛。 合码前建议收敛(4 项)1. file-only 附件读取回归(首审 P2-1 + 复审补充实证)
修法建议:UTF-8 解码严格 gate 在 2. ledger 把「不同请求」当成「同一请求」返回 success(静默数据丢失)
ledger 注释说 route-agnostic 是刻意设计,「一轮不发第二个 final 到别处」这个意图我们认同;真正的缺陷是 fingerprint 只哈希可见正文文本(cli.ts:9867-9876 + ledger.execute),destination / mentions / 附件与媒体都不在内,导致不同的请求被当作同一个请求的幂等重放并回报成功。修法:
3. doc-comment:未触达 provider 的失败把整轮评论永久焊死(且默认 send 就硬失败)
4. final 之后的补充发送与给模型的指引自相矛盾 follow-up 即可(不阻塞)ledger 文件按哈希命名、无 TTL 清扫; 评审方实测环境rebase 到 origin/master 3830d82(零冲突,patch-id 980d3882… 与作者 head f5ef740 逐字一致); |
|
补充两条修复收口细节(接续上一条 #5883483858 的门槛 ②③,自动评审意见,最终以维护者为准): 关于 ③:ledger 记录没有任何生命周期清理,卡死会跨会话存活
关于 ②③ 的交叉点:doc-comment 的指纹不要退化成「正文相等即重放」 doc 分块路径当前的 |
|
第三轮自动评审(fa7f7783,仍以维护者最终审阅为准)。 上轮 4 项合码门槛——逐条复核已收敛
评审方在最新主干(2c95db63f)上本地 rebase(未动你的远端): 合最新主干时有一处必须处理的语义冲突(非本 PR 源码缺陷)主干 09-29 合入的 #1597(2c95db63f)与本 PR 改同一区域。把你的分支 rebase/merge 到最新 master 时,
我在本地并集版本里把这 3 个用例按新语义改写期望后跑过,33/33 全绿,即合并后源码行为自洽,需要的只是同步这几个测试断言与 fixture 并集(fixture 需同时支持 CAPTURE_REQUEST+IM 路径和 CAPTURE_DOC_REPLY+一次性拒绝标记)。你下次合入最新 master 时请一并处理,届时我们会基于新 head 重新全量复审。 CI 与小问题
|
我的分支下午已经 merge 过一次远端 master 了(resolve 过冲突),还需要我在当前分支处理这个问题吗 |
|
🚀 Released in v3.33.0 |
问题背景
部分 Botmux 调用方需要发送带有较长 query 参数的权威链接,例如问题详情链接。链接经过模型生成或正文整理后,可能出现参数被截断、遗漏或改写的情况。
此前
botmux send会直接发送最终生成内容,无法判断调用方要求保留的完整链接是否仍然存在。一旦链接损坏,Botmux 仍会产生消息、上传文件或发布评论等外部副作用。此外,同一轮任务在重试、进程恢复或响应状态不确定时,可能重复执行 final 发送,导致:
根因
botmux send缺少调用方可声明的内容完整性约束,无法验证关键 URL 是否被原样保留。修复方案
1. 增加通用链接完整性校验
新增可重复参数:
发送前会检查每个 --expected-link 是否原样存在于最终可见内容中:
• 仅接受完整的 HTTP/HTTPS URL
• 支持重复传入多个链接
• 不自动拼接、修复或规范化 URL
• 在 TTS、文件上传、联系人查询和消息发送等外部副作用之前完成校验
• 链接缺失时直接拒绝发送
校验覆盖:
• 普通文本和回复卡片
• 自定义卡片的可见正文
• sandbox relay
• 语音发送
• 文件及 file-only final
• 文档评论
• 某一步响应状态未知时 fail closed,避免产生重复评论
通用性与兼容性
该修复不依赖 DACU 或具体业务链接,是通用的发送完整性保护。
调用方需要主动传入权威 URL:
botmux send
--response-kind final
--expected-link "https://example.com/detail"
"详情:https://example.com/detail"
兼容性说明:
• 未传 --expected-link 时,不启用链接完整性校验
• 只有具备 turn 上下文的发送才启用持久化轮次幂等
• 不改变 URL 内容,也不尝试从不完整链接推导完整链接
• sandbox relay 已支持并校验新参数
测试
针对本次改动的 6 个测试文件:
• 87/87 tests passed
• npm run build passed
• git diff --check passed
Node 22 本地全量 unit 测试结果:
• 26,081 passed
• 21 skipped
• 5 failed
其中 4 项已在干净的 origin/master 上复现:
• plugin-mcp-sandbox.test.ts:2 项
• worker-codex-startup-readiness.integration.test.ts:2 项
另有 1 项 dashboard-ipc.test.ts 失败,未涉及本 PR 修改的文件。