Skip to content

feat: add hybrid code mode - #11854

Open
DragonnZhang wants to merge 68 commits into
mainfrom
dragon/add-codemode
Open

DragonnZhang wants to merge 68 commits into
mainfrom
dragon/add-codemode

Conversation

@DragonnZhang

Copy link
Copy Markdown
Collaborator

What this PR does

Adds a Codex-aligned tools.mode enum with direct, code_mode, and code_mode_only. code_mode keeps ordinary tools directly callable while also exposing the isolated exec JavaScript tool; each visible ordinary tool carries its nested JavaScript declaration, while exec retains compact ALL_TOOLS metadata. code_mode_only preserves the strict exec-only ordinary-tool surface, and direct remains the default.

Updates filtered subagent tool surfaces so direct declarations and nested exec bindings honor the same allowlists, exposes the enum in Settings as Default / Code Mode / Code Mode Only, regenerates the settings JSON schema, and removes the former tools.codeModeOnly boolean setting entirely.

Adds synchronized English and Chinese design documents, and brings the existing CodeModeOnly design up to the repository's bilingual documentation standard (English, Chinese).

Why it's needed

Qwen Code previously offered only the default direct tool surface or the strict CodeModeOnly surface. Models could not combine direct calls for simple operations with exec orchestration for multi-tool workflows. A three-value enum matches Codex's ToolMode naming and gives users one explicit setting for all supported exposure modes.

Reviewer Test Plan

How to verify

  1. Leave tools.mode unset or set it to direct, restart Qwen Code, and confirm ordinary tools remain available while exec is absent.
  2. Set tools.mode to code_mode, restart, and confirm both ordinary tools and exec are available. Confirm ordinary tool descriptions include their tools.<name>(args) declaration and deferred tools remain discoverable through tool_search.
  3. Set tools.mode to code_mode_only, restart, and confirm ordinary tools are available through exec rather than as top-level calls, while direct control tools remain available.
  4. Open Settings and confirm Tool Mode cycles among Default, Code Mode, and Code Mode Only. Confirm tools.codeModeOnly is no longer present in the settings schema.
  5. Start with --safe-mode or --bare while either code mode is configured and confirm the effective mode is direct.

Automated verification completed: focused Core tests (121 tests), focused CLI tests (585 tests), a repeated settings-schema regression run (60 tests), full build, full typecheck, full lint, and both installed and branch-built CLI version smoke checks.

Evidence (Before & After)

Before: Settings exposed Code Mode Only (Experimental) as a boolean with false / true.

After: Settings exposes Tool Mode (Experimental) as an enum displaying Default / Code Mode / Code Mode Only. Updated TUI snapshots cover the default display.

Tested on

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

Environment (optional)

macOS, Node.js v24.18.0; local source build and package-level Vitest suites.

Risk & Scope

  • Main risk or tradeoff: Hybrid mode adds a short nested-call declaration to each ordinary tool description, increasing prompt size slightly; complete schemas are not duplicated in the exec description.
  • Not validated / out of scope: Live-provider interactive runs and Windows/Linux local execution were not tested; CI covers supported platforms.
  • Breaking changes / migration notes: tools.codeModeOnly is removed. Replace { "tools": { "codeModeOnly": true } } with { "tools": { "mode": "code_mode_only" } }.

Linked Issues

Related to #10377.

中文说明

本 PR 做了什么

新增与 Codex 对齐的 tools.mode 枚举,支持 direct、code_mode 和 code_mode_only。code_mode 在保留普通工具直接调用能力的同时提供隔离的 exec JavaScript 工具;每个可见普通工具会携带自己的嵌套 JavaScript 声明,而 exec 保留精简的 ALL_TOOLS 元数据。code_mode_only 保持严格的普通工具仅经 exec 调用模式,direct 仍为默认值。

更新经过过滤的子智能体工具面,使直接声明和 exec 嵌套 binding 遵守同一组 allowlist;在设置界面中将该枚举显示为 Default / Code Mode / Code Mode Only;重新生成 settings JSON schema;并彻底移除原来的 tools.codeModeOnly 布尔设置。

新增同步的英文和中文设计文档,并将现有 CodeModeOnly 设计补齐为仓库要求的双语文档(英文、中文)。

为什么需要

Qwen Code 此前只提供默认的直接工具面或严格的 CodeModeOnly 工具面。模型无法在简单操作中使用直接调用,同时在多工具工作流中使用 exec 编排。三值枚举与 Codex 的 ToolMode 命名一致,并为所有支持的暴露模式提供一个明确的统一设置项。

Reviewer 测试计划

如何验证

  1. 不设置 tools.mode 或将其设为 direct,重启 Qwen Code,确认普通工具仍可用且不存在 exec。
  2. 将 tools.mode 设为 code_mode 并重启,确认普通工具和 exec 同时可用;确认普通工具描述包含各自的 tools.<name>(args) 声明,延迟工具仍可通过 tool_search 发现。
  3. 将 tools.mode 设为 code_mode_only 并重启,确认普通工具通过 exec 而不是顶层调用使用,同时直接控制工具仍然可用。
  4. 打开设置界面,确认 Tool Mode 可在 Default、Code Mode 和 Code Mode Only 之间切换,并确认 settings schema 中不再存在 tools.codeModeOnly。
  5. 配置任一 code mode 后用 --safe-mode 或 --bare 启动,确认有效模式为 direct。

已完成自动化验证:Core 相关测试(121 个)、CLI 相关测试(585 个)、再次运行的 settings schema 回归测试(60 个)、完整 build、完整 typecheck、完整 lint,以及已安装版本和分支构建版本的 CLI 版本 smoke 检查。

前后对比证据

之前:设置界面以 false / true 布尔值展示 Code Mode Only (Experimental)。

之后:设置界面以枚举展示 Tool Mode (Experimental),可选 Default / Code Mode / Code Mode Only。更新后的 TUI snapshot 覆盖默认显示。

测试平台

OS 状态
🍏 macOS ✅
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

macOS、Node.js v24.18.0;本地源码构建和 package 级 Vitest 测试套件。

风险与范围

  • 主要风险或取舍:混合模式会在每个普通工具描述中增加一段简短的嵌套调用声明,使 prompt 略微增大;完整 schema 不会在 exec 描述中重复。
  • 未验证 / 范围外:未进行真实 provider 的交互式运行,也未在 Windows/Linux 本地执行;支持平台由 CI 覆盖。
  • 破坏性变更 / 迁移说明:tools.codeModeOnly 已移除。请将 { "tools": { "codeModeOnly": true } } 替换为 { "tools": { "mode": "code_mode_only" } }。

关联 Issue

关联 #10377。

@DragonnZhang

Copy link
Copy Markdown
Collaborator Author

E2E test report

  • Baseline CLI: globally installed qwen reports 0.23.3-nightly.20260913.faa395885e.
  • Branch CLI: the built CLI reports 0.23.3.
  • Automated behavior coverage passed for all three enum values, safe/bare fallback to direct, direct/hybrid/only declaration surfaces, deferred-tool discovery, filtered subagent allowlists, and the Settings enum/default rendering.
  • Focused Core: 121 tests passed.
  • Focused CLI: 585 tests passed; the 60-test settings-schema suite was rerun after the final removal assertion and passed.
  • Repository checks: npm run build, npm run typecheck, and npm run lint passed. The first build attempt was interrupted by a transient SIGABRT in the Telegram workspace; that workspace passed independently and the complete build passed on retry.
  • Live-provider interactive execution was not run locally. Reviewer verification steps for direct, code_mode, and code_mode_only are included in the PR body.

@doudouOUC doudouOUC 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.

Read the full diff of the ten production files and audited every non-test getToolMode/getCodeModeOnly/isCodeModeEnabled read site at this head. No new production defect found — and, per the review rules, I re-verified the four open Criticals against the code as it stands rather than against their threads. All four still stand; I am not re-filing them, listing them here only so the record shows they were measured at this commit.

  • R1-1 — still stands. packages/cli/src/config/config.ts:2261-2264 passes settings.tools?.mode straight through (? (settings.tools?.mode ?? ToolMode.Direct)), while packages/core/src/config/config.ts:10399 gates registration with a denylist (if (this.getToolMode() === ToolMode.Direct) return;). An out-of-union value therefore registers exec while the other read sites treat the session as direct. I confirmed there is no value validation on the settings-load path.
  • R1-22 — still stands. agent-core.ts:1720-1724: isCodeModeEnabled(...) && this.executionAllowedExactTools?.has(ToolNames.EXEC) && getToolExposure(toolName) === 'code-mode-callable' returns true, i.e. an allowlist containing only exec authorises direct calls to every code-mode-callable tool. In hybrid there is no second wall (the scheduler gate is CodeModeOnly-only, which I verified is correct for hybrid).
  • R1-2 and R1-3 I did not re-derive line by line; the first needs only that ToolMode is a value import evaluated at module load in settingsSchema.ts (it is), and the second only that agent-core.ts narrows declarationNames to {exec} ∪ configuredNames while the binding plan keeps the widened set (it does).

Verified correct for hybrid, so no change is needed there: the twelve unconverted === CodeModeOnly checks are each semantically right for code_mode (scheduler/ACP direct-call gates, deferred reveal and preload, getDeferredToolSummary, the zoom hint); planCodeModeBindings builds a fresh plan per call, so there is no cache-staleness path; tool_search stays registered and top-level-visible in hybrid with revealed deferred tools receiving augmented declarations through the normal refresh; and no codeModeOnly stragglers remain in any production file, with the regenerated settings.schema.json enum matching the schema source.

@wenshao

wenshao commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /takeover from 5

@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 22, 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 window's round counter starts at 5 (the rounds this PR spent in review before takeover), so the Critical-only brake engages after 0 more change-producing round(s) instead of a full fresh 5. Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。本窗口轮次计数从 5 起算(即本 PR 托管前已进行的评审轮数),因此再经过 0 个产生改动的轮次即进入 Critical-only,而非重新计满 5 轮。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

qwen-code-ci-bot added 2 commits September 22, 2026 15:27
- web-shell: call the exported isSettingVisible in the code-mode alias
  test and sync the mirrored alias table to tools.mode, fixing the
  ReferenceError and stale-alias failures in the Test job
- coreToolScheduler: render only the skill invocation surfaces the
  session actually has — no exec surface in direct mode where exec is
  never registered, no top-level Skill surface in code_mode_only where
  direct skill calls are rejected
- agent-core: let MCP tool names fall through to the exact-name and
  pattern checks before the nested exec gateway admits them, so a
  server-level executionAllowedTools pattern is honored for nested
  bindings
- docs/settings: sync the threshold bridge-mode wording, the container
  execution fallback, and the zh-CN withheld-tool translation with the
  shipped behavior
# Conflicts:
#	packages/cli/src/config/settingsSchema.ts
#	packages/core/src/config/config.ts
#	packages/vscode-ide-companion/schemas/settings.schema.json
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #11854

Round mode: Critical-only (window seeded at round 5). Scope this round: the failed Test (ubuntu-latest, Node 22.x) check, the four actionable Critical findings, the requested origin/main merge, and a bounded set of cheap in-footprint Suggestions. Everything else in the actionable sections is replied to on its thread and deferred to the next round.

Commits: 3239c6804c (review fixes) and f35beb1413 (merge of origin/main).

Resolved findings

R4-1 (rc:4066711873) — Critical — web-shell test calls nonexistent isSettingExcluded

packages/web-shell/client/settings.test.ts now calls the exported isSettingVisible('tools.mode', { excludeItems: ['setting:code-mode-only'] }) and asserts false, matching the real export and polarity. This was the ReferenceError failing the Test job.

R4-2 (rc:4066711886) — Critical — stale mirrored alias table

The mirror entry in the both-directions alias test is re-valued to 'setting:code-mode-only': 'tools.mode' (value only, key set unchanged), so the exhaustive alias test matches the production SETTING_KEYS repoint.

R4-3 (rc:4066711894) — Critical — skill-activation reminder names surfaces the session does not have

coreToolScheduler.ts now renders only the invocation surfaces that exist: the exec clause appears only when a code mode is enabled AND exec is registered (isCodeModeEnabled(getToolMode()) && getTool(EXEC)), and the top-level Skill clause is omitted under code_mode_only (where direct skill calls are rejected). Direct mode (the default, where exec is never registered) now names only the top-level Skill tool. The previously pinned direct-mode test is updated to assert the exec clause is absent; new tests cover hybrid (both clauses) and code_mode_only (exec clause only, via a nested source: 'code_mode' call).

R2-2 (rc:4051539079, rc:4066712191) — Critical — nested exec gateway bypasses MCP execution patterns

agent-core.ts route (a): the nested-binding exec gateway now lets MCP tool names fall through to the exact-name and pattern checks whenever executionAllowedMcpPatterns is non-empty ((!toolName.startsWith('mcp__') || patterns.length === 0) guard). A fork allowlisted ['exec', 'mcp__github__read_*'] no longer binds mcp__github__create_issue (or mcp__filesystem__*) inside exec, while pattern-free allowlists keep the pinned full-registry inheritance and built-ins keep the pinned code_mode_only semantic. New test: honors MCP execution patterns in the hybrid nested binding set.

R4-6 (rc:4066711908) — Suggestion — zh-CN mistranslation of "withheld-tool warnings"

docs/design/code-mode.zh-CN.md acceptance criterion now reads 被保留工具(withheld)的警告 instead of 工具延迟警告, no longer colliding with the doc's own 延迟 = deferred usage.

R4-8 (rc:4066711921) — Suggestion — container design doc names only the rejection

Both language versions of docs/design/2026-09-12-agent-container-execution.md now state that tools.mode: "code_mode" warns and continues with direct tools only (no exec), alongside the code_mode_only rejection.

R4-4 (rc:4066711899) — Suggestion — partially resolved

In-footprint half fixed: the tools.toolSearch.threshold description (settingsSchema.ts) now names direct and hybrid modes plus the exec-reachability sentence, and the generated settings.schema.json was regenerated in the same commit. The three packages/sdk-typescript copies are outside the PR's footprint; deferred with a reply on the thread.

R3-8 (rc:4051538893) — Suggestion — verified already resolved at this head

A repo-wide grep finds tools.codeModeOnly in docs only at the intentional deprecation row (settings.md:392); the three passages the finding named already use tools.mode: "code_mode_only". Re-verified, listed as resolved.

Declined with evidence

R2-16 (rc:4051538861) — drop SharedArrayBuffer from the guest-globals bullet

Refuted: host.ts:491 already deletes SharedArrayBuffer from the guest globalThis (and did at 6c919b7 when filed), and quickjs-emscripten exposes no such global anyway — so "the guest has no SharedArrayBuffer" is accurate and the bullet stays. Replied on the thread.

Merge with origin/main (--conflict true)

Merged origin/main (60 commits) into the branch. Conflicts and semantic resolutions:

  • packages/cli/src/config/settingsSchema.ts: kept main's new tools.executionSandbox block and this PR's tools.mode enum; main's codeModeOnly boolean stays removed (the schema test suite pins its absence).
  • packages/core/src/config/config.ts: main had moved the container-execution branch below the registration helpers and extended it (environment.toolNames filter, structured-output/goal-worker/host-session registration). Took main's moved block and re-applied this PR's two code-mode changes onto it: the tools.mode = "code_mode_only" rejection message and the hybrid warn-and-fallback branch. The branch still returns before registerExecIfEnabled.
  • packages/vscode-ide-companion/schemas/settings.schema.json: regenerated from the merged schema source (contains executionSandbox and mode, not codeModeOnly).
  • packages/cli/src/config/config.ts: main's new ssh-workspace path assigned the removed configParams.codeModeOnly = false; mapped to the renamed key configParams.toolMode = ToolMode.Direct, and main's SSH test was updated to assert the new key (behavior pinned is unchanged: SSH workspaces force direct mode).

Test weakening

One pre-existing assertion was re-keyed, not removed: config.test.ts's SSH-workspace isolation test asserted the constructor param codeModeOnly: false; after the PR's settings rename the equivalent pin is toolMode: ToolMode.Direct. Same behavioral guarantee (SSH workspace forces non-code-mode), updated to the renamed surface. Recorded here per the test-evidence boundary.

Mutation probes (guard witnesses)

  • R4-3: temporarily forced execSurfaceAvailable = true → the direct-mode assertion failed (1 failed); restored → 444/444 pass.
  • R2-2: temporarily removed the MCP fall-through guard → honors MCP execution patterns in the hybrid nested binding set failed (1 failed | 32 passed); restored → 33/33 pass. The probe also confirmed the pinned pattern-free inheritance cases stayed green under the mutant.
  • R4-1/R4-2 are test-only repairs of a suite that was itself red at the reviewed head (ReferenceError + stale alias); R4-6/R4-8/R4-4 are documentation or description text with no guard to mutate.

Deferred to next round (replied on each thread)

R2-4 (nested-only skill gate refactor), R2-17, R2-18, R3-1, R3-4, R3-5 (partially stale — warn exists; settings.md sentence + dedicated test remain), R3-6, R3-7 (collision-resolution semantics choice), R4-4 SDK half (out of footprint), R4-5, R4-7, R4-9, and the open round-1/round-2 Suggestions (R1-5..R1-23, R2-3, R2-5..R2-15).

Environment note

This runner sets SANDBOX=qwen-code-dbf59527; main's sandbox-selection code (deliberately) disables whole-CLI sandboxing when that variable is present, which reds 11 pre-existing sandbox-related tests locally. Those suites were run with env -u SANDBOX (matching CI, where the variable is unset) — all pass. No code was changed for this; it is an artifact of running inside the sandbox container.

Verification

  • npm run build (COREPACK_HOME=/tmp/corepack) — passed (after conflict resolution, on the merged tree)
  • npm run typecheck — passed (first post-merge run surfaced stale dist/ plus one real rename fallout in cli/config.ts, fixed as toolMode: ToolMode.Direct; clean rerun)
  • npm run lint — passed
  • npm run generate:settings-schema — ran; regenerated settings.schema.json committed (contains executionSandbox + mode, no codeModeOnly)
  • packages/web-shell: npx vitest run client/settings.test.ts — 20 passed
  • packages/core: npx vitest run src/core/coreToolScheduler.test.ts — 444 passed
  • packages/core: npx vitest run src/agents/runtime/agent-core.skill-gate.test.ts — 33 passed
  • packages/core: npx vitest run src/config/config-execution-environment.test.ts — 19 passed
  • packages/core: npx vitest run src/config/config.test.ts src/core/client.test.ts (env -u SANDBOX) — 1264 passed
  • packages/cli: npx vitest run src/config/config.test.ts src/config/settingsSchema.test.ts src/config/settingsUtils.test.ts (env -u SANDBOX) — 605 passed
  • packages/cli: npx vitest run src/acp-integration/session/Session.test.ts (env -u SANDBOX) — 1048 passed
  • Integration tests: not run — no behavior in this round is exercised only through the bundled CLI harness (the changed paths are unit-covered above).
中文说明

Autofix 本轮总结 — PR #11854

本轮模式:仅 Critical(窗口由第 5 轮起算)。本轮范围:失败的 Test (ubuntu-latest, Node 22.x) 检查、四个可执行的 Critical 发现、所请求的 origin/main 合并,以及一小批低成本的 footprint 内 Suggestion。可执行区域中的其余条目已在各自线程回复并推迟到下一轮。

提交:3239c6804c(评审修复)与 f35beb1413(合并 origin/main)。

已解决的发现

R4-1(rc:4066711873)— Critical — web-shell 测试调用了不存在的 isSettingExcluded

packages/web-shell/client/settings.test.ts 现在调用真实导出的 isSettingVisible('tools.mode', { excludeItems: ['setting:code-mode-only'] }) 并断言 false。这正是导致 Test 任务失败的 ReferenceError。

R4-2(rc:4066711886)— Critical — 镜像别名表过期

双向别名穷尽测试中的镜像条目值改为 'setting:code-mode-only': 'tools.mode'(只改值,不增删键),与生产侧 SETTING_KEYS 的重指向一致。

R4-3(rc:4066711894)— Critical — 技能激活提醒列出了会话不具备的调用入口

coreToolScheduler.ts 现在只渲染实际存在的调用入口:exec 子句仅在启用某个 code mode 且已注册 exec 时出现(isCodeModeEnabled(getToolMode()) && getTool(EXEC)),顶层 Skill 子句在 code_mode_only 下省略(该模式拒绝直接 skill 调用)。direct 模式(默认,从不注册 exec)现在只提顶层 Skill 工具。原先固定错误行为的 direct 测试已改为断言 exec 子句不出现;新增测试覆盖 hybrid(两个子句)与 code_mode_only(仅 exec 子句,经由 source: 'code_mode' 的嵌套调用)。

R2-2(rc:4051539079、rc:4066712191)— Critical — 嵌套 exec 网关绕过 MCP 执行模式

agent-core.ts 采用路线 (a):当 executionAllowedMcpPatterns 非空时,嵌套绑定的 exec 网关让 MCP 工具名落入后续的精确名与模式检查((!toolName.startsWith('mcp__') || patterns.length === 0) 守卫)。白名单为 ['exec', 'mcp__github__read_*'] 的 fork 不再在 exec 内绑定 mcp__github__create_issue(或 mcp__filesystem__*);不带模式的白名单保持被固定的全 registry 继承语义,内建工具保持被固定的 code_mode_only 语义。新增测试:honors MCP execution patterns in the hybrid nested binding set。

R4-6(rc:4066711908)— Suggestion — 中文误译 “withheld-tool warnings”

docs/design/code-mode.zh-CN.md 的验收标准改为「被保留工具(withheld)的警告」,不再与文档中「延迟=deferred」的既有用法冲突。

R4-8(rc:4066711921)— Suggestion — 容器设计文档只写了拒绝分支

docs/design/2026-09-12-agent-container-execution.md 中英两版现在都说明:tools.mode: "code_mode" 会告警并仅以直接工具继续(不注册 exec),与 code_mode_only 的拒绝并列。

R4-4(rc:4066711899)— Suggestion — 部分解决

footprint 内的一半已修复:settingsSchema.ts 的 tools.toolSearch.threshold 描述现在同时描述 direct 与 hybrid 模式并补充 exec 可达句,生成的 settings.schema.json 已在同一提交重新生成。packages/sdk-typescript 的三处副本在 PR footprint 之外,已在线程回复中说明并推迟。

R3-8(rc:4051538893)— Suggestion — 已在当前 head 验证为解决

全仓 grep 显示文档中 tools.codeModeOnly 只剩有意的弃用行(settings.md:392);该发现指出的三处段落已使用 tools.mode: "code_mode_only"。重新验证后列为已解决。

附证据驳回

R2-16(rc:4051538861)— 从 guest 全局变量条目删除 SharedArrayBuffer

驳回:host.ts:491 已经从 guest 的 globalThis 删除 SharedArrayBuffer(在该发现提交时的 6c919b7 就已如此),且 quickjs-emscripten 本来也不暴露该全局对象——因此「guest 没有 SharedArrayBuffer」的表述是准确的,条目保留。已在线程回复。

与 origin/main 的合并(--conflict true)

将 origin/main(60 个提交)合入本分支。冲突与语义消解:

  • packages/cli/src/config/settingsSchema.ts:保留 main 新增的 tools.executionSandbox 块与本 PR 的 tools.mode 枚举;main 的 codeModeOnly 布尔键保持移除(schema 测试套件固定了它不存在)。
  • packages/core/src/config/config.ts:main 把容器执行分支移到了注册辅助函数之后并做了扩展(environment.toolNames 过滤、structured-output/goal-worker/host-session 注册)。采用 main 移动后的块,并把本 PR 的两处 code-mode 改动重新落到其上:tools.mode = "code_mode_only" 的拒绝文案与 hybrid 告警回退分支。该分支仍在 registerExecIfEnabled 之前返回。
  • packages/vscode-ide-companion/schemas/settings.schema.json:从合并后的 schema 源重新生成(含 executionSandbox 与 mode,不含 codeModeOnly)。
  • packages/cli/src/config/config.ts:main 新增的 ssh-workspace 路径给已删除的 configParams.codeModeOnly = false 赋值;映射到重命名后的 configParams.toolMode = ToolMode.Direct,并把 main 的 SSH 测试更新为断言新键(固定的行为不变:SSH workspace 强制 direct 模式)。

测试削弱说明

有一处既有断言改了键而非删除:config.test.ts 的 SSH-workspace 隔离测试原断言构造参数 codeModeOnly: false;本 PR 设置键重命名后,等价的固定是 toolMode: ToolMode.Direct。行为保证相同(SSH workspace 强制非 code mode),仅随重命名更新。按测试证据边界在此记录。

变异探针(守卫见证)

  • R4-3:临时强制 execSurfaceAvailable = true → direct 模式断言失败(1 failed);还原后 444/444 通过。
  • R2-2:临时移除 MCP 落空守卫 → honors MCP execution patterns in the hybrid nested binding set 失败(1 failed | 32 passed);还原后 33/33 通过。探针同时确认不带模式的继承用例在变异体下保持绿色。
  • R4-1/R4-2 是对本就在评审 head 变红的测试套件的纯测试修复(ReferenceError 加过期别名);R4-6/R4-8/R4-4 为文档或描述文案,没有可供变异的守卫。

推迟到下一轮(均已在各自线程回复)

R2-4(nested-only skill 门控重构)、R2-17、R2-18、R3-1、R3-4、R3-5(部分过时——告警已存在;settings.md 句子与专门测试待做)、R3-6、R3-7(碰撞消解语义取舍)、R4-4 的 SDK 一半(footprint 外)、R4-5、R4-7、R4-9,以及仍未处理的第 1、2 轮 Suggestion(R1-5..R1-23、R2-3、R2-5..R2-15)。

环境说明

本 runner 设置了 SANDBOX=qwen-code-dbf59527;main 的 sandbox 选择逻辑(有意地)在该变量存在时禁用整 CLI 沙箱,导致 11 个既有的沙箱相关测试在本地变红。这些套件改用 env -u SANDBOX 运行(与 CI 一致,CI 无此变量)——全部通过。未为此改动任何代码;这是在沙箱容器内运行的环境产物。

验证

  • npm run build(COREPACK_HOME=/tmp/corepack)— 通过(冲突消解后、合并树上)
  • npm run typecheck — 通过(合并后首次暴露了过期的 dist/ 以及 cli/config.ts 中一处真实的重命名遗留,已修为 toolMode: ToolMode.Direct;重跑干净)
  • npm run lint — 通过
  • npm run generate:settings-schema — 已运行;重新生成的 settings.schema.json 已提交(含 executionSandbox 与 mode,不含 codeModeOnly)
  • packages/web-shell:npx vitest run client/settings.test.ts — 20 通过
  • packages/core:npx vitest run src/core/coreToolScheduler.test.ts — 444 通过
  • packages/core:npx vitest run src/agents/runtime/agent-core.skill-gate.test.ts — 33 通过
  • packages/core:npx vitest run src/config/config-execution-environment.test.ts — 19 通过
  • packages/core:npx vitest run src/config/config.test.ts src/core/client.test.ts(env -u SANDBOX)— 1264 通过
  • packages/cli:npx vitest run src/config/config.test.ts src/config/settingsSchema.test.ts src/config/settingsUtils.test.ts(env -u SANDBOX)— 605 通过
  • packages/cli:npx vitest run src/acp-integration/session/Session.test.ts(env -u SANDBOX)— 1048 通过
  • 集成测试:未运行——本轮改动的路径均已被上述单元测试覆盖,不存在只有打包 CLI 或集成设施才能触达的行为。

Deferred non-Critical feedback

Critical-only mode is active: the round counter reached 5 (this window was seeded at round 5 by @qwen-code /takeover from 5, plus 0 change-producing round(s) since). The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

已进入仅处理 Critical 的模式:轮次计数已达 5(本窗口由 @qwen-code /takeover from 5 从第 5 轮起算,此后又完成 0 个产生改动的轮次)。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 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.24.3

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Could not produce a passing fix for this feedback (round 7/100). This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own.

What I found before stopping:
Qwen hit the tool-call loop guard during address-review. A human should take over this feedback batch.

See the Qwen Autofix agent step logs for model/tool output.

中文说明

🤖 未能为该反馈产生可通过验证的修复(第 7/100 轮)。此项现在需要人工处理;循环保持在线,仍会拾取新反馈与 base 冲突,但不会自行重试此项。

Run log: https://github.com/QwenLM/qwen-code/actions/runs/38693181081


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@qwen-code-review-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review was cancelled before a review could be posted. Nothing failed and nothing is retried automatically: the run was cancelled — by an operator, an upstream event, or the job exceeding its execution time limit. If you still want a review of this PR, request one with @qwen-code /review. See workflow logs.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix round — no action taken

What arrived this round

  • No new reviews and no inline review comments since the last evaluation (2026-10-15T05:49:31Z).
  • One issue-level comment [ic:6195978836] from @qwen-code-review-bot: the automated review run was cancelled before a review could be posted. The notice itself states that nothing failed and nothing is retried automatically; a fresh review can be requested with @qwen-code /review. This is an operational notice, not code feedback.
  • Critical-only mode is active (5 change-producing rounds complete). The deferred non-Critical items are an audit record and are explicitly out of scope for this round.

Why no code change

  • The only non-green check is review-pr: CANCELLED (run 38699035971): the review job itself was cancelled by an operator, an upstream event, or its execution time limit — not by anything in this PR's code. No code change can resolve it; re-running the review is a maintainer/workflow action, and this round has no GitHub credentials to request one.
  • All other checks on the head commit are green (Qwen Code CI build/lint/test, integration tests, tui-parity, Landlock helper, web-shell visuals, Serve A/B) or skipped by design (platform variants).
  • There are zero actionable findings to classify, reproduce, or fix, so there is nothing to commit and no thread to resolve or reply to.

Verification

No build, lint, or test commands were run because the round produced no diff — re-running them would only re-confirm the already-green CI state of the unchanged head commit. Read-only inspection performed:

  • git diff origin/main...HEAD --stat — confirmed the PR's current footprint (98 files, +5356/−618) for context.
  • Reviewed the workflow-prepared feedback.md and checks.json — confirmed no actionable findings and that the sole failed check is the cancelled review job described above.
中文说明

Autofix 本轮 — 未做任何改动

本轮收到的内容

  • 自上次评估(2026-10-15T05:49:31Z)以来,没有新的 review,也没有任何行内评论。
  • 仅有一条 issue 级评论 [ic:6195978836],来自 @qwen-code-review-bot:自动化 review 在发布结果之前被取消。该通知本身说明没有任何失败、也不会自动重试;如需重新 review,可使用 @qwen-code /review 发起。这是一条运维通知,不是代码反馈。
  • 当前处于仅处理 Critical 的模式(已完成 5 个产生改动的轮次)。被延后的非 Critical 条目仅为审计记录,明确不属于本轮处理范围。

为何不修改代码

  • 唯一非绿色的检查是 review-pr: CANCELLED(运行 38699035971):该 review 任务是被操作员、上游事件或执行时限取消的,与本 PR 的代码无关。任何代码改动都无法解决它;重新运行 review 属于维护者/工作流的操作,且本轮没有 GitHub 凭据可以发起请求。
  • 头提交上的其他检查全部为绿色(Qwen Code CI 的构建/lint/测试、集成测试、tui-parity、Landlock helper、web-shell 视觉检查、Serve A/B),或按设计跳过(各平台变体)。
  • 本轮没有任何可执行的发现需要分类、复现或修复,因此无需提交,也没有需要解决或回复的讨论串。

验证情况

由于本轮没有产生任何代码改动,未运行构建、lint 或测试命令——重复运行只会再次确认未变更头提交上已有的绿色 CI 状态。已执行的只读检查:

  • git diff origin/main...HEAD --stat — 确认了 PR 当前的改动范围(98 个文件,+5356/−618),作为背景信息。
  • 查看了工作流准备的 feedback.md 与 checks.json — 确认没有可执行的反馈,且唯一失败的检查就是上述被取消的 review 任务。

Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

@github-actions

Copy link
Copy Markdown
Contributor

Qwen Code review request accepted. Review is queued for an available runner; follow the workflow run for progress. A command-triggered review is not listed under the checks of this PR; the result is posted here as a review when it finishes.

@qwen-code-review-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review timed out. Qwen review timed out after 21600 seconds (of the 360-minute budget). This run already used the maximum 360 minute timeout. See workflow logs.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix round: no action needed

No changes were made in this round. Here is why:

  • Critical-only mode is active. Five change-producing rounds are complete, so the workflow's deterministic brake has engaged. The single remaining feedback item (a non-Critical comment from the automated reviewer) is listed under "Deferred non-Critical feedback" as an audit record. Per the round rules, that section is not actionable work: no code changes, thread resolutions, or replies are made for those items. It stays open for human follow-up, and @qwen-code /retry can start a fresh counting window if desired.
  • All actionable feedback sections are empty. There are no new trusted-maintainer or automated-reviewer reviews, no inline comments, and no issue-level comments newer than the last evaluation (2026-10-15T15:37:42Z).
  • No failed or still-red checks. The current check suite on the PR head is green (all completed checks report SUCCESS or a neutral SKIPPED/CANCELLED state).
  • No base-branch conflict to resolve. This round was invoked with --conflict false, so no merge was performed.

The branch is left exactly as it was at the start of the round: no commits, no working-tree modifications.

中文说明

Autofix 本轮:无需处理

本轮未做任何修改,原因如下:

  • 已处于仅处理 Critical 的模式。 已完成 5 个产生改动的轮次,工作流的确定性刹车机制已生效。仅剩的一条反馈(自动评审机器人非 Critical 评论)列在"延后的非 Critical 反馈"中作为审计记录。按照本轮规则,该区域不属于可执行的工作:不会针对这些条目修改代码、解决会话线程或回复评论。该条目保持开放,留待人工跟进;如有需要,可评论 @qwen-code /retry 开启新的计数窗口。
  • 所有可执行的反馈区域均为空。 自上次评估(2026-10-15T15:37:42Z)以来,没有新的受信任维护者或自动评审的 review、行内评论或 issue 级评论。
  • 没有失败或持续失败的检查。 PR 头部当前的检查套件全部为绿色(所有已完成的检查均为 SUCCESS,或为中性的 SKIPPED/CANCELLED 状态)。
  • 没有需要解决的基线分支冲突。 本轮以 --conflict false 调用,因此未执行合并。

分支保持本轮开始时的状态:没有新提交,工作区没有任何修改。

Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

qwen-code-dev-bot and others added 2 commits October 19, 2026 20:16
# Conflicts:
#	packages/cli/src/ui/AppContainer.test.tsx
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary

Feedback triage

feedback.md lists no actionable reviews, inline comments, issue-level comments, failed checks, or still-red checks. The populated Deferred non-Critical feedback section is the Critical-only audit record and is out of scope for this round. The actionable input is the Same-run verification repair: the previous round was rejected by deterministic verification because packages/cli failed in src/ui/AppContainer.test.tsx — keeps restored Mod diagnostics and input available when startup fails=false — where expect(initialize).toHaveBeenCalledOnce() observed 58 calls.

Root cause

AppContainer's mount effect starts an un-awaited async startup flow. Renders from earlier tests can unmount before that flow finishes, but the flow is not cancelled; when it resumes (for example after the bounded goal-runtime wait) it calls the module-level getInteractiveModSession(config) for its own Config. The failing test installed that module mock with mockReturnValue, so every resumed continuation — regardless of which Config it belonged to — received this test's session and incremented this test's initialize spy. The test sees one call in isolation; in the contended full-suite run many pending continuations resumed inside the vi.waitFor window, producing 58 calls.

Changes

packages/cli/src/ui/AppContainer.test.tsx: the session mock is now scoped with mockImplementation, returning the session only for this test's mockConfig and undefined for any other Config. A witness assertion checks that a lookup for a different Config does not resolve to the session. The production startup path and the existing exact-count assertion are unchanged.

Mutation probe: replacing the scoped implementation with mockReturnValue makes the new witness fail (expected ... to be undefined, received the mocked session); restoring the scoped implementation returns both parameterized cases to green.

Conflict resolution

origin/main (5dcf7c7cb1) is already an ancestor of HEAD (209c593536, the previous round's merge), so --conflict true required no additional merge and no conflict resolution this round.

Verification

  • COREPACK_HOME=/tmp/corepack npm run build — passed.
  • COREPACK_HOME=/tmp/corepack npm run typecheck — passed.
  • COREPACK_HOME=/tmp/corepack npm run lint — passed.
  • npx prettier --check packages/cli/src/ui/AppContainer.test.tsx — passed.
  • cd packages/cli && npx vitest run src/ui/AppContainer.test.tsx — passed, 214/214 tests.
  • cd packages/cli && npx vitest run src/ui/AppContainer.test.tsx -t 'keeps restored Mod diagnostics' — passed, 2/2 tests.
  • Mutation probe (scope replaced with mockReturnValue) — both parameterized tests failed at the witness assertion as expected; restored and re-ran green.
  • cd packages/cli && npx vitest run --changed origin/main --passWithNoTests --maxWorkers=25% --testTimeout=60000 --hookTimeout=60000 --coverage.enabled=false — src/ui/AppContainer.test.tsx passed 214/214; the overall run reported 8 unrelated files failing with environment-specific errors in this sandbox (EACCES: permission denied, mkdtemp '/home/github-runner/...' from the unwritable HOME, footer snapshots rendering the sandbox's docker marker, and sandbox/SSH-bootstrap/browser-launch tests). The same HEAD's CI gate run quoted in the feedback had only the AppContainer failure, confirming those 8 are local-environment-only and unrelated to this one-file test change.
中文说明

Autofix 本轮摘要

反馈分诊

feedback.md 中没有可执行的审查意见、行内评论、议题级评论、失败检查或持续失败的检查。唯一有内容的 Deferred non-Critical feedback 一节是仅处理 Critical 的审计记录,不属于本轮处理范围。本轮可执行的输入是 同一轮验证修复(Same-run verification repair):上一轮被确定性验证拒绝,原因是 packages/cli 的 src/ui/AppContainer.test.tsx 中 keeps restored Mod diagnostics and input available when startup fails=false 测试失败,expect(initialize).toHaveBeenCalledOnce() 观察到 58 次调用。

根因

AppContainer 的挂载 effect 启动了一个未被 await 的异步启动流程。此前测试中的渲染可能在流程结束前卸载,但该流程不会被取消;当它恢复执行时(例如在有界的目标运行时等待之后),会针对它自己的 Config 调用模块级 getInteractiveModSession(config)。失败的测试用 mockReturnValue 安装该模块 mock,因此每个恢复执行的续体——无论属于哪个 Config——都会拿到这个测试的会话并增加该测试 initialize spy 的调用次数。单独运行时测试只看到一次调用;在资源争用的全量测试运行中,大量待处理续体在 vi.waitFor 窗口内恢复,最终产生 58 次调用。

变更

packages/cli/src/ui/AppContainer.test.tsx:会话 mock 现在改为 mockImplementation,仅对本测试的 mockConfig 返回会话,对其他任何 Config 返回 undefined。新增一条见证断言,确认用不同 Config 查询不会解析到该会话。生产启动路径与原有的精确次数断言均未改动。

变异探针:把作用域实现换回 mockReturnValue 后,新见证断言失败(expected ... to be undefined,实际收到 mock 会话);恢复作用域实现后,两个参数化用例均恢复通过。

冲突解决

origin/main(5dcf7c7cb1)已经是 HEAD(209c593536,上一轮的合并提交)的祖先,因此 --conflict true 本轮不需要额外合并,也没有冲突需要解决。

验证

  • COREPACK_HOME=/tmp/corepack npm run build —— 通过。
  • COREPACK_HOME=/tmp/corepack npm run typecheck —— 通过。
  • COREPACK_HOME=/tmp/corepack npm run lint —— 通过。
  • npx prettier --check packages/cli/src/ui/AppContainer.test.tsx —— 通过。
  • cd packages/cli && npx vitest run src/ui/AppContainer.test.tsx —— 通过,214/214 个测试。
  • cd packages/cli && npx vitest run src/ui/AppContainer.test.tsx -t 'keeps restored Mod diagnostics' —— 通过,2/2 个测试。
  • 变异探针(将作用域替换为 mockReturnValue)—— 两个参数化测试如预期在见证断言处失败;恢复后重跑通过。
  • cd packages/cli && npx vitest run --changed origin/main --passWithNoTests --maxWorkers=25% --testTimeout=60000 --hookTimeout=60000 --coverage.enabled=false —— src/ui/AppContainer.test.tsx 通过 214/214;整轮运行报告 8 个不相关文件在此沙箱中因环境问题失败(不可写 HOME 导致的 EACCES: permission denied, mkdtemp '/home/github-runner/...'、footer 快照渲染出沙箱的 docker 标记,以及沙箱/SSH bootstrap/浏览器启动相关测试)。反馈中引用的同一 HEAD 的 CI 门禁运行只有 AppContainer 一个失败,确认这 8 个仅为本地环境问题,与本次单文件测试改动无关。
## Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

  • @qwen-code-review-bot is at this window's regular-feedback budget — to continue: start your comment with [Critical], submit a Request changes review, or comment @qwen-code /retry for a fresh window. / @qwen-code-review-bot 本窗口常规反馈预算已用完——继续请以 [Critical] 开头评论、提交 Request changes、或评论 @qwen-code /retry 开新窗口。
中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 main 有冲突——已在本次推送中解决。

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/模型 deepseek-v4.1-flash-1017 · CLI 0.25.3

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (timeout (3600000ms)) (attempt 9/100) — it will retry on the next scan.

⚠️ This change was NOT pushed — any commit referenced below was made only in the runner workspace and has been discarded. What the agent reported:
Qwen failed during address-review: timeout (3600000ms).

See the Qwen Autofix agent step logs for model/tool output.

中文说明

🤖 AutoFix 在完成前耗尽了时间(timeout (3600000ms))(第 9/100 次尝试)—— 将在下次扫描时重试。

Run log: https://github.com/QwenLM/qwen-code/actions/runs/39356318930


🧠 Handled by Qwen Code · model/模型 deepseek-v4.1-flash-1017 · CLI 0.25.3

@qwen-code-review-bot qwen-code-review-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.

[Critical] Blocking finding(s) follow.

Partially reviewed — gaps disclosed.

Unresolved, please confirm:

  • [Critical] R14-2 docs/developers/tools/task.md:17 — the recovered ledger truncated this prior-round Critical's claim; the current task.md text (exec admitted under either code mode, tool_search under code_mode_only) matches the code, but the original …
  • [Critical] R1-2 packages/cli/src/config/settingsSchema.ts — asserted still standing by maintainer @doudouOUC at an earlier commit; not independently re-verified at the reviewed commit within the time budget
  • [Critical] R1-3 packages/core/src/agents/runtime/agent-core.ts (declarationNames narrowing vs binding plan) — asserted still standing by @doudouOUC at an earlier commit; not independently re-verified at the reviewed commit within the time budget

Not reviewed: build-and-test — 'Integration Tests (CLI, No Sandbox)' was skipped in CI and its suite did not run locally.

Not explored to full depth (tool budget reached): "agent reverse-audit (round 1)": did not read packages/core/src/agents/runtime/subagent-plan-tool-policy.test.ts (lines 229-460) or agent-core.skill-eager-review.test.ts , so I have not conf…; "agent reverse-audit (round 1)": the claim "Hybrid AgentCore surfaces exclude tools hidden by tools.eager from nested bindings; Only retains these deferred targets" ( docs/design/code-mode.md…; "agent reverse-audit (round 1)": "withheld-tool warnings describe the actual available bindings" (acceptance criteria) — I did not locate the withheld-tool warning emitter, so this bullet is un…; "agent reverse-audit (round 2)": did not execute packages/core/src/code-mode/code-mode.test.ts or packages/core/src/code-mode/scheduler.test.ts , and did not mutation-test the canonicalName…; "agent reverse-audit (round 2)": did not enumerate every surface that builds advertised declarations (ACP/daemon session mappers, fork declaration-prefix reuse in agent-core.ts:2196-2205 , cl…, and 25 more.

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

⚠️ 59 finding(s) still carried the — [unverified] tag when the loop ended — the verifier never ruled on them, and they are not confirmed.

Deferred under the convergence posture (round 15, not a blocker) — recorded, not requested in this round:

  • docs/design/code-mode-only.zh-CN.md:123 — [review] The newly added Chinese design doc inverts the English source's concurrency rule: it says nested Promise.all batches are handled by the existing read-only concurrency classifier, while c…
  • docs/design/code-mode.md:3 — [review] The new code-mode.md (and its twin code-mode.zh-CN.md:3 ) opens with a byte-identical copy of the banner this PR also adds to docs/design/code-mode-only.md:3 , but its last sentence dangles here: c…
  • docs/design/code-mode.md:43 — [review] The new design doc's mode-resolution paragraph enumerates the forced- direct environments but omits the SSH-workspace fallback this same PR adds, and the unrecognized-value fallback; docs/design/code…
  • docs/developers/sdk-typescript.md:69 — [review] This added sentence scopes the bridge/warning rules to "direct and hybrid **code** modes", but in this codebase "code modes" is a defined term that *excludes* Direct; the authoritative schema …
  • docs/users/configuration/settings.md:403 — [review] This diff adds the same Code Mode Only discovery paragraph to the tools.eager row that it also adds to the new tools.mode row, producing three near-identical copies inside a 32-line sp…
  • packages/cli/src/config/settingsUtils.ts:660 — [review] The else branch of getDisplayValue now evaluates the exact same expression as the else if above it, making the settingExistsInScope(key, settings) condition (and its comment) d…
  • packages/cli/src/ui/commands/contextCommand.test.ts:1088 — [review] The new if (!declaration) continue; removes the only mechanism that could make clampDeficit materially nonzero, but the diff leaves two comments that still name that me…
  • packages/core/src/agents/runtime/agent-core.skill-gate.test.ts:698 — [review] The added block re-inlines the seven-line private-field cast nine times (lines 704, 741, 993, 1042, 1090, 1130, 1176, 1212, 1244) instead of calling the file's ow…
  • packages/core/src/agents/runtime/agent-core.ts:1976 — [review] The new getInheritedToolExecutionAllowlist() turns the policy-frame publish from one O(n) allowlist computation into O(n²), because the per-name filter calls isToolExecutionA…
  • packages/core/src/agents/runtime/agent-core.ts:2026 — [review] The same five-line "split the configured allowlist into exact names and * patterns, then raw-identity match" expression is written out twice inside one return — once for the…
  • packages/core/src/agents/runtime/subagent-plan-tool-policy.ts:175 — [review] toolConfigAllowsSkill now takes four adjacent, same-typed boolean positional parameters, and this diff moved one of them ( codeModeOnly ) from position 2 to posi…
  • packages/core/src/core/client.test.ts:3475 — [review] The test named reports only code-mode-callable withheld tools as reachable through exec uses a substring assertion that also matches the wrong message, so it does not pin the "only" in…
  • packages/core/src/core/coreToolScheduler.ts:6154 — [review] The diff grows an already-duplicated block: the whole "wrap execution in the ambient allowlist + code-mode runtime/source context" decision is now 25 byte-identical lines copy-past…
  • packages/core/src/tools/agent/agent.ts:2021 — [review] The new nestedExecutionAllowedTools is the only fork allowlist that is not passed through resolveForkExecutionAllowedTools() , so display_image — the one tool the fork path deliber…
  • packages/core/src/tools/agent/fork-subagent.ts:428 — [review] The new fork task-prompt sentence asserts exec is callable from toolMode alone, while every other new gate in this PR treats "code mode + exec not registered" as a live state…
  • packages/core/src/tools/skill-utils.ts:280 — [review] Rewording the activation envelope left the two #12235 regression guards building the *old* envelope text, so neither now pins the shape the scheduler actually emits.
  • packages/core/src/tools/tool-registry.ts:281 — [review] The new public ToolRegistry.forSubAgent field is written by one caller and read by no production code — a dead switch on a core-infrastructure class.
  • packages/core/src/utils/fileUtils.ts:1771 — [review] Any ambient code-mode allowlist suppresses the zoom hint outright, even though the *nested* (exec) route can be resolved precisely from that same allowlist via getCodeModeBindingPlan(new…

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had no anchor this round could use either — none at all, one with no certifier, one certified by an identity other than the one this round runs under, or one this round's fetch refused or resolved to the head — so the next review re-reads the whole diff unless recovery grafts an earlier own anchor that the round running it can use onto the complete work list this round leaves behind, and keeps doing so until a round's marker carries an anchor again or a graft lands that the round running it can use. (Stated, not acted on — this changes nothing about what the round posts.)

中文说明

仅完成部分审查,审查缺口已披露。

未决,请确认:共 3 条(原文未翻译,列表见上方英文部分)。

未审查(原文为英文):build-and-test — 'Integration Tests (CLI, No Sandbox)' was skipped in CI and its suite did not run locally.

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 1)":did not read packages/core/src/agents/runtime/subagent-plan-tool-policy.test.ts (lines 229-460) or agent-core.skill-eager-review.test.ts , so I have not conf…;"agent reverse-audit (round 1)":the claim "Hybrid AgentCore surfaces exclude tools hidden by tools.eager from nested bindings; Only retains these deferred targets" ( docs/design/code-mode.md…;"agent reverse-audit (round 1)":"withheld-tool warnings describe the actual available bindings" (acceptance criteria) — I did not locate the withheld-tool warning emitter, so this bullet is un…;"agent reverse-audit (round 2)":did not execute packages/core/src/code-mode/code-mode.test.ts or packages/core/src/code-mode/scheduler.test.ts , and did not mutation-test the canonicalName…;"agent reverse-audit (round 2)":did not enumerate every surface that builds advertised declarations (ACP/daemon session mappers, fork declaration-prefix reuse in agent-core.ts:2196-2205 , cl…,另有 25 条。

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

⚠️ 循环结束时仍有 59 条发现带着 — [unverified] 标记——验证者从未对它们作出裁决,它们不算已确认。

收敛姿态下延后(第 15 轮,非阻断)——已记录,本轮不要求修改:共 18 条(原文未翻译,列表见上方英文部分)。

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有留下本轮可用的锚点——要么完全没有、要么没有认证者、要么由本轮运行身份之外的身份认证、要么被本轮的获取拒绝或解析为头提交——因此下一次评审将重读整个 diff,除非恢复流程把本轮能使用的更早自有锚点嫁接到本轮留下的完整工作清单上;并会一直如此,直到某一轮的标记重新带上锚点,或落地的嫁接能被运行该轮的评审使用。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #11854

Mode: address-review (Critical-only window, round 15). Commit: a3dee29307 (merge of origin/main at a49f04c1f4).

Actionable findings

R14-2 — docs/developers/tools/task.md:17 — RESOLVED at HEAD (confirmed, no change needed)

The documentation now states the behavior the code implements. Lines 17 and 152 say a non-empty fork_tools list re-admits tool_search and tool_call in every mode when the parent session declares them, that tool_call's resolved target is still checked against the list, and that exec is admitted under either code mode (with tool_search only under code_mode_only).

Code evidence: buildForkExecutionAllowlist (packages/core/src/tools/agent/fork-subagent.ts:110-126) adds both bridge tools for any non-empty requested list when they are advertised; coreToolScheduler.ts:3029-3030 re-checks the resolved tool_call target with isToolExecutionAllowed; and AgentCore.isToolExecutionAllowed admits exec for a non-empty code-mode list while admitting tool_search only in code_mode_only. The earlier round's doc fix is present and accurate.

R1-2 — packages/cli/src/config/settingsSchema.ts — DISPROVED at HEAD

The surviving premise was that ToolMode is a value import evaluated at module load. At HEAD, line 38 imports ToolMode from @qwen-code/qwen-code-core/tools/code-mode.js, the module that defines it, not the core barrel. The round-1 fix (fda09c05) moved that import, and no other ToolMode import exists in the file. The exhaustive barrel-mock failure the finding described is therefore gone.

Evidence: settingsSchema.test.ts (65 tests) passes, and npm run build regenerated settings.schema.json successfully from this source.

R1-3 — packages/core/src/agents/runtime/agent-core.ts — DISPROVED at HEAD / already fixed

prepareTools now builds hybrid declarations from admissionPool(false), whose last predicate is the direct-call check, and builds the nested binding set from admissionPool(true). A nested-only allowlist therefore cannot revoke a direct declaration (agent-types.ts:108 documents nestedExecutionAllowedTools as "never grants direct tool calls"). That specific harm was fixed by 71b8502080.

The remaining {exec} ∪ configuredNames declaration narrowing is the documented direct-surface contract, not a leak: docs/design/code-mode.md says "The agent's tools list narrows its direct surface. Agent allowlists that do not grant exec narrow nested bindings. Inheriting or explicitly granting exec keeps all otherwise admitted ordinary code-mode-callable bindings." Listing exec widens only the nested binding set, and docs/developers/tools/task.md:17 documents that route.

Evidence: 534 tests passed across agent-core.skill-gate.test.ts, agent-core.fork-policy.test.ts, agent.test.ts, and fork-subagent.test.ts.

Merge conflict resolution

--conflict true requested a merge of origin/main (a49f04c1f4, 71 commits ahead). Conflicts in packages/cli/src/i18n/locales/en.js, zh.js, zh-TW.js, and packages/cli/src/serve/routes/workspace-settings.test.ts were resolved by keeping both sides' additive blocks: the PR's Tool Mode labels alongside main's Mods labels, and the PR's GET tool mode settings describe block alongside main's terminal-only Mods settings block.

The merge also surfaced one real incompatibility: main's new packages/cli/src/services/interactive-mod-tool-scheduler.native.test.ts still passed the removed codeModeOnly field to makeFakeConfig. I changed it to toolMode: 'code_mode_only', preserving the test's intent. Before the change, tsc --build failed with TS2353: Object literal may only specify known properties, and 'codeModeOnly' does not exist in type 'Partial<ConfigParameters>'; after the change, build, typecheck, and the test pass.

Verification

  • npm run build — passed.
  • npm run typecheck — passed.
  • npm run lint — passed.
  • npm run generate:settings-schema — passed; the regenerated schema matched the staged file (no unstaged drift).
  • env -u SANDBOX npx vitest run src/agents/runtime/agent-core.skill-gate.test.ts src/agents/runtime/agent-core.fork-policy.test.ts src/tools/agent/agent.test.ts src/tools/agent/fork-subagent.test.ts (packages/core) — 4 files, 534 tests passed.
  • env -u SANDBOX npx vitest run src/config/settingsSchema.test.ts src/services/interactive-mod-tool-scheduler.native.test.ts (packages/cli) — 2 files, 70 tests passed.
  • env -u SANDBOX npx vitest run src/serve/routes/workspace-settings.test.ts src/i18n/mustTranslateKeys.test.ts (packages/cli) — 2 files, 87 tests passed.
  • Mutation witness for the one-line test adaptation: the pre-fix tsc --build failed with the TS2353 above at the adapted line; after the fix, typecheck and the focused test pass.
  • Integration tests: not run. This round's production behavior is unchanged; the code delta is a test-input correction plus merge conflict resolution, all covered by the focused suites above.

Environment note: the runner's corepack pnpm copy was missing dist/worker.js, which made pnpm's link worker exit silently. I repaired the local toolchain from the published pnpm@11.24.0 package and installed from the committed lockfile; this changed no repository file.

中文说明

Autofix 本轮总结 — PR #11854

模式:address-review(仅 Critical 窗口,第 15 轮)。提交:a3dee29307(合并 origin/main,其 head 为 a49f04c1f4)。

可执行发现

R14-2 — docs/developers/tools/task.md:17 — 已在 HEAD 解决(已确认,无需改动)

文档现在描述的行为与代码一致。第 17 行和第 152 行说明:非空 fork_tools 列表在父会话声明了这两个工具时,会在任何模式下重新允许 tool_search 与 tool_call;tool_call 解析出的目标仍会按列表检查;两种代码模式下 exec 都会被允许(tool_search 仅在 code_mode_only 下允许)。

代码证据:buildForkExecutionAllowlist(packages/core/src/tools/agent/fork-subagent.ts:110-126)在列表非空且工具已声明时加入两个桥接工具;coreToolScheduler.ts:3029-3030 用 isToolExecutionAllowed 重新检查 tool_call 解析出的目标;AgentCore.isToolExecutionAllowed 对非空代码模式列表允许 exec,仅在 code_mode_only 下允许 tool_search。上一轮的文档修复已在位且准确。

R1-2 — packages/cli/src/config/settingsSchema.ts — 在 HEAD 上不成立

仍然保留的前提是:ToolMode 是在模块加载时求值的值导入。HEAD 第 38 行从定义它的模块 @qwen-code/qwen-code-core/tools/code-mode.js 导入 ToolMode,并非从 core 桶文件导入。第 1 轮修复(fda09c05)已迁移该导入,文件中不存在其他 ToolMode 导入。因此该发现描述的桶文件 mock 失败已消失。

证据:settingsSchema.test.ts(65 个测试)通过;npm run build 从该源文件成功重新生成了 settings.schema.json。

R1-3 — packages/core/src/agents/runtime/agent-core.ts — 在 HEAD 上不成立 / 已修复

prepareTools 现在用 admissionPool(false) 构建 hybrid 声明,其最后一个谓词是直接调用检查;并用 admissionPool(true) 构建嵌套绑定集合。因此仅嵌套的白名单不会撤销直接声明(agent-types.ts:108 明确说明 nestedExecutionAllowedTools “绝不授予直接工具调用”)。该具体危害已由 71b8502080 修复。

仍然存在的 {exec} ∪ configuredNames 声明收窄是文档规定的直接表面契约,并非泄漏:docs/design/code-mode.md 说明“agent 的 tools 列表收窄其直接表面。未授予 exec 的 agent 白名单收窄嵌套绑定。继承或显式授予 exec 会保留所有其他已准入的普通 code-mode-callable 绑定。”列出 exec 只会放宽嵌套绑定集合,docs/developers/tools/task.md:17 也记录了这一路径。

证据:agent-core.skill-gate.test.ts、agent-core.fork-policy.test.ts、agent.test.ts、fork-subagent.test.ts 共 534 个测试通过。

合并冲突解决

--conflict true 要求合并 origin/main(a49f04c1f4,领先 71 个提交)。packages/cli/src/i18n/locales/en.js、zh.js、zh-TW.js 和 packages/cli/src/serve/routes/workspace-settings.test.ts 的冲突通过保留双方的增量块解决:PR 的 Tool Mode 标签与 main 的 Mods 标签并存,PR 的 GET tool mode settings describe 块与 main 的 terminal-only Mods settings 块并存。

合并还暴露出一处真实不兼容:main 新增的 packages/cli/src/services/interactive-mod-tool-scheduler.native.test.ts 仍向 makeFakeConfig 传入已移除的 codeModeOnly 字段。我将其改为 toolMode: 'code_mode_only',保留测试意图。修改前 tsc --build 在该行报 TS2353: Object literal may only specify known properties, and 'codeModeOnly' does not exist in type 'Partial<ConfigParameters>';修改后 build、typecheck 和测试均通过。

验证

  • npm run build — 通过。
  • npm run typecheck — 通过。
  • npm run lint — 通过。
  • npm run generate:settings-schema — 通过;重新生成的 schema 与已暂存文件一致(无未暂存差异)。
  • env -u SANDBOX npx vitest run src/agents/runtime/agent-core.skill-gate.test.ts src/agents/runtime/agent-core.fork-policy.test.ts src/tools/agent/agent.test.ts src/tools/agent/fork-subagent.test.ts(packages/core)— 4 个文件,534 个测试通过。
  • env -u SANDBOX npx vitest run src/config/settingsSchema.test.ts src/services/interactive-mod-tool-scheduler.native.test.ts(packages/cli)— 2 个文件,70 个测试通过。
  • env -u SANDBOX npx vitest run src/serve/routes/workspace-settings.test.ts src/i18n/mustTranslateKeys.test.ts(packages/cli)— 2 个文件,87 个测试通过。
  • 单行测试适配的变异见证:修复前 tsc --build 在适配行报上述 TS2353;修复后 typecheck 和聚焦测试通过。
  • 集成测试:未运行。本轮生产行为未变;代码差异仅为测试输入修正与合并冲突解决,已被上述聚焦测试覆盖。

环境说明:运行器的 corepack pnpm 副本缺少 dist/worker.js,导致 pnpm 的链接 worker 静默退出。我用已发布的 pnpm@11.24.0 包修复了本地工具链,并从提交的 lockfile 安装;未改动任何仓库文件。

## Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

  • @qwen-code-review-bot is at this window's regular-feedback budget — to continue: start your comment with [Critical], submit a Request changes review, or comment @qwen-code /retry for a fresh window. / @qwen-code-review-bot 本窗口常规反馈预算已用完——继续请以 [Critical] 开头评论、提交 Request changes、或评论 @qwen-code /retry 开新窗口。
中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 main 有冲突——已在本次推送中解决。

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/模型 deepseek-v4.1-flash-1017 · CLI 0.25.3

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

📊 Takeover milestone — round 10/100, in the current window. Census: 5 pushed fix(es), 5 no-change review(s), 1 timeout(s), 1 rejected attempt(s), 0 deliberate stop(s) under instruction (deferred to a human), 3 other round(s) (crash / model error / gate error / infra), 6 base update(s).

This many rounds deserves a human look. Options: keep going (fine — nothing changes), split or reduce the PR if rounds keep accumulating, or release takeover (remove the autofix/takeover label or comment @qwen-code /takeover stop). Management continues unchanged unless you act.

中文说明

📊 接管里程碑 —— 第 10/100 轮(当前窗口)。统计:推送修复 5 次、审阅无需改动 5 次、超时 1 次、验证拒绝 1 次、按指示有意停止(移交人工)0 次、其他轮次(崩溃/模型错误/门错误/infra)3 次、base 更新 6 次。

轮次到这个量值得人工看一眼。可选:继续(无需操作);若轮次持续累积,考虑拆分或缩减 PR;或释放接管(移除 autofix/takeover 标签或评论 @qwen-code /takeover stop)。不操作则托管照常继续。

@qwen-code-review-bot qwen-code-review-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.

[Critical] Blocking finding(s) follow.

Partially reviewed — gaps disclosed.

Unresolved, please confirm:

  • [Critical] 4 entries — prior-round Critical; not re-ruled this round: the review time budget was exhausted before the open-blocker walk could run; the round-15 review body holds its latest ruling:
    • R12-2
    • R1-21
    • R7-3
    • R10-4

Not explored to full depth (tool budget reached): "agent reverse-audit (round 1)": did not trace isCodeModeToolCallAllowed 's call sites to confirm whether a model-issued direct call to an ordinary tool is actually refused under code_mode_on…; "agent reverse-audit (round 1)": could not execute the two new test files ( bundled-reference.test.ts , subagent-manager.skill-eager-review.test.ts ) — the review worktree has no node_modules…; "agent reverse-audit (round 1)": the three further sentences this diff adds to the tools.eager description — AgentCore excluding still-hidden tools.eager tools from nested bindings in hybri…; "agent reverse-audit (round 1)": did not execute npx vitest run src/tools/agent/agent.code-mode-review.test.ts — all four findings rest on reading the producer ( fork-subagent.ts:417-493 ), t…; "agent reverse-audit (round 1)": toctou layer — did not trace whether the ambient AsyncLocalStorage allowlist installed by coreToolScheduler.ts:6175 / :6234 ( runWithCodeModeAllowedNames ) …, and 25 more.

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

⚠️ 15 finding(s) still carried the — [unverified] tag when the loop ended — the verifier never ruled on them, and they are not confirmed.

Deferred under the convergence posture (round 16, not a blocker) — recorded, not requested in this round:

  • docs/design/code-mode-only.zh-CN.md:122 — [review] zh design doc contradicts EN doc and shipped code on nested code-mode concurrency classification
  • docs/design/code-mode-only.zh-CN.md:9 — [review] zh Status section omits the EN 'Partly superseded by Lazy Code Mode' paragraph
  • docs/design/code-mode.md:43 — [review] code-mode.md enumerates two of three forced-direct paths, omitting the SSH-workspace downgrade this PR ships
  • docs/design/code-mode.md:3 — [review] code-mode.md opening banner copied verbatim from code-mode-only.md declares this new file's own body superseded
  • docs/users/configuration/settings.md:403 — [review] Same six-sentence Code Mode semantics block now appears three times on one page and the copies have diverged
  • packages/cli/src/config/config.test.ts:4564 — [review] No test pins precedence when both tools.mode and legacy tools.codeModeOnly are present
  • packages/cli/src/config/settingsUtils.ts:629 — [review] Unconditional tools.mode force-persist writes explicit direct on Workspace Default reset, shadowing an inherited User-scope mode
  • packages/cli/src/config/settingsUtils.ts:657 — [review] getDisplayValue's last two arms are byte-identical; the settingExistsInScope condition is dead
  • packages/core/src/agents/background-agent-resume.ts:1042 — [review] skillRegistered argument cannot change any outcome at its only call site — dead switch on the resume wrapper
  • packages/core/src/agents/runtime/agent-core.skill-gate.test.ts:26 — [review] Rewritten header comment overstates the exec requirement: hybrid wildcard/skill entries announce without exec
  • packages/core/src/agents/runtime/agent-core.skill-gate.test.ts:521 — [review] New test replaces CoreToolScheduler.prototype.schedule with a never-restored spy
  • packages/core/src/agents/runtime/agent-core.ts:2026 — [review] MCP allowlist exact/wildcard split written inline twice more — three copies of one classification rule that must agree
  • packages/core/src/agents/runtime/subagent-plan-tool-policy.ts:177 — [review] toolConfigAllowsSkill takes four adjacent defaulted positional booleans — a transposed argument typechecks and silently inverts the skill gate
  • packages/core/src/core/coreToolScheduler.ts:6786 — [review] Activation reminder made surface-neutral, but the startup <available_skills> snapshot this PR newly enables for CodeModeOnly still names the undeclared Skill tool
  • packages/core/src/subagents/subagent-manager.ts:1217 — [review] Recovered skillRegistered mirrors only PermissionManager status, missing the registry's isToolDisabled gate — child can hold a SkillManager with no possible Skill tool
  • packages/core/src/tools/agent/agent.ts:3900 — [review] nestedExecutionAllowedTools spread inserted between the blocklist-persistence comment and the spread it explains; comment now misdescribes the nested list
  • packages/core/src/tools/tool-registry.ts:281 — [review] New public ToolRegistry.forSubAgent field is written by production and read by nothing — dead switch on a core class
  • packages/core/src/utils/fileUtils.ts:1771 — [review] Zoom-hint reachability keyed on ambient-allowlist presence instead of contents — every code-mode agent loses the zoom hint, including when its allowlist contains zoom_image
  • packages/core/src/utils/fileUtils.test.ts:1288 — [review] it.each title renders neither toolMode nor allowedNames — several distinct cases share an identical test name
  • packages/web-shell/client/settings/messages.ts:355 — [review] zh-CN settings string drops the 'In both code modes' scope on the agent-allowlist narrowing clause
  • …and 24 more (see the run report)

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had no anchor this round could use either — none at all, one with no certifier, one certified by an identity other than the one this round runs under, or one this round's fetch refused or resolved to the head — so the next review re-reads the whole diff unless recovery grafts an earlier own anchor that the round running it can use onto the complete work list this round leaves behind, and keeps doing so until a round's marker carries an anchor again or a graft lands that the round running it can use. (Stated, not acted on — this changes nothing about what the round posts.)

中文说明

仅完成部分审查,审查缺口已披露。

未决,请确认:共 4 条(原文未翻译,列表见上方英文部分)。

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 1)":did not trace isCodeModeToolCallAllowed 's call sites to confirm whether a model-issued direct call to an ordinary tool is actually refused under code_mode_on…;"agent reverse-audit (round 1)":could not execute the two new test files ( bundled-reference.test.ts , subagent-manager.skill-eager-review.test.ts ) — the review worktree has no node_modules…;"agent reverse-audit (round 1)":the three further sentences this diff adds to the tools.eager description — AgentCore excluding still-hidden tools.eager tools from nested bindings in hybri…;"agent reverse-audit (round 1)":did not execute npx vitest run src/tools/agent/agent.code-mode-review.test.ts — all four findings rest on reading the producer ( fork-subagent.ts:417-493 ), t…;"agent reverse-audit (round 1)":toctou layer — did not trace whether the ambient AsyncLocalStorage allowlist installed by coreToolScheduler.ts:6175 / :6234 ( runWithCodeModeAllowedNames ) …,另有 25 条。

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

⚠️ 循环结束时仍有 15 条发现带着 — [unverified] 标记——验证者从未对它们作出裁决,它们不算已确认。

收敛姿态下延后(第 16 轮,非阻断)——已记录,本轮不要求修改:共 44 条(原文未翻译,列表见上方英文部分)。

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有留下本轮可用的锚点——要么完全没有、要么没有认证者、要么由本轮运行身份之外的身份认证、要么被本轮的获取拒绝或解析为头提交——因此下一次评审将重读整个 diff,除非恢复流程把本轮能使用的更早自有锚点嫁接到本轮留下的完整工作清单上;并会一直如此,直到某一轮的标记重新带上锚点,或落地的嫁接能被运行该轮的评审使用。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

— qwen3.8-max@e6bf8ffe via Qwen Code /review (v0.25.3)

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix — no code change for PR #11854 (round 17)

The round-16 review completed partially: it added no inline or issue-level comments and did not re-rule the blockers it carries. I checked each carried item against HEAD a3dee29307. Three are already fixed by earlier commits of this PR; the fourth is a non-Critical suggestion with an existing follow-up deferral. No source file needs to change this round.

Carried findings

  • R10-4 (ambient allowlist lost on nested calls) — fixed. dispatchCodeModeTool now copies codeModeAllowedToolNames onto the nested request (packages/core/src/core/coreToolScheduler.ts:2041, including the empty-array fail-closed case), and execution re-installs it with runWithCodeModeAllowedNames(...) (packages/core/src/core/coreToolScheduler.ts:6175, :6234). The regression test re-establishes the parent allowlist for a nested call resumed after approval (packages/core/src/code-mode/scheduler.test.ts:603) passes.
  • R12-2 (context-cost bridge wording) — fixed. Both universals are now scoped to direct and hybrid modes, and Code Mode Only has its own explicit sentence: docs/users/features/context-cost.md:56 says "in direct and hybrid modes, every ordinary deferred tool … is then force-declared", and the later copy adds "Code Mode Only has no top-level deferred set to reveal: its ordinary deferred tools stay inside exec". This matches resolveDeferredToolsForReminder being skipped when the deferred summary is empty.
  • R7-3 (SDK exec promise) — fixed. The README, the developer docs and the published TSDoc now require "an actual nested exec binding" and carve out direct-only tools as reachable only through the tool_search + tool_call bridge, never through exec: packages/sdk-typescript/README.md:68, docs/developers/sdk-typescript.md:69, packages/sdk-typescript/src/types/types.ts:436-439 and :513-516.
  • R1-21 (/context MCP row in code_mode_only) — still present, not a Critical, deferred. The round-1 ledger records this finding at severity S (packages/cli/src/ui/commands/contextCommand.ts:449), and this thread was already answered with a follow-up-queue deferral. Verified at this head: getFunctionDeclarations() returns only exec, tool_search and direct-only declarations in CodeModeOnly (packages/core/src/tools/tool-registry.ts:1041, :1116-1135), and the detail loop skips tools without a top-level declaration (packages/cli/src/ui/commands/contextCommand.ts:449), so an alwaysLoad MCP tool inlined into exec's ALL_TOOLS metadata gets no /context detail row. Critical-only mode is active, so this non-Critical display gap is recorded in deferred-findings.json instead of growing this diff.

Notes

  • The 15 findings still tagged [unverified], and the unfinished reverse audit, are not confirmed findings and were not treated as actionable.
  • The review-pr check failure is the review job's own partial-round failure, not a code check. All Qwen Code CI checks on this head are green: Test, Lint & Static, Integration Tests (no-AK, No Sandbox), web-shell E2E Smoke, tui-parity, Serve A/B, and the Managed Agent lanes that ran.

Verification

  • cd packages/core && npx vitest run src/code-mode/scheduler.test.ts -t "re-establishes the parent allowlist" — 1 passed, 21 skipped.
  • No npm run build / npm run typecheck / npm run lint run: this round changes no source file.
中文说明

Autofix —— PR #11854 本轮(第 17 轮)不改代码

第 16 轮评审只完成了一部分:没有新增行内评论或 issue 级评论,也没有对携带的阻断项重新裁决。我按当前 HEAD a3dee29307 逐项核实:其中三项已由本 PR 更早的提交修复,第四项是非 Critical 的建议,且已有后续跟进队列的推迟记录。本轮不需要修改任何源码文件。

携带的发现

  • R10-4(嵌套调用丢失环境白名单)—— 已修复。 dispatchCodeModeTool 现在会把 codeModeAllowedToolNames 复制到嵌套请求上(packages/core/src/core/coreToolScheduler.ts:2041,包括空数组时失败关闭的情形),执行时再通过 runWithCodeModeAllowedNames(...) 重新安装(packages/core/src/core/coreToolScheduler.ts:6175、:6234)。回归测试 re-establishes the parent allowlist for a nested call resumed after approval(packages/core/src/code-mode/scheduler.test.ts:603)通过。
  • R12-2(context-cost 桥接措辞)—— 已修复。 两处“普遍结论”都已限定在 direct 和 hybrid 模式内,Code Mode Only 另有明确说明:docs/users/features/context-cost.md:56 写的是 “in direct and hybrid modes, every ordinary deferred tool … is then force-declared”,后文又补充 “Code Mode Only has no top-level deferred set to reveal: its ordinary deferred tools stay inside exec”。这与 resolveDeferredToolsForReminder 在延迟摘要为空时被跳过一致。
  • R7-3(SDK 的 exec 承诺)—— 已修复。 README、开发者文档和发布的 TSDoc 现在都要求“存在实际的嵌套 exec 绑定”,并把 direct-only 工具单独排除:它们只能经 tool_search + tool_call 桥接到达,绝不会经 exec 到达。见 packages/sdk-typescript/README.md:68、docs/developers/sdk-typescript.md:69、packages/sdk-typescript/src/types/types.ts:436-439 与 :513-516。
  • R1-21(code_mode_only 下 /context 的 MCP 行)—— 仍然存在,但不是 Critical,已推迟。 第 1 轮台账把该发现记为 S 级(packages/cli/src/ui/commands/contextCommand.ts:449),且该讨论串此前已回复并推迟到后续跟进队列。按当前 HEAD 核实:CodeModeOnly 下 getFunctionDeclarations() 只返回 exec、tool_search 和 direct-only 声明(packages/core/src/tools/tool-registry.ts:1041、:1116-1135),详情循环会跳过没有顶层声明的工具(packages/cli/src/ui/commands/contextCommand.ts:449),因此被内联进 exec ALL_TOOLS 元数据的 alwaysLoad MCP 工具不会出现在 /context 详情行中。当前处于仅处理 Critical 的模式,因此这个非 Critical 的展示缺口记入 deferred-findings.json,而不是在本轮扩大 diff。

说明

  • 仍带 [unverified] 标记的 15 条发现,以及未完成的反向审计,都不是已确认的发现,本轮未将其视为可执行项。
  • review-pr 检查失败是该评审任务本轮未完整收尾导致的,不是代码检查。该 HEAD 上所有 Qwen Code CI 检查均为绿色:Test、Lint & Static、Integration Tests (no-AK, No Sandbox)、web-shell E2E Smoke、tui-parity、Serve A/B 以及已运行的 Managed Agent 各 lane。

验证

  • cd packages/core && npx vitest run src/code-mode/scheduler.test.ts -t "re-establishes the parent allowlist" —— 1 个通过,21 个跳过。
  • 未运行 npm run build / npm run typecheck / npm run lint:本轮没有修改任何源文件。
## Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

  • @qwen-code-review-bot is at this window's regular-feedback budget — to continue: start your comment with [Critical], submit a Request changes review, or comment @qwen-code /retry for a fresh window. / @qwen-code-review-bot 本窗口常规反馈预算已用完——继续请以 [Critical] 开头评论、提交 Request changes、或评论 @qwen-code /retry 开新窗口。
中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

Base-conflict check · 基分支冲突检查: conflicts with main (no review fix needed, but a rebase/merge is required before merge). · 与 main 有冲突(无需评审修复,但合并前需 rebase/merge)。

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


🧠 Handled by Qwen Code · model/模型 deepseek-v4.1-flash-1017 · CLI 0.25.3

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #11854

Feedback triage

No actionable review feedback arrived this round: the Reviews, Inline comments,
Issue-level comments, and Failed checks sections were all empty. The only
still-red check was review-pr, which is the LLM reviewer workflow and is
declared non-blocking in the autofix workflow (NON_BLOCKING_CHECKS), so no
code change was indicated by it.

The deferred non-Critical section was left untouched per Critical-only mode,
and no inline threads were resolved or replied to.

Changes

--conflict true required syncing the PR branch with origin/main. The merge
produced one conflict, in packages/core/src/tools/agent/fork-subagent.ts:

  • The PR side added import { isCodeModeEnabled, ToolMode } from '../code-mode.js'
    for the fork tool-execution restriction message.
  • main added import { cloneApiHistory } from '../../utils/api-history-metadata.js'
    and switched selectForkHistory from structuredClone to cloneApiHistory.

Both sides are load-bearing in the merged file, so the resolution keeps both
imports and keeps main's cloneApiHistory call. The resulting file was
diffed against main's version and shows only the PR's own code-mode changes,
and the tree contains no conflict markers.

Verification

  • npm run build — passed (after the first attempt failed on a sandbox
    corepack cache permission error, EACCES writing
    /home/github-runner/.cache/node/corepack/v1; rerun with
    COREPACK_HOME=/tmp/qwen-corepack-home and COREPACK_ENABLE_DOWNLOAD=0)
  • npm run typecheck — passed
  • npm run lint — passed
  • cd packages/core && npx vitest run src/tools/agent — 527 passed
  • cd packages/core && npx vitest run src/tools/agent/fork-subagent.test.ts src/tools/agent/fork-profile.test.ts — 58 passed
  • git diff --check and a repository-wide conflict-marker scan — clean
中文说明

自动修复轮次总结 — PR #11854

反馈分诊

本轮没有可执行的评审反馈:Reviews、Inline comments、Issue-level comments 和
Failed checks 各节均为空。唯一仍为红色的检查是 review-pr,它是 LLM 评审工作流,
在自动修复工作流中已声明为非阻塞(NON_BLOCKING_CHECKS),因此它并未指示需要代码改动。

根据仅处理 Critical 的模式,延后的非 Critical 部分保持原样;没有解决或回复任何行内讨论。

改动

--conflict true 要求将 PR 分支与 origin/main 同步。合并产生了一个冲突,位于
packages/core/src/tools/agent/fork-subagent.ts:

  • PR 一侧为 fork 工具执行限制消息新增了
    import { isCodeModeEnabled, ToolMode } from '../code-mode.js'。
  • main 新增了
    import { cloneApiHistory } from '../../utils/api-history-metadata.js',
    并将 selectForkHistory 从 structuredClone 改为 cloneApiHistory。

两侧在合并后的文件中都不可或缺,因此解决方案保留两个导入,并保留 main 的
cloneApiHistory 调用。结果文件已与 main 版本做差异比较,只显示 PR 自身的
code-mode 改动,且工作树中不存在冲突标记。

验证

  • npm run build — 通过(首次尝试因沙箱 corepack 缓存权限错误而失败,写入
    /home/github-runner/.cache/node/corepack/v1 时报 EACCES;改用
    COREPACK_HOME=/tmp/qwen-corepack-home 和 COREPACK_ENABLE_DOWNLOAD=0 重跑)
  • npm run typecheck — 通过
  • npm run lint — 通过
  • cd packages/core && npx vitest run src/tools/agent — 527 项通过
  • cd packages/core && npx vitest run src/tools/agent/fork-subagent.test.ts src/tools/agent/fork-profile.test.ts — 58 项通过
  • git diff --check 及全仓库冲突标记扫描 — 干净
## Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

  • @qwen-code-review-bot is at this window's regular-feedback budget — to continue: start your comment with [Critical], submit a Request changes review, or comment @qwen-code /retry for a fresh window. / @qwen-code-review-bot 本窗口常规反馈预算已用完——继续请以 [Critical] 开头评论、提交 Request changes、或评论 @qwen-code /retry 开新窗口。
中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 main 有冲突——已在本次推送中解决。

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/模型 deepseek-v4.1-flash-1017 · CLI 0.25.3

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #11854

Feedback triage

No actionable feedback was supplied this round. The PR is in Critical-only mode after five change-producing rounds; the only deferred item is the automated reviewer's exhausted regular-feedback budget notice. There were no reviews, inline comments, issue-level comments, failed checks, or still-red checks to act on, so no inline threads were resolved or replied to.

Conflict resolution

The round was flagged --conflict true, and the branch was 13 commits behind origin/main, so I merged the base into the PR branch. The merge had one conflict in packages/cli/src/ui/AppContainer.test.tsx, where both sides had independently scoped the getInteractiveModSession spy to the test's own mockConfig:

  • The PR side returned undefined for every other Config and added an assertion that a second Config cannot resolve to the test session.
  • main delegated other Configs to the real getInteractiveModSession(config) function.

I kept main's real-function fallback so unrelated Configs retain the module's real behavior, and kept the PR's comment plus the makeFakeConfig() assertion. The assertion still holds because the real implementation is a WeakMap lookup and a fresh Config has no session. The net effect for the test is unchanged: only the test's mount can reach its mocked initialize.

Changes

  • packages/cli/src/ui/AppContainer.test.tsx — resolved the merge conflict by combining main's real-function fallback with the PR's config-scoping assertion and comment.
  • Merge commit: 52a5114c6c (chore: merge main and keep config-scoped Mod session mock (#11854)).

Verification

  • npm run build (first attempt) — failed before compilation because corepack could not create its cache under /home/github-runner/.cache (EACCES, sandbox permission). Rerun with a writable cache: COREPACK_HOME=/tmp/corepack-home npm run build — passed.
  • COREPACK_HOME=/tmp/corepack-home npm run typecheck — passed.
  • COREPACK_HOME=/tmp/corepack-home npm run lint — passed.
  • cd packages/cli && COREPACK_HOME=/tmp/corepack-home npx vitest run src/ui/AppContainer.test.tsx — 246 tests passed.
中文说明

Autofix 本轮总结 — PR #11854

反馈分类

本轮没有可执行的评审反馈。该 PR 在五个产生改动的轮次后处于仅处理 Critical 的模式;唯一被延后的条目是自动评审器常规反馈预算耗尽的提示。没有评审、行内评论、Issue 级评论、失败检查或持续失败的检查需要处理,因此没有解决或回复任何行内讨论串。

冲突解决

本轮带有 --conflict true 标记,且分支落后 origin/main 13 个提交,因此我将基线合入 PR 分支。合并只在 packages/cli/src/ui/AppContainer.test.tsx 产生一处冲突,两边都各自将 getInteractiveModSession 的 spy 限定到测试自己的 mockConfig:

  • PR 侧对其他所有 Config 返回 undefined,并新增断言,确认另一个 Config 不能解析到该测试的会话。
  • main 侧将其他 Config 委托给真实的 getInteractiveModSession(config) 函数。

我保留了 main 的真实函数回退,以便无关 Config 仍保持模块的真实行为,同时保留了 PR 的注释和 makeFakeConfig() 断言。该断言仍然成立,因为真实实现是 WeakMap 查找,新创建的 Config 没有会话。对测试的最终效果不变:只有该测试的挂载能触达其模拟的 initialize。

改动

  • packages/cli/src/ui/AppContainer.test.tsx — 通过结合 main 的真实函数回退与 PR 的配置限定断言和注释,解决了合并冲突。
  • 合并提交:52a5114c6c(chore: merge main and keep config-scoped Mod session mock (#11854))。

验证

  • npm run build(首次尝试)— 在编译前失败,因为 corepack 无法在 /home/github-runner/.cache 下创建缓存(EACCES,沙箱权限问题)。使用可写缓存重跑:COREPACK_HOME=/tmp/corepack-home npm run build — 通过。
  • COREPACK_HOME=/tmp/corepack-home npm run typecheck — 通过。
  • COREPACK_HOME=/tmp/corepack-home npm run lint — 通过。
  • cd packages/cli && COREPACK_HOME=/tmp/corepack-home npx vitest run src/ui/AppContainer.test.tsx — 246 个测试通过。
## Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

  • @qwen-code-review-bot is at this window's regular-feedback budget — to continue: start your comment with [Critical], submit a Request changes review, or comment @qwen-code /retry for a fresh window. / @qwen-code-review-bot 本窗口常规反馈预算已用完——继续请以 [Critical] 开头评论、提交 Request changes、或评论 @qwen-code /retry 开新窗口。
中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 main 有冲突——已在本次推送中解决。

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/模型 deepseek-v4.1-flash-1017 · CLI 0.25.3

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix — no code change for PR #11854

Feedback triage

The actionable sections are empty: no reviews, inline comments, or issue-level comments need a decision this round. The PR is in Critical-only mode after five change-producing rounds. The only recent inline finding (/context has no detail row for an alwaysLoad MCP tool inlined into exec under code_mode_only) is non-Critical and was already deferred to the follow-up queue, so it is out of scope; the deferred section also carries only the automated reviewer's exhausted-budget notice. No review threads were resolved or replied to.

Failed checks

All three checks listed as failed are CANCELLED, not failures, and all belong to the same head (52a5114c6c):

  • Capture web-shell visuals (ubuntu-latest, Node 22.x) — run 39565282142, cancelled at 08:09:30Z during Install base dependencies.
  • SDK Java (fast) / ubuntu-latest / Java 21 — run 39565282188, cancelled at 08:09:16Z during Run Java SDK tests (self-hosted).
  • (needs.scope.outputs.tier == ...) — the Managed Agent gate summary job from the same run, cancelled at 08:09:17Z.

The job API shows cancelled steps with no failing assertion. Both workflows define concurrency cancellation for pull-request runs, and these runs were cancelled mid-step; this is a cancelled run, not a test failure. No source change can make a cancelled run pass: the workflows need a re-run on this head before merge.

Branch state

The working tree is clean and HEAD is 52a5114c6c, identical to origin/dragon/add-codemode. A trial three-way merge against origin/main exits 0, so the branch is mergeable; I did not merge because the invocation did not flag a conflict.

Verification

  • git status --short — clean.
  • git rev-parse HEAD origin/dragon/add-codemode — both 52a5114c6c.
  • git merge-tree --write-tree --no-messages HEAD origin/main — exit 0 (no conflicts).
  • Read-only GitHub Actions API queries for jobs 119105957133, 119106144860, 119112004738 — all cancelled; the step lists contain only cancelled or skipped steps.
  • No npm run build / npm run typecheck / npm run lint or Vitest run: this round changes no file.
中文说明

Autofix —— PR #11854 本轮不改代码

反馈分类

本轮可执行区域为空:没有需要裁决的评审、行内评论或 Issue 级评论。该 PR 在五个产生改动的轮次后处于仅处理 Critical 的模式。最近唯一一条行内发现(code_mode_only 下,被内联进 exec 的 alwaysLoad MCP 工具在 /context 中没有详情行)属于非 Critical,且此前已被推迟到后续跟进队列,因此不在本轮范围内;被推迟区域也只有自动评审器预算耗尽的提示。本轮没有解决或回复任何评审讨论串。

失败的检查

列出的三项检查全部是 CANCELLED 而非失败,且都属于同一个 head(52a5114c6c):

  • Capture web-shell visuals (ubuntu-latest, Node 22.x) —— 运行 39565282142,在 Install base dependencies 阶段于 08:09:30Z 被取消。
  • SDK Java (fast) / ubuntu-latest / Java 21 —— 运行 39565282188,在 Run Java SDK tests (self-hosted) 阶段于 08:09:16Z 被取消。
  • (needs.scope.outputs.tier == ...) —— 同一运行中的 Managed Agent gate 汇总任务,于 08:09:17Z 被取消。

任务 API 显示的是被取消的步骤,没有失败的断言。两个工作流都为 pull request 运行配置了并发取消,而这些运行是在执行中途被取消的;这是运行被取消,而不是测试失败。源码改动无法让被取消的运行通过:合并前需要在该 head 上重新运行这些工作流。

分支状态

工作区干净,HEAD 为 52a5114c6c,与 origin/dragon/add-codemode 相同。对 origin/main 的试运行三方合并以 0 退出,因此该分支可以合并;由于本次调用未标记冲突,我没有执行合并。

验证

  • git status --short —— 干净。
  • git rev-parse HEAD origin/dragon/add-codemode —— 两者均为 52a5114c6c。
  • git merge-tree --write-tree --no-messages HEAD origin/main —— 退出码 0(无冲突)。
  • 对任务 119105957133、119106144860、119112004738 的只读 GitHub Actions API 查询 —— 全部为 cancelled;步骤列表中只有已取消或已跳过的步骤。
  • 未运行 npm run build / npm run typecheck / npm run lint 或 Vitest:本轮没有修改任何文件。
## Deferred non-Critical feedback

Critical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

  • @qwen-code-review-bot is at this window's regular-feedback budget — to continue: start your comment with [Critical], submit a Request changes review, or comment @qwen-code /retry for a fresh window. / @qwen-code-review-bot 本窗口常规反馈预算已用完——继续请以 [Critical] 开头评论、提交 Request changes、或评论 @qwen-code /retry 开新窗口。
中文说明

已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


🧠 Handled by Qwen Code · model/模型 deepseek-v4.1-flash-1017 · CLI 0.25.3

This branch has not been deployed

No deployments
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