<!-- codsh-publication:grok-cli-dsh-rewrite:ticket-48 --> ## Parent https://github.com/Blackman99/codsh/issues/132 **Ticket:** 48 **Status:** ready-for-agent **User Stories:** 33, 50(见父规格) ## What to build 用户设置目标并查看进度,可暂停、恢复或清除,达到预算或停止条件后不会无限继续调用模型。 ## Acceptance criteria - [ ] 目标执行由 dsh 支持的驱动与扩展组成,不启动官方第二套代理循环。 - [ ] 目标预算与工作流 agent 数预算分开;进度、失败、用户接管及停止原因真实可见。 - [ ] 暂停/恢复/清除、回合结束竞态和外部任务未完结时的行为由契约测试固定。 - [ ] 用受控模型验证达标、不达标、耗尽与中断,不以模型自述完成代替验收。 ## Blocked by - #140 — Ticket 08: 多提供商模型与推理选项 - #175 — Ticket 43: 后台命令与完成唤醒 - #179 — Ticket 47: 计划、问答与待办状态 ## Delivery contract 用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。
Activity
feat(rust): goal rounds with verified completion and stop conditions (#…
Blackman99 commentedon Sep 25, 2026
已集成:目标执行与停止条件(#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。update_goal complete的tools/pre-execute);GROK_GOAL_VERIFIER_N默认 3,范围限制在 1–5;多数或平票通过。GROK_GOAL_CLASSIFIER_MAX(默认 10)后,目标以verification-limit停止;/goal resume会把计数清零。verification-unavailable停止,即 fail closed。budget-limited停止,此时 resume 会被拒绝,需要/goal clear。$DSH_HOME/codsh-goals/<session>.json。◎ Goal round N/M,session replay 同样显示。--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 模型覆盖:cargo fmt --check:通过-D warnings:只有已知的 2 条;加-A dead_code -A clippy::needless_return后无告警。pnpm run build:rust:通过rust-goal-pty-test.py通过。它覆盖:验证拒绝后通过、/goal status、轮次中暂停、退出后--resume仍显示暂停、resume/clear、预算停止并拒绝 resume、Ctrl+C 中断轮次后暂停、GROK_GOAL=0。已有失败(非本次引入)
filesystem_sandbox有 2 个 cargo 测试失败;clippy 报tail_marker未使用和一处多余的return。reference-evidence.spec.mjs的 "drives interactive help" 在 5s 限制下超时。privacy::drafts_stay_local…、voice::substitute_route…。未验证
需要 owner 决定 / 与参考实现的差异
REVERIFY_AFTER、USE_CURRENT_MODEL_ONLY,也没有GROK_GOAL_CLASSIFIER开关。create_goal工具仍对模型开放(目标模式关闭时会隐藏)。/goal条目不隐藏,只在执行时回复关闭提示。/goal。GROK_GOAL*值会被忽略,不显示警告。-p没有/goal。slash:goal、setting:goal.enabled、tool:update_goal和 GROK_GOAL* 行保持 pending-parity,未修改 inventory。main、npm 发布、默认版本和 PR #213 均未改动。
解除阻塞