Skip to content

[Grok/dsh 48] 目标执行与停止条件 #180

Closed

Description

@Blackman99

Parent

#132

Ticket: 48

Status: ready-for-agent

User Stories: 33, 50(见父规格)

What to build

用户设置目标并查看进度,可暂停、恢复或清除,达到预算或停止条件后不会无限继续调用模型。

Acceptance criteria

  • 目标执行由 dsh 支持的驱动与扩展组成,不启动官方第二套代理循环。
  • 目标预算与工作流 agent 数预算分开;进度、失败、用户接管及停止原因真实可见。
  • 暂停/恢复/清除、回合结束竞态和外部任务未完结时的行为由契约测试固定。
  • 用受控模型验证达标、不达标、耗尽与中断,不以模型自述完成代替验收。

Blocked by

Delivery contract

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

Activity

  1. Blackman99 commented on Sep 25, 2026

    @Blackman99
    OwnerAuthor

    已集成:目标执行与停止条件(#180)

    提交:92cbe9b
    推送:rewrite/grok-dsh-20260920 快进 9833087..92cbe9b(未强推)。

    变基说明:原本基于 d61436c,期间 #177(a06632d)与 #183(9833087)先合入。变基时 13 个文件冲突(acp.rs、control.rs、main.rs、headless.rs、subagents.rs、rust-acp-control.mjs、rust-acp-subagents.mjs、rust.mjs、mock、package.json、三份文档),全部是两边各自新增的枚举分支、控制请求、事件类型、环境变量白名单和文档段落,已保留双方内容。因为变基不简单,下面的检查都在变基后完整重跑过。

    功能

    • /goal <objective> [--budget <tokens>] | status | pause | resume | clear:语法与参考实现一致,关键字按整行匹配且不区分大小写,只识别结尾独立的 --budget <正整数>。新目标会替换当前目标。命令经私有控制通道交给 dsh 扩展 rust-acp-goal.mjs。
    • 没有第二个 agent loop:目标轮次由 dsh 自带的 goal round driver 驱动,扩展只加以下内容:
      • 完成门控(update_goal complete 的 tools/pre-execute);
      • token 预算;
      • 暂停原因、接管标记和停止原因;
      • stderr 状态事件。
    • 模型自称完成不算完成:每次完成声明都要由 N 个独立验证子代理检查(execute 能力,只读加执行,不能写)。
      • GROK_GOAL_VERIFIER_N 默认 3,范围限制在 1–5;多数或平票通过。
      • 未通过时拒绝调用并列出差距,目标保持 active。
      • 被拒次数达到 GROK_GOAL_CLASSIFIER_MAX(默认 10)后,目标以 verification-limit 停止;/goal resume 会把计数清零。
      • 验证无法运行时(子代理关闭、策略错误、没有 spawner)以 verification-unavailable 停止,即 fail closed。
      • 仍有后台 job 运行时拒绝完成声明。
    • token 预算与工作流的 agent 数量预算互相独立:
      • 统计范围:目标 active 期间,根会话和它的子代理(包括验证者)的服务商 input+output token。
      • 检查时机:turn 结束时和每个目标轮次进入 step 前。
      • 达到预算后以 budget-limited 停止,此时 resume 会被拒绝,需要 /goal clear。
      • 预算数据存放在 $DSH_HOME/codsh-goals/<session>.json。
    • 进展可见:
      • Rust 客户端在记录中把目标轮次标为 ◎ Goal round N/M,session replay 同样显示。
      • 状态行显示阶段、轮次、token/预算、验证中、上次验证结果/尝试次数、停止原因和"你的消息优先"(接管)。
      • 停止通知会进入提示;状态在退出后 --resume 仍然保留(session/resume 期间到达的状态行不会丢失)。
    • 暂停原因区分 /goal pause、轮次被中断(Ctrl+C / ACP cancel)和模型应用户要求暂停。/goal clear 和替换目标会取消正在进行的轮次。
    • [goal] enabled = false 或 GROK_GOAL=0 关闭目标模式:模型看不到 goal 工具,命令返回关闭提示。

    检查(全部在干净环境中,变基后)

    • pnpm typecheck:通过
    • cargo build --locked -p codsh-rust:通过
    • cargo test --locked --workspace --no-fail-fast:各 crate 依次 589+498+42+61+2+379+61 通过,2 ignored,另有 2 个已知失败(见下)。新增 goal 解析、策略、状态行、控制事件测试。
    • pnpm test:95 个文件,2460 通过,4 失败。4 个都是在其他并行 worker 同时运行造成的高负载下(load 约 9)触发的 5s 超时,出在 reference-evidence.spec.mjs(3 个)和 reference-inventory.spec.mjs(1 个)。这两个文件用 --testTimeout=60000 重跑,172/172 全部通过。
    • scripts/rust-goal.spec.mjs:19/19,多次重复运行均通过。用受控 mock 模型覆盖:
      • achieved;
      • 先被拒、再达成;
      • verification-limit 与 resume;
      • 1/3 与 1/2 分票;
      • 验证者不给结论;
      • 子代理关闭;
      • 预算耗尽(exhausted);
      • 轮次中暂停、验证中暂停;
      • ACP cancel(interrupted);
      • 用户接管;
      • 后台 job 未完成;
      • 目标模式关闭;
      • 重启持久化;
      • 用法错误。
    • cargo fmt --check:通过
    • clippy -D warnings:只有已知的 2 条;加 -A dead_code -A clippy::needless_return 后无告警。
    • pnpm run build:rust:通过
    • Linux PTY:
      • 新增的 rust-goal-pty-test.py 通过。它覆盖:验证拒绝后通过、/goal status、轮次中暂停、退出后 --resume 仍显示暂停、resume/clear、预算停止并拒绝 resume、Ctrl+C 中断轮次后暂停、GROK_GOAL=0。
      • 变基后回归 scheduler、workflow、background、subagent、plan、queue 均通过;变基前 plugin-content、ship 也通过。
      • 结束后已确认没有本次遗留的 codsh-rust 进程。

    已有失败(非本次引入)

    • filesystem_sandbox 有 2 个 cargo 测试失败;clippy 报 tail_marker 未使用和一处多余的 return。
    • reference-evidence.spec.mjs 的 "drives interactive help" 在 5s 限制下超时。
    • 已知不稳定、本次通过的:privacy::drafts_stay_local…、voice::substitute_route…。

    未验证

    • macOS / Windows。
    • 真实付费服务商。
    • 仅限 macOS 的 PTY 脚本:plugin、hook、permission、assets、turn、resume、rust-pty-test。

    需要 owner 决定 / 与参考实现的差异

    • 验证面板用的是 dsh 子代理,不是参考实现的 skeptic 模型池;没有 planner、summary、strategist、REVERIFY_AFTER、USE_CURRENT_MODEL_ONLY,也没有 GROK_GOAL_CLASSIFIER 开关。
    • 验证基础设施失败时 fail closed,而参考实现是 fail open。
    • 轮次上限沿用 dsh 默认的 256。
    • dsh 自带的 create_goal 工具仍对模型开放(目标模式关闭时会隐藏)。
    • 目标模式关闭时,斜杠菜单里的 /goal 条目不隐藏,只在执行时回复关闭提示。
    • 无参数时在菜单上按 Enter 只会补全为 /goal 。
    • 无效的 GROK_GOAL* 值会被忽略,不显示警告。
    • plain -p 没有 /goal。
    • inventory 中的 slash:goal、setting:goal.enabled、tool:update_goal 和 GROK_GOAL* 行保持 pending-parity,未修改 inventory。

    main、npm 发布、默认版本和 PR #213 均未改动。

    解除阻塞

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