Skip to content

feat: support GPT-5 and GPT-6 reasoning effort configuration - #11295

Merged
wenshao merged 10 commits into
mainfrom
codex/gpt-5-reasoning-effort
Sep 9, 2026
Merged

wenshao merged 10 commits into
mainfrom
codex/gpt-5-reasoning-effort

Conversation

@wenshao

@wenshao wenshao commented Sep 7, 2026 •

Copy link
Copy Markdown
Collaborator

What this PR does

Adds model-specific reasoning effort configuration for a closed set of known GPT-5 models and GPT-6 Astra. Shared model normalization handles provider prefixes, routing tags, whitespace, numeric patch versions, and dated snapshots. Unknown family suffixes and future minor versions keep the generic provider behavior. ACP and Web Shell advertise supported tiers, thinking requirements, and default state. Astra exposes low, medium, high, xhigh, and max, defaults to medium, and has no off option.

Maps configured effort to the Chat Completions reasoning_effort field, including on DashScope-compatible gateways serving GPT models. Unsupported tiers clamp to the known model's supported range; unrelated sampling parameters and sibling reasoning budgets survive. OpenRouter retains its nested protocol, and explicit raw request overrides retain their priority. Nullish and empty-string flat placeholders allow configured effort; raw nested values, including null, remain whole-object overrides. Mandatory-thinking cleanup removes unsupported flat none without dropping forced-tool constraints. Shared preferences survive model switches and reloads when using the built-in GPT capabilities. Explicit configured capabilities retain their tier restrictions, defaults, disable-field ownership, and persistence reconciliation. GPT capability lookup handles batch tags locally, leaving other models’ token limits and modalities unchanged.

Controls report supported native flat overrides and OpenRouter nested effort values as their effective raw tier. Opaque native nested overrides show the model default. An explicit tier request blocked by a raw override fails without retaining a live change or saving a preference, even when it matches the displayed value. The thinking switch normally selects the advertised default tier, enabling models whose API default is off. With a blocking raw override, the switch restores configured defaults after off only when those defaults permit thinking. If the raw state or the session’s configured reasoning default disables thinking, the off switch is disabled and the saved preference is retained, including when configured capabilities omit a default tier or expose only a toggle. Default resolution uses the owning session or request, including after a provider entry is removed, so another workspace cannot alter this decision. ACP default always keeps its reset semantics. Welcome switch-on intent belongs to its source model and is discarded when the model changes, preserving the target’s existing preference, while an explicitly selected compatible tier still carries over. Model switching does not synthesize reset commands from saved max or none preferences.

The merge preserves explicit model reasoning capabilities from main. Validated GPT tiers are translated after raw request parameters merge, so a cleared flat field cannot swallow an accepted tier and raw nested whole-object overrides retain their priority.

A saved off preference survives mandatory GPT model switches even when capabilities are declared, unless the declaration explicitly forbids disabling. OpenRouter sampling flat overrides report their effective tier. Welcome rejects pending tiers that a raw override prevents changing, whether the target is off or already on, so the first prompt proceeds using the target state.

Why it's needed

GPT models currently expose generic effort choices and defaults that do not match their capabilities. Requests send the internal nested reasoning object instead of the Chat Completions field, while configuring sampling parameters can drop effort entirely. A selected effort can therefore be ignored or rejected.

Reviewer Test Plan

How to verify

  1. Configure GPT-5.4 with high effort and a completion-token sampling budget. Confirm the request carries flat high effort alongside the budget, without an injected nested reasoning object.

  2. Set the shared effort preference to max for GPT-5.1, GPT-5.4, GPT-5.6, and GPT-6 Astra. Confirm their outgoing efforts are high, xhigh, max, and max, respectively. Confirm explicit raw effort overrides retain their priority, except unsupported flat none on mandatory-thinking models.

  3. Inspect ACP reasoning controls when switching models. Confirm GPT-5.4 defaults to thinking off, GPT-5.5 defaults to medium, and GPT-6 Astra starts at medium with all five tiers. Astra and other mandatory-thinking models must reject off. Unsupported new picker selections should be rejected. Save max, switch from GPT-5.6 Sol to GPT-5.4 and back, and verify that the original preference survives while the active tier clamps to xhigh and returns to max. Likewise, a saved off preference should survive a temporary switch to Astra.

  4. Turn thinking on in Web Shell for a default-off GPT-5.4 session. Confirm it selects medium and enables the effort picker. Turn it off again and confirm the request sends none; OpenRouter must instead retain its nested disable field. Verify raw flat overrides and nullish/empty flat placeholders preserve their documented precedence.

  5. Verify GPT high/max and sampling budgets through a DashScope-compatible gateway. Forced-tool requests must retain required selection on GPT Pro/Astra unless an explicit provider restriction applies. Confirm existing Qwen controls and generic provider behavior remain consistent with the baseline.

  6. Check unknown GPT suffixes/future versions keep generic controls, while provider-prefixed known Sol/Astra models get their model capabilities. With Astra on a native endpoint and a raw flat none override in either layer, confirm the control shows medium and rejects xhigh. With native-endpoint raw nested reasoning, including null, confirm the raw value remains unchanged and blocked tier changes reject, even when selecting the displayed default.

  7. With native flat overrides or OpenRouter nested effort, enabled, and token-budget overrides, verify blocked tier changes reject and settings stay unchanged. Turn an opaque GPT-5.5 configuration off and back on: its raw default must be restored when that default permits thinking; selecting a tier must still reject. With raw flat none, OpenRouter nested disable, or a configured reasoning default of false combined with a blocking raw override, the ON action must be disabled, send no configuration request when clicked, and retain saved preferences in both user and workspace settings, including configured tiers without a default and toggle-only controls. An explicit default command must still reset the preference. On Welcome, turn Qwen thinking on, switch to GPT-5.4, and submit: the target keeps its existing preference without persisting Qwen’s xhigh or clearing a saved off preference. An explicit xhigh selection remains transferable.

  8. Declare a GPT model’s reasoning capabilities explicitly. Verify its permitted tier list and native disable field are preserved. Null/empty flat fields still allow selected effort, raw nested overrides still own their object, and a non-GPT batch route keeps its original output limits and modalities.

  9. On Welcome, explicitly select xhigh on another model, then select a target whose raw parameters fix its effort. Check both an off/cannot-enable target and an already-on High target: the preview must retain the target state and the first prompt must send without a rejected tier write. A compatible target without a raw restriction should still carry xhigh.

  10. Start a cold Welcome workspace with a saved off preference and a provider raw reasoning override. If the raw default permits thinking, turning ON should use the accepted default reset and the first message should receive a reply. If raw settings prevent enabling, ON should remain disabled and the first message should still succeed without changing the saved preference. A provider with empty generation settings must keep ordinary controls even when top-level settings contain a raw disable.

Evidence (Before & After)

The baseline used globally installed Qwen Code 0.23.0; verification used the local bundle with a recording mock endpoint and active ACP sessions.

Scenario Before After
GPT-5.4 high effort Nested reasoning object Flat high effort
High effort with sampling token budget Effort omitted Effort and budget both present
Shared max preference on GPT-5.1 / 5.4 / 5.6 Nested xhigh for all three Flat high / xhigh / max
GPT-5.4 thinking off Reasoning field omitted Flat none
GPT reasoning controls Generic tiers and default Model-specific tiers, defaults, and mandatory-thinking constraints

Web Shell controls (GPT-5.6 Sol and GPT-6 Astra). Chromium screenshots of the current Web Shell replaying unchanged reasoning options recorded from active PR ACP sessions through the repository's mock daemon. Both models start at Medium; the screenshots show Max selected. GPT-5.6 Sol allows thinking to be toggled, while GPT-6 Astra keeps it enabled and locks the switch. Playwright verified all five tiers, the initial Medium value, both thinking-switch states, and the persisted Max selection requests.

GPT-5.6 Sol — Max selected GPT-6 Astra — Max selected
GPT-5.6 Sol controls show five effort tiers with Max selected and thinking enabled GPT-6 Astra controls show five effort tiers with Max selected and mandatory thinking locked on

Request fields (Before & After). Comparisons generated from new recording-mock-endpoint runs for these exact two model identifiers. Each covers High, Max, and High with a 1024 completion-token budget. All six current-bundle request scenarios and both ACP capture scenarios passed; the global Qwen Code 0.23.0 baseline reproduced the nested-field, max-clamping, and sampling-effort-loss problems. Only relevant request fields are shown; real provider verification is reported separately below.

GPT-5.6 Sol request comparison: flat high and max effort, with the sampling token budget preserved

GPT-6 Astra request comparison: flat high and max effort, with the sampling token budget preserved

Earlier review verification (R2). Passed 3,313 unit tests (648 core, 1,746 CLI, 919 Web Shell), full build, bundle, workspace/integration typecheck, and changed-file lint/formatting. Eight deliberate mutation categories failed the expected regression assertions when protections were removed; original model, wire, ACP and UI regressions were also observed before the fixes. The rebuilt CLI passed 90 request/ACP E2E scenarios (51 wire and 39 ACP), 2 Chromium replay scenarios, and 13 no-network checks; 200 local mock API calls were recorded, including one fixture-only rerun. After the audit findings were fixed, two consecutive full-diff self-audits and the final independent reverse review found no further issue. R2 verification report. Prior verification remains available in the earlier follow-up report.

Cold Welcome follow-up (current, 9355b21d). Cold reasoning previews now preserve saved off preferences while advertising the accepted default reset or disabling an unavailable ON action. Passed 806 related unit tests, 4 real daemon/Chromium workflows and 2 direct ACP workflows, each receiving the first reply. Full build/bundle, full typecheck, changed-file lint/formatting and two consecutive self-audit and independent audit passes completed before commit. Only inference was mocked on loopback; there were no new external model calls. Reproduction, verification and current CI status.

Historical R6 review verification (9c48225e). Fixed saved-off preference loss, OpenRouter raw-tier reporting, and Welcome first-prompt failures, including a raw-on combination found in pre-commit reverse audit. Passed 2,937 unit tests, 27 built CLI ACP scenarios / 200 assertions, 3 final built-WebShell scenarios, 4 Welcome browser cases and all 58 Chromium smoke cases on the first attempt. Full build/bundle, full typecheck, repository lint/formatting and two consecutive root and independent clean audits passed before commit. R6 verification, deferred inventory and CI status.

Historical R5 CI and main integration verification. Merged the current main gate and its slow-rendering history-anchor fix, then corrected three obsolete mock references exposed by integration. Passed full build/bundle, full typecheck, repository lint/formatting, 3,441 focused unit tests and 9 lint-gate tests. All 58 Chromium smoke cases passed on their first attempt, including the 4× CPU throttled case that reproduced the original 286px failure. The existing GPT effort matrix also passed: 27 ACP scenarios / 560 assertions and 9 built-WebShell scenarios, with two consecutive clean self-audits and independent review passes. R5 verification and CI status.

Historical R4 switch correction verification. Unavailable ON actions are now disabled and retain both settings scopes; legitimate raw-on restoration and explicit default reset remain supported. Verification passed 1,808 unit tests, 27 actual ACP scenarios with 560 assertions, and 9 built-WebShell browser scenarios with 129 local mock requests. Full build/bundle, final CLI build, full typecheck, lint and formatting passed. Two consecutive reverse self-audits and independent review found no remaining actionable issue. R4 verification report and limits.

Historical R3 review and conflict verification. Merged main while preserving configured model capabilities, addressed all 12 review threads, and fixed the additional Welcome preference issues found in reverse audit. Build, bundle, full typecheck, lint, formatting, and 3,392 focused unit tests pass. The core/CLI matrix passed 41 ACP cases, 18 headless wire cases and 32 no-network checks; the final bundle additionally passed 9 ACP cases, 6 key browser scenarios and the full 53-test smoke suite without automatic retries. Two consecutive root and independent audit passes found no remaining issue. The first final smoke run exposed an old test that required the implicit preference reset being removed; its corrected contract was independently reviewed before the full passing rerun. Full R3 verification and limitations.

Real provider verification (historical, before R2 review fixes). GPT-5.5 and GPT-5.6 Sol each passed five scenarios using their existing settings. GPT-6 Astra passed the same five scenarios after the extension; the earlier GPT-5-only bundle reproduced nested high, max reduced to xhigh, and effort omitted with a sampling budget. All successful primary replies were exactly 42 with no tool calls. The following table records actual outgoing fields:

Scenario GPT-5.5 GPT-5.6 Sol GPT-6 Astra
Original configuration Effort omitted Effort omitted Effort omitted
High Flat high Flat high Flat high
Shared max preference Flat xhigh Flat max Flat max
Attempted off Flat none Flat none No invalid off value; mandatory thinking retained
High + 1024 completion budget Flat high + budget Flat high + budget Flat high + budget

A follow-up Astra run also passed low, medium, and xhigh, completing live coverage of all five tiers. Each tier was transmitted unchanged in flat reasoning_effort and accepted by the configured gateway. The CLI log does not retain independently usable reasoning-token counts, so these results do not establish differences in internal computation. Across the successful GPT-5 and post-fix GPT-6 tests, 18 primary requests and 20 automatic-memory background requests completed.

GPT-5.4 could not complete live verification: its configured route returned HTTP 502 with unknown provider for model gpt-5.4, and it was absent from the authenticated model list. The max case was aborted; off and budget cases were skipped. This is reported as blocked, not passed.

Tested on

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

Environment (optional)

Node.js 22.22.2 on macOS, using the bundled CLI and isolated configuration/runtime directories. Mock tests use loopback endpoints and mock credentials; live tests use the selected models' existing provider settings and credentials without changing the original settings.

Risk & Scope

  • Main risk or tradeoff: new model identifiers require explicit capability review; unknown variants retain generic behavior rather than inferred mandatory-thinking rules. Raw gateway parameters can produce a different effective effort from the requested preference. Native nested raw parameters remain opaque, and CLI/SDK override reporting has not been generalized.
  • Not validated / out of scope: GPT-5.4 live inference is blocked by the configured gateway's missing route. Live tests establish outgoing fields and gateway acceptance, not internal reasoning depth or quality differences. Live daemon-to-Web Shell integration was not tested; the screenshots use replayed ACP fixtures. This does not add a Responses transport. Astra's official tool-calling API requires Responses; the configured Chat Completions gateway is responsible for that compatibility, and live tool calling was not tested.
  • Breaking changes / migration notes: No configuration migration is required. Existing effort preferences are adapted to the active model.

Linked Issues

None; requested directly.

中文说明

本 PR 的改动

为已知的 GPT-5 模型和 GPT-6 Astra 增加模型专属推理 effort 配置。能力清单明确列举型号,共享规范化逻辑处理 provider 前缀、路由标签、空白、数字补丁版本和日期快照;未知后缀及未来 minor 版本保留通用 provider 行为。ACP 和 Web Shell 展示支持的档位、思考要求及默认状态。Astra 提供 low、medium、high、xhigh、max 五档,默认 medium,不提供关闭选项。

将配置的 effort 映射为 Chat Completions 的 reasoning_effort 字段,包括通过 DashScope 兼容网关访问 GPT 的路径。不支持的档位会适配到已知模型范围,同时保留其他采样参数和 reasoning 预算。OpenRouter 保留嵌套协议,显式原始请求参数保持覆盖优先级。平铺字段的空值和空字符串允许配置档位生效;嵌套原始值(包括 null)保留整对象覆盖语义。强制思考清理会移除不支持的平铺 none,且不会移除强制工具约束。使用内置 GPT 能力时,共享偏好在切换模型和重载后保留;显式配置的模型能力仍决定档位限制、默认值、关闭字段和偏好清理规则。batch 标签仅在 GPT 能力查询中处理,其他模型的 token 限制和模态保持原有行为。

控件将原生端点的已知平铺覆盖档位,以及 OpenRouter 的已知嵌套 effort 显示为实际原始档位;原生端点的不透明嵌套覆盖显示模型默认值。被原始覆盖阻断的显式选档会失败,不保留运行时改动、不保存偏好,即使所选值恰好等于当前显示值。思考开关通常选择已声明的默认档位,让 API 默认关闭的模型能够开启;存在阻断覆盖时,只有默认值允许思考,开关才会在关闭后恢复默认配置。若原始参数或该会话配置的默认值关闭思考,关闭状态的开关会被禁用并保留已保存的偏好,包括省略默认档位或仅提供开关的能力配置。默认值始终来自所属会话或请求,即使 provider 配置项被删除,也不会受其他工作区影响。ACP default 始终保留重置语义。欢迎页开启意图绑定来源模型,换模型时丢弃该待提交意图并保留目标已有偏好;用户明确选择的兼容档位仍可沿用。模型切换不会把已保存的 max 或 none 偏好转换成重置命令。

合并保留了 main 的显式模型推理能力。GPT 档位通过能力验证后,在原始请求参数合并完成后再转换,避免空平铺字段吞掉已确认的档位,并保留原始嵌套参数的整对象覆盖优先级。

已保存的关闭偏好在切换到声明了能力的强制思考 GPT 模型时也会保留,除非该声明显式禁止关闭。OpenRouter 的采样层平铺覆盖会显示实际档位。欢迎页会丢弃被原始参数阻断的待提交档位,无论目标当前关闭还是已开启,首条消息都按目标现有状态继续发送。

为什么需要

GPT 模型当前展示的通用 effort 档位和默认值与模型能力不符。请求发送的是内部嵌套 reasoning 对象,而不是 Chat Completions 要求的字段;配置采样参数还可能让 effort 完全丢失。因此,用户选择的 effort 可能被忽略或拒绝。

审阅者测试计划

如何验证

  1. 为 GPT-5.4 配置 high effort 和 completion-token 采样预算。确认请求同时包含平铺的 high effort 和预算,且没有自动注入的嵌套 reasoning 对象。

  2. 分别为 GPT-5.1、GPT-5.4、GPT-5.6 和 GPT-6 Astra 设置统一 max 偏好。确认实际 effort 分别为 high、xhigh、max 和 max;显式原始 effort 覆盖参数保留优先级,但强制思考模型不接受平铺的 none。

  3. 切换模型并检查 ACP 推理控件。确认 GPT-5.4 默认关闭思考,GPT-5.5 默认 medium,GPT-6 Astra 初始选中 medium 并提供全部五档。Astra 和其他强制思考模型必须拒绝关闭;新选择的不支持档位应被拒绝。保存 max,从 GPT-5.6 Sol 切换到 GPT-5.4 再切回,确认原始偏好保留,而当前档位先适配为 xhigh、再恢复为 max。同样,已保存的关闭偏好应在临时切换到 Astra 后保留。

  4. 在默认关闭的 GPT-5.4 Web Shell 会话中开启思考,确认选中 medium 且档位按钮可用。再次关闭时,请求应发送 none;OpenRouter 则使用嵌套关闭字段。确认原始平铺覆盖参数、空值及空字符串占位符合已说明的优先级。

  5. 通过 DashScope 兼容网关验证 GPT high/max 与采样预算。除非存在显式 provider 限制,GPT Pro/Astra 的强制工具请求必须保留 required 选择。确认现有 Qwen 控件和通用 provider 行为与基线一致。

  6. 确认未知 GPT 后缀和未来版本保留通用控件,带 provider 前缀的已知 Sol/Astra 型号获得正确能力。在原生端点的 Astra 任一原始参数层配置平铺 none,确认控件显示 medium 并拒绝 xhigh。原生端点上的嵌套原始 reasoning(包括 null)保持原样,阻断的档位选择应被拒绝,包括选择恰好等于所显示默认值的档位。

  7. 使用原生平铺覆盖,以及 OpenRouter 嵌套 effort、enabled 和 token 预算覆盖,确认被阻断的选档报错且设置不变。将带不透明覆盖的 GPT-5.5 先关闭再开启,默认值允许思考时应恢复原始配置,但显式选档仍被拒绝。原始平铺 none、OpenRouter 嵌套关闭参数,或同时存在阻断的原始覆盖与 reasoning 为 false 的配置默认值时,关闭状态的开关应禁用,点击不应发送配置请求,用户和工作区两层偏好应保留;明确发送 default 命令仍应重置偏好。欢迎页开启 Qwen 思考后切到 GPT-5.4 并发送,应保留目标已有偏好,不把 Qwen 的 xhigh 保存过去,也不清除已保存的关闭偏好;明确选择 xhigh 的对照场景仍可沿用。

  8. 显式声明 GPT 模型的推理能力,确认允许的档位和原生关闭字段被保留。平铺空值仍允许所选档位生效,原始嵌套覆盖仍拥有整对象优先级,非 GPT batch 路由保留原来的输出限制和模态。

  9. 在欢迎页明确选择其他模型的 xhigh 后,切换到由原始参数固定档位的目标。分别检查关闭且不可开启、以及已开启 High 的目标:预览应保留目标状态,首条消息不应因无效选档失败;没有原始限制的兼容目标仍可沿用 xhigh。

修改前后证据

基线使用全局安装的 Qwen Code 0.23.0;修复验证使用本地 bundle、可记录请求的模拟端点和实际 ACP 会话。

场景 修改前 修改后
GPT-5.4 high effort 嵌套 reasoning 对象 平铺 high effort
High effort 与采样 token 预算并用 Effort 丢失 Effort 和预算同时存在
GPT-5.1 / 5.4 / 5.6 使用统一 max 偏好 全部为嵌套 xhigh 分别为平铺 high / xhigh / max
关闭 GPT-5.4 思考 省略 reasoning 字段 平铺 none
GPT 推理控件 通用档位和默认值 模型专属档位、默认值及强制思考约束

Web Shell 控件(GPT-5.6 Sol 和 GPT-6 Astra)。 截图来自 Chromium 中的当前 Web Shell,通过仓库的模拟 daemon 回放 PR 实际 ACP 会话所记录的推理选项,未修改这些选项。两个模型均初始选中 Medium;截图展示选择 Max 后的状态。GPT-5.6 Sol 允许切换思考开关,GPT-6 Astra 则保持开启并锁定开关。Playwright 已验证完整五档、初始 Medium、两种思考开关状态,以及选择 Max 时发出的持久化配置请求。

GPT-5.6 Sol:选择 Max GPT-6 Astra:选择 Max
GPT-5.6 Sol 控件展示完整五档、选中 Max 并开启思考 GPT-6 Astra 控件展示完整五档、选中 Max 且思考开关锁定开启

请求字段(修改前后)。 对比图来自针对这两个精确模型标识重新采集的模拟端点请求。每个模型覆盖 High、Max,以及 High 与 1024 completion-token 预算并用。当前 bundle 的六项请求场景及两项 ACP 采集场景全部通过;全局 Qwen Code 0.23.0 基线复现了嵌套字段、max 被降低和采样参数导致 effort 丢失的问题。仅展示相关请求字段;真实 provider 验证在下文单独报告。

GPT-5.6 Sol 请求前后对比:平铺 high 和 max effort,并保留采样 token 预算

GPT-6 Astra 请求前后对比:平铺 high 和 max effort,并保留采样 token 预算

历史 R2 评论验证。 通过 3,313 项单元测试(core 648 项、CLI 1,746 项、Web Shell 919 项)、完整构建、打包、workspace/集成测试类型检查,以及改动文件的 lint/格式检查。8 类刻意移除保护的变异均触发预期回归断言;模型识别、请求字段、ACP 和 UI 问题也已在修复前复现。重新构建的 CLI 通过 90 项请求/ACP E2E 场景(51 项 wire、39 项 ACP)、2 项 Chromium 回放和 13 项无网络检查;共记录 200 次本机模拟 API 调用,包括一次修正测试期望后的单例重跑。 审计发现修复后,连续两轮完整 diff 自审及最终独立反向复审均未发现新问题。 详情见R2 验证报告;此前验证保留在上一轮报告。

冷启动 Welcome 补充验证(当前,9355b21d)。 冷启动推理预览保留已保存的关闭偏好,并提供可接受的 default 重置值或禁用不可用的开启操作。806 项相关单测、4 个真实 daemon/Chromium 流程及 2 个直接 ACP 流程通过,每个流程均收到首条回复。完整构建和打包、全量类型检查、变更文件 Lint/格式检查,以及提交前主审计和独立审计各连续两轮通过。仅推理服务使用本机 mock,没有新增外部模型调用。复现、验证和当前 CI 状态。

历史 R6 评论验证(9c48225e)。 修复保存的关闭偏好误删、OpenRouter 原始档位显示以及欢迎页首条消息失败,并修复提交前反向审计发现的 raw-on 组合问题。2,937 项单测、27 个实际 ACP 场景 / 200 条断言、3 个最终构建后浏览器场景、4 个欢迎页场景和全部 58 项 Chromium 冒烟测试首次通过;完整构建、打包、类型检查、全仓 Lint/格式以及主审计和独立审计各连续两轮干净后才提交。R6 验证、延期清单和 CI 状态。

R5 CI 与主线合并验证(历史)。 合并主线的新 CI 检查和慢渲染历史锚点修复,并纠正合并验证暴露的三处过期 mock 引用。完整构建、打包、全量类型检查、全仓 Lint/格式、3,441 项定向单测及 9 项 CI 检查脚本测试通过。58 个 Chromium 冒烟场景全部首次通过,包括曾准确复现 286px 偏移的 4 倍 CPU 降速场景。原 GPT effort 矩阵的 27 个 ACP 场景、560 条断言和 9 个构建后浏览器场景同样通过;连续两轮自审和独立复审均无遗留问题。R5 验证及 CI 状态。

历史 R4 思考开关修复验证。 无法完成的开启操作会被禁用并保留两层设置,合法原始参数恢复及显式 default 重置保持正常。通过 1,808 项单测、27 个实际 ACP 场景及 560 条断言、9 个构建后 Web Shell 浏览器场景,共 129 次本机模拟请求。完整构建与打包、最终 CLI 构建、全量类型检查、Lint 和格式检查通过。连续两轮反向自审及独立复审未发现遗留问题。R4 验证记录与范围。

历史 R3 评论和冲突验证。 已合并 main 并保留显式模型能力,处理全部 12 条评论,并修复反向审计额外发现的欢迎页偏好问题。构建、bundle、全量类型检查、Lint、格式及 3,392 项定向单测通过。核心/CLI 矩阵通过 41 个 ACP 场景、18 个 headless 请求场景及 32 项无网络检查;最终 bundle 另外通过 9 个 ACP 场景、6 个关键浏览器场景和完整 53 项冒烟测试,无自动重试。连续两轮自查和独立审查未发现遗留问题。最终第一轮冒烟暴露了一个要求执行已移除隐式重置的旧用例;修正合同经独立审查后,全套重跑通过。完整 R3 验证记录及限制。

真实 provider 验证(R2 评论修复前的历史记录)。 GPT-5.5 和 GPT-5.6 Sol 各使用已有设置通过五项场景。扩展后的 GPT-6 Astra 也通过相同五项场景;扩展前的 GPT-5 专用 bundle 复现了 high 使用嵌套字段、max 被降为 xhigh、采样预算导致 effort 丢失的问题。所有成功的主请求均准确回复 42,无工具调用。下表列出实际发出的字段:

场景 GPT-5.5 GPT-5.6 Sol GPT-6 Astra
原始配置 省略 effort 省略 effort 省略 effort
High 平铺 high 平铺 high 平铺 high
统一 max 偏好 平铺 xhigh 平铺 max 平铺 max
尝试关闭 平铺 none 平铺 none 不发送无效关闭值,保留强制思考
High + 1024 completion 预算 平铺 high + 预算 平铺 high + 预算 平铺 high + 预算

随后补测的 Astra low、medium、xhigh 也全部通过,完成五档真实覆盖。每档均原样写入平铺的 reasoning_effort,并被配置网关接受。CLI 日志未保留可独立核验的 reasoning token 计数,因此这些结果不证明内部计算量的差异。成功的 GPT-5 和修复后 GPT-6 测试共完成 18 个主请求及 20 个自动记忆后台请求。

GPT-5.4 未能完成真实验证:配置的路由返回 HTTP 502 和 unknown provider for model gpt-5.4,经过认证的模型列表也没有该模型。max 场景已中止,关闭及预算场景已跳过。该结果记录为受阻,未记为通过。

测试平台

操作系统 状态
🍏 macOS ✅ 已测试
🪟 Windows ⚠️ 未测试
🐧 Linux ⚠️ 未测试

环境

macOS、Node.js 22.22.2;使用打包后的 CLI 和隔离的配置及运行目录。模拟测试使用回环端点和模拟凭据;真实测试使用所选模型已有的 provider 配置和凭据,未修改原始设置。

风险与范围

  • 主要风险或权衡:新增型号需要明确复核能力;未知变体保持通用行为,不推断强制思考规则。原始网关参数可能使实际 effort 与请求偏好不同;原生端点的嵌套原始参数保留透传,CLI/SDK 的覆盖参数报告未作通用化扩展。
  • 未验证或不在范围内:GPT-5.4 真实推理受配置网关缺少路由阻塞。真实测试确认请求字段和网关接受情况,不证明内部推理深度或质量差异。未进行实际 daemon 与 Web Shell 的联调;截图使用 ACP 记录回放。本改动不增加 Responses 传输。Astra 官方工具调用 API 要求 Responses;当前 Chat Completions 网关负责兼容,未测试真实工具调用。
  • 破坏性改动或迁移说明:无需配置迁移,已有 effort 偏好会适配到当前模型。

关联 Issue

无;由用户直接提出。

@wenshao

wenshao commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author

E2E test report

Result: VERIFIED_FIXED — 21/21 scenarios passed. Tested on macOS with Node.js 22.22.2. The baseline was globally installed Qwen Code 0.23.0; verification ran the locally built dist/cli.js.

Request validation: 11/11 passed

A loopback recording mock served deterministic responses while each scenario ran with isolated configuration and runtime directories and mock credentials.

Scenario Baseline Verified result
GPT-5.4 high Nested reasoning Flat high
High with completion-token budget Effort missing Flat high and budget retained
GPT-5.1 max preference Nested xhigh Flat high
GPT-5.4 max preference Nested xhigh Flat xhigh
GPT-5.6 max preference Nested xhigh Flat max
GPT-5.4 thinking disabled No effort field Flat none
Raw sampling override Preserved Preserved
Raw extra-body override Preserved Preserved
Raw nested override Preserved Preserved
No configured reasoning No injected effort No injected effort
Generic provider max preference Nested xhigh Nested xhigh

All 11 processes completed successfully with an OK response. All 22 recorded streaming requests were independently checked for model, reasoning fields, and completion-token budget.

ACP validation: 10/10 passed

Each model used an independent active session. The check initialized and authenticated ACP, created a session, selected the model, inspected its reasoning options/default, and attempted an unsupported choice.

  • GPT-5, GPT-5.1, GPT-5.1-Codex-Max, GPT-5.4, GPT-5.4-Pro, GPT-5.5, and GPT-5.6 now expose the expected model-specific options and defaults. All seven cases failed those expectations on the global baseline.
  • Mandatory-thinking models reject none; unsupported effort selections are rejected.
  • Qwen 3.8 Max, Qwen 3.7 Plus, and the generic model preserve their baseline controls.

The mock server and child processes exited after testing. No real provider inference or visual Web Shell interaction was performed.

Additional validation

Build, typecheck, bundle, changed-file ESLint and Prettier checks passed. Focused unit tests passed: 262 core and 825 CLI tests. Independent code review found no Criticals or Suggestions.

@wenshao
wenshao marked this pull request as ready for review September 7, 2026 09:47
@wenshao wenshao changed the title feat: support GPT-5.x reasoning effort configuration feat: support GPT-5 and GPT-6 reasoning effort configuration Sep 7, 2026
@wenshao
wenshao dismissed a stale review via 5d36c59 September 7, 2026 10:32
@wenshao

wenshao commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author

Live E2E report — GPT-5 and GPT-6 Astra

Real inference used the selected models from the existing user settings, their configured gateway and credentials, and isolated configuration/runtime/workspace directories. Original settings were unchanged. No secrets or private endpoint addresses are included here.

Model Live scenarios Result
GPT-5.5 Original configuration, high, shared max, off, high + 1024 completion budget 5/5 passed; max maps to xhigh; off sends none
GPT-5.6 Sol Same five scenarios 5/5 passed; max stays max; off sends none
GPT-6 Astra Original configuration, all five explicit tiers, attempted off, high + 1024 completion budget 8/8 passed; all five tiers stay unchanged; mandatory thinking retained
GPT-5.4 Original configuration and high; max interrupted Blocked: HTTP 502, unknown provider for model gpt-5.4; absent from authenticated model discovery. Max was aborted, and off/budget cases were skipped.

Each successful primary response was exactly 42, with exit code 0 and no tool calls. Recorded requests confirm flat reasoning_effort, preservation alongside sampling parameters, and preservation of existing generation extras. Successful runs recorded 18 primary and 20 automatic-memory-extractor interactions (38 successful API log records). Background calls are counted separately and are not additional effort test cases.

Astra was reproduced before the extension: the GPT-5-only bundle sent nested high, reduced max to xhigh, and omitted effort with a sampling budget even though the gateway answered. After the fix, high/max use the correct flat field, and high coexists with the 1024 budget. The later low/medium/xhigh run completed five-tier coverage. An active ACP session independently verified medium as the initial UI value, exactly five choices, mandatory-thinking metadata, rejection of none with error -32602, and successful high/max selections.

The tests establish parameter transmission and gateway acceptance. They do not prove internal reasoning depth or quality differences; the CLI logger does not retain independently usable reasoning-token counts. Live tool calling and live daemon-to-Web Shell integration were not tested. Existing PR screenshots remain explicitly identified as ACP fixture replay.

Validation: build, typecheck, bundle, changed-file lint/formatting, 277 core tests and 818 CLI tests passed. Final independent code review found C=0, S=0. The original 21 mock E2E scenarios remain documented in the earlier report.

Reproduction prompt: Compute 17 + 25. Reply with exactly the decimal integer and nothing else. Do not use any tools. Each run used one primary turn, a zero primary tool-call budget and a 75-second wall-time limit. GPT-5 live tests used the original PR bundle (SHA-256 37e4bc1425e41a7840c79a0b136db78fbd44b1a7d4b0720d6227a39d1d3edc95); post-fix Astra tests used SHA-256 ab386711c9a0c12e84ec700ae0e70db09125a7f3315f2f650fa6489a4d09e236. The later edits only clarify documentation/comments and test typing.

中文说明

真实端到端报告 — GPT-5 和 GPT-6 Astra

测试使用用户已有设置中的所选模型、配置网关和凭据,并隔离配置、运行及工作目录。原始设置未修改。此报告不包含密钥或私有端点地址。

模型 真实场景 结果
GPT-5.5 原始配置、high、统一 max、关闭、high + 1024 completion 预算 5/5 通过;max 映射为 xhigh;关闭发送 none
GPT-5.6 Sol 相同五项场景 5/5 通过;max 保留 max;关闭发送 none
GPT-6 Astra 原始配置、五个显式档位、尝试关闭、high + 1024 completion 预算 8/8 通过;五档均原样发送;保留强制思考
GPT-5.4 原始配置及 high;max 中断 受阻:HTTP 502、unknown provider for model gpt-5.4,认证后的模型列表也没有该模型。max 已中止,关闭和预算场景已跳过。

成功的主响应均准确为 42,退出码为 0,无工具调用。请求记录确认平铺 reasoning_effort、effort 与采样参数同时保留,以及原有生成 extras 不变。成功测试共记录 18 个主请求和 20 个自动记忆提取请求,共 38 条成功 API 日志。后台调用单独计数,不算额外 effort 场景。

扩展前已复现 Astra 问题:GPT-5 专用 bundle 会发送嵌套 high、将 max 降为 xhigh,并在有采样预算时丢弃 effort,尽管网关仍会回答。修复后 high/max 使用正确的平铺字段,high 与 1024 预算并存;后续 low/medium/xhigh 补测完成五档覆盖。实际 ACP 会话独立验证了 UI 初始 medium、准确的五档列表、强制思考元数据、以 -32602 错误拒绝 none,以及 high/max 选档成功。

测试确认参数传递和网关接受情况,不证明内部推理深度或质量差异;CLI 日志未保留可独立核验的 reasoning token 计数。未测试真实工具调用或实际 daemon 与 Web Shell 的联调。PR 现有截图继续明确标注为 ACP 记录回放。

验证:构建、类型检查、打包、改动文件的 lint/格式检查,以及 core 277 项和 CLI 818 项单测全部通过。最终独立代码审查 C=0、S=0。之前的报告保留了 21 项模拟端到端场景结果。

复现提示词为上方英文原文。每次测试限制一个主轮次、零次主工具调用和 75 秒墙钟时间。GPT-5 真实测试使用原始 PR bundle,修复后 Astra 测试使用新的 bundle,精确 SHA-256 见上方;后续仅修改文档、注释及测试类型标注。

@wenshao

wenshao commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author

E2E review follow-up — a9b2b4bd36

VERIFIED_FIXED. Reproduced the review findings against the exact previous PR state (5d36c5934) and the global Qwen Code 0.23.0 baseline, then verified the rebuilt CLI containing this follow-up.

Behavior Previous PR state Verified result
GPT-5.4 raw high overrides Control reported thinking off Reports enabled; raw high stays on the wire
Shared max across Sol → GPT-5.4 → Sol User/workspace preferences were deleted Both scopes retain max; active requests use xhigh then max, including after reload
Shared off across Sol → Astra → Sol Unsupported preference could be cleared Both scopes retain off; Astra receives no disable field and Sol restores none
Requested max on GPT-5.4 / GPT-5.1 UI showed medium while requests used xhigh / high Live controls and previews show xhigh / high
GPT Pro/Astra through DashScope-compatible gateway Required tool selection was removed Required selection is retained; explicit provider/Qwen restrictions still work
GPT effort through DashScope-compatible gateway Nested effort remained Flat high/xhigh/max and sampling budgets are preserved
Sibling reasoning budget and null flat placeholders Budget or configured effort could disappear Both survive the configured merge order
Variant suffixes and numeric patches Capabilities were absent or incorrect Mandatory rules and tier ranges match the underlying model; malformed IDs stay generic

Validation completed before committing:

  • 45/45 E2E scenarios: 31 request scenarios and 14 active ACP sessions, including model switches, reloads, switch-backs, saved settings checked after process exit, and rejection/rollback of selections blocked by raw off overrides.
  • 82 recorded local mock API calls: 62 request-scenario calls and 20 ACP calls (18 primary stream requests plus 2 ancillary non-stream requests). Responses and recorded fields were checked directly, not only against a script's pass flag.
  • 13/13 no-network checks: 9 forced-tool constraints and 4 persisted previews.
  • 2,178 focused unit tests: 458 core and 1,720 CLI; full build, bundle, typecheck, changed-file lint and formatting passed.
  • Two discriminating mutation checks failed as expected when the OpenRouter exclusion or sampling clamp was removed; restored source passed.
  • Two consecutive full-diff reverse self-audits and two independent reverse review passes found no further issue. All four existing Critical findings were checked against the final code and confirmed fixed.

The full bundle was unchanged during E2E verification: 833 JavaScript files, manifest SHA-256 1c9083f4d53c7e96b9d6776620bfd0c6014b2d2bfdce3039bcbd6b27e75cef95. The complete PR diff against 56da7ac4d71dd7dcfbe06038bd910b731c6822d5 has SHA-256 2505833096bb4c91d294e51f744123637db76e625a72c80588b5362be98ed28e.

This follow-up used isolated configuration/runtime directories and local recording endpoints with mock credentials. User settings and real provider credentials were not used. Earlier real GPT-5.5/GPT-5.6/GPT-6 results remain historical evidence for those builds; no new live-provider acceptance is claimed here. Raw high overrides display an enabled default tier (medium), while the raw high request remains unchanged; full raw-tier synchronization is outside this PR.

中文验证报告

已在精确的上一版 PR 状态 5d36c5934 和全局 Qwen Code 0.23.0 上复现评论问题,再用修复后的完整 bundle 验证。

45 项端到端场景全部通过:31 项请求场景、14 个 ACP 会话,共记录 82 次本机模拟 API 调用;另有 9 项强制工具约束和 4 项持久化预览检查全部通过。max 在 Sol → GPT-5.4 → Sol 间切换及重载后保留,实际档位依次适配为 xhigh、恢复为 max;关闭偏好经过 Astra 后也能保留并恢复。用户与工作区配置均在进程退出后重新核对。原始关闭覆盖阻止选择 high 时,RPC 会拒绝并回滚。

GPT 网关请求、强制工具字段、预算和空值覆盖、模型变体及补丁版本均通过检查。原始 high 不再显示思考关闭,但界面仍显示已启用的默认档位 medium;请求中的原始 high 保持不变,本 PR 不扩大为完整原始档位同步。

提交前通过了 2,178 项定向单元测试(core 458、CLI 1,720)、完整构建、打包、类型检查、lint 和格式检查。两项变异检查移除对应保护后均按预期失败,恢复后通过。连续两轮完整 diff 反向自审和两轮独立反向复审均无新增问题,原有四条 Critical 均对最终代码逐条确认已修复。

测试前后的完整 bundle 清单及 diff hash 一致。本轮仅使用隔离目录、本机模拟端点和模拟凭据,未使用用户配置或真实凭据;不将此前真实 provider 测试冒充为本次新提交的真实调用结果。

@wenshao

wenshao commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

R2 review follow-up verification

Commit: 9f0106136e. Addresses the nine review threads against a9b2, plus the default-off GPT Web Shell switch defect found during reverse audit.

  • Build and unit checks: full build, bundle, workspace/integration typecheck, changed-file ESLint/Prettier, and diff whitespace checks passed. 3,313 tests passed across 16 files: core 648, CLI 1,746, Web Shell 919.
  • Regression efficacy: eight deliberate mutation categories each failed behavioral assertions: shared model normalization, flat placeholders, invalid configured-effort translation, GPT selection application, native nested interpretation, mandatory default reporting, opaque selection confirmation, and the default-on null fallback. No zero-test or bootstrap failure was counted. Before-fix model/wire/ACP/UI runs also reproduced the defects.
  • Final bundle E2E: 90 request/ACP scenarios passed (51 wire, 39 ACP), including the prior 45-scenario regression set; 2 Chromium replay scenarios and 13 no-network checks also passed. 200 loopback mock API calls were captured, including a single rerun after correcting a fixture expectation to match the preserved global-baseline behavior. No product failure remained.
  • UI evidence: GPT-5.4 switch-on sends medium; replaying the actual ACP response enables all four effort buttons. The Qwen toggle-only control still sends default. The unmodified stock mock daemon would have hidden the original bug, so these browser checks replayed real bundled ACP results.
  • Audit: after fixing findings, two consecutive full-diff reverse self-audits and the final independent reverse review were clean. Review covered all 25 PR files, added-field readers, provider inheritance, request versus configured model, raw-layer precedence, persistence/rollback, previews and UI actions. No new daemon route was added.

The new request/ACP witnesses cover closed known-model recognition, provider prefixes, empty flat placeholders, preserved nested null/false/off/high raw data, native/OpenRouter differences, mandatory flat none in both layers and with retained nested data, exact default-tier false confirmation, and successful GPT-5.4/Pro selection. Max/off preference persistence, model switching/reload, Qwen controls and generic fallback were rechecked.

R2-3 uses a small local reporting helper; the existing CLI/SDK raw-override reporting boundary was not generalized. For R2-7, nested null deliberately remains an explicit whole-object raw override; its wire semantics are preserved and documented, while blocked native tier changes now reject. It was not changed into a no-op.

Provenance: full PR diff SHA-256 ba712305b4f8b0ddf96d2ec2001ca3e1e7ad78991c06900b7d166aed2c114def; review-fix diff e2754b73f0ce2969c9cdf1278186d941ce23bd4623c2cdd88b9c6d9461c5b703; complete 833-file dist JavaScript manifest fcde53b7cde2a91c2c6dbd95bf7240c153e801fbabf905d14deb69a1a3170b05. Source and bundle were rechecked after testing; test processes were cleaned up.

This round used isolated settings and local mock endpoints only. The prior GPT-5.5/GPT-5.6 Sol/GPT-6 Astra live results remain historical evidence in the PR description; GPT-5.4's live route remains unavailable. These checks establish request fields and UI behavior, not internal reasoning compute. The GPT-5.6 and GPT-6 images hosted in the wenshao fork assets branch are retained.

中文说明

本轮 9 条评论已按修复或明确保留语义处理,并修复反向审计发现的 GPT-5.4 思考开关无法开启问题。提交前通过 3,313 项测试、完整构建/打包/类型检查及 lint/格式检查;8 类变异均能触发回归断言。最终 bundle 通过 90 项请求/ACP 场景、2 项浏览器回放和 13 项无网络检查,共记录 200 次本机模拟 API 调用。发现修复后连续两轮完整自审与最终独立反向复审均无新增问题。

嵌套 null 继续作为原始整对象覆盖透传,未扩展为无操作;被该覆盖阻断的原生端点档位选择会明确拒绝。CLI/SDK 既有覆盖报告范围未作通用化改造。真实模型验证记录保留为历史结果,本轮未使用用户凭据或额外调用真实 provider。

@wenshao

wenshao commented Sep 8, 2026 •

Copy link
Copy Markdown
Collaborator Author

CI smoke follow-up

Fixed in 975dd8cc3e. The failed Web Shell smoke job expected default when turning Qwen3.8 thinking back on. The previous change intentionally selects the advertised default tier (xhigh for Qwen3.8), because reset/default leaves default-off GPT models disabled. This follow-up corrects that single stale assertion; the production and mock behavior are unchanged. The separate reset and toggle-only assertions still expect default.

Reproduced the exact assertion on the published parent before editing. After the correction, the full browser smoke suite passed 50/50 with CI's 8 workers and default retry settings: 50 attempts, no retries, skips, flaky results or global errors. The original failing case, mandatory controls, welcome resets and toggle-only controls all passed. 112 ChatEditor unit tests, full build, bundle, workspace/integration typecheck, changed-file ESLint/Prettier and diff checks also passed. Two consecutive reverse self-audits were clean before committing. Source hashes stayed unchanged throughout browser verification and all test listeners were closed. GitHub CI passed on this commit. The previously failing Web Shell smoke job reports 50 passed (2.2m) using 8 workers, with no retries. All 22 completed non-skipped checks passed; only the automatic PR review is still running.

中文说明

已修正上一轮遗漏的一行冒烟测试期望:Qwen3.8 开启思考应发送已声明的默认档位 xhigh。原始失败先在本地复现,修正后按 CI 的 8 个 worker 配置通过全部 50 项浏览器冒烟测试,无重试、跳过或 flaky;112 项组件测试及构建、打包、类型检查、lint/格式检查也通过。提交前连续两轮反向自审无新增问题,云端主 CI 已通过,原报错的浏览器检查在 8 个 worker 下通过全部 50 项(2.2 分钟),无重试。目前 22 项已完成的非跳过检查全部通过,仅自动 PR 评审仍在运行。

@wenshao

wenshao commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

R3 review and conflict verification

Verified commit: 21fdaa53ce. Merged main at 078b924, preserving its explicit model reasoning capabilities. All 12 R3 review threads are addressed, including both Critical findings. Further reverse audit found and fixed two Welcome preference bugs before commit: switch-derived tiers could reset saved off state, and implicit model-switch resets could erase saved max/none.

The final Welcome behavior discards cross-model switch intent and incompatible pending choices, preserves the target’s existing preview/preference, and migrates compatible explicit choices. It does not synthesize a reset from the source preview.

  • Build, bundle, full workspace/integration typecheck, changed-file ESLint, Prettier, and diff whitespace checks pass.
  • 3,392 focused unit tests pass: 675 core, 1,739 CLI, and 978 Web Shell. The final Web Shell implementation was rerun; the core/CLI source and tests are unchanged from their complete passing runs.
  • The merged core/CLI implementation passed 41 bundled ACP cases (696 assertions), 106 additional captured-settings/error assertions, 18 headless wire cases (54 assertions), and 32 no-network pipeline/provider checks. These cover native/OpenRouter raw precedence, strict rejection and rollback, both writable preference scopes, opaque off/reset, configured capabilities, mandatory thinking, and non-GPT batch behavior.
  • The final bundle passed 9/9 real ACP cases (32 assertions, 11 local mock API calls) and 6/6 key browser scenarios: three switch-target preferences, two saved preferences without pending intent, and one incompatible explicit tier. Scenarios requiring no configuration write sent zero reasoning requests; the explicit-xhigh ACP control verified persistence and actual wire fields.
  • Fifteen deliberate implementation mutations failed behavioral assertions before the final Welcome corrections. The subsequent three switch-intent and four implicit-reset regressions were also red before their fixes. A fixture TypeError from an initial persistence-mutant attempt was excluded; its corrected baseline and assertion-failure retry are recorded.
  • Final reverse audit reached two consecutive clean root passes and two consecutive clean independent full-diff passes. The independent review also checked 480 actual pipeline/provider combinations and 192 App callback combinations. The E2E contract correction received two further clean reviews.

Validation transparency: an attempted typecheck overlapped build cleanup and failed on missing dist declarations; the authoritative full typecheck was run after build and passed. The first final smoke run passed 52/53: its remaining old test required the implicit preference reset that this fix removes. After updating that test to expect the existing Medium preference and no config request, the full 53/53 passed with no automatic retries in about 1.2 minutes. The original failure is retained, not counted as a pass. Prior raw-matrix browser fixture corrections remain documented in the local report.

All this round’s requests used isolated local mock endpoints and mock credentials; the original user settings were not modified. Historical GPT-5.5, GPT-5.6 Sol, and all-five-tier GPT-6 Astra live-provider results remain in the live report and PR body. Those results establish outgoing fields and gateway acceptance, not internal compute differences. No new paid provider tests were needed for this review round.

中文说明

验证提交:21fdaa53ce。已合并 main 的 078b924,并保留显式模型推理能力。R3 的 12 条评论均已处理,包括两条 Critical。提交前反向审计另外发现并修复了欢迎页的两处偏好问题:开关来源的档位可能重置已保存的关闭状态,模型切换时合成的重置请求可能清除已保存的 max/none。

最终欢迎页会丢弃跨模型开关意图及不兼容的待提交选择,保留目标现有预览和偏好;明确选择的兼容档位仍可迁移,不会根据来源模型的预览合成重置命令。

构建、bundle、全工作区及集成测试类型检查、变更文件 ESLint、Prettier 和空白检查通过。3,392 项定向单测通过:core 675、CLI 1,739、Web Shell 978;最终前端实现重新执行了完整相关测试,core/CLI 源码及测试与上一轮完整通过版本一致。合并后的核心实现通过 41 个真实 bundle ACP 场景(696 断言)、106 项捕获设置和错误断言、18 个 headless 请求场景(54 断言)及 32 项无网络检查。

最终 bundle 本轮通过 9/9 个真实 ACP 场景(32 断言、11 次本地模拟 API 调用)及 6/6 个关键浏览器场景:3 个开关目标偏好、2 个无待提交意图的保存偏好、1 个不兼容明确档位。要求不写配置的场景均未发送推理配置请求;明确选择 xhigh 的真实 ACP 对照验证了持久化及实际请求字段。

15 个故意引入的实现变体被行为断言捕获;后续开关意图 3 个、隐式重置 4 个回归用例也在修复前确认失败。最初持久化变体的夹具 TypeError 不计入有效反证,修正夹具后重新确认了正确基线及断言失败。最终连续两轮自查和两轮独立完整反向审查未发现问题;独立审查另验证了 480 组实际 pipeline/provider 组合和 192 组 App 回调组合。冒烟合同修订又通过两轮审查。

验证过程说明:一次类型检查与构建清理并发,因 dist 声明暂时缺失而失败;构建完成后独立执行的正式全量类型检查已通过。最终第一轮冒烟为 52/53,剩余旧用例要求清除偏好,与本次移除隐式重置的行为相反;改为验证保留 Medium 且没有配置请求后,完整 53/53 通过,无自动重试,用时约 1.2 分钟。原失败记录保留,不计作通过。

本轮所有请求均使用隔离的本地模拟端点和凭据,没有修改原始用户设置。之前 GPT-5.5、GPT-5.6 Sol 与 GPT-6 Astra 完整五档的真实网关测试记录保留在 PR 正文及历史报告中;它们证明发出的字段及网关接受情况,不证明内部计算量差异。本轮无需再次调用付费网关。

@wenshao

wenshao commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

R4 verification for d01fd784543e3408d28dfdf71c8c26fe5afb8ad0

Fixed the Thinking switch accepting an ineffective ON action and clearing saved effort preferences. The server now marks ON unavailable when a raw override blocks configured tiers and the owning session’s reset default cannot enable thinking. The off switch is disabled, including for configured capabilities without a default tier and toggle-only models. OFF remains available while thinking is on; legitimate raw-on restoration and explicitly requested default resets keep their existing behavior. The default source belongs to the session or request, including after a provider entry is removed or another workspace changes the agent cache.

  • Reproduced the original failure against published 21fdaa53ced703a2490995afed9d71481fd82c89. A first candidate passed its matrix, but the independent second audit reproduced the missing-default and toggle-only cases; that candidate was not committed, and the clean-pass count was reset before this final fix.
  • Final runtime: 27 ACP scenarios / 560 assertions, 9 built-WebShell Chromium scenarios, 129 local mock requests, zero browser errors, corrections or retries. Fifteen negative ACP scenarios report unavailable ON and preserve complete user/workspace settings after rejected direct tier requests; twelve positive scenarios preserve legitimate restoration. Explicit default reset is verified separately. The six disabled-browser cases send no configuration request when clicked; three positive cases can enable thinking.
  • Browser tests replay actual ACP options and responses through the repository mock daemon; this is not a live daemon-to-browser integration test. Production source and all 1,044 bundle files stayed unchanged during the final verification.
  • 1,808 unit tests passed: 1,622 ACP/session/model-configuration tests and 186 WebShell mapper/editor tests. Full build/bundle, workspace/integration typecheck, changed-file lint and formatting passed.
  • Two consecutive reverse self-audits and two independent full-diff passes found no remaining actionable issue after fixing the additional capability boundaries.

All requests used isolated local mock endpoints. The original user settings were untouched, paid provider tests were not repeated, and the GPT-5.6/GPT-6 images and historical real-provider evidence remain in the PR description. Earlier diagnostic fixture/type errors and a same-package coverage-directory collision remain recorded and are excluded from final passing totals.

中文:修复开启思考无效却确认成功、并清除已保存档位的问题。无法完成的开启操作现在会被禁用,覆盖省略默认档位及仅提供开关的合法配置;正常开启、关闭和显式 default 重置保持原有行为。初版修复在独立第二轮审计发现遗漏后被撤回,未提交,并重新计数审计。最终通过 27 个实际 ACP 场景、560 条断言、9 个构建后浏览器场景和 1,808 项单测;禁用的开关不会发送配置请求。当前验证未修改原始设置,也未重复付费模型调用。

@wenshao

wenshao commented Sep 8, 2026 •

Copy link
Copy Markdown
Collaborator Author

CI repair verification for 5602d9a9d8bfa5e83bed58e14490aeefc0338100

The failed Lint & Static job checked out the prior PR head but invoked the new main-branch freshness check, whose script was missing from that head. The browser smoke failure was a history-reading-anchor race under slow rendering: with the same 4× CPU throttling condition as main’s regression, the old PR source reproduced the exact 286px displacement (expected at most 2px).

Merged main at 1f890086f1a41e4de7965c44281116fd65b695d8, incorporating the gate and the existing history-anchor fix. Integration checks additionally exposed two App test cases referring to a renamed mock; corrected those three references while retaining all assertions. No additional production change was introduced beyond main, and the GPT effort implementation remains unchanged.

  • Full build, bundle, workspace/integration typecheck, repository ESLint and Prettier passed.
  • 3,441 focused unit tests passed (675 core, 1,758 CLI, 1,008 Web Shell), plus all 9 lint-gate tests.
  • Complete Chromium smoke: 58/58 passed on the first attempt (no retries or flaky results), including the original 4× CPU / 200-record case. The built CLI additionally passed 27 ACP scenarios / 560 assertions and 9 built-WebShell replay scenarios with 128 local mock calls, no retries or browser errors. All 7,873 tracked files and 1,044 bundle files were unchanged during runtime verification. Browser replay is not live daemon integration.
  • Two consecutive reverse self-audits and two independent full-diff review passes found no remaining actionable issue. Frozen source and staged PR diff hashes matched before commit.

The original non-throttled reproduction passed nine local executions; those results did not rule out the failure and were kept separately from the precise throttled reproduction. Original user settings were not changed, no paid model calls were repeated, and prior GPT-5.6/GPT-6 images and live-provider evidence are retained.

Remote verification is complete: Qwen Code CI run 34288267339 passed on this exact commit. Both previously failing jobs are green: Lint & Static and Linux Web Shell smoke. The remote log confirms all seven main-branch gate files are current; Linux smoke passed 58/58 in 58 first attempts, including the formerly failing 200-record case. At final verification the PR had 21 successful checks and no failed or pending checks.

@wenshao

wenshao commented Sep 9, 2026 •

Copy link
Copy Markdown
Collaborator Author

Follow-up status, 9355b21d (2026-09-09): The cold Welcome toggle preview item recorded below as deferred is now fixed and verified separately. It was still present at this report's 9c48225e head; the model-switch carry-over correction did not close it. See the cold Welcome reproduction and verification report for the new commit and its CI status. The results below remain historical evidence for 9c48225e; other deferred Suggestions remain deferred.

中文:下方曾延期的冷启动 Welcome 开关预览问题已在 9355b21d 修复并单独验证;它在本报告对应的 9c48225e 仍然存在,不能与模型切换继承修复合并认定为已解决。本报告原有测试和 CI 结果仍属于旧提交,其余 Suggestion 保持延期。


R6 review fixes and verification

Committed as 9c48225e64365f34f81f8c40b7c7fde5d4e25440 after two consecutive clean reverse self-audit passes and two independent clean passes. No commit was made while either audit had an open finding.

  • Fixed both duplicate R5-1 threads: table-imposed mandatory thinking no longer deletes a saved off preference over declared capabilities. Explicit canDisable:false and incompatible configured max retain their stricter reconciliation.
  • Fixed R6-2: OpenRouter sampling flat overrides report their actual merged tier/state, preserving extra-body-only, declared-capability, nested-override and mandatory-none exceptions.
  • Fixed R6-1 and the related raw-on case discovered during reverse audit: Welcome drops pending tiers that the target cannot apply, retains the target preview, and sends the first prompt without a rejected config write. Both raw-on metadata shapes were independently captured from actual ACP.
  • R6-3 is a false positive. The GPT-5 family guide groups base/mini/nano and lists minimal/low/medium/high; GPT-5.1 introduces none. Specific sources are now recorded in the design. No base/mini/nano live call was made or claimed.
Verification Result
Focused unit tests 2,937 passed: 950 Session/configuration, 683 ACP, 307 core capability/pipeline, 997 App/ChatEditor/mapper
Built CLI ACP 27 scenarios / 200 assertions; all 12 mandatory ids, tiered/toggle-only, switch/reload and strict-declaration counterexamples
Built WebShell 3 effective-tier scenarios passed on final assets
Welcome browser 4 cases passed; blocked targets preserve state and send the first prompt, unrestricted target still carries xhigh
Complete Chromium smoke 58/58 first attempts, workers=1, retries=0, no flaky/skipped/error outcomes; previous 4× CPU/200-record reading-anchor case passed
Build and static checks Full build, bundle, workspace/integration typecheck, repository lint and formatting, final changed-file lint all passed
Audits A raw-on bug found during reverse audit was reproduced and fixed, resetting the count; the final patch then passed two consecutive root and independent passes

The final eight-file diff matches the audited SHA-256 8d02b7008cab955ca455b211f82a17a1d782076f3b9ef4f0371cab7662e3eeb5. All 7,873 tracked files and 1,044 dist files stayed unchanged during final built-browser verification; CLI source and bundle were byte-identical to ACP verification. The primary ACP matrix made 74 loopback mock calls; three additional metadata observations made five more. Browser tests replay actual ACP metadata through mock transport; this does not claim live daemon-to-browser integration or new real-provider inference. Existing GPT-5.6/GPT-6 images and historical live-provider evidence remain intact.

Remote verification on this exact head: Qwen Code CI run completed successfully. The completed smoke-job log reports 58 tests using two workers and 58 passed (3.9m); all 58 case ordinals occur exactly once, with no retry or flaky result. Linux unit tests, Lint & Static, no-AK integration and Serve A/B also passed. The lint log confirms all seven freshness checks actually ran successfully. Across PR checks, 23 have passed and none failed; automatic PR review remains in progress, with conditional jobs skipped. The local smoke result above and this remote result are separate runs.

Deferred R6 follow-up inventory

This PR is beyond five review rounds, so this round fixes correctness/regressions and retains the review's deferred inventory for follow-up. The Welcome toggle preview limitation fails closed; broader tier-lock metadata, unknown raw tiers, documentation refinements, diagnostic wording, additional test isolation/naming and generic TUI ladder work are not expanded into this patch. No deferred item is being silently treated as fixed.

  • packages/web-shell/client/components/ChatEditor.tsx:1133 — [probe] Critical [fails-closed] [new-surface] Welcome/toggle enable-value path: previews never advertise…
  • docs/design/gpt-5-reasoning-effort.md:71 — [probe] Design doc says canEnable:false disables OFF; the code…
  • docs/users/configuration/model-providers.md:701 — [probe] The wire-shape cell's two-way split is contradicted by its…
  • docs/users/configuration/model-providers.md:726 — [probe] Doc states the blocked-tier rejection as universal; it is…
  • packages/cli/src/acp-integration/acpAgent.test.ts:9668 — [probe] it.each title collision: 8 generated cases collapse to 6…
  • packages/cli/src/acp-integration/acpAgent.ts:5338 — [review] Cold-restore request-scope discipline is unpinned
  • packages/cli/src/acp-integration/acpAgent.ts:6044 — [review] Blocked-tier rejection never names the raw override…
  • packages/cli/src/acp-integration/acpAgent.ts:14773 — [probe] No _meta field advertises that the tier list is pinned
  • packages/cli/src/acp-integration/model-configuration.test.ts:553 — [probe] 18 assertions run inside 2 named cases; a failure names…
  • packages/cli/src/acp-integration/model-configuration.ts:167 — [probe] An out-of-ladder raw tier ('minimal') is reported as the…
  • packages/cli/src/acp-integration/model-configuration.ts:268 — [probe] canDisable is inherited into a declared capability but…
  • packages/cli/src/serve/workspace-service/__tests__/facade.test.ts:67 — [review] New mock entries contradict each other and defeat the…
  • packages/core/src/core/openaiContentGenerator/pipeline.test.ts:1230 — [probe] Declared-capability rows pin only the widening side;…
  • packages/core/src/core/openaiContentGenerator/provider/default.ts:151 — [review] The new declared-capabilities clamp branch is untested
  • packages/core/src/core/openaiContentGenerator/provider/default.ts:159 — [review] The clamp is model-aware but the TUI /effort ladder is not
  • packages/core/src/core/reasoning-effort.test.ts:49 — [review] gpt-5.2-codex is the only capability-table label with no…

中文:重复的偏好误删评论、OpenRouter 状态错误、Welcome 首条消息失败均已处理,并修复了提交前审计新发现的 raw-on 组合问题。两轮主审计和两轮独立审计干净后提交;本地 2,937 项单测、27 个 ACP 场景及 65 个浏览器场景通过。基础 GPT-5 的 none 评论已按官方逐型号资料说明为误报,其余延期项逐条保留在上方。远程主 CI 已通过;日志确认 WebShell smoke 58 项均首次通过,两个 worker,用时 3.9 分钟。PR 共 23 项检查通过、无失败,自动评阅仍在运行,另有按条件跳过的任务。

@qqqys qqqys 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-only review pass at head 9c48225e. The newest commit answers the four Criticals round 6 filed, but no review round has ruled on this head — the automatic review was still in flight when this pass ran — and I could not trace those four to closure inside my budget on a 3,034-line diff. So this is a COMMENT: nothing new is being alleged, and what follows separates what I verified from what remains unruled.

What I verified at this head. The table-imposed mandatory-thinking coercion R5-1 was anchored on is still present and unchanged in shape: getModelConfiguration returns { ...configured, canDisable: false } when the GPT table says thinkingMandatory and the caller supplied a declared capability (model-configuration.ts:272-277), alongside the table-only branch that adds canDisable: false when there is no declared capability (:278-287). The fix commit states that table-imposed mandatory thinking no longer deletes a saved off preference over declared capabilities, while an explicit canDisable: false and an incompatible configured max keep their stricter reconciliation — so the change must live in the downstream reconciliation that decides whether a persisted model.reasoningEffort is deleted, not at this coercion site. I did not reach that code within budget, so I record R5-1 as unconfirmed rather than fixed or still standing: the mechanism the finding named is still here, and the part that would answer it is somewhere I did not read. Relatedly, the pipeline's mandatory strip is still gated on thinkingMandatory, now derived from both the generator's own flag and the GPT table (pipeline.ts:987-989) and consulted before the flat reasoning_effort: 'none' rewrites (:1010-1020, :1051-1055), which is consistent with the fix report but does not by itself settle whether a user's raw none survives.

What remains unruled. Round 6 (04:45Z, at the previous head) filed four Criticals: R5-1 on both duplicate threads (a persisted global model.reasoningEffort: 'none' becoming unsupported for a table-mandatory GPT model and being deleted from every writable scope — the data-loss-shaped one, and the reason I spent my budget there), R6-1 (the Welcome model-switch carry-over gating on reasoningPreviewSupports, which never reads the new canEnable capability, so an explicit tier intent migrates onto a target that cannot apply it), R6-2 (on OpenRouter a sampling-layer flat reasoning_effort is authoritative enough that the pipeline drops the configured nested tier, while getGptReasoningOverrideState did not report that shape), and R6-3 (base gpt-5, gpt-5-mini and gpt-5-nano newly classified thinkingMandatory: true, so the pre-existing mandatory strip deletes a user's raw reasoning_effort: 'none'). The fix commit reports the first three closed and adjudicates R6-3 a false positive on vendor-documentation grounds — that the GPT-5 family guide groups base/mini/nano under minimal/low/medium/high and none arrives only with 5.1, with the sources now recorded in the design doc. That adjudication is a vendor-contract judgment I cannot verify from this repository, and it is precisely the kind of claim that needs an independent ruling rather than a reviewer's deference, because if it is wrong the strip is deleting a configuration users are entitled to set.

One deferred item is itself labelled Critical. The convergence-posture inventory retained for follow-up includes packages/web-shell/client/components/ChatEditor.tsx:1133 — [probe] Critical [fails-closed] [new-surface] Welcome/toggle enable-value path: previews never advertise …, and the fix report is explicit that no deferred item is being silently treated as fixed and that the Welcome toggle preview limitation fails closed. Retaining a Critical as follow-up past five rounds is a legitimate posture, but it is a maintainer's risk acceptance to make, not something this pass can clear.

The scan gap. I read the two sites above and no more of a diff that adds 3,034 lines across 32 files, with roughly 520 lines of production code spanning packages/core/src/core/** (openaiContentGenerator/pipeline.ts, reasoning-effort.ts, provider/default.ts, provider/dashscope.ts), packages/cli/src/acp-integration/** (acpAgent.ts, model-configuration.ts, session/Session.ts) and packages/web-shell/client/** (App.tsx, ChatEditor.tsx, daemon/session/mappers.ts), plus ~2,300 lines of new tests and five design/user docs. Under a Critical-only remit an unscanned surface is not a clean surface, and this one carries a preference-deletion path, a wire-shape mapping across three provider protocols, and two UI controls that can silently no-op — the three places this PR's own Critical history keeps producing findings.

One thing in this PR's favour that is worth stating. It is maintainer-authored, so AGENTS.md's external-PR core tier — the one that would otherwise require escalation before approving a change to packages/core/src/core/** — does not apply, and the verification behind this head is unusually strong: 2,937 focused unit tests, 27 built-CLI ACP scenarios with 200 assertions covering all twelve mandatory ids plus tiered, toggle-only, switch/reload and strict-declaration counterexamples, built WebShell effective-tier scenarios, four Welcome browser cases, a complete Chromium smoke at 58/58 with one worker and no retries, full build, bundle, workspace and integration typecheck, repository lint and formatting, two consecutive clean reverse self-audit passes, and a recorded SHA-256 for the final eight-file diff. Remote CI on this exact head passed with nothing failing.

CI at this head. 24 checks pass and 98 are skipped, four route dispatches are cancelled from superseded runs, and one lane — the automatic review — is still in flight. Nothing fails, and nothing among the completed legs is attributable to a defect introduced by this PR.

Next step: the in-flight review round is the cheapest path to a ruling on R5-1, R6-1, R6-2 and R6-3 at this head, and R6-3 in particular needs someone to check the vendor tier tables rather than accept the rebuttal. If that round times out again, the alternative is an explicit maintainer risk acceptance naming those four, the deferred ChatEditor.tsx:1133 Critical, and the unscanned surface above.


中文说明:本次在 head 9c48225e 上评审,结论为 COMMENT。最新提交回应了第 6 轮提出的四项 Critical,但本 head 上没有任何评审轮次作出裁决——本次复核运行时自动评审仍在进行——而在一份新增 3034 行的 diff 上,我无法在预算内把这四项追踪到闭合。因此这是一次 COMMENT:不提出任何新主张,以下把"我已核实的"与"仍未裁决的"分开陈述。我在本 head 上核实到的部分。 R5-1 所锚定的那处"由表强制的思考不可关闭"仍然原样存在:当 GPT 表声明 thinkingMandatory 且调用方提供了已声明的能力时,getModelConfiguration 返回 { ...configured, canDisable: false }(model-configuration.ts:272-277),旁边是没有已声明能力时补上 canDisable: false 的纯表分支(:278-287)。修复提交称"表强制的思考不再越过已声明能力删除已保存的关闭偏好",而显式的 canDisable: false 与不兼容的配置 max 保留其更严格的调和——因此该改动必然位于决定"是否删除已持久化 model.reasoningEffort"的下游调和逻辑中,而不在这一处强制点。我在预算内没有读到那段代码,所以把 R5-1 记为无法确认,而不是已修复或仍存在:该发现点名的机制仍在这里,而能回应它的部分位于我未读之处。与此相关,pipeline 的强制剥离仍以 thinkingMandatory 为门,该值现在同时来自生成器自身的标志与 GPT 表(pipeline.ts:987-989),并在扁平 reasoning_effort: 'none' 改写之前被查询(:1010-1020、:1051-1055);这与修复报告一致,但本身并不足以判定用户原始的 none 是否得以保留。仍未裁决的部分。 第 6 轮(04:45,针对上一个 head)提出四项 Critical:R5-1(两个重复线程——已持久化的全局 model.reasoningEffort: 'none' 对表内强制思考的 GPT 模型变为不支持,并从每个可写作用域中被删除;这是带数据丢失形态的一项,也是我把预算花在那里的原因)、R6-1(Welcome 的模型切换继承以 reasoningPreviewSupports 为门,而它从不读取本 PR 新增的 canEnable 能力,因此一个显式档位意图会被迁移到无法应用它的目标上)、R6-2(在 OpenRouter 上,采样层的扁平 reasoning_effort 权威到足以让 pipeline 丢弃已配置的嵌套档位,而 getGptReasoningOverrideState 未报告该形态)、R6-3(base gpt-5、gpt-5-mini、gpt-5-nano 被新分类为 thinkingMandatory: true,于是既有的强制剥离会删除用户原始的 reasoning_effort: 'none')。修复提交报告前三项已闭合,并把 R6-3 裁定为误报,理由是厂商文档——GPT-5 家族指南把 base/mini/nano 归在 minimal/low/medium/high 之下,而 none 自 5.1 才引入,来源已记录进设计文档。该裁定是一个我无法从本仓库核实的厂商契约判断,而它恰恰是需要独立裁决、而非评审者予以尊重的那类主张:如果它是错的,那么被删除的正是用户有权设置的配置。有一项被延后的条目本身即标注为 Critical。 收敛姿态下保留为后续项的清单中包含 packages/web-shell/client/components/ChatEditor.tsx:1133 — [probe] Critical [fails-closed] [new-surface] Welcome/toggle enable-value path: previews never advertise …,且修复报告明确说明没有任何延后项被静默当作已修复、Welcome 开关预览的局限是 fail-closed 的。超过五轮后把一项 Critical 留作后续是合理的姿态,但这属于维护者的风险接受,不是本次复核能够清除的。扫描缺口。 除上述两处外,我没有再读这份新增 3034 行、涉及 32 个文件的 diff 的任何部分;其中约 520 行生产代码横跨 packages/core/src/core/**(openaiContentGenerator/pipeline.ts、reasoning-effort.ts、provider/default.ts、provider/dashscope.ts)、packages/cli/src/acp-integration/**(acpAgent.ts、model-configuration.ts、session/Session.ts)与 packages/web-shell/client/**(App.tsx、ChatEditor.tsx、daemon/session/mappers.ts),另有约 2300 行新测试与五份设计/用户文档。在 Critical-only 口径下,未扫描的面不等于干净的面,而这一面恰好包含一条偏好删除路径、跨三种 provider 协议的线格式映射,以及两个可能静默无操作的 UI 控件——正是本 PR 自己的 Critical 历史反复产生发现的那三处。有一点对本 PR 有利,值得写明。 它由维护者本人提交,因此 AGENTS.md 的外部 PR core 档位(否则会在批准一个改动 packages/core/src/core/** 的 PR 前要求上报)并不适用;且本 head 背后的验证异常充分:2937 个聚焦单元测试、27 个基于已构建 CLI 的 ACP 场景与 200 条断言(覆盖全部 12 个强制 id,以及分档、仅开关、开关/重载与严格声明的反例)、已构建 WebShell 的有效档位场景、4 个 Welcome 浏览器用例、以单 worker 无重试完成的 58/58 Chromium 冒烟、完整构建与打包、workspace 与集成的类型检查、仓库级 lint 与格式化、连续两次干净的反向自审,以及最终八文件 diff 的 SHA-256 记录。针对本 head 的远端 CI 亦通过且无失败。CI:本 head 上 24 项通过、98 项跳过,四次 route 派发因运行被取代而取消,一项——自动评审——仍在进行;无失败,已完成的检查中也没有可归因于本 PR 的缺陷。下一步:正在进行的那一轮评审是对本 head 上 R5-1、R6-1、R6-2、R6-3 作出裁决最省事的路径,其中 R6-3 尤其需要有人去核对厂商的档位表,而不是接受该反驳。若那一轮再次超时,替代方案是由维护者给出明确的风险接受,点名这四项、被延后的 ChatEditor.tsx:1133 Critical,以及上述未扫描面。

doudouOUC
doudouOUC previously approved these changes Sep 9, 2026

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

Independent read-only review at head 9c48225e, including the delta commit over the round-6 anchor 5602d9a9. No blocking issues found; approving.

Delta commit 9c48225e verified against the three findings it claims to close.

  • R5-1 (saved-off preference reconciliation) — Session.ts:10778 now preserves a saved none preference whenever the model is in the GPT capability table, unless the configured capabilities explicitly declare canDisable: false. Verified against the new it.each rows in Session.test.ts: gpt-6-astra with declared capabilities and no explicit canDisable retains reasoningEffort: 'none' in both settings scopes with zero setValue writes; the canDisable: false row keeps the strict clearing (2 writes). The split of gptCapabilities (built-in table hit) from configuredReasoning (operator declaration) is the right predicate boundary.
  • R6-2 (OpenRouter flat-override reporting) — model-configuration.ts:getGptReasoningOverrideState now extracts the effective tier from the merged flat value (efforts.find(tier => tier === flat)), reports enabled from the flat value instead of defaultEnabled when it isn't the removed-placeholder case, and only sets useDefaultEffort when no concrete tier was recovered. The new test rows pin the merged-precedence case (samplingParams high + extra_body low → reports low), the flat-none case (enabled: false, no tier), and the mandatory-model flat-none removal case (Astra → enabled: true, default tier).
  • R6-1 (Welcome pending-tier rejection) — App.tsx:reasoningPreviewSupports now rejects any pending enabling intent when canEnable === false && !enabled, and rejects concrete tiers when canEnable === false or enableValue === 'default' (a raw override owns the tier). The expanded it.each matrix covers the toggle source, canEnable: false, and enableValue: 'default' rows both directions, including the no-config-request assertion for rejected carries.
  • R6-3 — the false-positive disposition is correctly grounded: the GPT-5 family guide lists minimal/low/medium/high for base/mini/nano with none introduced in GPT-5.1, the sources are now recorded in the design doc, and the table entry (efforts: ['low','medium','high'], thinkingMandatory: true) is exactly the mappable subset of the shared CLI ladder (which has no minimal tier).

The round-6 deferred Critical is closed by this head. The bot's only Critical-axis deferral (Welcome/toggle enable-value path, fails-closed/new-surface) is the reasoningPreviewSupports fix above — verified in code and tests, not just claimed.

Core surfaces re-verified at this head, not just the delta. The normalization in getGptReasoningCapabilities (batch-tag strip before normalize(), dated-snapshot and patch-version collapse after) correctly leaves unknown minor versions and non-GPT models at generic behavior. flattenGptReasoningEffort runs after the extra_body merge so raw nested reasoning (including null) retains whole-object priority, raw flat values beat configured effort, and only placeholder (nullish/empty) flat slots accept the configured tier; OpenRouter and raw-nested-bearing configs skip flattening entirely, and DashScope gets the same flattening for GPT models it serves. The mandatory-none cleanup emits flat none only for non-mandatory GPT models without configured capabilities and off OpenRouter — forced-tool constraints are not dropped. supportedReasoningEffortsFor prefers declared capabilities over the GPT table, so explicit operator configuration keeps its tier restrictions.

CI and threads at this head. 23 checks SUCCESS, 26 SKIPPED, one bot review lane in flight (not a merge gate). 39/39 review threads resolved. reviewDecision still shows CHANGES_REQUESTED from the bot's round-6 review at the previous head; the bot's re-review of this head is in progress. Remaining deferred items from the bot are Suggestion-level follow-ups explicitly recorded as non-blocking under the convergence posture.

Not re-verified locally: the full unit/E2E matrices (CI ran them green at this exact head, and the author's R6 report covers the built-bundle ACP/browser scenarios).


中文说明:本次在 head 9c48225e 上独立只读审查(含相对 round-6 锚点 5602d9a9 的 delta 提交),结论为 APPROVE,无阻塞问题。delta 提交声称关闭的三项发现均对照代码与新增测试核实:R5-1 保存的 off 偏好在 GPT 表强制思考但配置未显式 canDisable: false 时保留(两个 settings 域零写入),显式 canDisable: false 仍走严格清除;R6-2 OpenRouter 扁平覆盖现在上报合并后的实际档位(extra_body 优先于 samplingParams),扁平 none 上报 enabled: false,强制思考模型的占位 none 移除路径不变;R6-1 Welcome 挂起档位在 canEnable === false 或 enableValue === 'default' 时被拒绝且不发送配置请求。R6-3 的误报判定有 OpenAI 官方文档依据且已记入设计文档(GPT-5 基础家族为 minimal/low/medium/high,none 自 GPT-5.1 引入;CLI 阶梯无 minimal 档,表中 low/medium/high 是可映射子集)。bot 第 6 轮唯一 deferred 的 Critical(Welcome/toggle enable-value 路径)正是本次 reasoningPreviewSupports 修复所关闭的。核心面(normalize 顺序、flatten 在 extra_body 合并之后、OpenRouter/raw nested 跳过、DashScope 同步扁平化、mandatory-none 清理不丢 forced-tool 约束、声明能力优先于 GPT 表)均在本 head 重新核实。CI 23 项通过、其余跳过、1 项 bot 评审进行中(非门禁);39 条 threads 全部 resolved;reviewDecision 的 CHANGES_REQUESTED 来自 bot 对旧 head 的第 6 轮评审,其对新 head 的重审正在进行。其余 deferred 项均为 Suggestion 级跟进,非阻塞。

@wenshao

wenshao commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator Author

Independent local verification (Linux) — 9c48225e64

Built both arms from source and ran an independent rig against them: merge-base 1f890086f1 vs PR head 9c48225e64. Prior rounds on this PR were all reported on macOS and the PR body's Tested on table still lists Linux as untested, so this round is deliberately a Linux pass on the current head, plus wire-level and ACP-level A/B against the merge base and a mutation-based check that the fix is load-bearing.

Verdict: no blocking issue found. Every behaviour the PR body and docs/users/configuration/model-providers.md claim was reproduced against a real HTTP gateway and a real ACP session. Three non-blocking observations are at the end.

Environment

Linux 6.12 / Node 22.22.2. Two full worktrees built through core → acp-bridge → channel-base → sdk → web-shell (3 vite builds) → web-templates → channels → esbuild, producing a real dist/cli.js per arm. Every run below uses the bundled CLI, isolated QWEN_HOME/QWEN_RUNTIME_DIR, and mock credentials. openrouter.ai and dashscope.aliyuncs.com are resolved to loopback inside a private mount namespace (unshare -m + a bind-mounted /etc/hosts), so the hostname-gated provider branches are exercised for real without touching the host's resolver.

1. Outgoing request body — 24 scenarios, both arms

The bundled CLI is run headless (-p) against a local recording HTTP server that speaks Chat Completions; the body compared is the streaming turn. All 24 scenarios completed the turn on both arms (the model reply 42 came back), so every shape below was actually accepted end to end.

Outgoing Chat Completions body: merge-base vs PR head, 24 scenarios

Everything the description claims reproduces, and the merge base reproduces every "before" symptom:

  • Flat reasoning_effort replaces the nested object for known GPT models; max resolves per model (gpt-5.1 → high, gpt-5.4 → xhigh, gpt-5.6-sol / gpt-6-astra → max) where the base clamped all four to nested xhigh; gpt-5-pro raises low → high.
  • A sampling budget or an unrelated sampling key no longer swallows the tier — the base dropped the effort entirely in both cases.
  • Disable sends reasoning_effort: 'none' where allowed and nothing on mandatory-thinking models; OpenRouter keeps its nested reasoning shape for both effort and disable.
  • Two real base-arm defects are visible in the placeholder rows: the merge base put literal reasoning_effort: null and reasoning_effort: "" on the wire. The head substitutes the configured tier.
  • Identifier normalisation (openai/… prefix, dated snapshot, :batch, numeric patch) all resolve to the model's capabilities, while gpt-5.9 and gpt-5.4-turbo stay on the generic nested path — byte-identical to the base.
  • A DashScope-compatible gateway serving GPT flattens too.

Ten further scenarios were run on the head only, all matching the documented precedence: a sibling budget_tokens survives beside the flat field (reasoning_effort: "max" + reasoning: {"budget_tokens":50000}); extra_body flat beats samplingParams flat; raw nested (including null) stays a whole-object override; a mandatory model gets no disable value; on OpenRouter a sampling flat override suppresses the configured nested effort while an extra-body-only flat override does not.

2. ACP controls — 10 models, both arms

Read from session/new on the bundled CLI in --experimental-acp mode, one isolated process per model.

ACP reasoning_effort control: merge-base vs PR head

The last row is the control: an unrelated Qwen model is identical on both arms, so the change is scoped to the GPT table. A 15-step interaction matrix in one live ACP session also passed:

Step Result
gpt-5.4 ← max rejected — Unknown reasoning effort: max. Choose one of: none, low, medium, high, xhigh
gpt-6-astra ← none rejected — Choose one of: low, medium, high, xhigh, max
gpt-5-pro ← low rejected — Choose one of: high
astra max → switch to gpt-5.4 active tier clamps to xhigh, saved preference kept
switch back to astra max restored
gpt-5.4 ← none, detour through astra, back none still selected
persistence written as model.reasoningEffort in user settings, qwenCode/reasoningSelectionPersisted acknowledged

I also enumerated the capability table straight out of the built core: the 12 mandatory-thinking ids documented in model-providers.md match the code exactly, and GPT-5.4, whitespace, azure/openai/…, gpt-5.4.2.3, gpt-5.6-sol-2026-03-01 and openai/gpt-6-astra:batch all normalise correctly while gpt-6, gpt-6-astra-mini, gpt-5.7 and gpt5.4 correctly stay generic.

3. Web Shell controls — Chromium on Linux

The repo's mock daemon was fed configOptions captured verbatim from a real ACP session of the built PR CLI (no hand-written fixtures), then driven with Playwright.

Web Shell reasoning controls for gpt-5.4, gpt-5.6-sol and gpt-6-astra

gpt-5.4 opens with thinking off and the tiers disabled; gpt-5.6-sol offers the full ladder with a switchable toggle; gpt-6-astra offers the full ladder with the toggle on and disabled and no "Thinking off" entry. Selecting Max emits exactly one {configId:'reasoning_effort', value:'max', persist:true} write on both models. The repository's own web-shell.smoke.spec.ts also passed 34/34 here with workers=1 retries=0.

4. Negative controls

Each mutation reverts one production hunk, rebuilds core and the bundle, and re-runs the affected scenario — so the check discriminates the fix rather than confirming green:

Mutation Scenario Unmutated head Mutated head
drop flattenGptReasoningEffort(result) in default.ts gpt-5.4 high reasoning_effort: "high" back to nested reasoning
drop flattenGptReasoningEffort(merged) in dashscope.ts gpt-5.4 high @ DashScope reasoning_effort: "high" back to nested reasoning
revert the samplingParams re-injection in pipeline.ts high + 1024-token budget reasoning_effort: "high" effort gone
drop the GPT reasoning_effort = 'none' branch in pipeline.ts gpt-5.4 off reasoning_effort: "none" no field at all

5. Tests and static gates on Linux (head)

Gate Result
Changed-file unit tests 3,437 passed — core 675 (6 files), CLI 1,765 (5 files), Web Shell 997 (3 files)
Full packages/core suite 24,043 tests, 3 failed — the same 3 fail on the merge base (see below)
Web Shell Chromium smoke 34/34, first attempt, workers=1 retries=0
eslint --max-warnings 0 on all 27 changed TS/TSX files pass
prettier --check on all 32 changed files pass
tsc --noEmit for packages/core and packages/cli pass

The three full-suite failures are skill-curator > reports skippedErrors when rename fails transiently, session-writer-lease > classifies an unreadable owned lock as unavailable and git-branches > types the refusal with a lock hint when the index is wedged. All three simulate a permission failure, and the rig runs as root, so the chmod never bites. The identical set fails on the merge base — environmental, not caused by this PR.

Non-blocking observations

N1 — the new declared-capabilities narrowing branch has no observable effect. With capabilities.reasoning = {efforts:['low','medium','high']} declared on gpt-6-astra and a configured max, the request carries no reasoning field at all — neither the clamped high nor the raw max. The reason is ordering: applyConfiguredReasoningEffort in pipeline.ts runs before the provider, and it drops an effort that is not in the declared list rather than clamping it, so the new configured && !configured.toggleOnly ? configured.efforts : gpt.efforts branch in default.ts:151 never sees an out-of-range tier. Evidence that this is pre-existing rather than a regression: the merge base produces the identical body, and so does a non-GPT model with the same declaration. The widening direction (declaring max on gpt-5.4) works and is also identical on both arms. This turns the deferred note "The new declared-capabilities clamp branch is untested" into "it is also unobservable end to end" — worth either a test that pins the intended narrowing behaviour or a note that the pipeline owns it.

N2 — a batch tag followed by another tag falls back to generic. gpt-5.4:batch resolves to the GPT-5.4 capabilities, but gpt-5.4:batch:foo does not (:batch(?=:|$) strips it, leaving gpt-5.4:foo, which no longer normalises). Harmless if only the trailing form occurs in practice; worth a line in the design doc if not.

N3 — the only merge blocker is a stale bot review. All 39 review threads are resolved, no check is failing at 9c48225, and an approving human review is on record; reviewDecision is still CHANGES_REQUESTED because of qwen-code-ci-bot's review left at 5602d9a9, two heads ago. Also, since this round covers Linux, the Tested on table in the description can be updated.

中文说明

独立本地验证(Linux)—— 9c48225e64

在本地从源码构建了两条臂:merge-base 1f890086f1 与 PR head 9c48225e64,并用独立搭建的验证环境进行对比。本 PR 之前的各轮验证都在 macOS 上完成,PR 描述里的 Tested on 表格至今仍标注 Linux 未测试,因此本轮刻意做成当前 head 上的 Linux 验证,同时补充与 merge base 的线级、ACP 级 A/B,以及通过变异确认修复确实承载行为。

结论:未发现阻塞问题。 PR 描述和 docs/users/configuration/model-providers.md 中声明的行为,全部在真实 HTTP 网关和真实 ACP 会话上复现成立。末尾有三条非阻塞观察。

环境

Linux 6.12 / Node 22.22.2。两个 worktree 均按 core → acp-bridge → channel-base → sdk → web-shell(3 次 vite)→ web-templates → channels → esbuild 完整构建,各自产出真实的 dist/cli.js。下面所有运行都使用构建后的 bundle CLI、隔离的 QWEN_HOME/QWEN_RUNTIME_DIR 和假凭据。openrouter.ai 与 dashscope.aliyuncs.com 在私有 mount namespace 内(unshare -m + bind-mount /etc/hosts)解析到回环地址,从而真实走到按主机名分支的 provider 逻辑,且不影响宿主机的解析。

1. 出站请求体 —— 24 个场景,双臂对比

以 headless(-p)方式运行 bundle CLI,打到一个本地录制型 HTTP 服务(实现 Chat Completions),对比的是流式那一轮的请求体。24 个场景在两条臂上都完成了整轮对话(模型返回 42),所以下面每一种请求形态都确实被端到端接受了。

图见上方 fig2。描述中的每一项都复现成立,merge base 也复现了全部「修复前」症状:

  • 已知 GPT 模型由嵌套对象改为平铺 reasoning_effort;max 按模型解析(gpt-5.1 → high、gpt-5.4 → xhigh、gpt-5.6-sol / gpt-6-astra → max),而 base 把四者都压成嵌套 xhigh;gpt-5-pro 把 low 抬到 high。
  • 采样预算或无关采样参数不再吞掉档位 —— base 在这两种情况下都完全丢失了 effort。
  • 允许关闭的模型发送 reasoning_effort: 'none',强制思考的模型什么都不发;OpenRouter 的 effort 与关闭都保留嵌套 reasoning 形态。
  • 占位符两行暴露了 base 上两个真实缺陷:merge base 会把字面量 reasoning_effort: null 和 reasoning_effort: "" 发到线上,head 改为使用配置档位。
  • 标识符归一化(openai/… 前缀、日期快照、:batch、数字补丁号)都能命中模型能力;而 gpt-5.9、gpt-5.4-turbo 保持通用嵌套路径,与 base 逐字节一致。
  • DashScope 兼容网关承载 GPT 时同样平铺。

另有 10 个场景仅在 head 上运行,全部符合文档中的优先级:兄弟 budget_tokens 与平铺字段共存(reasoning_effort: "max" + reasoning: {"budget_tokens":50000});extra_body 平铺覆盖优先于 samplingParams 平铺;原始嵌套(含 null)保持整对象覆盖;强制思考模型不下发任何关闭值;在 OpenRouter 上采样层平铺覆盖会抑制配置的嵌套 effort,而仅 extra-body 的平铺覆盖不会。

2. ACP 控件 —— 10 个模型,双臂对比

在 --experimental-acp 模式下从 session/new 读取,每个模型一个独立进程。图见上方 fig3。

最后一行是对照组:一个无关的 Qwen 模型在两臂上完全一致,说明改动限定在 GPT 表内。同一个真实 ACP 会话里的 15 步交互矩阵也全部通过:

步骤 结果
gpt-5.4 ← max 拒绝 —— Unknown reasoning effort: max. Choose one of: none, low, medium, high, xhigh
gpt-6-astra ← none 拒绝 —— Choose one of: low, medium, high, xhigh, max
gpt-5-pro ← low 拒绝 —— Choose one of: high
astra 存 max → 切到 gpt-5.4 生效档位收敛到 xhigh,已保存偏好保留
切回 astra max 恢复
gpt-5.4 ← none,绕道 astra 再切回 仍为 none
持久化 写入用户设置的 model.reasoningEffort,并回执 qwenCode/reasoningSelectionPersisted

我还直接从构建后的 core 枚举了能力表:model-providers.md 中记录的 12 个强制思考模型 id 与代码完全一致;GPT-5.4、前后空格、azure/openai/…、gpt-5.4.2.3、gpt-5.6-sol-2026-03-01、openai/gpt-6-astra:batch 都能正确归一化,而 gpt-6、gpt-6-astra-mini、gpt-5.7、gpt5.4 正确地保持通用行为。

3. Web Shell 控件 —— Linux 上的 Chromium

用仓库自带的 mock daemon,喂入从构建后 PR CLI 的真实 ACP 会话中逐字捕获的 configOptions(没有手写夹具),再用 Playwright 驱动。图见上方 fig1。

gpt-5.4 打开时思考关闭、档位置灰;gpt-5.6-sol 提供完整档位且开关可切换;gpt-6-astra 提供完整档位,开关处于开启且被禁用状态,并且没有「Thinking off」项。在这两个模型上选择 Max 都只发出一次 {configId:'reasoning_effort', value:'max', persist:true} 写入。仓库自带的 web-shell.smoke.spec.ts 在此环境下也 34/34 通过(workers=1 retries=0)。

4. 反向对照(变异)

每个变异回退一处生产代码,重新构建 core 和 bundle,再重跑受影响场景 —— 以此证明检查能区分修复本身,而不只是「绿了」:

变异 场景 未变异 head 变异后 head
删除 default.ts 中 flattenGptReasoningEffort(result) gpt-5.4 high reasoning_effort: "high" 退回嵌套 reasoning
删除 dashscope.ts 中 flattenGptReasoningEffort(merged) gpt-5.4 high @ DashScope reasoning_effort: "high" 退回嵌套 reasoning
回退 pipeline.ts 中 samplingParams 重新注入 high + 1024 token 预算 reasoning_effort: "high" effort 丢失
删除 pipeline.ts 中 GPT reasoning_effort = 'none' 分支 gpt-5.4 关闭思考 reasoning_effort: "none" 无该字段

5. Linux 上的测试与静态门(head)

门 结果
改动文件单测 3,437 通过 —— core 675(6 文件)、CLI 1,765(5 文件)、Web Shell 997(3 文件)
packages/core 全量 24,043 项,3 项失败 —— merge base 上同样这 3 项失败(见下)
Web Shell Chromium smoke 34/34,首次通过,workers=1 retries=0
27 个改动 TS/TSX 文件 eslint --max-warnings 0 通过
32 个改动文件 prettier --check 通过
packages/core 与 packages/cli 的 tsc --noEmit 通过

那 3 项全量失败分别是 skill-curator > reports skippedErrors when rename fails transiently、session-writer-lease > classifies an unreadable owned lock as unavailable 和 git-branches > types the refusal with a lock hint when the index is wedged。三者都在模拟权限失败,而验证环境以 root 运行,chmod 对 root 无效。merge base 上失败集合完全相同 —— 属于环境因素,与本 PR 无关。

非阻塞观察

N1 —— 新增的「已声明能力收窄」分支没有可观察效果。 在 gpt-6-astra 上声明 capabilities.reasoning = {efforts:['low','medium','high']} 并配置 max 时,请求里完全没有 reasoning 相关字段 —— 既不是收窄后的 high,也不是原始的 max。原因是顺序:pipeline.ts 的 applyConfiguredReasoningEffort 先于 provider 执行,对不在声明列表中的档位是丢弃而非收窄,因此 default.ts:151 新增的 configured && !configured.toggleOnly ? configured.efforts : gpt.efforts 分支永远看不到越界档位。这不是回归:merge base 产生完全相同的请求体,一个非 GPT 模型配相同声明也是如此。放宽方向(在 gpt-5.4 上声明 max)可用,且两臂一致。这把延期项中的「新增的已声明能力收窄分支未被测试」补充为「端到端也观察不到效果」—— 建议要么补一条固定预期收窄行为的测试,要么在文档中说明该行为归 pipeline 所有。

N2 —— batch 标签后再跟标签会退回通用行为。 gpt-5.4:batch 能命中 GPT-5.4 能力,但 gpt-5.4:batch:foo 不能(:batch(?=:|$) 剥离后剩下 gpt-5.4:foo,不再归一化)。如果实践中只出现结尾形态则无害,否则建议在设计文档里补一句。

N3 —— 目前唯一的合并阻塞是一条过期的 bot review。 39 条 review thread 全部已解决,9c48225 上没有失败的检查,并且已有一条人工 approve 记录;reviewDecision 仍是 CHANGES_REQUESTED,来源是 qwen-code-ci-bot 留在两个 head 之前的 5602d9a9 上的评审。另外,既然本轮覆盖了 Linux,描述里的 Tested on 表格可以更新。


🤖 Generated with Claude Code — Claude Opus 5 (1M context)

@wenshao

wenshao commented Sep 9, 2026 •

Copy link
Copy Markdown
Collaborator Author

Cold Welcome reasoning follow-up

Fixed in 9355b21d5f60159b3d270ab109350d4a25731b99 after two consecutive clean reverse self-audit passes and two independent clean passes on the final incremental change.

This closes the deferred cold Welcome toggle issue discussed in the read-only review. It was distinct from the model-switch carry-over fix: the later approval incorrectly treated the cold-preview issue as already closed at 9c48225e. The new reproduction used the real daemon and Chromium and confirmed the missing information before making this fix.

Before this change, a saved off preference plus a raw reasoning override made cold Welcome select medium when turning thinking on; the actual session rejected that selection and released the newly allocated session before sending the first prompt. Both cold provider-preview producers now project the target provider's raw state and enable constraints. An allowed reset selects default; a raw configuration that prevents enabling disables ON before session creation. Resolved provider defaults take precedence over ignored top-level generation settings, and ACP reads the preference for its own workspace.

Verification Result
Related unit tests 806 passed across ACP, model configuration and workspace provider status; 9 new producer regressions included
Final real daemon + Chromium 4/4 workflows returned the first reply; each had one prompt, no session release and no page error
Independent direct ACP 2/2 raw-on/raw-off workflows passed cold-preview/session metadata and first-reply checks
Build and static checks Full build, bundle, workspace/integration typecheck, changed-file ESLint and Prettier passed
Reverse audits Two consecutive clean self-audit passes and two independent clean passes before commit

The browser workflows cover raw nested high with saved off, raw flat none, ordinary settings and a provider with empty generation settings overriding a top-level raw disable. The raw-off scenario leaves the switch disabled and still sends the first prompt. The other three apply the accepted enable selection and receive the first reply. Before the fix, the two raw scenarios failed and both ordinary/precedence controls passed.

All six final runtime workflows used the real bundled CLI; browser workflows used the real daemon, built UI and Chromium. Only inference was mocked on loopback: six local inference requests, zero external provider calls. The production sources and all 1,044 dist files stayed unchanged during verification. Documentation wording and a test assertion/format changed during the run, so the blanket all-tracked-files hash check initially reported a difference; this was checked against the manifest and is not claimed as an unchanged whole checkout. Final bundle SHA-256: b8dc47ed07cdbb5ec38e6245600009003836657192de2cf09a881159fa322d41.

Remote verification on this exact head: Qwen Code CI completed successfully, including Linux unit tests, Lint & Static, no-AK integration and Web Shell E2E smoke. The smoke log reports 58/58 passed with two workers in 4.2 minutes; the preceding transcript document browser gate passed all 5 tests. Serve A/B, Web-shell Visuals, TUI parity/no-flicker and SDK Java also passed. At this update, PR checks show 22 passed, zero failed and 9 conditional skips; automatic PR review is still in progress. Earlier CI results remain evidence for their own preceding commits.

中文:本次修复的是此前延期的冷启动 Welcome 预览缺口,与已修复的模型切换继承问题不同。此前 APPROVE 将两者合并认定为已修复,范围过宽;这次补齐两处预览生成路径,并通过真实 daemon、最终构建 UI 和 Chromium 验证首条消息。806 项相关单测、4 个浏览器流程及 2 个直接 ACP 流程通过。提交前主审计和独立审计各连续两轮无新问题。所有推理请求均为本机 mock,没有新的真实模型调用;新提交的远程主 CI 已全部通过:Linux 单测、静态检查、无 API Key 集成、5 项文档浏览器检查和 58/58 项 Web Shell 冒烟测试(两个 worker,4.2 分钟)。Serve A/B、可视化、TUI 和 Java SDK 流程也已通过。当前 22 项检查通过、无失败、9 项按条件跳过;自动评审仍在运行。

@wenshao
wenshao enabled auto-merge September 9, 2026 08:54
@wenshao

wenshao commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qqqys qqqys 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-only review at head 9355b21d. Verdict: COMMENT — not an approval. One previously reported blocking item is still present in the code at this head as an unresolved factual dispute, and the review budget ran out before the rest could be confirmed.

Confirmed against the code at this head

Still blocking — the gpt-5 / gpt-5-mini / gpt-5-nano mandatory-thinking strip.
packages/core/src/core/reasoning-effort.ts:59-67 classifies all three ids as thinkingMandatory: true, and packages/core/src/core/openaiContentGenerator/pipeline.ts:1120-1129 then deletes a flat reasoning_effort of none whenever thinkingMandatory holds. So a user's explicit raw flat none for those three ids is removed from the wire with nothing replacing it, and this diff also removes the test that used to pin the preserve behaviour (should preserve reasoning_effort none when thinking is disabled). The author declined the change and cited vendor model pages listing minimal/low/medium/high for the GPT-5 family; the reporter cited the generic SDK union. Which value those three ids actually accept is an external fact this review could not settle inside its budget, and it decides whether this path prevents an API rejection or silently discards a user setting. It needs a maintainer decision, and whichever way it goes, a test that pins what reaches the wire for exactly those three ids.

No longer blocking — the Welcome carry-over. packages/web-shell/client/App.tsx:1368-1377 now returns false from reasoningPreviewSupports when the preview reports canEnable: false and is not already enabled, and that gate is what the carry-over paths consume (:8945, :9179, :9781). The reported "renders thinking ON on a target that cannot be enabled" path is closed at this head.

Partially confirmed — persisted none surviving a model switch or reload. packages/cli/src/acp-integration/session/Session.ts:10752-10753 derives configuredReasoning from the declared capability and treats a model as table-driven only when no capability was declared, and the clear guard at :10781 keys on the declared canDisable; getModelConfiguration (packages/cli/src/acp-integration/model-configuration.ts:270-289) forces canDisable: false only onto the returned merged object, not onto the declared one. That is consistent with the claimed fix, but the full reconcile path across both writable settings scopes was not traced end to end, so this is recorded as not fully confirmed rather than as fixed.

Not verified at this head: the OpenRouter sampling-layer flat reasoning_effort reporting path (getGptReasoningOverrideState in model-configuration.ts versus the flat-over-nested precedence in pipeline.ts).

Gates not completed in this run

The independent Critical-only scan of this head was not performed. The head moved after the previously reviewed commit and grew: packages/cli/src/serve/workspace-providers-status.ts (+15/-5) and its new workspace-providers-status.test.ts (+115) are new and were not read at all, and acpAgent.ts (+90/-22) and model-configuration.ts (+215/-9) both grew. No new Critical is claimed in either direction for that unreviewed surface.

CI

Test, lint, integration, serve A/B and the TUI/web-shell visual gates pass at this head; web-shell E2E Smoke and review-pr are still pending. No failure attributable to this PR was observed, and CI is not the reason for this verdict.

Suggested next step

Settle the gpt-5 family thinkingMandatory question with a maintainer decision plus a wire-level test for those three ids, then the remaining two items (the reconcile scope trace and the OpenRouter override reporting) can be confirmed in one pass at a single head.

@wenshao
wenshao dismissed a stale review September 9, 2026 09:02

fixed

@wenshao

wenshao commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator Author

Follow-up to review 5152051695, against the unchanged head 9355b21d5f60159b3d270ab109350d4a25731b99.

GPT-5 family support. The model-specific official evidence supports retaining the current mandatory-thinking classification. The GPT-5 family guide explicitly names gpt-5, gpt-5-mini, and gpt-5-nano together and lists minimal, low, medium, and high. The GPT-5.1 guide identifies none as newly introduced and distinguishes it from GPT-5's minimal. A shared SDK union includes values across models; it does not establish support for each individual model. Removing an unsupported flat none therefore has a documented compatibility basis. No live API verification of these three base-family models is being claimed.

Exact-model test coverage. The current request-level test matrix already checks that raw reasoning_effort: 'none' is removed for gpt-5 and Astra, while remaining present for GPT-5.4. It inspects the final SDK request using a mock; it does not prove server acceptance. The request matrix does not yet include separate mini/nano rows. Adding those two rows is a reasonable coverage improvement, and those additions are not part of the current head. This coverage gap alone does not demonstrate that the production classification is incorrect.

Remaining review scope. This review confirms the Welcome carry-over fix and explicitly leaves the persistence trace, OpenRouter reporting, and the new cold-preview surface partially or wholly unverified. The R6 report records the persistence/OpenRouter evidence; the cold Welcome follow-up records both preview producers and the real daemon/Chromium and direct ACP verification on the current change. An incomplete review is not approval, but its unverified sections do not establish additional defects either.

CI update. Qwen Code CI on this exact head has now completed successfully, including all 58 Web Shell smoke tests. Serve A/B, Web-shell Visuals, TUI checks and SDK Java also passed. Automatic PR review is still running at the time of this reply.

The proposed disposition is to retain the documented model classification, add the two exact-model request cases, and use the existing evidence for a focused completion of the remaining review. Maintainer confirmation of the compatibility policy is welcome; the current evidence does not substantiate the claim that these three models must accept none.

中文说明

官方 GPT-5 家族指南明确将基础款、mini、nano 列在一起,支持 minimal/low/medium/high;GPT-5.1 才引入 none。通用 SDK 类型不能证明每个型号都支持所有值,因此建议保留当前能力判定。这里没有声称对基础 GPT-5 三个型号做过真实 API 测试。

当前请求层测试已覆盖 GPT-5 移除原始 none,并与 GPT-5.4 保留 none、Astra 移除 none 做对照;mini/nano 的独立请求用例确实尚未补上,属于可补充的覆盖缺口。这两条测试还没有提交,不能视为已完成;缺少它们本身也不能证明生产逻辑有误。

本轮确认了 Welcome carry-over 已修复,其余相关路径明确写的是未核查完成,应结合已有报告定点补完核查。主 CI 已全部通过,包括 58 项 Web Shell 冒烟测试;自动评审仍在运行。建议保留实现、补齐两个型号的请求测试,并由维护者确认兼容策略。

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM!

@wenshao
wenshao added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 6e616a7 Sep 9, 2026
90 of 91 checks passed
@qwen-code-ci-bot qwen-code-ci-bot assigned qqqys and unassigned qqqys Sep 9, 2026

@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-only review at head 9355b21d. Verdict: APPROVE, one non-blocking Suggestion inline.

Delta commit verified. 9355b21d (fix: align cold reasoning previews with session controls) is the only commit on top of the previously reviewed 9c48225e. Both cold preview call sites (serve workspace-providers-status.ts and acpAgent workspaceProviders) now resolve the target provider's generationConfig and pass it into buildModelReasoningConfigPreview; the two getGptReasoningOverrideState calls (with/without the effective reasoning state) correctly derive display state and enableValue/canEnable constraints, and the new it.each matrix plus the acpAgent test pin the claimed behaviors, including the settings-file no-write assertion.

Core surfaces re-verified at this head. Normalize order (:batch strip → shared normalize → dated-snapshot/patch-version collapse) leaves unknown minors and non-GPT models at generic behavior. flattenGptReasoningEffort runs after the extra_body merge, fills only placeholder flat slots, drops just the effort key, and is skipped entirely for OpenRouter and raw-nested-bearing configs; DashScope applies the same flattening for GPT models it serves. The mandatory-none cleanup keeps tool_choice=required handling gated on explicitThinkingMandatory only, so GPT-table mandatory models do not newly trigger the DashScope forced-tool drop. Declared capabilities keep priority over the built-in table in both supportedReasoningEffortsFor and getModelConfiguration.

R6-3 disposition stands. The design doc now records the vendor sources: the GPT-5 family page lists minimal/low/medium/high for gpt-5/gpt-5-mini/gpt-5-nano, and none was introduced with GPT-5.1. Keeping those three mandatory (stripping an unsupported flat none rather than emitting a value the API rejects) is the correct call; qqqys's follow-up approval reached the same conclusion.

CI: all gate checks SUCCESS at this head; review-pr bot lane still in flight (not a merge gate). The outstanding CHANGES_REQUESTED review decision is the stale bot round-6 review at d01fd784, whose findings were closed by 9c48225e + this head.

The inline Suggestion is display-only, self-heals at session creation, and does not block merge.

: {}),
...(enableOverride?.blocksTierChange
? {
...(effectiveReasoning === false ? { enabled: false } : {}),

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.

[Suggestion] cold preview 与 live session 在「provider 默认关闭 thinking」场景下显示不一致。

当 provider 条目仅配置 generationConfig: { reasoning: false }(无 raw override、无已保存的 reasoningEffort 偏好)时:

  • 此处 enabled: false 的修正嵌套在 enableOverride?.blocksTierChange 条件内。该场景下第一次 getGptReasoningOverrideState 调用因 reasoning === false 在函数顶部早退返回 undefined(override 不生效),第二次调用(reasoning: undefined)在没有任何 raw 键时也返回 undefined(enableOverride 不生效)→ 两个 spread 均跳过,buildModelReasoningConfigOption 回退到 reasoning.defaultEnabled !== false(如 gpt-5.5 为 true)→ preview 显示 medium(开)。
  • 而 live session(acpAgent.ts 中 reasoningEnabled = generation.reasoning !== false && ... → false)显示 none(关),pipeline 线上行为也是对该模型发 reasoning_effort: 'none'。

即 cold preview 显示「开」,live 与线上行为是「关」——正是本提交要消除的 cold/live 不对齐场景之一。影响仅限展示层(session 创建后自愈),且需特定配置组合触发,故为 Suggestion,不阻塞合并。

建议:将 effectiveReasoning === false → enabled: false 的投影移出 blocking 条件、放在 override spread 之后即可(effectiveReasoning === false 时 override 必为 undefined,不会与 raw override 的显示态冲突;无 raw override 时不应附加 canEnable,因为 session 内仍可正常开启)。同时建议在 workspace-providers-status.test.ts 的 it.each 矩阵中补一行无 raw override 的 { reasoning: false } 用例固定该行为。

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants