Skip to content

fix(goal-draft): keep drafts concise and verifiable - #11284

Merged
qqqys merged 3 commits into
QwenLM:mainfrom
qqqys:fix/goal-draft-quality
Sep 7, 2026
Merged

fix(goal-draft): keep drafts concise and verifiable#11284
qqqys merged 3 commits into
QwenLM:mainfrom
qqqys:fix/goal-draft-quality

Conversation

@qqqys

@qqqys qqqys commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Keeps /goal-draft focused on the reads needed to establish scope and verification, asks for compact completion checks, and explicitly allows an audit to find no defects. It preserves user requirements without adding arbitrary coverage or evidence quotas. Unresolved essential inputs produce a draft marked "Needs clarification", with no approval proposal or runnable Goal command.

Default stopping assumptions are identified as model instructions rather than runtime-enforced limits. Ready drafts retain the existing terminal approval or manual-command handoff, with clear wording that the draft has not been applied.

Why it's needed

Drafting can expand into excessive investigation and add unsupported completion requirements, such as requiring an audit to find a defect. The previous fallback also allowed missing essential information to become assumptions in an actionable command. Users need a small, grounded objective and an accurate explanation of what remains unresolved before starting autonomous work.

Reviewer Test Plan

How to verify

  • Ask /goal-draft to address a documented failing test. Expect a concise objective using the real verification command, with no test execution or implementation during drafting.
  • Ask for an audit of an agreed scope. Expect evidence-backed coverage that permits zero findings, without invented scenario, artifact, or exploration-round quotas.
  • Leave an essential success criterion or input unresolved. Expect one clarification round where supported; otherwise a marked incomplete draft with no runnable /goal set, /goal edit, or approval proposal.
  • Ask to tighten an existing goal. Expect the explicit edit/replace choice to be preserved, optional defaults to be marked, and prose stopping limits not to be described as runtime configuration.

Evidence (Before & After)

Global CLI baseline samples added an unrequested "20 turns or 10 minutes" budget without identifying it as an execution convention. Three changed-bundle samples reached final output: the completed ready drafts marked the default budget as an assumption and said the draft was not applied; the missing-criterion sample returned TODOs without an actionable command. The audit sample timed out at both 120s and 240s, so zero-defect/coverage-quota behavior is not yet verified with real model output. Detailed results are in the separate E2E report comment.

Local validation passed: clean npm ci, full build and bundle, full typecheck, 69 tests across the bundled skill and Goal tools, changed-test ESLint, changed-file Prettier, and git diff --check. The bundled skill matches the edited source. Prompt-contract tests do not prove model compliance.

Tested on

OS Status
🍏 macOS ✅ tested
🪟 Windows ⚠️ not tested
🐧 Linux ⚠️ not tested

Environment (optional)

Node.js 24.14.1; global CLI baseline and local node dist/cli.js in isolated fixture/runtime directories. Model: qwen3.8-max.

Risk & Scope

  • Main risk or tradeoff: prompt guidance is model-dependent; incomplete inputs now deliberately withhold an actionable handoff. One completed sample still overstated what a grep check proves about unchanged tests, as the baseline also did; generated criteria still need review.
  • Not validated / out of scope: Web Shell proposal approval, proposal editing UI, and live active-Goal edit/replace execution. Tool registration, permissions, runtime, and Goal storage are unchanged.
  • Breaking changes / migration notes: no configuration or storage migration.

Linked Issues

None.

中文说明

此 PR 做了什么

/goal-draft 只读取确定范围和验证方式所需的信息,生成简洁的完成条件,并明确允许审计未发现缺陷。保留用户要求,不额外添加覆盖量或证据数量指标。必要信息未解决时,只输出“待澄清”草稿,不发起目标批准,也不附可执行的 Goal 命令。

默认停止条件会标记为假设,并说明它属于模型执行约定,不是运行时强制限制。完整草稿继续使用现有终端批准或手动命令交接,并明确草稿尚未应用。

为什么需要

草拟可能演变为过度调查,并附加缺乏依据的完成条件,例如要求审计必须发现缺陷。原有 fallback 还可能把缺失的必要信息当作假设写进可执行命令。用户需要在启动自主执行前,得到简洁、有依据的目标,并知道哪些信息尚未确定。

Reviewer 验证计划

如何验证

  • /goal-draft 草拟修复已有文档说明的失败测试。应使用真实验证命令,目标简洁,草拟期间不运行测试或实现修复。
  • 要求审计约定范围。应要求有证据的场景覆盖,允许零缺陷,不凭空增加场景数、文件数或探索轮数指标。
  • 保留一个未确定的必要成功标准或输入。在支持提问时应集中澄清一次;否则只给标记为待澄清的草稿,不附可执行的 /goal set/goal edit,也不发起批准。
  • 要求收紧已有目标。应保留用户明确的编辑或替换选择,标记可选默认值,不把正文停止条件描述成运行时配置。

修改前后证据

全局 CLI 基线样本增加了用户未要求的“20 回合或 10 分钟”预算,没有说明它只是执行约定。修改后 bundle 有三个样本得到最终输出:完整草稿标注了默认预算假设并说明尚未应用;缺失判据的样本只给 TODO,没有可执行命令。审计样本在 120 秒和 240 秒两次超时,因此零缺陷与覆盖配额的实际模型输出尚未验证。详细结果记录在单独的 E2E 报告评论中。

本地已通过:干净安装 npm ci、完整 build 和 bundle、完整 typecheck、bundled skill 与 Goal tools 共 69 个测试、修改测试文件的 ESLint、修改文件的 Prettier,以及 git diff --check。打包 skill 与修改后的源码一致。提示词契约测试不能证明模型一定遵循指令。

测试平台

OS 状态
🍏 macOS ✅ 已测试
🪟 Windows ⚠️ 未测试
🐧 Linux ⚠️ 未测试

环境

Node.js 24.14.1;全局 CLI 基线和本地 node dist/cli.js 均在隔离的 fixture/runtime 目录运行。模型:qwen3.8-max。

风险与范围

  • 主要风险或取舍:提示词效果依赖模型;必要信息不完整时会有意省略可执行交接。一个完整样本仍过度解读 grep 对“测试未修改”的证明力,基线也存在此问题,生成的判据仍需审阅。
  • 未验证或范围之外:Web Shell 提议批准、提议编辑 UI、真实运行中 Goal 的编辑和替换。工具注册、权限、运行时和 Goal 存储保持不变。
  • 兼容性和迁移:无需配置或存储迁移。

关联 Issue

无。

@qqqys

qqqys commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author

E2E report: goal-draft quality

Tested on macOS, Node.js 24.14.1, default model qwen3.8-max. Baseline used global qwen 0.23.0; verification used the locally built CLI. Four fixed Chinese prompts ran in a small isolated workspace containing a documented failing addition test and two documented audit surfaces. Runtime data was isolated from the fixture and real user config was unchanged.

Both versions were invoked with --approval-mode default --output-format json --max-wall-time 120s --max-tool-calls 8. Only timed-out verification cases were retried once with --max-wall-time 240s.

Scenario Baseline Changed bundle
Draft a fix for the documented failing test Final draft added an unrequested 10-minute budget without identifying it as a convention Final output on retry; 3 checks, real npm test command, default budget marked as an assumption, draft explicitly not applied; 6 read-only calls
Tighten supplied goal text Final draft added the same unmarked time budget Final output; 2 checks, Chinese body, marked default stopping assumption and not-applied notice; 4 read-only calls
Missing performance success criterion Timed out, no final draft Final output marked Needs clarification with TODOs; no actionable Goal command; 6 read-only calls
Audit the documented surfaces, permitting no findings Timed out, no final draft Timed out at both 120s and 240s; zero-defect and coverage-quota output behavior remains unverified

All fixture file hashes remained unchanged. Recorded calls were limited to Goal reads, file reads, searches and tool discovery; no task tests, shell execution, file modifications or Goal creation occurred during drafting. The tighten case supplied text without an active Goal; live active-Goal edit/replace was not exercised. No terminal or Web Shell approval interaction was exercised.

Limits: the concrete-test draft still claimed that matching an assertion with grep proves the test was not modified. This overclaim also existed in the baseline and remains a model-quality limitation. Three completed samples are not a guarantee that every generated criterion is sound. Different baseline/source versions, stochastic outputs and retry limits also prevent a latency-improvement claim. The forced deepseek provider probe failed with HTTP 401 before producing tokens; subsequent samples used the working default provider.

Deterministic checks passed: full build/bundle/typecheck, bundled-asset equality, 69 focused tests, formatting and changed-test lint. Local automated review timed out after six minutes without a verdict; an independent read-only diff review completed with no actionable findings.

中文摘要:四类真实模型采样中三类得到最终输出,确认了默认停止假设、草稿尚未应用提示,以及缺失判据时不交付可执行命令。审计场景两次超时,零缺陷和覆盖配额的实际输出尚未验证。所有样本只读,未创建 Goal。完整构建、类型检查和 69 个测试通过;自动审查超时后,独立只读 diff 审查未发现可操作问题。仍保留模型过度解读 grep 证据的既有局限,不宣称所有草稿都可靠或生成速度提升。

@qqqys
qqqys marked this pull request as ready for review September 7, 2026 07:55
@qqqys

qqqys commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Sep 7, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. This is a fork PR, so the first round comes from the next scheduled scan (usually within minutes). Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。本 PR 来自 fork,首轮处理将由下一次定时扫描执行(通常几分钟内)。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-ci-bot

qwen-code-ci-bot commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finished — CI landed green on b142fd9 and the deferred approval was posted. finalize run

Qwen Triage 已完成 —— b142fd9 的 CI 全绿,延迟审批已提交。查看 finalize 运行

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR! Template is complete ✓ — including the Chinese translation and an honest Tested-on table.

Problem: partly observed, partly read off the prompt text, and one piece you've flagged as unverified yourself. The unmarked-budget issue is genuinely observed: your baseline samples added a "20 turns or 10 minutes" budget without saying it was only a convention. The headless-fallback issue is real but static rather than reproduced — the old text said "take the recommended default and mark it [ASSUMPTION]" with no essential/nonessential distinction, so it did license exactly what you describe; your baseline run for that scenario timed out rather than demonstrating it. The audit-quota / zero-defect guidance has no runtime evidence at all, which you say plainly in the report. That honesty is appreciated and I'm not treating it as a blocker — but it does mean one of the three changes ships unproven, and I've named a lane for it below in the review comment.

Direction: aligned. This is prompt and docs quality for a bundled skill this repo owns, not a new surface. CHANGELOG shows the area is actively shipped — feat(core): add a bundled goal-draft skill… (#10002) and fix(goal): stop exporting the unreachable propose_goal decline message (#10787) — so tightening its instructions is maintenance, not scope creep into someone else's subsystem.

Size: touches a core path (packages/core/src/skills/bundled/goal-draft/SKILL.md). Production lines: 22 (SKILL.md, +16/−6). Test lines: 54 (SKILL.test.ts, +53/−1, excluded from the count). Docs outside core: 12 (docs/users/features/goals.md). Well under the 500-line threshold, and the title is fix, not refactor — so no core hard block and no maintainer-awareness escalation.

Approach: scope feels right, and it matches what I'd have written independently — bound the reads, cap the check count without inventing quotas, allow a zero-finding audit, gate the hand-off on unresolved essentials, and label the default budget as a model convention. Two small things, both optional:

  • The docs rewrite drops the mention that the skill first checks whether the request is a Goal at all, and that it runs a self-check. Both still happen. A user reading only goals.md loses the expectation that /goal-draft may just say "this isn't a goal".
  • The Web Shell / ACP clarification is correct, but it's arguably a separate concern from "concise and verifiable". Since you're already rewriting that hand-off enumeration, folding it in is defensible — just naming it rather than objecting.

I'd rather neither of these triggered another round: autofix/takeover is engaged on this PR, so take them only if you agree, and leave them otherwise.

Risk: no elevated risk signals — none of the changed files match the high-revert-correlation paths.

Moving on to code review. 🔍

中文说明

感谢贡献!模板完整 ✓ —— 包含中文翻译和如实填写的测试平台表格。

问题: 一部分是实测观测到的,一部分是从提示词文本直接读出的,还有一部分你自己已标注为未验证。未标注预算的问题确实是实测到的:基线样本添加了"20 回合或 10 分钟"预算,却没有说明它只是执行约定。headless fallback 的问题真实存在,但属于静态文本缺陷而非复现结果——旧文本写的是"take the recommended default and mark it [ASSUMPTION]",没有区分必要与非必要信息,因此确实允许了你描述的行为;而该场景的基线运行是超时,并没有实际演示出这个问题。审计配额 / 零缺陷这部分完全没有运行时证据,你在报告中也如实说明了。这份坦诚值得肯定,我不把它当作阻塞项——但这确实意味着三项改动中有一项是未经证明就上线的,我已在审查评论里点名了对应的验证通道。

方向: 对齐。这是本仓库自有 bundled skill 的提示词与文档质量改进,不是新增面。CHANGELOG 显示该领域一直在持续交付——feat(core): add a bundled goal-draft skill…#10002)与 fix(goal): stop exporting the unreachable propose_goal decline message#10787)——所以收紧它的指令属于日常维护,而不是侵入别人子系统的范围扩张。

规模: 触及核心路径(packages/core/src/skills/bundled/goal-draft/SKILL.md)。生产行数:22(SKILL.md,+16/−6)。测试行数:54(SKILL.test.ts,+53/−1,不计入)。核心之外的文档:12docs/users/features/goals.md)。远低于 500 行阈值,且标题是 fix 而非 refactor —— 因此不触发核心硬阻塞,也不需要维护者知会升级。

方案: 范围合理,和我独立想到的做法一致——限定读取范围、限制检查条数但不凭空设配额、允许审计零缺陷、在必要信息未解决时拦住交接、并把默认预算标注为模型执行约定。两点小建议,均为可选:

  • 文档改写删掉了"该 skill 会先判断这是否值得作为 Goal"以及"会执行自检"这两处说明。这两个行为依然存在。只读 goals.md 的用户会失去"/goal-draft 可能直接回答'这不是一个 goal'"的预期。
  • Web Shell / ACP 的澄清是正确的,但严格说与"简洁且可验证"是两个关注点。既然你本来就在重写那段交接枚举,合并进来也说得通——只是点出来,并非反对。

我更希望这两点不要触发新一轮修改:本 PR 已挂上 autofix/takeover,所以认同再改,不认同就放着。

风险: 无升级风险信号——改动文件均未命中高回滚相关性路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max-2026-09-02

Reviewed at b142fd99166ea0acf18caf054b93b0cd166d2b5e · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

Code review

No critical blockers and no AGENTS.md violations. This is a prompt-and-docs change: no runtime code path, schema, tool registration, permission rule, or Goal storage is touched, so the review is about whether the text is accurate and whether the contract tests actually pin it.

I wrote down my own approach before opening the diff — bound the reads to scope and verification, cap the check count without inventing quotas, allow a zero-finding audit, gate the hand-off on unresolved essentials, label the default budget as a model convention, then pin the wording in the colocated test and sync the user docs. Your diff lands on the same shape, and adds one thing I hadn't thought of that I think is right: routing the edit-versus-replace choice into the single question round instead of letting the skill pick, which is what makes "essential decision remains" in the new Step 5 gate actually reachable. Nothing here I'd have done materially simpler.

The three factual claims in the new text all check out against the runtime, which is the part I cared about most — a prompt that asserts something false about the product is worse than no prompt:

  • "Budget is a stopping agreement for the model, not a runtime-enforced limit." Correct. The only budget in the Goal runtime is a token budget (GOAL_DEFAULT_TOKEN_BUDGET, stamped from tokenBudgetGrant); nothing parses a turn count or a wall-clock limit out of the objective text.
  • "Web Shell or another ACP client … receive a command to run manually." Correct. config.ts registers propose_goal only when resolveInteractionMode(this) === 'interactive', and prompts.ts resolves Zed/stream-json to 'acp', not 'interactive'. This also agrees with what goals.md already said before your PR, so the skill prose and the user docs are now consistent rather than contradicting each other.
  • "do not … run builds or tests, install dependencies, or start services." Load-bearing, not redundant — allowedTools is an additive auto-approval grant rather than a sandbox, so this prose is the actual enforcement. Worth having said explicitly.

Contract tests: I checked every assertion statically rather than trusting that CI would catch a mismatch. All 20 new assertions match the head SKILL.md text exactly, including the two ordering assertions (Step 5 heading → new gate → ready-objective hand-off) and the three that only look inside the sliced gate paragraph. I also pulled all 95 string literals out of the head test file and checked each against the head SKILL.md: every miss is a test name, an import path, or a not.toContain tool name, so no pre-existing assertion references text this PR deletes — that's the main way a prompt-contract test file breaks, and it's clear here.

Consumers I traced, since the file sits under a core path: the colocated SKILL.test.ts; bundled-skills.integration.test.ts, which only parses frontmatter for required fields and is unaffected because you left the frontmatter alone; the Web Shell i18n description assertions in localCommands.test.ts, likewise keyed off the unchanged frontmatter description; the one-line row in commands.md and the pointer in headless.md, both still accurate; and the decline-clause fragment that goal-tools.test.ts explicitly says must not drift from the skill's copy, which is still present. goal-tools.ts and its propose_goal description are untouched.

Two non-blocking notes, both already raised in the gate comment and both fine to leave alone: the docs rewrite drops the mention that the skill may decide the request isn't a Goal at all, and the Web Shell/ACP clarification is strictly a separate concern from the PR title.

One thing I want to say plainly rather than bury: the behavioural risk you disclose — that incomplete inputs now deliberately withhold an actionable hand-off — is a real trade, and it lands hardest on headless runs, which is exactly where headless.md points users at /goal-draft. I think withholding beats inventing a success criterion, and your framing of it is right. Just noting that the users who feel it are the ones who can't answer a question round.

Test evidence

Unattended CI run — I did not build, run, or execute anything from this PR. The evidence below is the PR's own CI, read through the API, plus the static text verification described above.

Final CI results for b142fd9 (auto-updated by the triage finalize job after CI completed):

Check Conclusion
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Integration Tests (no-AK, No Sandbox) ✅ success
Lint & Static (ubuntu-latest, Node 22.x) ✅ success
route ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。

Nothing is red on this commit. There are 96 check-runs in total; everything not listed above is bot orchestration (route, authorize, assign, label, Classify PR, and the triage and review-pr runs themselves), skipped or still in flight. There is no failing job, so there is no log excerpt to quote. The three pending checks are the ones that actually matter for this diff — Test is what runs the contract tests I verified by hand above — so treat the unit-test result as not yet available rather than as passing.

Not verified, and why: real-scenario TUI testing is out of scope on an unattended CI run, so there is no terminal capture in this comment. The model-compliance question is covered by the lane below.

Your own E2E report is your claim, not evidence I reproduced — I'm citing it only to say that it is unusually candid about its own gaps, and that the gap it names is the one worth closing.

Sandboxed verification would settle this: @qwen-code /tmux — that an audit draft now permits "no confirmed defects" and does not invent scenario, evidence-file, or exploration-round quotas. Your report says that scenario timed out at both 120s and 240s on the baseline and the changed bundle, so nothing has yet observed the new guidance working, and the contract tests pin wording rather than compliance (as you note yourself). A TUI run of the audit prompt with a longer wall-clock budget is the only thing that would show it. @qwen-code /verify is the A/B alternative if you'd rather have load-bearing proof against the base build. You have write access, so neither lane needs sponsoring.

中文说明

代码审查: 没有关键阻塞项,也没有违反 AGENTS.md 的地方。这是提示词与文档改动:没有触及任何运行时代码路径、schema、工具注册、权限规则或 Goal 存储,所以审查重点是文本是否准确、契约测试是否真的钉住了它。

我在看 diff 之前先写下了自己的方案——限定读取范围到 scope 与验证方式、限制检查条数但不凭空设配额、允许审计零缺陷、在必要信息未解决时拦住交接、把默认预算标注为模型约定,然后在同目录测试中钉住措辞并同步用户文档。你的 diff 与之一致,并且补了一点我没想到、但我认为是对的:把"编辑还是替换"的选择纳入唯一一轮提问,而不是让 skill 自己决定——正因为如此,Step 5 新增的"仍有必要决策未解决"这道闸才真的可达。这里没有我会做得明显更简的地方。

新文本中的三条事实性陈述都与运行时对得上,这是我最在意的部分——一个对产品做了错误断言的提示词比没有提示词更糟:

  • "Budget 是给模型的停止约定,不是运行时强制限制。" 正确。Goal 运行时唯一的预算是 token 预算(GOAL_DEFAULT_TOKEN_BUDGET,由 tokenBudgetGrant 写入);没有任何代码从 objective 文本里解析回合数或墙钟时限。
  • "Web Shell 或其他 ACP 客户端……改为手动执行命令。" 正确。config.ts 只在 resolveInteractionMode(this) === 'interactive' 时注册 propose_goal,而 prompts.ts 会把 Zed/stream-json 解析为 'acp' 而非 'interactive'。这也与本 PR 之前 goals.md 已有的说法一致,因此 skill 提示词与用户文档现在互相吻合,而不是自相矛盾。
  • "不要……运行构建或测试、安装依赖、启动服务。" 这是有实际作用的,不是冗余——allowedTools 是附加的自动批准授权,而不是沙箱,所以这段正文才是真正的约束手段。明确写出来是有价值的。

契约测试: 我用静态方式核对了每一条断言,而不是指望 CI 去发现不一致。20 条新增断言全部与 head 版本的 SKILL.md 文本精确匹配,包括两条顺序断言(Step 5 标题 → 新增闸门 → 完整目标交接)以及三条只在闸门段落切片内查找的断言。我还从 head 测试文件中提取了全部 95 个字符串字面量逐一比对:所有未命中项都是测试名、import 路径或 not.toContain 的工具名,因此没有任何既有断言引用了本 PR 删除的文本——这是提示词契约测试最容易崩的方式,而这里是干净的。

我追踪的下游消费方(该文件位于核心路径下):同目录的 SKILL.test.tsbundled-skills.integration.test.ts(只解析 frontmatter 的必填字段,因为你没有改动 frontmatter,所以不受影响);Web Shell 的 i18n 描述断言 localCommands.test.ts(同样以未改动的 frontmatter description 为键);commands.md 里的一行表格与 headless.md 里的指引(两者仍然准确);以及 goal-tools.test.ts 明确要求不得与 skill 副本漂移的 decline 片段(仍然存在)。goal-tools.ts 及其 propose_goal 描述未被触及。

两点非阻塞意见,闸门评论中已提出,放着不改也完全可以:文档改写删掉了"该 skill 可能判断这根本不是一个 Goal"的说明;Web Shell/ACP 澄清严格说与 PR 标题是两个关注点。

有一点我想直说而不是埋起来:你披露的行为风险——信息不完整时会刻意省略可执行交接——是真实的取舍,而且对 headless 运行影响最大,而 headless.md 恰恰是把用户指向 /goal-draft 的地方。我认为"不给"胜过"编造一个成功判据",你的表述也是对的。只是提醒一下:感受到这个变化的是那些无法回答问题轮次的用户。

测试证据: 这是无人值守的 CI 运行——我没有构建、运行或执行本 PR 的任何代码。上面的证据来自通过 API 读取的 PR 自身 CI,加上我做的静态文本核对。

该 commit 上没有任何红灯。总共 96 个 check-run;未列出的都是机器人编排任务(routeauthorizeassignlabelClassify PR,以及 triage 与 review-pr 运行本身),处于 skipped 或仍在进行。没有失败的 job,因此没有日志片段可引用。三个待完成的检查恰好是对本 diff 最关键的——Test 就是运行上面我手工核对过的那些契约测试的地方——所以请把单元测试结果视为尚不可用,而不是已通过。

未验证项及原因:无人值守 CI 运行不做真实场景 TUI 测试,因此本评论没有终端截取输出。模型是否遵循指令的问题由下面的验证通道覆盖。

你自己的 E2E 报告属于你的陈述,不是我复现出的证据——我引用它只是为了说明它对自身局限的坦诚程度少见,而它点出的那个缺口正是值得补上的。

沙箱验证可以定论此事:@qwen-code /tmux —— 验证审计草稿现在是否允许"无确认缺陷",且不会凭空编造场景数、证据文件数或探索轮数配额。你的报告说该场景在基线改动后的 bundle 上都在 120 秒与 240 秒两次超时,因此至今没有任何运行观测到新指令生效,而契约测试钉住的是措辞而非遵循度(你自己也指出了这点)。用更长的墙钟预算在 TUI 中跑一次审计提示,是唯一能证明它的方式。如果你更想要相对基线构建的承重证明,@qwen-code /verify 是 A/B 替代方案。你有写权限,两条通道都不需要他人代为发起。

Qwen Code · qwen3.8-max-2026-09-02

Reviewed at b142fd99166ea0acf18caf054b93b0cd166d2b5e · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean, accurate, and well-pinned; the two nits are cosmetic and the one open question is about model behaviour, not about this diff.

Stepping back: this is 22 lines of prompt text, a matching set of contract tests, and a docs sync. It does not add machinery, does not abstract anything, and does not touch a runtime path. Six months from now the contract tests are what makes it maintainable — they pin the wording, so the next person who rewrites a sentence finds out immediately which guarantee they broke. That's the reason I'd thank the author rather than curse them.

The approach matches what I proposed independently before reading the diff, and beats it in one place: routing the edit-versus-replace choice into the single question round is what makes the new "essential decision remains" gate reachable at all. I'd have left the skill choosing, which is precisely the failure mode the PR is about.

On whether the problem exists — I want to be exact rather than generous. The unmarked-budget issue is observed in the author's baseline samples. The headless-fallback issue is a real defect but I confirmed it by reading the old text, not by watching it happen: the old fallback said to take the recommended default with no essential/nonessential distinction, so it did license inventing a success criterion. The audit-quota guidance has no runtime evidence, and the author says so. I'm comfortable shipping that third piece unproven because its worst case is "the model keeps behaving as it does today" — it cannot regress anything, since nothing it replaces was working either.

On volume, because it deserves a straight answer: the author has nine PRs open, four of them in the Goal subsystem. I checked whether I was being worn down or whether this one stands on its own, and it stands on its own — the diff doesn't collide with the others, which touch the runtime, the continuation prompt, and Web Shell rather than the drafting skill. One sequencing note for whoever lands these, not a concern about this PR: a sibling proposal to pause a Goal after three no-progress turns would introduce a genuine runtime turn limit. The sentence added here is scoped to turn counts written in the objective, so it stays true either way — but if both land, worth a read-through of the docs paragraph so a user isn't left thinking prose budgets and runtime limits are the same thing.

What I did not verify, stated plainly: real model compliance. The contract tests prove the text says what it should; they cannot prove a model follows it, and the author's own E2E report leaves the audit scenario unobserved after two timeouts. That gap is what the sandboxed lane named in the review comment is for, and it is the only thing standing between this and a 5.

Verdict: approve. CI on this commit is still running (Test, Lint & Static, and Integration Tests are in flight), so approval is deferred until CI lands green on b142fd99166ea0acf18caf054b93b0cd166d2b5e — I'm not attesting to a unit-test result that does not exist yet. If anything lands red or the head moves, the approval is withheld rather than carried over.

中文说明

Confidence: 4/5 —— 干净、准确、钉得牢;两点意见属于表面问题,唯一悬而未决的是模型行为,而不是这个 diff 本身。

退一步看:这是 22 行提示词文本、一组配套的契约测试,加上一次文档同步。它没有新增机制、没有引入抽象、没有触及运行时路径。六个月后让它仍然可维护的正是那些契约测试——它们钉住了措辞,所以下一个改写句子的人会立刻知道自己打破了哪条保证。这也是我会感谢作者、而不是埋怨作者的原因。

方案与我在读 diff 之前独立提出的想法一致,并且有一处比我的更好:把"编辑还是替换"的选择纳入唯一一轮提问,正是这一点让新增的"仍有必要决策未解决"这道闸真正可达。我原本会让 skill 自己决定,而那恰恰就是本 PR 要解决的失效模式。

关于问题是否真实存在——我想说得准确,而不是宽厚。未标注预算的问题在作者的基线样本中是实测到的。headless fallback 的问题是真实缺陷,但我是通过阅读旧文本确认的,而不是看着它发生:旧的 fallback 说直接采用推荐默认值,且没有区分必要与非必要信息,因此确实允许了编造成功判据。审计配额这部分没有运行时证据,作者也这么说了。我可以接受第三部分未经证明就上线,因为它的最坏情况是"模型维持今天的行为"——它不会让任何东西退化,因为它替换掉的本来也没生效。

关于数量,值得给一个直接回答: 作者有九个 PR 处于开启状态,其中四个在 Goal 子系统。我确认了自己是被数量磨软了、还是这一个本身站得住——它站得住:这个 diff 与其他几个不冲突,后者动的是运行时、continuation prompt 和 Web Shell,而不是草拟 skill。给最终合并这些 PR 的人一条顺序上的提醒(不是对本 PR 的疑虑):其中一个兄弟提案会在三个无进展回合后暂停 Goal,那会引入真正的运行时回合限制。这里新增的句子限定于写在 objective 里 的回合数,所以两种情况下都依然成立——但如果两者都合并,建议把这段文档通读一遍,免得用户以为正文预算和运行时限制是同一回事。

我没有验证的部分,直说:真实的模型遵循度。契约测试证明文本说的是它该说的话;它们无法证明模型会照做,而作者自己的 E2E 报告在两次超时后也没有观测到审计场景。这个缺口正是审查评论里点名的沙箱验证通道要补的,也是本 PR 与 5 分之间唯一的距离。

结论:批准。该 commit 上的 CI 仍在运行(TestLint & StaticIntegration Tests 正在进行),因此批准推迟到 CI 在 b142fd99166ea0acf18caf054b93b0cd166d2b5e 上全绿之后——我不会为一个尚不存在的单元测试结果背书。如果有检查变红或 head 发生移动,批准将被保留,而不会顺延。

Qwen Code · qwen3.8-max-2026-09-02

Reviewed at b142fd99166ea0acf18caf054b93b0cd166d2b5e · re-run with @qwen-code /triage

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship — CI landed green after the review. ✅

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review timed out. Qwen review timed out after 10800 seconds (of the 180-minute budget). For large PRs, retry with a longer timeout by commenting: @qwen-code /review --timeout=360. See workflow logs.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [review-pr] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [review-pr] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@qqqys
qqqys enabled auto-merge September 7, 2026 11:28

@qwen-code-dev-bot qwen-code-dev-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved at head a253680b.

The claim this change rests on is true at the registration level, which is what makes it worth more than a wording tweak. ProposeGoalTool is registered only when resolveInteractionMode(this) === 'interactive' (packages/core/src/config/config.ts:9440-9446), so a Web Shell or other ACP session has no dialog to promise — and the only places Web Shell mentions the tool at all are a display label and a translation string (toolFormatting.ts:26, i18n.tsx:3703). Telling the skill to print a copyable command there, and to stop saying "I'll propose it for approval", is therefore correcting a promise the runtime cannot keep rather than simplifying prose. The same goes for Budget: nothing parses the objective for a turn or minute count, the enforced ceiling is model.goalTokenBudget, and the 1,500-character cap the docs cite matches PROPOSE_GOAL_OBJECTIVE_MAX_CHARACTERS.

I checked the guard suite mechanically instead of trusting that it passes. All 53 string assertions in SKILL.test.ts hold against the head's SKILL.md; the three that do not appear in the body are the deliberate not.toContain assertions on allowedTools (run_shell_command, write_file, edit, update_goal), which is the right polarity for a skill that must draft without doing. The new ordering pin is the one I would have asked for: it locates the Needs clarification gate relative to ## Step 5 and Then hand off, and nothing else: (10047 / 10909 / 11214 at this head) and then slices the text between them to confirm the withholding instructions live inside that window — so moving the gate below the hand-off, which would let the skill print a runnable /goal set for an incomplete draft, goes red. A missing anchor yields -1 and fails toBeGreaterThan, so the pin cannot pass by absence.

One free improvement this PR was the natural place for. The same page, at docs/users/features/goals.md:19, still says "the footer pill and every status card show what it has spent" and "Once a Goal has billed a turn". Neither holds: the legacy goal_status card renders no figure in both renderers, and the four implementations gate on recorded spend rather than turns. That text arrived from PR #11248 and is already on main, so it is not this diff's defect and I am not blocking on it — but since this PR is editing that file and that page is where a reader learns what the budget line means, scoping the sentence here would have cost one line. Worth folding into the follow-up on the other PR rather than leaving for a third pass.

CI facts. At this head Test (ubuntu-latest), Lint & Static and Integration Tests (no-AK) were still queued behind the merge of main that landed a few minutes earlier; Classify PR, both Desktop Shell lanes and the precheck/assign/label jobs are green, and nothing has reported red. There are no review threads on the PR, and the automated review on this head is already an approve — my decision is on the content, not waiting on the board.

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partially reviewed — gaps disclosed. Suggestions are inline.

1 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • goals.md:66 dropped "is this a Goal at all" and self-check mentions — already raised in the triage gate comment (comment 5567492204) and the stage-2 review (comment 5567517976)

Not explored to full depth (tool budget reached): "agent 1d": none — no check was cut short by the ceiling..

Not reviewed: reverse audit — stopped before round 4 by the review time budget.

中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。

本轮确认的 1 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未探索到全部深度(达到工具调用预算):"agent 1d"none — no check was cut short by the ceiling.

未审查:反向审计——评审时间预算不足,未能开始第 4 轮。

— qwen3.8-max via Qwen Code /review (v0.23.0)

Comment thread packages/core/src/skills/bundled/goal-draft/SKILL.md Outdated
Comment thread packages/core/src/skills/bundled/goal-draft/SKILL.md Outdated
Comment thread packages/core/src/skills/bundled/goal-draft/SKILL.md
Comment thread packages/core/src/skills/bundled/goal-draft/SKILL.test.ts Outdated
Comment thread packages/core/src/skills/bundled/goal-draft/SKILL.md Outdated
Comment thread packages/core/src/skills/bundled/goal-draft/SKILL.md
Comment thread packages/core/src/skills/bundled/goal-draft/SKILL.md
@qwen-code-dev-bot

qwen-code-dev-bot commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

AutoFix round 1 finishedview run. See this round's report below.

中文说明

AutoFix 第 1 轮已完成 —— 查看运行。本轮报告见下方。

@qwen-code-dev-bot
qwen-code-dev-bot dismissed stale reviews from qwen-code-ci-bot and themself via 4a2c036 September 7, 2026 15:01
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Address-review round — PR #11284

Commit: 4a2c0363bdfix(core): align goal-draft gate and budget default with the documented contract

All seven inline findings were Suggestion-level, valuable, and inside this PR's own footprint (packages/core/src/skills/bundled/goal-draft/), so all seven were implemented. Every new pin was verified with a mutation probe: the target wording was removed or reverted, the intended test went red, and the wording was restored to green.

Feedback dispositions

  • [rc:3950177633] R1-1 — gate wider than the documented contract (SKILL.md:111): Implemented. The gate now fires only on the essential set the docs already name — "an unknown success criterion, an unverified command or input path, or an unresolved edit-versus-replace choice (each written as <TODO: …>)" — matching docs/users/features/goals.md:70. Self-check item 7 was reconciled: an unverified path or command is essential and stays <TODO: …> rather than passing. The test locator was moved to the new opening, and two pins were added: the intro's deliverable sentence scoped to the pre-Step-0 slice (the phrase also occurs in the gate line), and success criterion inside the gate window.
  • [rc:3950177644] R1-3 — template Budget lost the absolute turn cap (SKILL.md:69): Implemented. The slot is now <user's stopping agreement; otherwise stop as blocked after 20 turns, and mark that default [ASSUMPTION] in Context>, restoring the absolute cap and the canonical stop as blocked verb used by goals.md:49/:59, the exemplars, and goal-tools.ts.
  • [rc:3950177661] R1-5 — [ASSUMPTION] marking has no enforcement point (SKILL.md:83/91/109): Implemented, both halves. Self-check item 10 now ends "; an unrequested default Budget is marked [ASSUMPTION] in Context.", and the strong exemplar gained Context: [ASSUMPTION] the 20-turn budget is the drafter's default, not the user's. Pins assert the clause on the Step-5 slice and the exemplar wording.
  • [rc:3950177665] R1-6 — polarity-blind assertion (SKILL.test.ts:184): Implemented. The fragment pin was replaced with the full prohibition sentence "Do not claim that writing it configures a timer or changes the Goal token budget" (byte-identical to SKILL.md).
  • [rc:3950177677] R1-7 loc 1 — template Budget line ungated: Implemented. The template slice now pins <user's stopping agreement, stop as blocked after 20 turns, and the absence of minutes.
  • [rc:3950177685] R1-7 loc 2 — intro deliverable sentence ungated: Implemented. deliver only a draft marked "Needs clarification" is pinned inside body.slice(0, body.indexOf('## Step 0')) so the gate line cannot satisfy it.
  • [rc:3950177688] R1-7 loc 3 — Step 1 preserve-choice behaviour ungated: Implemented. Pinned preserve the user's explicit choice to edit it and do not choose on the user's behalf.

No finding was declined, deferred, or escalated; comment-replies.json and deferred-findings.json are therefore omitted. --conflict was false and no merge was needed.

Notes: after the exemplar row grew, Prettier re-padded the Weak→strong table (whitespace-only; row wordings unchanged). No settings source changed, so no schema regeneration.

Mutation probes

Each probe mutated SKILL.md, re-ran the focused suite, and restored the file:

  1. Removed the essential-item enumeration from the gate → withholds an actionable hand-off… failed (1 failed / 11 passed). Restored → green.
  2. Reverted the template Budget slot to the base turn/minutes quota → fixes the objective contract labels… failed. Restored → green.
  3. Removed item 10's marking clause → describes the prose budget… failed. Restored → green.
  4. Removed the exemplar's Context: [ASSUMPTION]…describes the prose budget… failed. Restored → green.
  5. Deleted "Do not claim that " from the budget bullet → describes the prose budget… failed. Restored → green.
  6. Restored the base deliverable sentence in the intro → withholds an actionable hand-off… failed. Restored → green.
  7. Restored the unconditional "ask whether to edit it" Step 1 sentence → walks the six steps in order… failed. Restored → green.

Verification

  • npx vitest run src/skills/bundled/goal-draft/SKILL.test.ts (packages/core) — 12 passed, 0 failed (run pre-probe, post-probe-restore, and post-format)
  • Mutation probes 1–7 above — each red on the intended test, then green after restore
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • npx prettier --check on both changed files — clean (after prettier --write re-padded the table)
  • Pre-commit hook (lint-staged) — passed during commit

Integration tests were not run: the change is skill prose plus its contract tests, fully exercised by the focused Vitest suite; it is not behavior reachable only through the bundled CLI or integration harness.

中文说明

评审处理轮次 — PR #11284

提交:4a2c0363bdfix(core): align goal-draft gate and budget default with the documented contract

七条行内发现均为 Suggestion 级别、有价值、且位于本 PR 自身足迹内(packages/core/src/skills/bundled/goal-draft/),因此七条全部实现。每条新增断言都用变异探测验证过:删除或还原目标措辞后目标测试变红,恢复后回到全绿。

各条发现的处理

  • [rc:3950177633] R1-1 — 闸门宽于文档契约(SKILL.md:111):已实现。 闸门现在只对文档已列出的必要项触发——"未知成功判据、未核实的命令或输入路径、未解决的 edit-versus-replace 选择(各自写作 <TODO: …>)"——与 docs/users/features/goals.md:70 一致。自检第 7 条已对齐:未核实的路径或命令属于必要项,保持 <TODO: …> 而不再算通过。测试定位串已移到新开头,并补了两条断言:限定在 Step 0 之前切片内的开头交付句(该短语在闸门行也出现),以及闸门窗口内的 success criterion
  • [rc:3950177644] R1-3 — 模板 Budget 丢失绝对回合上限(SKILL.md:69):已实现。 槽位现为 <user's stopping agreement; otherwise stop as blocked after 20 turns, and mark that default [ASSUMPTION] in Context>,恢复绝对上限与 goals.md:49/:59、示例及 goal-tools.ts 使用的规范 stop as blocked 动词。
  • [rc:3950177661] R1-5 — [ASSUMPTION] 标注没有落地点(SKILL.md:83/91/109):已实现,两半都做。 自检第 10 条末尾新增";未被用户指定的默认 Budget 已在 Context 中标注 [ASSUMPTION]",强示例行补了 Context: [ASSUMPTION] the 20-turn budget is the drafter's default, not the user's. 断言分别钉住 Step-5 切片中的该条款与示例措辞。
  • [rc:3950177665] R1-6 — 极性盲断言(SKILL.test.ts:184):已实现。 片段断言替换为完整禁止句 "Do not claim that writing it configures a timer or changes the Goal token budget"(与 SKILL.md 逐字节一致)。
  • [rc:3950177677] R1-7 第 1 处 — 模板 Budget 行无断言把关:已实现。 模板切片现在钉住 <user's stopping agreementstop as blocked after 20 turns,以及不含 minutes
  • [rc:3950177685] R1-7 第 2 处 — 开头交付句无断言把关:已实现。 deliver only a draft marked "Needs clarification" 被钉在 body.slice(0, body.indexOf('## Step 0')) 内,闸门行无法满足它。
  • [rc:3950177688] R1-7 第 3 处 — Step 1 保留用户选择行为无断言把关:已实现。 钉住 preserve the user's explicit choice to edit itdo not choose on the user's behalf

没有发现被拒绝、推迟或升级;因此省略 comment-replies.jsondeferred-findings.json--conflict 为 false,无需合并。

说明:示例行变长后,Prettier 重新填充了 Weak→strong 表格(仅空白;各行措辞未变)。未改动 settings 源,无需重新生成 schema。

变异探测

每个探测都修改 SKILL.md、重跑聚焦套件、然后还原文件:

  1. 删除闸门中的必要项枚举 → withholds an actionable hand-off… 失败(1 失败 / 11 通过)。还原 → 全绿。
  2. 把模板 Budget 槽还原为基线的回合/分钟配额措辞 → fixes the objective contract labels… 失败。还原 → 全绿。
  3. 删除第 10 条的标注条款 → describes the prose budget… 失败。还原 → 全绿。
  4. 删除示例的 Context: [ASSUMPTION]…describes the prose budget… 失败。还原 → 全绿。
  5. 从预算 bullet 中删除 "Do not claim that " → describes the prose budget… 失败。还原 → 全绿。
  6. 把开头交付句还原为基线句子 → withholds an actionable hand-off… 失败。还原 → 全绿。
  7. 把 Step 1 还原为无条件的 "ask whether to edit it" → walks the six steps in order… 失败。还原 → 全绿。

验证

  • npx vitest run src/skills/bundled/goal-draft/SKILL.test.ts(packages/core)— 12 通过,0 失败(探测前、探测还原后、格式化后各跑一次)
  • 上述变异探测 1–7 — 每个都在目标测试上变红,还原后转绿
  • npm run build — 通过(退出码 0)
  • npm run typecheck — 通过(退出码 0)
  • npm run lint — 通过(退出码 0)
  • 对两个改动文件运行 npx prettier --check — 干净(在 prettier --write 重新填充表格之后)
  • 提交时的 pre-commit 钩子(lint-staged)— 通过

未运行集成测试:本次改动是 skill 正文及其契约测试,聚焦 Vitest 套件已完全覆盖;不属于只能通过打包 CLI 或集成框架触达的行为。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

🧵 Resolved all 7 selected review thread(s). · 已关闭全部选中的 7 条评审线程。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 kimi-k3 · CLI 0.23.0

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved at head 4a2c036. Contained change (+106/-16, 3 files): goal-draft guidance tightened toward concise, verifiable objectives, plus the last commit aligning the gate and budget default with the documented behavior. All checks green at head except review-pr, still running.

@qwen-code-dev-bot qwen-code-dev-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved at head 4a2c0363.

我上一张批准票挂在 a253680b 上,随着这次推送已被标记为过期,所以这是在新 head 上重投的一票。 增量只有一个提交、两个文件、+34/-14,内容是把 skill 的措辞对齐到它自己该遵守的契约,而不是加功能。

对齐方向我两边都读了,确实是对齐不是放宽。 SKILL.md:111 现在把"什么算 essential"列成三项——未知的成功判据、未验证的命令或输入路径、没定下来的 edit 还是 replace——这与本 PR 自己写进 docs/users/features/goals.md:70 的那句逐类对应;而旧写法是"只要还剩任何 <TODO: …> 或关键决定",跟同一份文件里的另一条规则(非必要默认值用 [ASSUMPTION] 标,<TODO> 只留给缺成功判据的情况)互相矛盾:按旧措辞,一个只带非必要 <TODO> 的草稿本该被拒绝交付,而按 marker 规则它又该正常交付。收窄成枚举是把这条自相矛盾消掉,方向是收紧口径而不是放宽闸门。

这条改动唯一可能开洞的地方,在同一个 hunk 里堵上了。 自检第 7 条从"Context 里的路径和命令都验证过或是 <TODO>"改成"未验证的路径或命令属于 essential,必须保持 <TODO: …>",所以不能再用"标个 [ASSUMPTION]"的方式把一个没验证过的命令带进可执行的交接里。Budget 那三处也自洽了:模板行、自检第 10 条、以及弱/强示例表——强例子现在带 Context: [ASSUMPTION] the 20-turn budget is the drafter's default, not the user's,不再出现"示例里写默认预算但不声明这是假设"这种自我打脸;同时正文没有把它说成运行时强制的轮数上限,和文档里"写进 objective 不会配置计时器或改动 token 预算"仍然一致。

守卫套件我重新逐条比过,不是只看它没红。 这个 head 上 SKILL.test.ts 里 58 个正向 toContain 字面量全部存在于 SKILL.md(重写后用脚本再核了一遍);顺序 pin 是升级不是削弱——gate 锚点跟着新句子搬了位置,另外补了两条切片断言:交付句只能在 ## Step 0 之前匹配到(因为 "Needs clarification" 现在同时出现在 gate 句里,全局 toContain 会串味),以及 gate 到交接之间那段必须含 success criterion。这两处都是我会在自己 review 里要求的形状。

之前那轮已核实的前提没有被这次推送改动:propose_goal 只在 resolveInteractionMode === 'interactive' 时注册(packages/core/src/config/config.ts:9442),所以 Web Shell/ACP 拿到可复制命令是事实而不是取舍;tokensUsed/tokenBudget 在 web-shell mapper 里走 getNumber + 可选展开、不进必填校验,这一点在 #11254 已核过,本 PR 不碰。

不阻塞、留个话头:同一页 goals.md:19 那句"footer pill 和每一张状态卡都显示花费"以及"Once a Goal has billed a turn"仍然不准确(legacy 状态卡不显示数字,实现判的是已记录花费),那是 #11248 带来的、本 PR 没动,值得顺手一个小 follow-up。

CI 事实。 这个 head 上 Test (ubuntu-latest) 24m15s、Lint & Static 13m55s、Integration Tests (no-AK) 10m13s 都绿,只有 review-pr 还在跑,没有任何红。页面仍是 REVIEW_REQUIRED/BLOCKED:还有 4 位被点名的真人 reviewer 没交票,机器人批准不满足这条要求——yiliang114 已经在这个 head 上 Approve 了,所以真正缺的是那四位里再补一张。

@qqqys
qqqys added this pull request to the merge queue Sep 7, 2026
Merged via the queue into QwenLM:main with commit bc13d16 Sep 7, 2026
60 of 61 checks passed
@chiga0

chiga0 commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

Post-merge review of head 4a2c0363 (merged during review, right after the wording-alignment commit; no approval event). Executed locally on linux / node v24.20.0.

Verified

  • The user-doc additions match the skill text at this head: read-bounded grounding (no tests/builds/installs/services during drafting), usually 3–5 Done-when checks with no count-padding, the audit zero-defect rule with no invented scenario/evidence/round quotas, the "Needs clarification" gate that withholds propose_goal and any runnable /goal set//goal edit line, [ASSUMPTION] reserved for nonessential defaults, and the Budget line described as a model stopping agreement rather than a runtime timer or token-budget change.
  • The handoff wording matches the actual propose_goal availability (interactive terminal only; Web Shell/ACP/headless/disabled/active-Goal take the manual-command path).
  • The bundled skill copy is generated at build time from this same source (copy_bundle_assets), so there is no second committed copy to drift.
  • The alignment commit's re-anchored gate ("If an essential item remains unresolved") keeps its position between Step 5 and the handoff, pinned positionally by the tightened test; the intro's deliverable sentence is pinned above Step 0 where only it can match.

Executed: SKILL.test.ts + bundled-skills.integration.test.ts + goal-tools.test.ts 86/86 at this head (the contract tests are direct string/order pins on the prompt file, which is the mutation surface for a prompt-only change).

Cross-check: the earlier LGTM predates the alignment commit; nothing else open. Prompt-contract tests pin the text, not model compliance — as the PR itself discloses, including the E2E gap on the audit-quota behavior.

No blockers found in what merged.

Reviewed with AI assistance.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.23.1.

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants