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

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-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-dev-bot

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

Copy link
Copy Markdown
Collaborator

✅ AutoFix round 1 finished — view run. See this round's report below.

中文说明

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

@qwen-code-dev-bot
qwen-code-dev-bot dismissed stale reviews from ghost 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: 4a2c0363bd — fix(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

提交:4a2c0363bd — fix(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 agreement、stop 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 it 与 do not choose on the user's behalf。

没有发现被拒绝、推迟或升级;因此省略 comment-replies.json 与 deferred-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.

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.

5 participants