Repository navigation
fix(source-read): continue bounded public text at a verified digest - #6954
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机
隔离 Chat 中需要审查较长公开源码的 Agent 会遇到这个问题。例如一份超过十万字符的源码,旧工具每次只能返回开头,后段恢复逻辑始终不可达;新工具允许按已返回的偏移和摘要续读。同一真实 MCP 调用脚本在基线无法拼回全文,在本次 head 能拼回全部 105728 个字符,同时保留原有首段内容和私有地址拒绝结果。本 PR 只交付匿名静态文本续读,不改变消息补办、业务执行、身份权限或社区 Bot 整体验收结论。实际运行 Bot 的安装采用与新的原生会话验收仍须另行验证,已有部分读取、图像失败和社区发布门禁不会因此自动变为通过。
这是一个可交付的修复增量,不能据此宣称整个 Bot 已修好。它解决的是“工具已取得正文却无法把后段交给模型”的实际能力缺口,而不是让模型换一种措辞掩盖未读内容。继续重复同一个调用只会重复首段,调整提示词本身也无法创造不可达的后段。
改动思路
续读属于既有匿名 IO provider;范围字段从当前正文派生,不建立缓存、第二套读取器或业务决策 authority。本 PR 同时交付工具参数、隔离 worker、原生启用提示、测试和文档;正式 Bot 的安装采用与完整黄金集保留在各自验收边界。
我比较了不改、提高文本上限、手工复制源码和增加缓存四条路。提高上限会扩大单次输出;手工注入需要用户或 Root 代办;缓存则引入新的过期和隔离问题。这里保留现有每次十万字符、四兆字节及三十秒限制,每次重新取得正文并校验完整摘要,代价是续读仍会产生一次请求,不承诺性能或费用下降。
| 触发 | 基线行为 | 本次行为 |
|---|---|---|
| 公开源码超过十万字符 | 重复读取仍只有首段 | 按 next_offset 取下一段 |
| 续读时源码改变 | 无可靠续读入口 | 摘要不同则不返回正文 |
| host 没有启用 reader | 无工具与相关提示 | 保持相同行为 |
契约以修改前的 docs/integrations/public-source-reader.md 为准,revision 0a37fb55416d44012e167ad1ecd5f34a043c93db。原文无编号,审查映射 STATIC-BOUNDS、SOURCE-COVERAGE、HOST-ADMISSION、QUALIFICATION-BOUNDARY 分别对应有界匿名 IO、诚实覆盖范围、默认关闭和独立原生验收,不将文档本次新增段落反过来当作既有要求。
具体改动
关键代码讲解
_text_page_parameters同时供入口和 worker 使用。偏移必须是有界的整数,布尔值不能混入;非零偏移必须提供原始完整摘要。它只维护读取参数一致性,不新增权限判定者。article先计算全部响应字节的摘要,若预期值不同立即返回public_source_changed,没有正文;随后按解码后的字符范围切片。HTML 先沿原流程提取文本,范围仍以提取结果计。尾段可能仍为truncated=true,因为它不含首段;是否还有下一段由next_offset决定。read_public_url沿用原来的锁、公开地址校验和隔离观察 worker,只把参数传给既有路径。私有地址仍拒绝,超时仍返回原有脱敏错误。默认调用不需要补新参数。public_source_read_context保留版本、摘要、图像、输出预算和隐私等原提示,只在真实 admitted tools 存在时增加一条续读说明。缺失、关闭或不匹配工具的三种配置,在基线和 head 都返回空文本。
正向路径是首次调用得到 [0,100000) 和 SHA,再用同一 SHA 读取 [100000,105728)。反向路径是在第二次读取中遇到内容变化:摘要比较先于返回正文,调用方必须从零重读,不能拼接两个版本。源码与独立安装 wheel 的两个 focused suites 均为 91 passed,真实 stdio MCP 及隔离 worker 也完成了全文拼接、错误摘要无正文和私有地址拒绝。
我额外用完全相同的真实 MCP 调用脚本比较基线和本次 head,而非只调用内部 helper:旧 MCP 接口忽略新增参数,返回的仍是首段,全文 oracle 以 exit 1 失败;本次以 exit 0 通过。默认首段的全部旧字段和文本、私有地址错误完全相等,只排除了刻意新增的三个范围字段。仓库 premerge 的六项直接检查和十一项选中检查均通过;按当前政策未读取或等待 GitHub CI。源码和 wheel 使用的生产模块字节已核对。
对主干的风险
最需要防的反例是第一次取得首段后,URL 的后段变化;单纯 offset 会把不同时刻的内容拼成虚假证据。本次整段摘要比较阻止这个路径,单元测试补充变化正文、Unicode、HTML、边界与无效参数,真实 MCP 检查则防止 schema 或 worker 没有实际接受参数却让 helper 测试假绿。四兆字节、超时、HTTPS 地址与 DNS 检查和图像行为没有改动。
每一页会重新请求,遇到不断变化的来源可能只能诚实报告未完成;此时可从零重读或关闭既有可选能力,不能扩权。这不是总耗时或费用优化,也没有测得这类收益。早期低于十万字符的 Unicode 测试夹具及过期前端 bundle 的构建失败均保留,最终检查使用已修正夹具和标准重建的包,没有放宽断言、预算或发布门禁。
本次没有 UI 代码变化;真实模型是否会自行续读、原 Topic 回传是否完整、黄金集和图像验收仍必须在运行服务采用后独立检查。MCP 成功只证明这条读取能力可用,不证明业务补办完成,也不会把历史部分读取或失败改记为成功。
我的整体评价
APPROVE,限 exact head 8cafa4a3aa10972a9eddffb6f31995dd29fe1880。这是由实际任务暴露的能力缺口驱动的小范围修复,既有 IO owner 足以承担,新增状态均为当前响应派生,默认关闭和用户原有授权边界保持。无需用户为续读额外复制源码、补配置或重复确认。当前没有核实的阻塞回归;接受其作为可用的读取增量,同时继续保留运行服务采用与完整 Bot 验收的独立结论。
English verdict: APPROVE for exact head 8cafa4a3aa10972a9eddffb6f31995dd29fe1880. The existing anonymous reader now supports bounded, digest-checked continuation. Real base/head MCP comparison, 91 source and 91 installed-wheel tests, and repository premerge passed. Installed Bot adoption and the complete community qualification remain separate; this author-owned COMMENTED review is not formal GitHub approval.
An isolated Chat source review could only reach the first 100,000 characters, even when the reader fetched and hashed the entire response. This prevented inspection of later recovery code.
Extend the existing read_public_url tool with a character offset and previous-source digest. Each response keeps the current bound; changed sources return no text. Native context explains continuation. Anonymous transport, address checks, worker isolation and default-off admission keep their existing owners. No cache, business replay or permission changes.
Validation: 91 focused source tests and 91 tests against an independently installed Python 3.12 wheel. Real stdio MCP plus its isolated worker joined a pinned 106,488-byte source, rejected a stale digest and a private URL. The same MCP caller fails the full-source oracle on the base and passes on this head; legacy prefix/error payloads stay equal except for the three intentional range fields. Repository premerge passed six direct and eleven selected checks. The stale frontend bundle was rebuilt through the standard Chat build before wheel qualification. Current Goal policy disables exact-scope quality receipts; GitHub CI was not consulted.
Actual installed Bot adoption, original-topic readback and the complete community golden pack remain separate acceptance. Existing partial reads and release holds are preserved.