Skip to content

[Grok/dsh 74] 内置研究流程端到端兼容 #206

Closed

Description

@Blackman99

Parent

#132

Ticket: 74

Status: ready-for-agent

User Stories: 48, 49, 50, 55(见父规格)

What to build

用户运行固定版本的内置研究入口,通过配置服务和 dsh 子代理获得带证据、覆盖限制与真实失败信息的研究结果。

Acceptance criteria

  • 在允许许可下复用该内置流程、提示和支持资源,并核对其固定版本行为,不仿造一个同名简化提示。
  • 规划、采集、验证、预算与报告均实际运行;来源可追溯,未验证内容不被标成已证实。
  • 分支失败、部分覆盖、取消、缺服务和限流有准确状态,不隐藏在成功总结内。
  • 测试服务覆盖错误分支,获批准的真实替代服务验证整条流程;其他发现的内置流程独立分票,不默认随此票完成。

Blocked by

Delivery contract

用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。

Activity

  1. Blackman99 commented on Sep 26, 2026

    @Blackman99
    OwnerAuthor

    已集成到 rewrite/grok-dsh-20260920:490a12f(#206 真实运行暴露问题的修复,已 rebase 到 22f6bb8 并重新检查)。原实现为 5b300a8。

    修复内容(来自本机真实运行发现的问题)

    1. 网页工具注册改由生效设置决定(阻塞项):此前启动器在 Rust 客户端读取 config.toml 之前,就按 CODSH_WEB_SEARCH / CODSH_WEB_FETCH 环境变量写 dsh 的 tool-web 行,所以只在 config.toml 中配置时是 search:false fetch:false,研究代理拿不到 web_search/web_fetch。现在 rust.mjs 只写 fail-closed 占位行,config::apply_to_dsh(及测试 seam 补丁)在其后追加 web_tools_yaml,取值为生效的 web.search/fetch.enabled(config.toml + GROK_WEB_FETCH/GROK_DISABLE_WEB_SEARCH 等环境变量覆盖 + requirements + --disable-web-search)。游离的 CODSH_WEB_* 不再算设置。这一修复同时恢复了 [Grok/dsh 39] 可配置网页搜索与获取 #171 仅用 config.toml 配置时的会话内网页搜索。
    2. partial 结果不再显示成普通成功:完成通知为 ◎ Task completed · workflow deep-research [complete (result: partial)],workflow 事件带 result,/tasks 行与工作流块标题显示 complete (result: partial),与 /workflow runs 的 Result status: partial 一致。
    3. 无头 -p "/deep-research <问题>" 真正执行内置命令(按参考 slash_exec 行为):客户端发 workflow_launch 而不是把文本交给模型,插件前台等待(CODSH_WORKFLOW_FOREGROUND),结果块作为回答;运行完成(partial 或 verified)退出码 0,停止/阻塞/预算用尽/失败为 1,收到信号会停止运行;无问题时输出参考用法。streaming-messages-json 的 init 行在发出启动时立即输出,列出会话可见工具(新增 control tools 请求)并在 slash_commands 中列出 deep-research。
    • 未加入验证代理强制抓取和密钥剥离(未获批准)。文档:README / README.zh(含子代理审批说明与真实运行记录)、CONTEXT、CONTRIBUTING、changeset。

    检查(本机 Linux x86_64,rebase 后的 490a12f)

    • 新增 scripts/rust-web-config-pty-test.py(packed 安装产物,不设 CODSH_WEB_*、不用 CODSH_ACP_PATCH,回环 OpenAI 形态假模型 + 假 SearXNG/页面;已加入 test:rust:pty):通过。只靠 config.toml 时会话提供并实际调用 web_search/web_fetch;-p init 含两者与 workflow、slash_commands == ["deep-research"];GROK_DISABLE_WEB_SEARCH=1 只剩 fetch;未配置但设了游离 CODSH_WEB_* 时两者都没有。
    • 修正掩盖问题的旧测试:rust-workflow-pty-test.py 的 overlay 改为以 web 关闭生成,只由 config.toml 打开工具,并新增 partial 通知/任务行与无头 /deep-research(含无问题用法、init)检查:通过;rust-plain-pipe-test.py 不再因游离 CODSH_WEB_SEARCH 期望出现 web_search。
    • Rust 单测新增:config(不设 CODSH_WEB_*:仅配置、环境覆盖、--disable-web-search、游离环境变量)、control、headless、subagents、plain 路径;spec 新增 statusWords 与 partial workflow 事件。
    • cargo test --locked --workspace --no-fail-fast:codsh-rust 782 passed / 4 失败(2 个 filesystem_sandbox、privacy、voice,与基线相同的 Linux 已知失败),其他 crate 1043 passed。cargo fmt --check 干净;严格 Clippy -D warnings 仅基线已有的 filesystem_sandbox.rs:743 与 :1372 两项,-A dead_code -A clippy::needless_return 下 0 警告。
    • pnpm run typecheck 通过;pnpm test 108 文件 / 2645 passed / 15 skipped。
    • pnpm run build、pnpm run build:rust 成功(native linux-x64 SHA-256 6a08ed50c4000230f47b0a5f9265d42cf8fdc037673bec948dba062af42f188d);check:rust-package 与 rust-install-test.py 通过。
    • PTY:rust-web-config(新)、rust-workflow、rust-image-gen、rust-video-gen、rust-memory-capture 通过。rust-plain-pipe-test.py 在本机于修改部分之前的沙箱用例处因无 bubblewrap 拒绝(needs a macOS Seatbelt subpath or a Linux bubblewrap bind),跳过该沙箱段后全部通过;核心 PTY 测试在 Linux 上按设计拒绝运行。
    • legacy e2e(pnpm 10.34.5)全套 19 文件 / 177 passed / 1 skipped。

    真实运行(本机 localhost,免费无密钥)

    llama.cpp b11200 llama-server + Qwen3-4B-Instruct-2507 Q4_K_M(CPU,-c 20480 -np 1),源码安装的 SearXNG(127.0.0.1:18888,JSON 格式),GROK_WORKFLOW_MAX_CONCURRENT_AGENTS=1。问题:“In which Rust release was the Rust 2024 edition stabilized, and on what date was it announced?”

    修复前(2026-09-26,95070ba):

    • run1(仅 config.toml):生成的 overlay 为 tool-web search:false fetch:false,研究代理没有任何网页工具,结果 partial,但通知与 /tasks 显示 complete。
    • run2(手动设置 CODSH_WEB_SEARCH=1 CODSH_WEB_FETCH=1,即所有旧测试的做法):4 个研究代理真实调用 SearXNG;两个验证代理输出裸数组未通过 schema,结果 partial(35 分钟)。
    • 取消:运行 90 秒后 /workflow stop,/workflow runs、/tasks、通知均为 cancelled,研究代理被取消,无报告、无残留进程。
    • 无头(旧方式,让模型调用 workflow 工具):规划/研究/验证/报告均运行,7 条带引用结论,status partial;init 为 tools:[]、slash_commands:[];-p "/deep-research" 被发给模型,退出码 1。

    修复后(2026-09-27,本分支构建,全程不设任何 CODSH_WEB_*,web 配置只来自 config.toml):

    • 交互 run1(01:23–02:41):生成配置中占位行之后追加了生效行 search:true fetch:true;4 个研究代理都真实调用了 web_search。所有 web_fetch 都返回 Error: permission mode ask——工作流子代理不能回答审批(codsh 既有规则:子代理内的 ask 会被拒绝),而默认模式是 ask。两个验证代理 schema 失败 → Status: Partial。显示:通知 [complete (result: partial)],/tasks 为 'deep-research' — complete (result: partial) · Verify · 7 agents,/workflow runs 为 Result status: partial。
    • 无头(02:41–03:16,--always-approve):-p "/deep-research" 输出参考用法,退出码 0;-p "/deep-research <问题>" --output-format streaming-messages-json 第 1 行 init 含 30 个工具(含 web_search、web_fetch、workflow)与 slash_commands:["deep-research"];内置命令实际运行了整个流程(规划 2 问题,2 个研究代理搜索+抓取,2 个验证代理,综合报告),结果 — status: complete、Result status: partial,9 条带引用结论(1.85.0,2025-02-20,来源 blog.rust-lang.org / doc.rust-lang.org 等),2 条被验证排除,综合正文引用校验失败 → 改用确定性列表;退出码 0,35 分钟。
    • 交互 run2(03:36–04:46,同一 config.toml 另加 [permission] allow = ["WebFetch(domain:…)"] 覆盖抓取白名单域名):研究代理 web_search + web_fetch 均成功,两个验证代理都实际抓取了来源;验证代理 1 输出未通过 schema,其分片被排除。报告 Status: Partial,综合回答“Rust 2024 edition 在 Rust 1.85.0 中稳定,于 2025 年 2 月 20 日发布公告”,引用 [S1]–[S6] 均为 blog.rust-lang.org,覆盖范围列出分片失败与被排除的结论。通知、/tasks(complete (result: partial) · Report · 6 agents)、/workflow runs 均显示 partial。运行的 script.rhai 与固定版本逐字节相同。
    • 服务已停止。

    对照验收标准

    • 复用固定版本内置流程、提示与资源,不仿造简化提示:通过。参考 a28ee2b 的 deep_research.rhai 逐字节固定并有摘要校验;真实运行保存的 script.rhai 与之相同,子代理拿到的是参考提示原文。参考中编译进的内置工作流只有这一个;bundled 作用域在参考中从托管存储下载,本构建没有,不随此票完成。
    • 规划、采集、验证、预算与报告均实际运行;来源可追溯,未验证内容不被标成已证实:通过。真实运行中规划、研究(真实搜索与抓取)、验证、报告均运行,报告来源为可打开的 URL,未通过验证的结论被排除并列入覆盖范围;预算与停止由假服务测试覆盖(真实运行未触及预算上限)。
    • 分支失败、部分覆盖、取消、缺服务和限流有准确状态,不隐藏在成功总结中:通过。partial 现在在通知、/tasks、工作流块、/workflow runs 与无头结果中一致显示;真实取消为 cancelled;缺网页工具与抓取被拒都以不确定项写入报告并标为 partial;限流仅用假服务验证。
    • 测试服务覆盖错误分支,真实替代服务验证整条流程:通过。假 SearXNG/页面服务覆盖失败分支、限流、否定结论、引用校验失败、缺服务、规划失败、停止、预算与无问题暂停;本机 SearXNG + 本地模型完成了整条流程。

    已记录的差异 / 未覆盖

    • 验证代理打开来源不是强制的(与参考脚本相同):无头运行中验证代理 0 未调用任何工具即给出 supported。
    • 研究代理不会被告知当前日期(与参考相同)。
    • 限流只用假服务测试,未在线触发。
    • 工作流子代理不能回答审批,默认 ask 模式下它们的 web_fetch 需要允许规则、已记住的域名授权或 always-approve,否则抓取被拒并如实报告为不确定项(已写入 README)。
    • 4B 本地模型的验证代理经常输出不符合参考 schema 的结果,结果因此为 partial——这是模型能力问题,流程如实报告。
    • macOS 与 Windows 未运行。

    证据:本机 /workspace/evidence-206/(修复前)与 /workspace/evidence-206/fixes/(修复后,含 README、每个子代理的工具调用统计、屏幕快照、报告与工作流目录)。

    未改动

    main、npm 发布、默认切换均未改动。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions