Skip to content

fix(serve): Hot-reload runtime model providers - #10269

Merged
doudouOUC merged 12 commits into
mainfrom
fix/issue-10184-runtime-model-provider-sync
Aug 30, 2026
Merged

fix(serve): Hot-reload runtime model providers#10269
doudouOUC merged 12 commits into
mainfrom
fix/issue-10184-runtime-model-provider-sync

Conversation

@doudouOUC

Copy link
Copy Markdown
Collaborator

What this PR does

This PR adds a dedicated runtime synchronization path for model-provider mutations. After a provider is installed or a model is deleted, the daemon rebuilds the parent environment used by future ACP children, asks the active workspace child to reload persisted settings and environment, refreshes bootstrap, initializing, and live Session model registries, and clears per-model generator caches without switching any Session's current model or disturbing a generator already held by an active turn.

Mutation responses now expose an optional runtimeSync result with applied, deferred, or failed status. A failed runtime refresh does not roll back persisted settings or turn the successful mutation into an HTTP error; the Web Shell instead reports that the change was saved and that running sessions may require a retry or daemon restart. JSON-RPC model-switch failures also use the existing structured error-message extractor so object errors no longer render as [object Object].

The synchronization contract, state ownership, ordering, Session semantics, and failure behavior are documented as part of the change.

Why it's needed

The Web Shell currently persists and immediately lists newly installed models, but a Session created before the mutation keeps a stale in-memory model registry. Selecting the visible route therefore fails until qwen serve is restarted. The same stale-state gap affects deletion and child replacement, and structured JSON-RPC errors make the failure difficult to understand. This change keeps persisted settings, future-child spawn state, the live ACP child, and every Session registry consistent without broadening the work into a general settings watcher or a full workspace reload.

Reviewer Test Plan

How to verify

  1. Start a local OpenAI-compatible stub and qwen serve with a disposable workspace, then create a Session before installing the stub provider.
  2. Install the provider through the workspace provider endpoint and confirm the response reports runtimeSync.status = applied; read the route from workspace provider status and select it in the pre-existing Session without restarting the daemon.
  3. Install another model while a turn is active and confirm that turn finishes with its existing generator, while the new model becomes selectable afterward.
  4. Delete the installed model and confirm it disappears from provider status, the Session is not implicitly switched, and selecting the stale route returns a readable error.
  5. Recreate the ACP channel and confirm the replacement child can use both the new model and the updated API key.
  6. Inject parent-environment and child-refresh failures and confirm persistence still succeeds with HTTP 200 plus runtimeSync.status = failed; confirm the Web Shell warns only for failed, not applied, deferred, or a missing field from an older daemon.

Evidence (Before & After)

Before: a provider installed after Session creation appeared in workspace provider status, but selecting its route returned HTTP 500 (Model ... not found in the registry) and the matching SSE notice displayed [object Object]; restarting the daemon made the route work.

After: the same live Session received runtimeSync.status = applied and selected the new route immediately. An active-turn run retained its original generator until completion, deletion removed future route selection without switching the Session, and a rebuilt ACP child used the updated credential. Parent environment degradation preserved the successful mutation and returned HTTP 200 with runtimeSync.status = failed.

Tested on

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

Environment (optional)

Node.js 22.22.3, npm 10.9.8, macOS, local HTTP qwen serve, disposable QWEN_HOME and workspace, and a local OpenAI-compatible stub. Verified with the affected CLI, ACP bridge, core, SDK, and Web Shell Vitest suites, plus npm run build, npm run typecheck, and npm run lint.

Risk & Scope

  • Main risk or tradeoff: Explicit mutations now coordinate persisted state with multiple runtime copies while workspace generations may be replaced; generation guards, per-Config failure isolation, and a final pre-publication registry refresh keep the operation fail-closed and prevent a partially initialized Session from escaping with stale providers.
  • Not validated / out of scope: Browser-level Web Shell E2E and local Windows/Linux runs were not performed. General settings watching, arbitrary settings hot reload, qualified multi-workspace mutation routes, and automatic migration of a live Session's current model remain out of scope.
  • Breaking changes / migration notes: None. The response schema remains version 1 and runtimeSync is additive and optional, so new SDK clients remain compatible with older daemons.

Linked Issues

Closes #10184

中文说明

本 PR 做了什么

本 PR 为模型 Provider 变更新增专用运行时同步链路。安装 Provider 或删除模型后,daemon 会重新构建供后续 ACP child 使用的父进程环境,通知当前 workspace child 从已持久化 settings 重载配置与环境,刷新 bootstrap、初始化中以及所有 live Session 的模型注册表,并清理 per-model generator cache;整个过程不会切换任何 Session 的当前模型,也不会影响 active turn 已持有的 generator。

变更接口现在返回可选的 runtimeSync 结果,状态为 applieddeferredfailed。运行时刷新失败不会回滚已持久化的 settings,也不会把成功的变更误报为 HTTP 错误;Web Shell 会提示配置已保存,但运行中的 Session 可能需要重试或重启 daemon。JSON-RPC 模型切换失败也改为复用现有结构化错误消息提取逻辑,不再把对象错误展示成 [object Object]

本次变更同时记录了同步契约、状态所有权、执行顺序、Session 语义和失败行为的设计文档。

为什么需要

当前 Web Shell 在安装模型后会立即持久化并展示新模型,但变更前已创建的 Session 仍持有旧的内存模型注册表,因此选择已经可见的 route 会失败,直到重启 qwen serve。删除模型和 child 重建也存在同类状态不一致,同时结构化 JSON-RPC 错误让问题难以理解。本次修改在不扩展为通用 settings watcher、也不触发完整 workspace reload 的前提下,使持久化 settings、后续 child 的 spawn 状态、当前 ACP child 以及所有 Session registry 保持一致。

Reviewer 测试计划

如何验证

  1. 启动本地 OpenAI-compatible stub,并使用临时 workspace 启动 qwen serve;在安装 stub Provider 前先创建一个 Session。
  2. 通过 workspace Provider 接口安装 Provider,确认响应为 runtimeSync.status = applied;从 workspace Provider 状态读取 route,并在不重启 daemon 的情况下让已有 Session 选择该 route。
  3. 在 turn 执行期间安装另一个模型,确认当前 turn 仍使用原 generator 完成,结束后新模型可被选择。
  4. 删除已安装模型,确认它从 Provider 状态中消失,Session 不会被隐式切换,选择旧 route 时返回可读错误。
  5. 重建 ACP channel,确认替换后的 child 可以使用新模型和更新后的 API key。
  6. 分别注入父进程环境和 child 刷新失败,确认持久化仍成功、HTTP 仍返回 200 且 runtimeSync.status = failed;确认 Web Shell 只对 failed 警告,对 applieddeferred 和旧 daemon 缺失字段均不警告。

证据(变更前后)

变更前:Session 创建后再安装的 Provider 会出现在 workspace Provider 状态中,但选择其 route 会返回 HTTP 500(Model ... not found in the registry),对应 SSE notice 显示 [object Object];重启 daemon 后同一路由才可使用。

变更后:同一个 live Session 收到 runtimeSync.status = applied 后可立即选择新 route。active-turn 验证中当前 turn 一直保留原 generator,删除只禁止后续 route 选择而不切换 Session,ACP child 重建后也使用了更新后的凭据。父进程环境降级时,变更仍成功持久化,并以 HTTP 200 返回 runtimeSync.status = failed

测试平台

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

环境(可选)

Node.js 22.22.3、npm 10.9.8、macOS、本地 HTTP qwen serve、临时 QWEN_HOME 与 workspace,以及本地 OpenAI-compatible stub。已验证受影响的 CLI、ACP bridge、core、SDK 和 Web Shell Vitest 测试,并执行 npm run buildnpm run typechecknpm run lint

风险与范围

  • 主要风险或权衡:显式变更现在需要在 workspace generation 可能被替换的同时协调多份运行时状态;generation guard、逐 Config 失败隔离以及 Session 发布前的最后一次 registry 刷新让操作保持 fail-closed,并防止初始化到一半的 Session 带着旧 Provider 状态对外发布。
  • 未验证或范围外:未执行浏览器级 Web Shell E2E 和本地 Windows/Linux 验证。通用 settings watcher、任意 settings 热更新、qualified multi-workspace mutation 路由以及自动迁移 live Session 当前模型均不在本次范围内。
  • 破坏性变更或迁移说明:无。响应 schema 仍为版本 1,runtimeSync 是 additive optional 字段,因此新 SDK 客户端仍可兼容旧 daemon。

关联 Issue

Closes #10184

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Issue 10184 runtime model-provider sync

Baseline

  1. Start a local OpenAI-compatible stub that accepts model requests.
  2. Start qwen serve with a temporary QWEN_HOME and workspace.
  3. Create a daemon Session before installing the stub provider.
  4. Install the provider through POST /workspace/auth/provider.
  5. Read its selector from GET /workspace/providers and submit it to
    POST /session/:id/model.
  6. Record the pre-fix Unknown or stale model route response and the
    model_switch_failed event payload.

Verification

  • Repeat the baseline and verify the model switch succeeds without restart.
  • Keep a model turn active while installing another model. Verify the active
    turn completes with its existing generator, then select the new model.
  • Delete a configured model. Verify it disappears from provider status and a
    stale selector is rejected with a readable message, without switching an
    existing Session that already uses it.
  • Stop the ACP channel after installation, create a new Session, and verify the
    replacement child inherits the new provider API key.
  • Inject parent-environment and child-command failures separately. Verify the
    mutation remains persisted, returns runtimeSync.status = failed, and the
    Web Shell shows a restart warning.

Results

Executed on 2026-08-27 with a disposable QWEN_HOME, workspace, daemon, and
local OpenAI-compatible HTTP stub.

Baseline

  • Provider installation returned HTTP 200 and GET /workspace/providers
    exposed the new route.
  • Selecting that route in a Session created before installation returned HTTP
    500 (Model ... not found in the registry). The matching SSE
    model_switch_failed notice rendered the error as [object Object].
  • Restarting the daemon rebuilt the registry and made the same route usable.

Post-fix

  • Hot install: the same live Session installed a provider, observed
    runtimeSync.status = applied, read the route, and selected it successfully
    without restarting the daemon.
  • Active turn: the turn began at 06:59:38.130, installation completed at
    06:59:38.199, and the turn completed at 06:59:42.232. The stub saw the
    active turn use boot-model/boot-key; selecting the installed route after
    completion used hot-model/hot-key.
  • Delete: deletion returned HTTP 200 with runtimeSync.status = applied; the
    route disappeared from provider status, selecting the stale route returned a
    structured HTTP error, and SSE reported Model 'hot-model' not found...
    instead of [object Object].
  • Channel rebuild: after installation the ACP child changed from PID 85831
    to PID 93286; the replacement child selected the installed model and the
    stub received Bearer hot-key.
  • Credential rotation boundary: reinstalling the same provider and environment
    key returned applied. The existing Session retained its established
    generator and old key, while a second Session in the same live child PID
    8227 selected the same route and immediately used Bearer newer-key. This
    confirms the child environment and registry were refreshed without replacing
    a live Session's current generator.
  • Parent env degradation: after startup, replacing the workspace .env file
    with a directory caused the runtime env reader to report a file-read failure.
    The child provider reload still ran, persistence remained successful, and the
    install response stayed HTTP 200 with runtimeSync.status = failed rather
    than incorrectly reporting applied.

Primary raw evidence was retained under /tmp/qwen-10184-postfix-* and
/tmp/qwen-10184-rotation-*, including
qwen-10184-rotation-requests.jsonl and
qwen-10184-rotation-create-same-child.json.

The real-daemon run covered HTTP, ACP, Session registry, SSE, active-turn,
credential-rotation, and channel-replacement behavior. Failure-status and Web
Shell warning behavior were covered by directed tests; Web Shell assets were
not available for a browser-level E2E run.

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finishedview run. See the stage comments in this thread for the result.

Qwen Triage 已完成 —— 查看运行。结果见本线程中的各阶段评论。

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

Rendered against a mock daemon (no real backend): the PR base vs this PR head eca0424. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

ℹ️ No screenshot changed against the PR base — but this PR edits 3 render-shaping files:

  • packages/web-shell/client/App.tsx
  • packages/web-shell/client/components/messages/AuthMessage.tsx
  • packages/web-shell/client/i18n.tsx

Either the change has no visual effect (logic, plumbing, a state the scenarios never reach), or no scenario renders this UI — in which case the preview cannot see it, and an empty result is a coverage gap rather than a clean bill of health. To make it visible, add a scenario to packages/web-shell/client/e2e/visuals/screenshots.spec.ts that seeds whatever state the UI is gated on; it then appears here as a head-only (NEW) capture.

Full-resolution recordings (.webm) are attached to the workflow run.

Qwen Code · web-shell visuals

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Re-run gate on head eca0424f — the head has not moved since the last pass, so this pass re-derived every gate input against the same commit rather than re-quoting it.

Template looks good ✓

Problem: an observed bug with strong evidence. Linked issue #10184 remains open, and @wenshao reproduced the exact defect on the merge base in a live Linux environment (real daemon, real ACP children, mock providers, Web Shell in Chromium) before confirming this PR's path fixes it end-to-end. This is the opposite of theoretical hardening.

Direction: aligned. A model installed at runtime being unusable until qwen serve restarts is a real gap in the daemon/Web Shell story, and the fix stays inside that surface — no general settings watcher, no forced model migration, response schema stays additive.

Size: 905 production logic lines (additions + deletions), 2,204 test lines, and 122 lines of design doc, across cli / acp-bridge / core / sdk-typescript / web-shell. The Stage 0 two-tier gate protects core from external contributions and exempts maintainer-authored PRs — this pass re-confirmed @doudouOUC's write access through the collaborator API, so the size cap does not bind this run. The size stays noted for awareness; it is not a blocker.

Approach: the scope matches what the problem actually requires — four copies of state must agree after a mutation (persisted settings, future-child spawn env, the live ACP child, every Session registry), and the diff addresses each with a persist-first, fail-closed ordering. The final commit is a tightly focused fix of the two round-8 findings plus their pinning tests. No drive-by changes spotted.

Risk: Stage 1e matches high-risk paths — packages/cli/src/acp-integration/ (acpAgent.ts, session/Session.ts). Not a blocker, but the code review carries full enrichments and CI evidence is required before any approval.

Moving on to code review. 🔍

中文说明

针对 head eca0424f 的 re-run 门槛——head 与上一轮相同,本轮对同一提交重新推导了全部门槛输入,而非复述旧结论。

模板完整 ✓

问题:已观测到的 bug,证据充分。关联 issue #10184 仍处于 open 状态;@wenshao 已在真实 Linux 环境中(真实 daemon、真实 ACP child、mock provider、Chromium 中的 Web Shell)于 merge base 上精确复现该缺陷,并确认本 PR 的路径端到端修复了它。这不是理论性加固。

方向:对齐。运行时安装的模型必须重启 qwen serve 才能使用,是 daemon/Web Shell 场景中的真实缺口;修复也限定在该范围内——没有泛化的 settings 监听、没有强制迁移模型,响应 schema 保持增量兼容。

规模:约 905 行生产逻辑(增删合计)、2,204 行测试、122 行设计文档,横跨 cli / acp-bridge / core / sdk-typescript / web-shell。Stage 0 双层门槛用于保护核心模块免受外部贡献的冲击,维护者本人发起的 PR 豁免——本轮已通过 collaborator API 重新确认 @doudouOUC 具有 write 权限,因此规模封顶在本轮不适用。规模仅作知悉记录,不构成阻断。

方案:范围与问题所需相符——一次变更后必须保持一致的状态有四份(持久化 settings、未来 child 的 spawn 环境、当前 live ACP child、所有 Session 注册表),diff 以 persist-first、失败关闭的顺序逐一覆盖。最后一次提交是针对第 8 轮两项发现的聚焦修复及其锁定测试。未发现顺手改动。

风险:Stage 1e 命中高风险路径——packages/cli/src/acp-integration/(acpAgent.ts、session/Session.ts)。不构成阻断,但代码审查需带完整增强项,且批准前必须有 CI 证据。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Code review of eca0424f — this pass read every production hunk itself (all ~905 production lines across the 20 non-test files), using the worktree only for base-state context, and independently re-verified the two round-8 Criticals at hunk level.

Round-8 findings — both confirmed fixed on this head, with pinning tests.

  • R8-1 (deferred activation could restore stale settings-managed env values). The deferred-activation callback in acpAgent.ts calls reloadScopesFromDiskAtomically([User, Workspace]) immediately before reloadEnvironment; on reload failure it skips env application entirely, keeps the current environment, and logs a warn. The pre-publish loop is revision-fenced: a failed atomic reload throws fail-closed only when the provider revision moved concurrently, otherwise it keeps current settings and continues. acpAgent.test.ts pins both branches.
  • R8-2 (full workspace reload discarded the fail-closed result). On every runtime path in run-qwen-serve.ts (primary, secondary, dynamic workspace) the ordering is now build-snapshot → validate → only then mutate process.env via the new fail-closed reloadEnvironment mode → swap the overlay. Every failure branch returns runtimeEnvironmentApplied: false; the facade treats a thrown parent refresh as false and surfaces the field in both the reload response and the settings_reloaded event, omitting it only when truly undefined. facade.test.ts and run-qwen-serve.test.ts pin true/false across all three paths.

Fresh pass over the whole production diff — no new blockers found. Highlights of what I checked directly, hunk by hunk:

  • modelRegistry.reloadModelProvidersConfig now builds a replacement ModelRegistry and swaps it in only on success — a throwing constructor leaves the old registry intact, a real fix over the old delete-then-register.
  • LoadedSettings.reloadScopeFromDisk returns a boolean and reloadScopesFromDiskAtomically snapshots all scopes and rolls back on any partial failure; settings.test.ts pins the rollback on a bad-workspace-JSON partial failure.
  • reloadEnvironment's new failClosedOnEnvFileReadError mode returns before touching process.env when an env file is unreadable; environment.test.ts pins that process.env is untouched.
  • The new workspaceModelProvidersReload control method fails closed before bumping the revision counter, isolates per-config failures, and refreshes bootstrap + initializing configs + every live Session.
  • syncModelProvidersRuntime in server.ts decides fan-out from the existing getModelProvidersOwnerScope helper (user scope → all secondary runtimes, workspace scope → primary only), uses Promise.allSettled, and aggregates with the right precedence (failed > applied > deferred), rethrowing only a primary rejection.
  • Both routes persist first, then sync: sync errors degrade to HTTP 200 + runtimeSync.status = failed, generation-close still yields its 503 path, and the DELETE partial-persist branch still syncs when modelProviders committed.
  • The [object Object] fix reuses the bridge's existing exported extractErrorMessage helper (present on main) — no parallel utility.
  • Web Shell: owner-guard + operation-token discard stale completions after an owner change; warnings fire only on failed; the fixed client-side timeout was removed in step with the SDK's deadline change (a recorded tradeoff — see deferrals).
  • SDK surface is additive-only (runtimeSync, runtimeEnvironmentApplied optional fields); the provider-mutation timeout override respects an explicitly configured client timeout via hasExplicitFetchTimeout.

Standing deferrals (recorded in round 8, not requested again): the pre-publish reload loop has no attempt bound; the DELETE sync-rejection and aggregation-rejected branches are unpinned by tests; the AuthMessage StrictMode probe (render-phase ref reset); and provider mutations run with no client deadline (timeout 0), so a wedged daemon keeps the UI busy. Follow-up-issue material, not blockers.

The sync flow, for orientation:

sequenceDiagram
    participant P1 as Web Shell
    participant P2 as serve route
    participant P3 as workspace service
    participant P4 as daemon env
    participant P5 as ACP child
    P1->>P2: install provider or delete model
    P2->>P2: persist settings first
    P2->>P3: syncModelProvidersRuntime
    P3->>P4: rebuild parent spawn env, fail-closed
    P3->>P5: model-providers reload control call
    P5->>P5: reload settings, refresh Session registries, clear caches
    P5-->>P3: configsRefreshed and configsFailed
    P3-->>P2: applied, deferred, or failed
    P2-->>P1: HTTP 200 plus runtimeSync
Loading
Files changed (30 of 43 shown)
File What changed
docs/design/runtime-model-provider-hot-sync.md Design doc for the sync contract, ordering, and failure semantics, updated for the two round-8 fixes
packages/cli/src/acp-integration/acpAgent.ts New provider-reload control method, revision counter, pre-publish refresh loop, and the R8-1 deferred-activation fix
packages/cli/src/acp-integration/session/Session.ts Active-session registry refresh that re-reads settings atomically and fails closed
packages/cli/src/config/settings.ts reloadScopeFromDisk now reports success and an atomic multi-scope reload rolls back partial failures
packages/cli/src/config/environment.ts reloadEnvironment gains a fail-closed mode that leaves process.env untouched on unreadable env files
packages/cli/src/serve/run-qwen-serve.ts Parent-env rebuild reordered to fail before mutating; secondary and dynamic runtimes report applied status — the R8-2 fix
packages/cli/src/serve/server.ts Cross-runtime sync aggregation with user-scope fan-out and workspace-scope isolation
packages/cli/src/serve/routes/workspace-auth.ts Provider install route persists first, then reports runtimeSync status
packages/cli/src/serve/routes/workspace-models.ts Model delete route persists first, syncs runtime, reports runtimeSync status
packages/cli/src/serve/workspace-service/index.ts Facade reloadModelProviders and runtimeEnvironmentApplied surfaced in reload
packages/cli/src/serve/workspace-service/types.ts Service contract additions for the new sync and status fields
packages/cli/src/serve/types.ts Serve-level runtimeSync result type
packages/core/src/models/modelRegistry.ts Registry reload builds a replacement registry and swaps only on success
packages/acp-bridge/src/bridge.ts Model-switch failure frames use the existing structured error extractor
packages/acp-bridge/src/status.ts Registers the new workspace model-providers reload control method
packages/sdk-typescript/src/daemon/DaemonClient.ts Provider mutations use no default client deadline so the bounded server sync can finish
packages/sdk-typescript/src/daemon/types.ts Additive optional runtimeSync and runtimeEnvironmentApplied fields
packages/sdk-typescript/src/daemon/events.ts settings_reloaded event gains runtimeEnvironmentApplied
packages/sdk-typescript/src/daemon/index.ts Exports the new runtime-sync result type
packages/web-shell/client/App.tsx Delete-model completion guarded by session owner; warns only on failed sync
packages/web-shell/client/components/messages/AuthMessage.tsx Install dialog appends a warning on failed sync and discards stale completions after an owner change
packages/web-shell/client/daemon/workspace/actions.ts Provider mutations no longer wrapped in a fixed client-side timeout
packages/web-shell/client/daemon-react-sdk.ts Re-exports the new runtime-sync result type
packages/web-shell/client/daemon/index.ts Re-exports the new runtime-sync result type
packages/web-shell/client/i18n.tsx Bilingual copy for the runtime-sync warning
packages/cli/src/serve/server.test.ts Multi-runtime fan-out, replacement-generation, degradation, and generation-close tests
packages/cli/src/acp-integration/acpAgent.test.ts Deferred-activation reload success and failure branches, publish-loop revision behavior
packages/cli/src/serve/run-qwen-serve.test.ts Fail-closed env paths pinned for primary, secondary, and dynamic workspaces
packages/cli/src/serve/workspace-service/tests/facade.test.ts Facade surfaces a parent-env failure in the response and the event
packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx DOM-level coverage of install dialog sync states and owner-change discard
…and 13 more files Remaining test files adapting to the new boolean reload result and additive SDK fields

Test evidence — the PR's own CI on the reviewed commit, fetched once via the API (this run never builds or executes PR code). No movement since the last pass thirty minutes ago: Test (ubuntu-latest, Node 22.x) and Serve A/B (ubuntu-latest, Node 22.x) — re-run at 07:05 UTC — are still executing (~47 minutes in at fetch time). Context for the earlier cancellation at push time: the unit suite hit GitHub's 1-hour job cap on this head, the previous head, and the latest main commit, so it reads as a repo-wide suite-duration problem rather than a regression from the final commit. Everything else on this head is green: Qwen Live Host CI, SDK Java (Java 11/17/21 on ubuntu, macOS, Windows), Security Checks, and Web-shell Visuals at the workflow level, with Desktop Shell on both OSes, no-AK integration tests, Live Host (macOS), the dependency CVE audit, and the secret scan all successful. Sandboxed side: the @qwen-code /verify A/B run on this exact head completed ✅ merge-ready at 02:30 UTC (161/161 scripted assertions, 0 failures), and a fresh verify run is in flight as of this pass. Not verified: this review runs no PR code; the author's build/typecheck/lint claims rest on their local macOS report, though the green jobs above show the head compiling and serving in anger.

CI results for eca0424 — this table auto-updates as CI workflows complete:

Check Conclusion
Test (ubuntu-latest, Node 22.x) ⏳ running
Serve A/B (ubuntu-latest, Node 22.x) ⏳ running
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Integration Tests (no-AK, No Sandbox) ✅ success
Live Host (macos-latest) ✅ success
Real daemon E2E / Java 11 ✅ success
Secret scan (TruffleHog) ✅ success

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

The behavioural claim is already substantiated beyond the unit suite — @wenshao's live A/B verification in a real Linux daemon/ACP/Web Shell environment (his evidence, earlier head) and the sandboxed verify on this exact head (161/161, merge-ready). The author's own runs were macOS-only, so the two in-flight Linux jobs plus the in-flight verify re-run are the remaining signal: @qwen-code /verify remains the lane that settles behaviour on this head if the unit suite hits the 1-hour cap again like main does.

Real-scenario testing: N/A for this pass — unattended CI re-run; live behaviour was exercised in @wenshao's Linux environment (his evidence, linked in the thread), not by this review.

中文说明

eca0424f 的代码审查——本轮亲自通读了全部生产代码 hunk(20 个非测试文件、约 905 行生产改动),工作树仅用于对照基线状态,并在 hunk 层面独立复核了第 8 轮的两项 Critical。

第 8 轮两项发现——均已在本 head 上确认修复,且有锁定测试。

  • R8-1(延迟激活可能恢复过期的 settings 管理环境变量):acpAgent.ts 的延迟激活回调在 reloadEnvironment 之前立即调用 reloadScopesFromDiskAtomically([User, Workspace]);重载失败则完全跳过环境变量应用、保留当前环境并记录 warn。发布前循环有 revision 栅栏:原子重载失败时仅当 provider revision 发生并发变更才失败关闭地抛错,否则保留当前 settings 继续。acpAgent.test.ts 锁定两个分支。
  • R8-2(整 workspace reload 丢弃失败关闭结果):run-qwen-serve.ts 的所有运行时路径(primary、secondary、动态 workspace)顺序均改为「先构建快照 → 校验 → 再以新的失败关闭 reloadEnvironment 模式改 process.env → 交换 overlay」。所有失败分支返回 runtimeEnvironmentApplied: false;facade 把抛错的父环境刷新视为 false,并在 reload 响应与 settings_reloaded 事件中透出该字段,仅在真正未定义时省略。facade.test.ts 与 run-qwen-serve.test.ts 在三条路径上分别锁定了 true/false

对全部生产 diff 的重新审查——未发现新的阻断项。 逐 hunk 直接核对的要点:

  • modelRegistry.reloadModelProvidersConfig 现在构建替代 ModelRegistry、仅成功时交换——构造函数抛错则保留旧注册表,相对旧的「先删后注册」是真实修复。
  • LoadedSettings.reloadScopeFromDisk 返回布尔值,reloadScopesFromDiskAtomically 对所有 scope 快照、任一失败即回滚;settings.test.ts 锁定了 workspace JSON 损坏导致的部分失败回滚。
  • reloadEnvironment 新增的 failClosedOnEnvFileReadError 模式在 env 文件不可读时于修改 process.env 之前返回;environment.test.ts 锁定 process.env 未被改动。
  • 新的 workspaceModelProvidersReload 控制方法在 revision 计数自增前失败关闭,逐 Config 隔离失败,并刷新 bootstrap、初始化中的 configs 与所有 live Session。
  • server.ts 的 syncModelProvidersRuntime 依据现有 getModelProvidersOwnerScope 辅助函数决定扇出(user scope → 全部 secondary runtime,workspace scope → 仅 primary),使用 Promise.allSettled,聚合优先级正确(failed > applied > deferred),仅在 primary 拒绝时重新抛出。
  • 两条路由均先持久化再同步:同步错误降级为 HTTP 200 + runtimeSync.status = failed,generation 关闭仍走 503 路径,DELETE 部分持久化分支在 modelProviders 已提交时仍会同步。
  • [object Object] 修复复用 bridge 已导出的 extractErrorMessage 辅助函数(main 上已存在)——没有平行工具函数。
  • Web Shell:owner guard + operation token 丢弃 owner 切换后的过期完成态;仅对 failed 警告;固定客户端超时随 SDK 截止时间调整一并移除(已记录的权衡——见延后清单)。
  • SDK 表面纯增量(runtimeSyncruntimeEnvironmentApplied 均为可选字段);provider 变更的超时覆盖通过 hasExplicitFetchTimeout 尊重显式配置的客户端超时。

仍在延后清单中的事项(第 8 轮已记录,本轮不再要求):发布前 reload 循环没有尝试次数上限;DELETE 同步拒绝分支与聚合拒绝分支没有测试锁定;AuthMessage 的 StrictMode 探针(render 阶段重置 ref);provider 变更没有客户端超时(timeout 0),daemon 卡死时 UI 会一直忙碌。适合作为后续 issue 跟进,不构成本 PR 阻断。

测试证据——通过 API 一次性拉取的本提交 CI 结果(本审查不构建、不执行 PR 代码)。 与三十分钟前上一轮相比无变化:Test (ubuntu-latest, Node 22.x)Serve A/B (ubuntu-latest, Node 22.x)(07:05 UTC 重跑)仍在执行(拉取时约 47 分钟)。推送时刻那次取消的背景:单测套件在本 head、上一个 head 以及最新的 main 提交上都触及 GitHub 1 小时 job 上限,因此判定为仓库范围的套件时长问题,而非最后一次提交引入的回归。本 head 其余 CI 均为绿色:工作流层面 Qwen Live Host CISDK Java(ubuntu/macOS/Windows × Java 11/17/21)、Security ChecksWeb-shell Visuals 通过,两个平台的 Desktop Shell、no-AK 集成、Live Host(macOS)、依赖 CVE 审计、密钥扫描均成功。沙箱侧:针对本 head 的 @qwen-code /verify A/B 运行已于 02:30 UTC 以 ✅ 可合并完成(161/161 脚本断言,0 失败),本轮时又有一次新的 verify 在途。未验证:本审查不执行 PR 代码;作者的 build/typecheck/lint 结论依赖其 macOS 本地报告,但上方绿色 job 表明该 head 可以编译并真实运行。

行为层面的主张已经在单测之外获得证实——@wenshao 在真实 Linux daemon/ACP/Web Shell 环境的实机 A/B 验证(他的证据,针对较早 head)与针对本 head 的沙箱 verify(161/161,可合并)。作者本人的运行仅在 macOS 上,因此正在执行的两个 Linux job 与在途的 verify 复跑是剩余信号:若单测套件像 main 一样再次触及 1 小时上限,@qwen-code /verify 仍是在本 head 上定论的通道。

真实场景测试:本次不适用——非值守 CI re-run;实机行为由 @wenshao 在其 Linux 环境中执行(他的证据,见本线程),并非本次审查所驱动。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the two round-8 Criticals are re-verified fixed on this head with pinning tests, a full hunk-level pass over all ~905 production lines found no new blockers, and the verdict is approve; the withheld point is the unit suite that has never completed green on this head (a repo-wide 1-hour-cap problem also present on main) plus the recorded round-8 follow-ups.

Stepping back. My independent proposal for #10184 would have been exactly the shape this PR landed on: persist the mutation, notify the live child to reload over a control call, rebuild the parent spawn environment for future children, and report sync status on the response. The PR matches that and goes further where the problem genuinely demands it — four copies of state that can disagree, sessions mid-initialization while a mutation lands (hence the revision fence and pre-publish recheck), and a multi-workspace daemon needing user-scoped fan-out with workspace-scoped isolation. That machinery is the actual state space of the daemon, not over-abstraction, and it reuses what already exists (getModelProvidersOwnerScope, extractErrorMessage, ModelRegistry) rather than building parallel paths. The one place I would have been tempted to cut — the runtimeSync contract in favour of just restarting things — is the worse call for a live daemon, and the graceful degradation (applied/deferred/failed, persistence never rolled back) is documented in the design doc.

What changed since the last pass, and why the verdict holds:

  • @chiga0 has now approved this exact commit (round 4 review, "no blocking findings"), joining @wenshao's approval on the same head — both human votes stand on eca0424f, the commit this review attests.
  • The two round-8 Criticals I flagged in /review were addressed in this commit; this pass re-read every production hunk itself rather than trusting the prior pass's write-up, and confirmed both fixes and their pinning tests.
  • The sandboxed A/B verification on this exact head passed merge-ready (161/161 assertions), and the previously-cancelled CI jobs were re-run at 07:05 UTC and are still executing — that is the only thing standing between this verdict and the approval.

Housekeeping for whoever merges this:

  • The round-8 deferred list (unbounded pre-publish retry, the unpinned DELETE/aggregation rejection branches, the StrictMode probe, the removed client deadline) is real follow-up work — worth an issue so it doesn't evaporate at merge.
  • The bot's standing CHANGES_REQUESTED reviews are from earlier /review rounds on older heads; their Criticals are the ones verified fixed here. The deferred approval below supersedes them (GitHub counts each reviewer's latest review).
  • The unit suite hitting the 1-hour job cap on main as well is an infra problem that outlives this PR.

Verdict: approve — deferred until CI lands green on this commit. Test (ubuntu) and Serve A/B are still executing (re-run at 07:05 UTC), so the approval is not posted this instant; it will be submitted pinned to the reviewed commit once every check completes green, and withheld if anything lands red or the head moves.

中文说明

置信度:4/5 —— 第 8 轮的两项 Critical 已在本 head 上复核确认修复且有锁定测试,对全部约 905 行生产改动的逐 hunk 重读未发现新的阻断项,结论为批准;扣掉的一分是单测套件在本 head 上从未绿色跑完(main 上同样存在的仓库范围 1 小时上限问题),以及第 8 轮记录的后续跟进项。

退一步看。如果让我独立解决 #10184,方案形状与本 PR 一致:先持久化变更,通过控制调用通知 live child 重载,为后续 child 重建父进程 spawn 环境,并在响应中上报同步状态。PR 与此一致,并在问题确实要求的地方走得更远——可能不一致的状态有四份、变更落地时可能有 session 正在初始化(因此需要 revision 栅栏与发布前重查)、多 workspace daemon 需要 user scope 扇出与 workspace scope 隔离。这些机制是 daemon 真实的状态空间,不是过度抽象,且复用既有实现(getModelProvidersOwnerScopeextractErrorMessageModelRegistry)而非另起平行路径。我唯一动过念头想砍的——用直接重启代替 runtimeSync 契约——对运行中的 daemon 而言是更差的选择,优雅降级(applied/deferred/failed,持久化永不回滚)已写入设计文档。

上一轮之后发生了什么、结论为何保持:

  • @chiga0 现已对这一提交给出批准(第 4 轮审查,"无阻断发现"),与 @wenshao 在同一 head 上的批准并列——两张人类票都落在本次审查所背书的 eca0424f 上。
  • 我在 /review 中标记的两项第 8 轮 Critical 已在本提交中处理;本轮亲自重读了全部生产 hunk,而非采信上一轮的记录,确认了两项修复及其锁定测试。
  • 针对本 head 的沙箱 A/B 验证以可合并通过(161/161 断言);此前被取消的 CI job 已于 07:05 UTC 重跑、仍在执行——这是该结论与批准落地之间唯一的距离。

给合并者的事项清单:

  • 第 8 轮延后清单(无上限的发布前重试、未锁定的 DELETE/聚合拒绝分支、StrictMode 探针、被移除的客户端超时)是真实的后续工作——值得开个 issue,避免合并后蒸发。
  • 机器人仍挂着的 CHANGES_REQUESTED 评审来自更早 /review 轮次、针对更旧的 head;其 Critical 已在本 head 核实修复。下文的延迟批准落地后将将其覆盖(GitHub 以每位评审者最新评审计)。
  • 单测套件触及 1 小时 job 上限在 main 上同样存在,是本 PR 之后仍会存在的设施问题。

结论:批准——延迟到本提交 CI 全绿后执行。 Test (ubuntu)Serve A/B 仍在执行(07:05 UTC 重跑),因此批准不在本时刻提交;待全部检查绿色完成后按被审查的提交钉定提交,若有检查变红或 head 移动则保留不发。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

Built the PR base vs this PR head a18d30c, drove a fixed endpoint set against each, and diffed the JSON responses. Only fields that changed are shown.

No response changes against the PR base across 12 scenario(s).

Qwen Code · serve A/B

@github-actions

github-actions Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.63% 85.63% 91.04% 84.57%
Core 88.74% 88.74% 90.49% 87.2%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.63 |    84.57 |   91.04 |   85.63 |                   
 src               |   86.45 |    82.24 |   88.23 |   86.45 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  llm.tsx          |   73.22 |    77.73 |   80.76 |   73.22 | ...1345-1349,1476 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   74.75 |    77.49 |   93.67 |   74.75 |                   
  acpAgent.ts      |   73.85 |    77.38 |   92.96 |   73.85 | ...17,13195-13196 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   90.91 |    86.46 |   95.68 |   90.91 |                   
  Session.ts       |   90.28 |    85.21 |   95.05 |   90.28 | ...00,13227-13231 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.63 |     80.8 |   94.01 |   86.63 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.43 |    78.79 |   94.44 |   88.43 | ...1294,1384-1386 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.56 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.66 |    78.53 |   65.62 |   90.66 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.55 |    88.77 |   90.68 |   89.55 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.84 |    96.22 |     100 |   96.84 | ...40-245,303-306 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   94.07 |    86.01 |   94.33 |   94.07 | ...1292,1299-1300 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   92.02 |    90.37 |   93.34 |   92.02 |                   
  agent-prompt.ts  |   94.89 |    92.99 |   97.95 |   94.89 | ...3289,3624-3704 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.72 |    97.61 |   94.11 |   94.72 | 271,1336-1374     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.19 |    93.72 |   98.61 |   97.19 | ...6196-6240,6515 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |    94.1 |    92.85 |   92.85 |    94.1 | ...80-782,787-789 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |   96.13 |    92.32 |     100 |   96.13 | ...1316,1325-1326 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 664,989,1045,1081 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.43 |    88.62 |     100 |   96.43 | ...2483,2584-2600 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1214,1249-1280 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   83.78 |    78.57 |   88.88 |   83.78 | ...69-783,785-807 
  submit.ts        |   94.13 |    89.45 |   94.44 |   94.13 | ...1695,1723-1760 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.33 |    94.61 |   98.67 |   97.33 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 824-825           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,514,619,715    
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.81 |    93.65 |     100 |   98.81 | ...78,301,327-328 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.42 |     100 |     100 | 788               
  local-anchor.ts  |   93.78 |    88.75 |     100 |   93.78 | ...61,594-595,745 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   98.05 |    88.57 |     100 |   98.05 | 33-34             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 36                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.04 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.28 |    90.55 |   95.04 |   94.28 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.62 |    91.05 |   83.78 |   89.62 | ...2515,2517-2525 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.52 |    92.85 |   90.32 |   91.52 | ...1062,1064-1065 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   90.64 |    85.29 |      96 |   90.64 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   90.45 |    85.07 |   95.83 |   90.45 | ...01-306,347-352 
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |    99.7 |    96.32 |     100 |    99.7 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.34 |    85.02 |   90.78 |   87.34 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.14 |     100 |     100 | 715               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   90.75 |    80.47 |   94.73 |   90.75 | ...1091,1112-1117 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.18 |    81.65 |   76.99 |   84.18 | ...9217,9235-9239 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    88.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.64 |    91.03 |   71.09 |   89.64 | ...3146,3176-3177 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...90-591,598-599 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   89.88 |     90.9 |     100 |   89.88 | ...05-206,274-295 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.37 |    79.95 |   94.53 |   80.37 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.71 |    76.82 |   93.44 |   75.71 | ...5649,5706-5712 
  index.ts         |   82.65 |    79.59 |   91.22 |   82.65 | ...2432,2518-2519 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   86.32 |    78.72 |   93.33 |   86.32 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.21 |    76.37 |     100 |   89.21 | ...52-554,568-572 
  ...on-journal.ts |   91.69 |    80.86 |     100 |   91.69 | ...46-747,753-755 
  ...on-service.ts |   83.22 |    75.11 |   89.01 |   83.22 | ...3014,3023-3025 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.53 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.25 |    81.55 |   95.63 |   86.25 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.95 |    84.38 |   94.59 |   87.95 | ...1730,1775-1776 
  ...r-backfill.ts |   98.53 |    94.51 |     100 |   98.53 | ...48-249,616-617 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.69 |    83.06 |    94.3 |   86.69 | ...7149,7151-7152 
  sse-events.ts    |   87.01 |    84.95 |   94.44 |   87.01 | ...40-951,954,961 
  ...e-sessions.ts |    86.9 |    80.57 |     100 |    86.9 | ...81-483,486-491 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   84.74 |       75 |     100 |   84.74 | ...35,349,357-361 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    89.9 |    79.35 |   93.93 |    89.9 | ...2348,2393-2394 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.14 |    84.21 |     100 |   87.14 | ...1802,1812-1817 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.07 |    91.22 |   97.39 |   93.07 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   88.78 |    82.32 |     100 |   88.78 | ...63,880,943-952 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.14 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   95.13 |     87.5 |     100 |   95.13 | 188-194           
  ...on-archive.ts |   91.29 |    89.33 |   97.61 |   91.29 | ...1133,1196-1197 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.89 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |   98.71 |    98.57 |     100 |   98.71 | 267-270           
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |   91.09 |    89.14 |   91.83 |   91.09 |                   
  index.ts         |   90.62 |     88.5 |   90.24 |   90.62 | ...1481,1511-1517 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    92.7 |    89.68 |   98.13 |    92.7 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.45 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.09 |    78.17 |   70.65 |   71.09 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.62 |    73.37 |   71.05 |   76.62 | ...4465,4581-4587 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.33 |    77.27 |   41.66 |   68.33 | ...63-465,495-500 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |    84.6 |    84.46 |   91.68 |    84.6 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   80.71 |     64.7 |     100 |   80.71 | ...05-206,220-223 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.75 |    74.02 |   83.33 |   73.75 | ...72-605,616-617 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   73.25 |    80.22 |    77.7 |   73.25 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.78 |    87.65 |   86.79 |   90.78 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   93.24 |       85 |     100 |   93.24 | 73-75,77,79       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |    86.4 |    82.06 |    86.6 |    86.4 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    87.05 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.47 |    82.34 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |    86.1 |    84.16 |   87.81 |    86.1 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.55 |    73.58 |     100 |   94.55 | ...87-288,293-294 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   87.63 |    84.43 |   78.72 |   87.63 | ...5813-5815,5817 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    94.94 |     100 |     100 | ...43,279,349,359 
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.98 |    86.07 |    96.1 |   87.98 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.21 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.49 |    89.77 |   96.44 |   92.49 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.22 |    85.18 |     100 |   89.22 | ...23-424,431-432 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.38 |    71.83 |   88.88 |   70.38 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.74 |     87.2 |   90.49 |   88.74 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.26 |    84.51 |   94.55 |   90.26 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.74 |       78 |    85.1 |   85.74 | ...1803-1807,1810 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   93.21 |    83.47 |   94.44 |   93.21 | ...94,702,707-714 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.27 |    88.23 |   98.33 |   95.27 | ...1478,1492-1494 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.87 |    68.43 |   78.94 |   76.87 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    75.8 |    65.46 |   78.57 |    75.8 | ...1879,1885-1886 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   77.32 |    86.38 |   75.52 |   77.32 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.45 |    90.21 |   96.87 |   91.45 | ...66-467,586-592 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.37 |    87.56 |   92.44 |   93.37 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   90.39 |    80.91 |   81.25 |   90.39 | ...2551,2597-2599 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.57 |    89.41 |   83.33 |   93.57 | ...04-505,508-509 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.85 |    90.47 |     100 |   93.85 | ...2206,2299-2302 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.77 |    84.16 |      95 |   95.77 | ...88,356,376-379 
  ...ow-sandbox.ts |   97.29 |    88.84 |     100 |   97.29 | ...1835,1841-1842 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   84.84 |    85.82 |   91.09 |   84.84 |                   
  TeamManager.ts   |   78.24 |    83.83 |   84.12 |   78.24 | ...1907,1930-1931 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |    92.5 |    95.45 |      95 |    92.5 | ...29-330,393-403 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.28 |    95.34 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |    85.71 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.96 |     100 |     100 | 189,198           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   86.21 |    88.39 |   78.34 |   86.21 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.91 |    87.81 |   76.32 |   84.91 | ...9653,9657-9659 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.83 |    88.65 |   93.87 |   92.83 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.36 |    88.22 |   91.83 |   92.36 | ...4537,4635-4636 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...08-509,554-560 
  ...lScheduler.ts |   90.23 |    85.01 |   94.73 |   90.23 | ...6512,6540-6556 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  llm-chat.ts      |   95.21 |    90.81 |   96.69 |   95.21 | ...5744,5789-5790 
  llm-request.ts   |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.89 |    91.12 |      85 |   93.89 | ...1272,1475-1476 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |     92.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 765-766,835       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.58 |    89.11 |   97.43 |   96.58 |                   
  ...tGenerator.ts |   97.66 |    88.91 |   97.43 |   97.66 | ...1494,1523,1534 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.33 |    90.93 |   96.58 |   92.33 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.25 |    89.66 |   96.87 |   91.25 | ...1946,2115-2130 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |   95.38 |    91.56 |     100 |   95.38 | ...1461-1462,1569 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.24 |       92 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.34 |    90.56 |     100 |   95.34 | ...54-155,168-169 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   88.79 |    86.22 |   93.46 |   88.79 |                   
  ...ive-safety.ts |   97.77 |    93.75 |     100 |   97.77 | 100-101           
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.27 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.52 |    83.52 |      83 |   84.52 | ...3139,3177-3178 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   92.43 |    87.52 |     100 |   92.43 | ...1293-1294,1304 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.59 |    90.38 |      95 |   93.59 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.96 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.82 |   97.36 |   95.75 | ...73,663,681-682 
  goal-runtime.ts  |   96.51 |    90.64 |   96.49 |   96.51 | ...1636-1637,1768 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   98.58 |     95.2 |   96.15 |   98.58 | ...41-242,350-351 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   89.12 |    87.01 |    89.8 |   89.12 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   75.58 |    83.23 |   87.87 |   75.58 | ...25-927,937-940 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   82.47 |    84.21 |      75 |   82.47 | 63-67,169-184     
  ...oksManager.ts |   94.87 |    90.12 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ipc           |   92.72 |    90.15 |    97.5 |   92.72 |                   
  inbound-gate.ts  |   98.93 |     89.1 |     100 |   98.93 | 522-524           
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.45 |    93.65 |     100 |   97.45 | 235-237           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   85.71 |    94.11 |      80 |   85.71 | 162-175           
  uds-inbox.ts     |   82.42 |    81.81 |     100 |   82.42 | ...33,240-250,282 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   88.82 |    85.24 |    90.9 |   88.82 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.16 |    78.76 |   94.44 |   90.16 | ...06,629,642-648 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |   78.51 |    83.16 |   77.77 |   78.51 | ...1487,1500-1502 
  ...ent-config.ts |   87.64 |    83.62 |      88 |   87.64 | ...08,411-425,437 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.38 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   73.92 |       75 |   66.66 |   73.92 | ...78-482,485,491 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |    81.53 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.81 |    89.34 |   91.35 |   92.81 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    64.51 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.07 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   84.45 |    91.47 |    72.4 |   84.45 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.79 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |      89 |    90.99 |   86.84 |      89 | ...1461,1567-1571 
  rule-parser.ts   |   94.89 |    92.83 |     100 |   94.89 | ...1550,1584-1586 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.05 |    95.23 |     100 |   99.05 |                   
  system-prompt.ts |   99.05 |    95.23 |     100 |   99.05 | 226               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.82 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.91 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.61 |    86.24 |   96.49 |   90.61 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.72 |    96.53 |     100 |   97.72 | ...1081,1224-1232 
  ...ingService.ts |    92.6 |    88.14 |   94.73 |    92.6 | ...2856,2871-2872 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.52 |    90.99 |     100 |   95.52 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.23 |     100 |   98.26 | ...65-866,889-890 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.04 |    89.74 |     100 |   96.04 | 72,98-101,190-191 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.74 |    94.92 |     100 |   98.74 | 601,655-656,714   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   84.57 |    75.18 |   97.72 |   84.57 | ...2567,2589,2603 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.82 |    85.68 |    91.4 |   88.82 | ...4049-4050,4091 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    95.83 |     100 |     100 | 139               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.78 |    86.08 |   94.73 |   89.78 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   86.11 |    85.71 |   86.11 |   86.11 | ...1244,1251-1255 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 286-287           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   88.58 |    89.46 |    98.3 |   88.58 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.54 |    86.59 |   97.43 |   85.54 | ...1588,1665-1666 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   83.23 |    84.98 |   86.51 |   83.23 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.88 |    92.79 |   83.78 |   87.88 | ...55-561,564-568 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.83 |    77.77 |   66.66 |   60.83 | ...1523,1540-1560 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    88.81 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...ry/qwen-logger |   74.23 |    80.86 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |     80.7 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.54 |    86.06 |   90.21 |   87.54 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.25 |    87.61 |   93.93 |   86.25 | ...2552,2556-2559 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1342,1350-1351 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |    98.1 |       93 |     100 |    98.1 | ...1233,1288-1289 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |   96.04 |    82.25 |     100 |   96.04 | ...41,594,604-608 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.08 |    93.75 |    92.3 |   99.08 | 217-219           
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |    81.5 |    90.69 |   66.66 |    81.5 | ...80-286,354-361 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   93.56 |    90.78 |   91.66 |   93.56 | ...49,653,701-723 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.73 |    90.47 |   93.75 |   95.73 | ...48-552,565-570 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.48 |    82.45 |   86.53 |   80.48 | ...1099,1107-1108 
  ...-finalizer.ts |    98.1 |    92.36 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...64-565,581-587 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.26 |    88.51 |   89.71 |   87.26 |                   
  agent.ts         |   85.88 |    87.64 |   87.35 |   85.88 | ...4265,4299-4309 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   89.33 |    87.68 |   82.75 |   89.33 |                   
  workflow.ts      |   89.33 |    87.68 |   82.75 |   89.33 | ...33,878,880-881 
 src/utils         |   92.78 |    89.74 |   96.89 |   92.78 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |     100 |    97.18 |     100 |     100 | 79,86             
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    92.99 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   96.06 |    84.09 |     100 |   96.06 | 251,350-358       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.22 |    98.01 |     100 |   98.22 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |     86.2 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |     62.5 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.82 |    92.48 |     100 |   96.82 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run.

@doudouOUC doudouOUC self-assigned this Aug 27, 2026
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 38 passed · 0 failed · 38 total

Flakiness gate: ⚠️ timeout — only 2 of 5 rounds fit the 15-minute budget; the completed rounds agreed

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:38 通过 · 0 失败 · 38 总计

抖动门:⚠️ timeout — only 2 of 5 rounds fit the 15-minute budget; the completed rounds agreed

Verification report

PR #10269 — fix(serve): Hot-reload runtime model providers

Verdict: merge-ready — 38/38 scripted assertions passed (0 unexpected failures). Verified head: 7f47586aad49c435cd94a017c0ae3bac5fe26aa1 (merge-ref HEAD^2; base tip 4e9c2e87db).

中文摘要
  • 结论merge-ready。38 条脚本化断言全部通过,0 条意外失败。
  • A/B 结论(见 "Central claim" 表与 01-…png / 02-…png 截图):在 base(HEAD^1)上,先创建 Session 再安装 Provider 后,旧 Session 选择新 route 返回 500 Model 'stub-model-1' not found for authType 'openai'(即 bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart #10184 的症状),且响应没有 runtimeSync 字段;在 head 上同一场景返回 runtimeSync.status=applied,旧 Session 立即切换成功,且 wire 层证明新模型与安装时写入的 API key 真实到达了 fake OpenAI server。
  • 次级结论deferred(无 Session)、failed(父环境重建失败时仍 HTTP 200 且持久化保留)、删除流程(route 消失、Session 不被隐式切换、再选旧 route 报可读错误)、SSE model_switch_failed 通知(base 显示 [object Object],head 显示可读详情)均按 PR 声称行为实测通过。
  • 测试门:server 1104/1104、run-qwen-serve 329/329、acpAgent+Session 1233/1233、bridge 804/804、core config 580/580、SDK 354/354、web-shell App 549/549、AuthMessage.dom 4/4 全绿;settings.test.ts 有 13 个失败,但其中 12 个在 base 上以完全相同方式失败(环境性集群),新增的 1 个 home-dir 测试落在同一集群,其失败断言位于 PR 改动代码下游(直接钉住新布尔返回值的 4 个 reload 测试全绿)。
  • 变异矩阵:两处关键改动各被一个变异杀死(M1 路由接线移除 → 3 红;M2 忽略 configsFailed → 1 红),对照与恢复行均绿。
  • 未覆盖:active-turn 期间安装另一模型的 E2E(仅由 core 单测钉住 generator 保留)、ACP channel 重建后的凭据使用 E2E、浏览器级 Web Shell E2E。

Central claim + A/B

Central claim: a provider installed (or model deleted) after a session was created becomes usable in that live session without restarting qwen serve; mutation responses expose runtimeSync (applied/deferred/failed) and a failed runtime refresh never rolls back persistence.

Harness (ab-harness.mjs, mock-free): real node <cli> serve per arm + real loopback OpenAI-compatible stub; session created before install; then install → switch → prompt. Base arm = tmp/base-tree worktree at HEAD^1 with base-built core/acp-bridge/cli dists (internal @qwen-code/* links re-pointed into the base tree; readlink -f asserted).

cell oracle base (4e9c2e87db) head (7f47586aad)
boot + session before install POST /session 200 ✓ (control) 200 ✓
control turn (boot model) fake-server request fake-model seen ✓ fake-model seen ✓
install provider POST /workspace/auth/provider 200, no runtimeSync field 200, runtimeSync.status=applied
provider status after install GET /workspace/providers stub listed (visible but unusable) stub listed
switch in pre-existing session POST /session/:id/model 500 Model 'stub-model-1' not found for authType 'openai' 200
post-switch turn fake-server wire not reached (switch failed) model=stub-model-1 + Authorization: Bearer sk-stub-…10269

Witnesses: evidence/01-ab-head-selects-new-model.png, evidence/02-ab-base-rejects-new-model.png (raw harness output per cell).

The base cell reproduces #10184 exactly (route visible in status, switch 500, restart was the only remedy); the head cell closes it, and the wire oracle proves the installed credential — not the boot env key — served the post-switch turn.

Secondary probes (both arms, symmetric)

probe base head
install with no session 200, no field 200, runtimeSync.status=deferred
install with unreadable user-level .env (EISDIR) 200, no field, persistence kept 200, runtimeSync.status=failed, persistence kept
delete installed model after switching 200, no field; session never switched (prompt fell back to boot model) 200 + runtimeSync.status=applied; stub gone from status; session kept deleted model (prompt did not fall back); re-switch 500 readable
SSE model_switch_failed on bad switch error: "[object Object]" ← issue symptom, live error: "Model '…' not found for authType 'openai'"

Mutation matrix (evidence/03-mutation-matrix.png)

row mutation result
0 control, unmutated green (13 passed, sync filter)
1 server.ts: auth-provider route sync wiring removed killed — 3 auth-route sync tests red with behavioral assertions (expected undefined to deeply equal { status: 'deferred' }, object mismatch, expected 200 to be 503); DELETE-route sync test stayed green (precise attribution)
2 workspace-service/index.ts: configsFailed no longer marks failed killedexpected { status: 'applied' } to deeply equal { status: 'failed' }
3 restored tree green again (13 passed)

The A/B itself is the vacuity witness for the child-side path: the head switch succeeded only because the ACP child executed workspaceModelProvidersReload and rebuilt its registries; acp-integration suite (1233/1233) additionally pins beforeSessionPublish/reloadModelProvidersFromDisk.

Targeted gates (exact counts)

suite result
cli server.test.ts 1104/1104
cli run-qwen-serve.test.ts 329/329
cli acpAgent.test.ts + session/Session.test.ts 1233/1233
cli facade.test.ts + workspace-models.test.ts + settingsWatcher.test.ts green
cli settings.test.ts 161/174 — see Finding 1
acp-bridge bridge.test.ts 804/804
core config.test.ts 580/580
sdk DaemonClient.test.ts 354/354
web-shell App.test.tsx / AuthMessage.dom.test.tsx 549/549 / 4/4

Gate liveness: the mutation rows prove the runner and collection are live (mutants turned the selected suites red with the intended assertions).

Findings (non-blocking)

  1. settings.test.ts environmental cluster; the PR's one new test lands in it. 13 tests fail in this sandbox: 12 fail identically on base (byte-identical failing names, same expected undefined to be … signature), and the 1 head-only failure is the PR's new should keep workspace settings empty when reloading the home directory, whose failing assertion (getModelProvidersOwnerScope'User') is downstream of the PR's change — the PR's settings.ts diff is confined to reloadScopeFromDisk, and the pre-existing sibling fails at settings.user.settings.ui right after loadSettings(), before reloadScopeFromDisk is ever called, on base. The four modified reload tests that pin the new boolean return pass. Not a PR regression; recommend confirming the suite is green in project CI (author tested macOS only).
  2. Pre-existing [object Object] sibling in daemon logs (both arms). On env-file read failure the daemon warns failedFiles="[object Object]" — the same stringification disease this PR fixes for model-switch notices, in the env-file warning path. Present on base; out of this PR's scope; noted for a follow-up.
  3. Other err instanceof Error ? err.message : String(err) sites remain in acp-bridge (10 sites on non-model_switch_failed paths). The PR fixed exactly the two emitters named by the bug; scope matches. Informational.

Not covered

  • Active-turn generator retention E2E (Reviewer plan step 3): pinned only by the core unit test (getContentGenerator() unchanged across reloadModelProvidersConfig, green) — holding a turn open during install was not driven.
  • ACP channel recreation with updated credential E2E (step 5): the env-rebuild path was exercised via the S2c failure injection and the applied path, but a child respawn was not driven.
  • Browser-level Web Shell E2E (component-level dom tests green instead).
  • Per-commit attribution: single-commit PR, N/A.
  • Windows/Linux author-side runs (author-declared untested; this round ran on Linux).

Methodology

Environment: CI merge-ref checkout (HEAD merge, HEAD^1 base, HEAD^2 head, depth 2), node:22 container; head dist prebuilt by the lane. Base control: scratch worktree tmp/base-tree at HEAD^1, core/acp-bridge/cli rebuilt there with tsc --build; root node_modules exposed via a symlink farm with @qwen-code/{qwen-code-core,acp-bridge,qwen-code} re-pointed into the base tree (realpath asserted; sdk and channel/web packages link head dists — unchanged by the PR, identical on both arms). Harnesses (ab-harness.mjs, probes.mjs, s2c-failed.mjs) drive real daemons over real HTTP with a loopback OpenAI stub that records every request (model + Authorization) as the wire oracle; raw logs in logs/. Assertions aggregated by check-assertions.mjs from the executed runs only.

Flakiness gate log

rounds=5 files=13 skipped=0
file packages/acp-bridge/src/bridge.test.ts: (cd packages/acp-bridge) npx --no-install vitest run ./src/bridge.test.ts
file packages/cli/src/acp-integration/acpAgent.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/acpAgent.test.ts
file packages/cli/src/acp-integration/session/Session.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/Session.test.ts
file packages/cli/src/config/settings.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settings.test.ts
file packages/cli/src/config/settingsWatcher.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settingsWatcher.test.ts
file packages/cli/src/serve/routes/workspace-models.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/routes/workspace-models.test.ts
file packages/cli/src/serve/run-qwen-serve.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/run-qwen-serve.test.ts
file packages/cli/src/serve/server.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/server.test.ts
file packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/workspace-service/__tests__/facade.test.ts
file packages/core/src/config/config.test.ts: (cd packages/core) npx --no-install vitest run ./src/config/config.test.ts
file packages/sdk-typescript/test/unit/DaemonClient.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/DaemonClient.test.ts
file packages/web-shell/client/App.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/App.test.tsx
file packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/AuthMessage.dom.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/acp-bridge/src/bridge.test.ts: PPP
  packages/cli/src/acp-integration/acpAgent.test.ts: PPP
  packages/cli/src/acp-integration/session/Session.test.ts: PP
  packages/cli/src/config/settings.test.ts: PP
  packages/cli/src/config/settingsWatcher.test.ts: PP
  packages/cli/src/serve/routes/workspace-models.test.ts: PP
  packages/cli/src/serve/run-qwen-serve.test.ts: PP
  packages/cli/src/serve/server.test.ts: PP
  packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: PP
  packages/core/src/config/config.test.ts: PP
  packages/sdk-typescript/test/unit/DaemonClient.test.ts: PP
  packages/web-shell/client/App.test.tsx: PP
  packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: PP

verdict: timeout
summary: only 2 of 5 rounds fit the 15-minute budget; the completed rounds agreed

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settings.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settingsWatcher.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/routes/workspace-models.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: P (exit 0)
round 1 · packages/core/src/config/config.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: P (exit 0)
round 2 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 2 · packages/cli/src/config/settings.test.ts: P (exit 0)
round 2 · packages/cli/src/config/settingsWatcher.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/routes/workspace-models.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: P (exit 0)
round 2 · packages/core/src/config/config.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: P (exit 0)
round 3 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)

Evidence images

01-ab-head-selects-new-model

02-ab-base-rejects-new-model

03-mutation-matrix

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally (Agent 7 ran the unit suites of the changed workspaces only); the Test (macos-latest / windows-latest) matrix jobs were also skipped.

Not explored to full depth (tool budget reached): chunk 7: executing the two new tests (App.test.tsx filtered run, AuthMessage.dom.test.tsx) — the worktree has no node_modules and a full monorepo npm ci + workspace bu….

中文说明

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

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally (Agent 7 ran the unit suites of the changed workspaces only); the Test (macos-latest / windows-latest) matrix jobs were also skipped。

未探索到全部深度(达到工具调用预算):chunk 7:executing the two new tests (App.test.tsx filtered run, AuthMessage.dom.test.tsx) — the worktree has no node_modules and a full monorepo npm ci + workspace bu…

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

Comment thread packages/web-shell/client/App.tsx Outdated
Comment thread packages/web-shell/client/components/messages/AuthMessage.tsx
Comment thread packages/cli/src/acp-integration/acpAgent.test.ts
Comment thread packages/cli/src/acp-integration/acpAgent.test.ts
Comment thread packages/cli/src/acp-integration/acpAgent.ts Outdated
Comment thread packages/cli/src/serve/workspace-service/index.ts
Comment thread packages/cli/src/config/settings.ts
Comment thread packages/cli/src/serve/routes/workspace-models.test.ts
Comment thread packages/cli/src/serve/server.ts Outdated
Comment thread packages/web-shell/client/i18n.tsx Outdated
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Addressed review feedback in 27257df.

Outcome Review items Resolution
Fixed 2 Critical timeout races SDK model-provider mutations now allow 45s and the WebUI wrapper 50s, preserving the daemon's 30s child deadline and surfacing persisted runtime-sync results.
Fixed 10 test, ordering, contract, and copy suggestions Added discriminating/fail-closed/post-reload tests, preserved immediate persisted-state broadcasts, covered env rejection, warned on invalid settings shape, removed the dead parameter, and made recovery guidance restart-only.
Not changed 4 raw-error logging suggestions Kept raw provider, environment, and child exceptions out of logs per the design's secret-safety boundary; callers receive the bounded failed status.

Verification: focused affected-package tests passed; pre-commit formatting/lint passed; full repository build and typecheck passed.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally (Agent 7 ran the unit suites of the changed workspaces only); the Test (macos-latest / windows-latest) matrix jobs were also skipped.

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

  • packages/cli/src/serve/workspace-service/__tests__/facade.test.ts:3584 — [probe] SessionNotFoundError + failed-env branch of reloadModelProviders has no test (mutant survives)
  • packages/cli/src/serve/routes/workspace-models.ts:305 — [probe] DELETE route generation-close sync guards have no test (POST route has one)
  • packages/cli/src/acp-integration/acpAgent.ts:12009 — [probe] reloadEnvironment(merged, cwd) in the reload handler is never asserted
中文说明

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

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally (Agent 7 ran the unit suites of the changed workspaces only); the Test (macos-latest / windows-latest) matrix jobs were also skipped。

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

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

Comment thread packages/cli/src/acp-integration/acpAgent.test.ts
Comment thread packages/sdk-typescript/test/unit/DaemonClient.test.ts Outdated
Comment thread packages/cli/src/acp-integration/acpAgent.test.ts Outdated
Comment thread packages/cli/src/acp-integration/acpAgent.test.ts Outdated
Comment thread packages/cli/src/acp-integration/session/Session.ts Outdated
@doudouOUC

doudouOUC commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator Author

Follow-up review items addressed in 4802a7f.

Review item Resolution
Failed-session Config cleanup Added a post-failure reload assertion proving only the bootstrap Config remains registered.
SDK timeout regression witness Made both delayed fetch mocks AbortSignal-aware so the default 30s timeout mutation fails.
Ext-handler scope gate Asserted User then Workspace reloads and added a Workspace-only failure case.
Session creation scope gate Covered User-only and Workspace-only failures, including disposal, non-publication, and cleanup.
Live Session scope gate Added a Workspace-only failure case that prevents applying stale providers.

Verification: full acpAgent.test.ts (515), Session.test.ts (721), and DaemonClient.test.ts (356) passed; npm run build and npm run typecheck passed. Independent mutation probes confirmed each new assertion turns red for its corresponding regression.

chiga0
chiga0 previously approved these changes Aug 27, 2026

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

Review spanning all three commits. No blocking findings at this head.

Round-1 Criticals — both resolved in 27257dfb:

  • R1-1 (App.tsx unreachable runtimeSync: 'failed' warning): Fixed — the SDK delete call now has a 45s budget and the Web UI wraps with a 50s client timeout, making the failed branch reachable before the client request times out. Author confirmed.
  • R1-2 (AuthMessage.tsx install-path same race): Fixed with the same 45s SDK / 50s WebUI timeout layering.

Round-1 Suggestions — resolved in 27257dfb:

  • R1-3/R1-4/R1-10: Reload mock cleared before test scope boundaries; reload call arguments pinned with toHaveBeenNthCalledWith.
  • R1-5: Test added for newSession rejecting and disposing when final provider reload fails (both User and Workspace scope failure in 4802a7f7).
  • R1-11: Persisted settings writes now broadcast before runtime sync rather than after.
  • R1-12: reloadDaemonEnv rejection path covered by facade regression test.
  • R1-13: Non-object JSON emits a shape-only warning, not treated as the object itself.
  • R1-14: Ordering assertion now outside the sync mock, not inside it.
  • R1-15: Unused optional assertGenerationOpen parameter removed from both routes.
  • R1-16: Recovery guidance leads with restart over retry for the delete-provider flow.

Round-1 Suggestions — intentionally declined (R1-6/R1-7/R1-8/R1-9): Error details deliberately excluded from runtime-sync log output; raw child exceptions excluded from the structured error string per the approved design contract. Author's rationale documented in inline comments.

Round-2 Suggestions — resolved in 4802a7f7:

  • R2-1/R2-3/R2-4: Failed-creation test now parametrized over User and Workspace scope; pre-publish reload guard failure path for newSession and languagePropagation paths both covered.
  • R2-2: DaemonClient.test.ts fetch mock now wires the request's AbortSignal to rejection so the 31s SDK timeout test can actually abort.
  • R2-5: Session.test.ts now covers workspace scope failure in reloadModelProvidersFromDisk.

CI: build-cli SKIPPED; Real daemon E2E / Java 11, web-shell E2E Smoke, Java matrix (ubuntu/windows/macos), and Post Coverage Comment all pass.

Reviewed with AI assistance.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 72 passed · 0 failed · 72 total

Flakiness gate: ⚠️ timeout — the 15-minute budget elapsed before two full rounds completed (1 done) — no flakiness signal either way

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:72 通过 · 0 失败 · 72 总计

抖动门:⚠️ timeout — the 15-minute budget elapsed before two full rounds completed (1 done) — no flakiness signal either way

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - follow-up round at new head

Ran the PR in an isolated, token-free container: A/B against the base build at the new base tip, mock-free harness assertions, mutation A/B across the test-strengthening delta, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 72 passed · 0 failed · 72 total

中文 — 判定:✅ 通过 · 可合入(agent 判定,follow-up 轮)
  • 结论merge-ready。本轮为 follow-up:上一轮在旧 head(7f47586a)判定 merge-ready 后,PR 新增两个提交(review-feedback 修复 + 测试加强),base 也前进了 294 个文件(其中 11 个与本 PR 重叠)。本轮在新 merge head 4802a7f7全部重新实测:中心 A/B(head 19/19 vs base 18/18)、次级探针、变异矩阵、定向门禁。
  • A/B 结论01-ab-head-new-model-live.png / 02-ab-base-rejects-new-model.png):base 上先建 Session 再装 Provider 后切换返回 500 Model 'stub-model-1' not found for authType 'openai'、无 runtimeSync 字段、SSE 通知显示 [object Object]bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart #10184 症状完整复现);head 上同一场景 runtimeSync.status=applied、旧 Session 立即切换成功,wire 层证明请求带安装时写入的 API key 到达 fake OpenAI server;deferred/failed/删除流程均按声称实测。
  • Delta 结论03-mutation-matrix-old-vs-new.png):测试加强提交真实有效——5 个单点变异(Session workspace 作用域守卫、ext-method workspace 守卫、ext-method 重载顺序、SDK 两处 45s 超时)在旧测试下全部存活、在新测试下全部被预期断言杀死,且无 killed→survived 回归。review-feedback 提交的生产改动(sync 参数内收、删除路由 broadcast 前移、45s/50s 超时梯、settings 非对象告警)经读码 + 测试钉住 + 活体 A/B 验证,generation guard 仍 fail-closed。
  • 上轮 findings 状态:F1(settings.test.ts 环境性失败簇)在新 head 重新比对(见下);F2(daemon 日志 failedFiles="[object Object]")双臂仍复现,维持;F3(String(err) 同源站点)精确归因:base tip 22 处 → head 20 处,PR 恰好转换两个 model_switch_failed emitter。
  • 未覆盖:active-turn 期间安装的 E2E、ACP channel 重建 E2E、浏览器级 Web Shell E2E(均与上轮相同,由单测钉住)。
Verification report

PR #10269 — fix(serve): Hot-reload runtime model providers (follow-up round)

Verdict: merge-ready — 72/72 scripted assertions passed (0 unexpected failures). Verified head: 4802a7f767d7b300a4109d07e64ef296dad89658 (git rev-parse HEAD^2); merge base tip bbaba8b1f807014c9beafb455a2ff334011bd370 (HEAD^1). Previous round verified head 7f47586aad at base 4e9c2e87db; both old commits are locally reachable, so the delta since that round is measured exactly, not inferred.

Topology note: the snapshot lists 3 commits; git rev-list HEAD^1..HEAD^2 returns 1 (shallow boundary artifact, as expected). The three snapshot OIDs (7f47586a, 27257dfb, 4802a7f7) are all reachable and their per-commit diffs were exercised individually, so per-commit attribution IS available this round despite the shallow clone.

Previous-finding status table (re-measured at new head, never diffed)

# finding (previous round) severity status at 4802a7f7 re-measurement
F1 settings.test.ts environmental cluster; PR's one new test lands in it non-blocking stands (re-measured) base at new tip: 12 failed / 161 passed with byte-identical failing names and the same expected undefined to be … signature; head-side run in gates below (comparison in Findings)
F2 pre-existing [object Object] sibling in daemon env-file warning (failedFiles) non-blocking stands EISDIR probe re-driven on both arms this round: failedFiles="[object Object]" in daemon-*-failed.log on head AND base
F3 other err instanceof Error ? err.message : String(err) sites in acp-bridge informational stands, precisely attributed exact-pattern count: 22 at base tip → 20 at head; the PR's bridge.ts diff is exactly the two model_switch_failed emitters converted to extractErrorMessage(err). (Previous round's "10 sites" was a narrower scope; the exact-string census says 20 remaining siblings.)

Additionally observed this round (new sibling of the F2/F3 family, both arms, pre-existing): the daemon's generic route-error log line [ERROR] [DAEMON] route=POST /session/:id/model … [object Object] still stringifies the JSON-RPC error object on head as on base. The PR fixed the two emitters named by the bug (SSE notice + SDK path); this log line is a third, unnamed site. Informational, out of scope, noted for a follow-up.

Central claim + A/B (re-measured at new head)

Central claim (carried): a provider installed (or model deleted) after a session was created becomes usable in that live session without restarting qwen serve; mutation responses expose runtimeSync (applied/deferred/failed); a failed runtime refresh never rolls back persistence.

Harness (harness/ab-harness.mjs + harness/stub-server.mjs, mock-free): real node <cli dist> serve per arm (bearer-token enabled), real loopback OpenAI-compatible stub recording every request (model + Authorization) as the wire oracle; session created before install. Base arm = tmp/base-tree worktree at HEAD^1 (bbaba8b1, the new base tip — base advanced 294 files / 11 overlapping this PR's files since the previous round, so this control tests what actually lands), with core/acp-bridge/sdk/cli rebuilt there; internal @qwen-code/{qwen-code-core,acp-bridge,sdk,qwen-code} links re-pointed into the base tree and realpath-asserted (this round also re-points sdk, which the PR now touches; the previous round's farm left it at head). readlink -f output quoted in logs; lockfile untouched by the PR, so reusing the root node_modules is a clean control.

cell oracle base (bbaba8b1) head (4802a7f7)
boot + session before install POST /session 200 ✓ (control) 200 ✓
control turn (boot model) fake-server request fake-model seen ✓ fake-model seen ✓
install provider POST /workspace/auth/provider 200, no runtimeSync field 200, runtimeSync.status=applied
provider status after install GET /workspace/providers stub listed (visible but unusable) stub listed
switch in pre-existing session POST /session/:id/model 500 Model 'stub-model-1' not found for authType 'openai' 200
post-switch turn fake-server wire stub-model-1 never served (control) model=stub-model-1 + Authorization: Bearer sk-stub-…10269

Witnesses: evidence/01-ab-head-new-model-live.png (19/19), evidence/02-ab-base-rejects-new-model.png (18/18). Both captures are second full runs of the same harness and agreed with the first runs cell-for-cell (stability cross-check).

The base cell reproduces #10184 exactly at the NEW base tip; the head cell closes it on top of 294 base-advance files, i.e. against what would actually merge.

Secondary probes (both arms, symmetric, re-measured)

probe base head
install with no session 200, no field 200, runtimeSync.status=deferred
install with unreadable user-level .env (EISDIR) 200, no field, persistence kept 200, runtimeSync.status=failed, persistence kept
delete installed model after switching 200, no field; session never switched 200 + runtimeSync.status=applied; stub gone from status; session kept its model; re-switch 500 readable
SSE model_switch_failed on bad switch error: "[object Object]" ← issue symptom, live error: "Model '…' not found for authType 'openai'"

Delta since the previous round

Commit 27257dfb (review feedback, production):

  1. syncModelProvidersRuntime no longer receives assertGenerationOpen from the routes; the guard moved into the workspace service (assertActiveGeneration() at every step boundary of reloadModelProviders, assertGenerationOpen still passed to reloadDaemonEnv). Verified fail-closed by reading the service and by the carried generation-close semantics test (M1 baseline includes it, green) — the route still maps a thrown generation error to 503 via sendGenerationClosedError.
  2. DELETE route now broadcasts the settings writes before runtime sync (UI sees the change while sync may still spend up to 30s on the ACP child). Pinned by the updated route test (broadcastSettingsChanged invocation order < syncModelProvidersRuntime); writes remains intact for the response fields (clearedActiveModel, requiresRestart) — verified by reading the handler and by the delete cell in the A/B.
  3. Timeout ladder: daemon child sync timeoutMs: 30_000 < SDK MODEL_PROVIDER_MUTATION_TIMEOUT_MS = 45_000 (deleteModel + installAuthProvider) < webui wrapper 50_000. Pinned at both ends by unit tests (SDK child-sync tests; webui does not preempt the SDK timeout for model-provider mutations).
  4. settings.ts: warn log when a reloaded scope file is not a JSON object — pinned by the new assertion in settings.test.ts (settings file is not a JSON object), which is NOT in the environmental failing cluster.
  5. i18n wording drop ("Retry or") — pinned by App.test.tsx.

Commit 4802a7f7 (tests only): mutation A/B across test files (old = 27257dfb, new = merge head; production identical between the two):

mutant old tests new tests kill attribution
control, unmutated (Session/acpAgent/SDK filtered) green green (B0-B2)
M-S1 Session.reloadModelProvidersFromDisk ignores workspace-scope failure survived killedexpected [Function] to throw an error (new workspace-scope test) commit-3 new Session test
M-A1 ext-method handler ignores workspace-scope failure survived killedexpected { configsRefreshed: 2 } to deeply equal { configsRefreshed: 0, configsFailed: 1 } (multi-session test) commit-3 workspace-failure branch
M-A2 ext-method reloads Workspace before User survived killedexpected 1st "spy" call to have been called with [ 'User' ] commit-3 nth-call order assertions
M-D1 deleteModel loses 45s timeout survived killedwaits past the daemon child-sync deadline… commit-3 abort-respecting fake (see note)
M-D2 installAuthProvider loses 45s timeout survived killedgives provider installation the same child-sync headroom commit-3 abort-respecting fake

No mutant regressed killed→survived. Witness: evidence/03-mutation-matrix-old-vs-new.png.

Note on M-D1/M-D2 old-arm survival (why it is the finding, not noise): with the 45s arg removed the client falls back to its 30s default and aborts at t=30s — but the OLD fake fetch ignores the abort signal, so the client's awaited promise still resolves at 31s and the old assertions pass. The old tests therefore never exercised the timeout at the wire; commit 3's abort-listener fake is what makes the 45s headroom observable. This is the "scenario never reached the code under test" failure mode, fixed by the strengthening commit; the new tests kill both mutants with the intended assertions.

Carry-over mutations (re-measured at new head):

row mutation result
M1 control (4 sync tests, server.test.ts) unmutated green (4 passed)
M1 auth-provider route sync wiring removed killed — 3 red (same three as previous round: sync-after-replacement, warning-state, generation-close)
M2 control (run-qwen-serve.test.ts) unmutated green (1 passed)
M2 configsFailed no longer marks failed killedexpected { status: 'applied' } to deeply equal { status: 'failed' } (same assertion as previous round)
M2-alone vs facade suite same mutant survived — redundant defence: the facade test's runtimeEnvironmentApplied: false path holds the line (layered guards); combination row below proves the set
M-COMB both failed-marking hunks reverted killed on facade (1 red) and on run-qwen-serve (1 red) — the guard set is load-bearing

Reviewer Test Plan walk-through (per step, at new head)

  1. stub + serve + session before install — performed (A/B cell A1).
  2. install → runtimeSync.status=applied; route selectable in pre-existing session without restart — performed (A3/A6/A7/A8).
  3. install another model during an active turn; turn keeps its generator — not driven E2E (carried; pinned by core unit test getContentGenerator() unchanged across reload, green in gates).
  4. delete → gone from status, session not switched, stale route readable error — performed (B1-B5).
  5. recreate ACP channel; replacement child uses new model + updated key — not driven E2E (carried).
  6. inject parent-env / child-refresh failures → 200 + failed; Web Shell warns only for failed — env-failure side performed (E1-E3); child-refresh-failure injection carried (unit-pinned); Web Shell warn gating pinned by App.test.tsx (component level).

Targeted gates (exact counts, at new head)

suite result
acp-bridge bridge.test.ts 804/804
cli server.test.ts 1105/1105
cli run-qwen-serve.test.ts 329/329
cli acpAgent.test.ts 515/515
cli session/Session.test.ts 721/721
cli settings.test.ts 161/174 — see Finding 1 (12 base-identical environmental + 1 PR-new test in same cluster)
cli settingsWatcher.test.ts 46/46
cli routes/workspace-models.test.ts 24/24
cli workspace-service/__tests__/facade.test.ts 119/119
core config.test.ts 586/586
sdk DaemonClient.test.ts 356/356
web-shell App.test.tsx + AuthMessage.dom.test.tsx 553/553
webui workspace/actions.test.ts 18/18

Gate liveness: the mutation rows prove the runners and collections live (mutants turned the selected suites red with the intended assertions); the settings.test.ts cluster is proven environmental by the base-side byte-identical comparison.

Findings (non-blocking)

  1. settings.test.ts environmental cluster persists at the new base tip; head comparison — base (bbaba8b1): 12 failed / 161 passed, names and expected undefined to be … signature byte-identical to the previous round's base cluster. Head: 13 failed / 161 passed (174) — exactly the base 12 plus one head-only failure, the PR's new should keep workspace settings empty when reloading the home directory (base-only: none). Same structure as the previous round: the PR-new test lands in the environmental cluster, its failing assertion downstream of the PR's change. The four reload tests pinning the PR's boolean return, and the new non-object-warn assertion, are outside the cluster. Not a PR regression; recommend confirming the suite is green in project CI (author tested macOS only).
  2. failedFiles="[object Object]" in the daemon env-file warning — stands on both arms (re-driven this round). Pre-existing, out of scope, follow-up candidate.
  3. 20 remaining err instanceof Error ? err.message : String(err) siblings in bridge.ts (22 at base tip; PR converts exactly the two model_switch_failed emitters). Plus one newly observed sibling: the generic [ERROR] [DAEMON] route=POST /session/:id/model … [object Object] server log line (both arms, pre-existing). Informational; scope matches the bug report.

Not covered

  • Active-turn generator retention E2E (plan step 3) and ACP channel recreation E2E (step 5) — carried from previous round, unit-pinned only.
  • Child-refresh failure injection E2E (step 6 second half) — unit-pinned (facade + run-qwen-serve tests).
  • Browser-level Web Shell E2E — component dom tests green instead.
  • Full-repo npm run typecheck/lint — PR's own CI covers; this round ran the affected suites and the tsc builds of both arms (base arm compiled clean as part of the control build).
  • Flakiness gate: not re-run as a standalone 5-round loop this round; stability evidence instead from (a) both A/B arms executed twice (official + capture) with identical results, and (b) the mutation matrix re-running the filtered suites 20+ times with consistent outcomes.
  • Windows/Linux author-side runs (author-declared untested).

Methodology

Environment: CI merge-ref checkout (HEAD merge 01a46eb, HEAD^1 base bbaba8b1, HEAD^2 head 4802a7f7, depth 2 with the three snapshot commits additionally reachable), node:22 container; head dist prebuilt by the lane. Base control: worktree tmp/base-tree at HEAD^1, core/acp-bridge/sdk/cli rebuilt there with the repo's own build scripts; full-mirror node_modules farm with @qwen-code/{qwen-code-core,acp-bridge,sdk,qwen-code} re-pointed into the base tree (realpath asserted; unchanged packages link head dists, identical on both arms). Harnesses drive real daemons over real HTTP with a loopback OpenAI stub recording every request as the wire oracle; mutation runs swap test-file versions via git show and restore from the merge commit, with git-status-clean asserted after every phase. Raw logs in logs/, harnesses in harness/.

Flakiness gate log

rounds=5 files=14 skipped=0
file packages/acp-bridge/src/bridge.test.ts: (cd packages/acp-bridge) npx --no-install vitest run ./src/bridge.test.ts
file packages/cli/src/acp-integration/acpAgent.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/acpAgent.test.ts
file packages/cli/src/acp-integration/session/Session.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/Session.test.ts
file packages/cli/src/config/settings.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settings.test.ts
file packages/cli/src/config/settingsWatcher.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settingsWatcher.test.ts
file packages/cli/src/serve/routes/workspace-models.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/routes/workspace-models.test.ts
file packages/cli/src/serve/run-qwen-serve.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/run-qwen-serve.test.ts
file packages/cli/src/serve/server.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/server.test.ts
file packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/workspace-service/__tests__/facade.test.ts
file packages/core/src/config/config.test.ts: (cd packages/core) npx --no-install vitest run ./src/config/config.test.ts
file packages/sdk-typescript/test/unit/DaemonClient.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/DaemonClient.test.ts
file packages/web-shell/client/App.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/App.test.tsx
file packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/AuthMessage.dom.test.tsx
file packages/webui/src/daemon/workspace/actions.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/workspace/actions.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/acp-bridge/src/bridge.test.ts: PP
  packages/cli/src/acp-integration/acpAgent.test.ts: PP
  packages/cli/src/acp-integration/session/Session.test.ts: PP
  packages/cli/src/config/settings.test.ts: PP
  packages/cli/src/config/settingsWatcher.test.ts: PP
  packages/cli/src/serve/routes/workspace-models.test.ts: PP
  packages/cli/src/serve/run-qwen-serve.test.ts: PP
  packages/cli/src/serve/server.test.ts: PP
  packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: PP
  packages/core/src/config/config.test.ts: PP
  packages/sdk-typescript/test/unit/DaemonClient.test.ts: PP
  packages/web-shell/client/App.test.tsx: PP
  packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: P
  packages/webui/src/daemon/workspace/actions.test.ts: P

verdict: timeout
summary: the 15-minute budget elapsed before two full rounds completed (1 done) — no flakiness signal either way

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settings.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settingsWatcher.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/routes/workspace-models.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: P (exit 0)
round 1 · packages/core/src/config/config.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: P (exit 0)
round 1 · packages/webui/src/daemon/workspace/actions.test.ts: P (exit 0)
round 2 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 2 · packages/cli/src/config/settings.test.ts: P (exit 0)
round 2 · packages/cli/src/config/settingsWatcher.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/routes/workspace-models.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: P (exit 0)
round 2 · packages/core/src/config/config.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)

Evidence images

01-ab-head-new-model-live

02-ab-base-rejects-new-model

03-mutation-matrix-old-vs-new

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@doudouOUC
doudouOUC enabled auto-merge August 27, 2026 16:27
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on 4802a7f767d7b300a4109d07e64ef296dad89658 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 4802a7f767d7b300a4109d07e64ef296dad89658既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

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

  • packages/sdk-typescript/test/unit/DaemonClient.test.ts:829 — [probe] installAuthProvider headroom test nested inside describe('deleteModel')
  • packages/cli/src/acp-integration/session/Session.test.ts:961 — [probe] reloadModelProvidersFromDisk happy path cannot discriminate an apply-before-reload mutant
  • packages/sdk-typescript/test/unit/DaemonClient.test.ts:792 — [probe] 31s headroom tests pin only the 30s lower bound, not the 45s mutation-timeout cap
  • packages/cli/src/acp-integration/session/Session.test.ts:960 (+1 locations) — [probe] providerProtocol ?? {} reload default unpinned at both reload call sites
  • packages/cli/src/acp-integration/acpAgent.test.ts:4567 — [probe] initializing-session reload test pins call counts only, never the applied provider arguments
  • packages/sdk-typescript/test/unit/DaemonClient.test.ts:853 — [probe] the only installAuthProvider test never inspects the recorded request

Convergence: round 3 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 5 (5 new). Findings keep coming back to the same files: packages/cli/src/acp-integration/acpAgent.test.ts (findings in round 2; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

已审查——无阻断问题。 建议见行内评论。

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

收敛情况:第 3 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 5 条(其中 5 条首次提出)。发现反复回到同一批文件:packages/cli/src/acp-integration/acpAgent.test.ts(第 2 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。本轮没有未决的 Critical,因此"合入后把剩余 Suggestion 线程转到后续 issue"是一个可选的结束方式——已合入的 PR 不会继续发散。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/cli/src/acp-integration/acpAgent.test.ts Outdated

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: build-and-test — packages/cli unit tests timed out after 540 seconds.

Not reviewed: build-and-test — local verification ran on Node 24.18.1 rather than the required Node 22.

Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.

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

  • packages/cli/src/serve/routes/workspace-auth.ts:354 — [review] Provider installation lacks a test that pins persistence before runtime synchronization.
  • packages/cli/src/serve/routes/workspace-models.ts:304 — [review] The deletion route does not directly test generation closure thrown by runtime synchronization.
  • packages/sdk-typescript/src/daemon/DaemonClient.ts:360 — [review] The timeout tests prove 31 seconds succeeds but do not pin the intended 45-second deadline.
  • packages/web-shell/client/App.tsx:11308 — [review] Delete-model UI tests do not prove applied, deferred, and absent statuses remain warning-free.

Convergence: round 3 posted 8 inline comment(s), 8 of them reported for the first time. Findings keep coming back to the same files: packages/cli/src/acp-integration/session/Session.ts (findings in round 2; 1 more now). (Evidence: the previous round was recovered from a marker this account did not post, so those rounds may not be this account's own.) A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

未审查:build-and-test — packages/cli unit tests timed out after 540 seconds。

未审查:build-and-test — local verification ran on Node 24.18.1 rather than the required Node 22。

未审查:反向审计——在 5 轮的反审轮数上限内未收敛。

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

收敛情况:第 3 轮发布了 8 条行内评论,其中 8 条是首次提出。发现反复回到同一批文件:packages/cli/src/acp-integration/session/Session.ts(第 2 轮已出过发现,本轮又有 1 条)。(证据说明:上一轮的数据来自并非本账号发布的标记,上述轮次可能不属于本账号。)一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

— gpt-5.6-sol via Qwen Code /review (v0.22.2)

Comment thread packages/cli/src/acp-integration/acpAgent.ts
Comment thread packages/cli/src/acp-integration/acpAgent.ts Outdated
Comment thread packages/cli/src/acp-integration/session/Session.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-models.ts
Comment thread packages/cli/src/serve/run-qwen-serve.ts Outdated
Comment thread packages/cli/src/serve/server.ts Outdated
Comment thread packages/sdk-typescript/src/daemon/DaemonClient.ts Outdated
Comment thread packages/web-shell/client/App.tsx Outdated
doudouOUC and others added 5 commits August 30, 2026 01:08
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC
doudouOUC force-pushed the fix/issue-10184-runtime-model-provider-sync branch from 98b789a to f9abe3f Compare August 29, 2026 17:14

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

  • D8-6 publish-loop re-iteration branch unpinned — already reported as R4-2 (comment 3879560855, acpAgent.ts:13042) and deferred to follow-up by the author
  • D8-7 DELETE sync-rejection branches untested — already reported in the round-2 deferred list (review 5042583992, workspace-models.ts:305) and round-3 deferred list (review 5044922045, workspace-models.ts:304)
  • D8-8 publish-loop change-detection disjuncts exercised only in their false state — already reported (comment 3882343587, acpAgent.ts:13037) and deferred to follow-up by the author
  • D8-10 partial-persist path discards the runtimeSync result — already reported in the round-5 deferred list (review 5053125741, workspace-models.ts:280) and discussed as R6-8 (comment 3883342901, workspace-models.ts:287)
  • D8-11 dynamic-workspace fail-closed branches uncovered — already reported as R4-8 (comment 3879560897, run-qwen-serve.ts) and deferred to follow-up by the author
  • D8-14 unconditional revision bump forces a redundant re-auth — already reported (comment 3882343609, acpAgent.ts:12100) and deferred to follow-up by the author
  • D8-15 envFileReadFailed discarded without diagnostics — same family as the sync-failure stderr error detail already discussed and declined by the author with maintainer acceptance of the design's secret-safety contract (threads 3871829201, …

Not reviewed: build-and-test — install + core/acp-bridge builds green (one infrastructure timeout), but zero test suites ran within the per-call budget and test-efficacy was unmeasurable (all 18 probes inconclusive on build state); Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally; Test (macos-latest / windows-latest, Node 22.x) matrix jobs were also skipped.

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

4 Suggestion(s) were drafted inline past the resolved critical posting floor; the CLI moved them into the deferral list below (floor enforcement).

Deferred under the convergence posture (round 8, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • packages/web-shell/client/components/messages/AuthMessage.tsx:197 — [probe] Critical [fails-closed] [new-surface] StrictMode wedges the install dialog in "Saving…" — owner-change reset effect keyed on the transient ownerChanged boolean neve…
  • packages/cli/src/serve/server.test.ts:33364 — [review] D8-2: The runtime-sync aggregation's rejected-secondary clause ( result.status === 'rejected' in syncModelProvidersRuntime ) has no test pin — every test in this block resolves the se…
  • packages/web-shell/client/App.tsx:11534 — [review] D8-5: A combined delete response {removed: true, requiresRestart: true, runtimeSync: {status:'failed'}} — reachable when the deleted model id also appears in modelFallbacks (the route r…
  • packages/cli/src/acp-integration/acpAgent.ts:13037 — [review] D8-9: This network-bound ensureAuthenticated runs after the last options.signal?.throwIfAborted() (line 12991) with no re-check, so a session can publish past its initializat…
  • packages/web-shell/client/components/messages/AuthMessage.tsx:199 — [review] D8-13: The owner-change reset clears the load error without re-triggering the catalog fetch. The dialog is App-level state and survives session switches, while the…
  • packages/web-shell/client/daemon/workspace/actions.ts:1036 — [review] provider mutations lost their client deadline — timeout 0 disables it; a wedged daemon leaves the UI permanently busy
  • packages/cli/src/serve/run-qwen-serve.test.ts:7658 — [review] overlay env-reload failure branches unexercised — 0 of 10 reloadModelProviders call sites drive them
  • packages/cli/src/serve/run-qwen-serve.ts:5513 — [review] four drifted copies of the fail-closed env-reload algorithm; the primary lacks the apply-step catch its twins have

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

中文说明

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

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

未审查:build-and-test — install + core/acp-bridge builds green (one infrastructure timeout), but zero test suites ran within the per-call budget and test-efficacy was unmeasurable (all 18 probes inconclusive on build state); Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally; Test (macos-latest / windows-latest, Node 22.x) matrix jobs were also skipped。

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

4 条 Suggestion 在已解析的 critical 发布下限之外被起草为行内评论;CLI 已将其移入下方延后清单(下限强制执行)。

收敛姿态下延后(第 8 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 8 条(原文未翻译,列表见上方英文部分)。

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

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

Comment thread packages/cli/src/acp-integration/acpAgent.ts Outdated
Comment thread packages/cli/src/serve/run-qwen-serve.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Addressed the two round-8 Critical findings in eca0424.

Finding Action
R8-1 deferred activation could restore stale settings-managed environment values Deferred activation now atomically reloads the Session settings immediately before environment application, and preserves the current environment if that reload fails.
R8-2 full workspace reload discarded the fail-closed parent-environment result The reload response and settings_reloaded event now expose runtimeEnvironmentApplied, including false for fail-closed and thrown parent-environment refresh paths.

Verification: acpAgent 533/533, workspace facade 124/124, run-qwen-serve 357/357, npm run build, and npm run typecheck.

Suggestion-level and explicitly deferred findings were not expanded in this round to preserve convergence.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 161 passed · 0 failed · 161 total

Flakiness gate: ⚠️ timeout — the 15-minute budget elapsed before two full rounds completed (0 done) — no flakiness signal either way

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:161 通过 · 0 失败 · 161 总计

抖动门:⚠️ timeout — the 15-minute budget elapsed before two full rounds completed (0 done) — no flakiness signal either way

Verification report

PR #10269 — fix(serve): Hot-reload runtime model providers (follow-up round 7)

Verdict: merge-ready161/161 scripted assertions passed, 0 unexpected failures. Verified head: eca0424f567020c1c9ad730b32f0460b45f009d6 (git rev-parse HEAD^2); merge commit 95c31f5a11; base tip 413b6d15d3d7bb17e22b05e07b008efb1cb7f43e (HEAD^1). Both the PR head and the base advanced since round 6: head a18d30cfcc (round 6) → rebased chain 3fcb3aee → f9abe3f7 → eca0424f56 (two new commits: "update daemon SDK mocks after cutover" and "codex: address PR review feedback"); base 5bd21da29d413b6d15d3 (main moved on #9638, which lands on top of #9811's WebShell cutover). This round verifies the merged tree at the new base: the delta's two commits got their own attribution and a mutation matrix, the central A/B re-ran fresh (harness rebuilt from source), and every carried finding was re-measured, never diffed.

中文 — 判定:✅ 通过 · 可合入(agent 判定,follow-up 第 7 轮)
  • 结论merge-ready161/161 个脚本断言全部通过、0 个意外失败。本轮 head 在 rebase 后新增两个提交(f9abe3f7 SDK mock 跟随 cutover、eca0424f56 codex 评审反馈);main 前进了 fix(cli): deliver teammate messages at tool-round boundaries, not whole-task end #9638(落在 refactor(vscode-ide-companion): migrate chat to WebShell and qwen serve #9811 WebShell cutover 之后),498 个文件。验证对象是新 base(413b6d15d3)上的合并树 95c31f5a11
  • 合并完整性(见证 00):43 个 PR 文件中 32 个逐字节采用分支版本;11 个因 main 同时修改而自动合并——逐一核实:无冲突标记、自动合并未丢弃任何 PR 标记行、其余全部文件与 base 逐字节一致。快照 baseRefOidfe34a5cf=refactor(vscode-ide-companion): migrate chat to WebShell and qwen serve #9811)比 merge-ref 的 base(413b6d15d3=fix(cli): deliver teammate messages at tool-round boundaries, not whole-task end #9638)旧,用内容标记(dynamicCommandTranslation 键)定序确认。
  • A/B 结论(见证 01/02):先建 Session 再装 Provider——base 臂切换返回 500 且 SSE 出现字面量 [object Object]bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart #10184 全部症状复现、runtimeSync 字段缺失);head 臂 runtimeSync.status=applied,旧 Session 立即切换成功(200),stub wire 层证实后续请求携带安装时写入的 model+key。主流程 2 次/臂 + base 1 次,逐格一致;本轮零基建污染(第 6 轮曾出现 3 次负载超时,本轮全部干净)。
  • 环境失败契约(见证 03):$QWEN_HOME/.env 损坏(EISDIR)时 head 200 + runtimeSync.status=failed、provider 与 key 仍持久化、daemon 健康(7/7);base 对照(200、无字段、持久化保留,7/7)。
  • 主动回合保护(见证 03):turn 执行中安装 Provider(200 + applied),当前 turn 用原 model+boot key 完成,之后新模型可选、下一 turn 用新凭据(8/8)。
  • 新提交 delta 的变异矩阵(见证 04):4 个载荷守卫全部被预期断言杀死(D1 延迟激活守卫 3 red、D3 字段发射 1 red、D4 mock 路径回退触发 Missing "./daemon-react-sdk" specifier in "@qwen-code/webui" package、D5 生产者 true→false 使同步状态 fail-closed 2 red);1 个存活(D2=reload catch 臂)分类为覆盖缺口(同文件阳性对照 D3 已红)。
  • 门禁(见证 05):14 个受影响套件全绿,合计 5 千余用例(含 main 前进带来的新增用例),0 失败。
  • 上轮 findings 复测:F1(settings.test.ts 环境性失败簇)12 个 base 失败名在 head 逐字节重现、唯一 head 独有失败仍是 PR 新测试且落在同簇;F2(failedFiles="[object Object]")两臂复现维持;F3(bridge.ts 同源站点)39→37 维持;F4 本轮 2 次未变异运行(head+base)均 357/357 全绿。均非阻塞。
  • 本轮新增 finding(非阻塞):模型切换失败时,daemon 自身的 [ERROR] [DAEMON] route=… 日志行仍输出字面量 [object Object](head 日志 1 处、base 2 处,两臂行为一致,非本 PR 引入)——根因是 sendBridgeError 兜底路径的三处 String(err)error-response.ts:905–942),与 bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart #10184 同属一个 bug 类、同一条失败链路,只是落在运维日志面而非客户端面;仓库已有 extractErrorMessage 可直接复用。

Previous-finding status table (re-measured at new head + new base, never diffed)

# finding (round ≤ 6) severity status at merge 95c31f5a11 (head eca0424f56, base 413b6d15d3) re-measurement
F1 settings.test.ts environmental cluster; PR-new test lands in it non-blocking stands (re-measured) base tip 413b6d15d3: 12 failed / 162 passed (174); merged head: 13 failed / 163 passed (176). Scripted set comparison (logs/f1-{base,head}-failures.txt, witness 00-merge-integrity-and-f1.png): 12 byte-identical shared failures, zero base-only; the single head-only failure is exactly the PR's should keep workspace settings empty when reloading the home directory, inside the same home-dir/env cluster. Not a PR regression — reproduces on both arms in this Linux container (author tested macOS only).
F2 daemon env-file warning logs failedFiles="[object Object]" non-blocking stands Re-driven on both arms via harness/f2-probe.mjs (disposable QWEN_HOME, .env replaced with a directory → EISDIR, real daemon boot): warn line one or more runtime env files could not be read + failedFiles="[object Object]" present on head AND base (3/3 checks each arm). Pre-existing, out of scope.
F3 err instanceof Error ? … : String(err) siblings in bridge.ts informational stands scripted census: 39 → 37 occurrences of : String(; git diff HEAD^1..HEAD on bridge.ts changes exactly 4 lines (−2/+2) — the two model_switch_failed emitters converted to extractErrorMessage(err). The A/B proves the reported symptom (SSE [object Object] on model switch) is gone on head ([object Object]=0 in both switch censuses).
F4 Flakiness-gate P→F on run-qwen-serve.test.ts (round-3 lane) could not be reproduced informational stands (not reproduced) Round-7 ledger: unmutated run-qwen-serve.test.ts on the merged head (357/357, mut-tree) and on the base arm (357/357, base tree) — identical counts both arms, zero failures (logs/f4-base-ledger.log). The D5 mutant run of the same suite went red by design (2 failures), so the runner can fail; it simply never fails unmutated here.
F5 (round-6 Finding 2) harness infra: load-tainted ACP boots on the shared runner infra not re-triggered All six round-7 daemon runs booted clean (health 2.6–5.9 s), zero infraFailure fields, no timeouts or port errors in any daemon log; no replacement runs were needed.
F6 (round-6 N4 / M6 drift) N4 secondary envfail coverage gap; M6-clause pin drift from main's advance informational superseded by this round's delta matrix for the touched paths; N4 itself not re-mutated N4's exact mutant (secondary provider-reload envfail early return) was not re-run this round — see Not covered. The delta matrix re-pins the adjacent guards it shares a pattern with (D1/D5, below). M6-clause drift is a main-side fact that still stands (component/test unchanged by this PR's delta).

Central claim + A/B (re-measured fresh at the new merge tree and the new base tip)

Central claim (carried): a provider installed (or model deleted) after a session exists becomes usable in that live session without restarting qwen serve; mutation responses expose runtimeSync (applied/deferred/failed); a failed runtime refresh never rolls back persistence. The round-6 harness was not reusable (prior-round artifacts are not mounted), so it was rebuilt from the source (harness/ab-harness.mjs + harness/stub-server.mjs, mock-free) from the serve/route code at this merge commit.

Harness: real node <cli dist> serve per arm with a disposable QWEN_HOME and workspace, bearer token, --allow-private-auth-base-url; a real loopback OpenAI-compatible stub records every request (model + Authorization) as the wire oracle; the session SSE stream is censused live. The session is created before the mutation. Base arm = worktree at HEAD^1 fully rebuilt with the repo's own build scripts over a symlinked node_modules farm; all 26 @qwen-code/* links realpath-asserted into the base tree; base dist proven free of all six PR symbols (runtimeSync, syncModelProvidersRuntime, reloadModelProvidersDaemonEnv, reloadRuntimeOverlaySnapshotForModelProviders, runtimeEnvironmentApplied, reloadScopesFromDiskAtomically: 0 files across cli/core/acp-bridge dist), with the head dist as control-on-the-control (4/5/6 files). Official runs: 2 head + 1 base (main), 1 per arm (envfail), 1 head (activeturn) — all cell-for-cell stable, zero infra taint. Witnesses: 01-ab-head-new-model-live.png (head run 2, 13/13), 02-ab-base-rejects-new-model.png (base, 13/13), 03-envfail-and-activeturn.png (7/7 + 8/8).

cell oracle base (413b6d15d3) head (merge 95c31f5a11) ×2 runs
D0 daemon boot GET /health 200 ✓ 200 ✓
A1 session before mutation POST /session {cwd} 200 ✓ 200 ✓
A2 control turn (boot model) stub wire fake-model + Bearer sk-boot-10269 same ✓
A4 install after session POST /workspace/auth/provider 200, no runtimeSync 200, runtimeSync.status=applied
A5 provider status GET /workspace/providers stub listed (visible, unusable) stub listed
A6 switch in pre-existing session POST /session/:id/model 500 Model 'stub-model-1' not found for authType 'openai' 200 (+ qwenModelSwitch meta with installed baseUrl/key)
A7 SSE symptom (issue #10184) SSE census model_switch_failed=1, literal [object Object]=1 model_switched=1, [object Object]=0
A8 post-switch turn stub wire boot model + boot key (stub never served) ✓ stub-model-1 + Bearer sk-installed-10269
B1 delete model DELETE /workspace/models 200, no field 200, runtimeSync.status=applied
B2 gone from status GET /workspace/providers gone; boot model kept gone; boot model kept
B3 session not implicitly switched SSE census no model_switched no model_switched
B4 re-switch stale route 500 + census 500 + SSE [object Object]=1 500 + readable details, [object Object]=0 in SSE/HTTP (the daemon's own stderr log line still carries it — Finding 4)

Env-failure contract (--mode envfail, witness 03): user-level .env replaced with a directory (EISDIR on read) mid-run, then a mutation. Head (7/7): 200 + runtimeSync.status=failed, provider entry and API key still persisted to settings.json, daemon healthy. Base (7/7): 200, no runtimeSync field, persistence kept, daemon healthy — base never re-reads env at mutation time, so the same corruption stays silent there; the PR strictly increases observability.

Active-turn generator retention (--mode activeturn, witness 03; Reviewer Test Plan step 3): stub holds the completion for 7 s; a provider install lands mid-turn (200 + runtimeSync.status=applied); the in-flight turn finishes on the original model + boot key (wire oracle: models=["fake-model"], auths=["Bearer sk-boot-10269"]); the new model is selectable afterward and serves the next turn with the installed key. 1 run × 8/8 checks (round 6 ran 2; the behavior re-proved identical at this tree, so one clean run was budgeted this round).

Delta verification: the two commits since round 6

Round-6 head (a18d30cfcc) is unreachable in this depth-2 checkout, but the rebased chain is: 3fcb3aee (round-6 content, "synchronize user providers across runtimes") → f9abe3f7eca0424f56, both new commits' parents present, so the delta is directly diffable (git diff 3fcb3aee..eca0424f56: 11 files, +170/−21).

  • f9abe3f7 (2 files, test-only) — repoints the vi.mock specifier in AuthMessage.dom.test.tsx and main-boot.test.tsx from @qwen-code/webui/daemon-react-sdk to @qwen-code/web-shell/daemon-react-sdk. The cutover itself is main-side (refactor(vscode-ide-companion): migrate chat to WebShell and qwen serve #9811, landed before this merge): packages/web-shell/client/daemon-react-sdk.ts exists at the base tip and is what production code imports; the PR's own +1 line there exports the new DaemonModelProviderRuntimeSyncResult type through the barrel. Mutant D4 (revert the path): killed — Error: Missing "./daemon-react-sdk" specifier in "@qwen-code/webui" package plus 2 red main-boot tests. The commit is load-bearing, not cosmetic.
  • eca0424f56 (9 files) — two functional pieces:
    1. Deferred-activation fail-closed settings re-read (acpAgent.ts): installManagedConversationActivation now calls settings.reloadScopesFromDiskAtomically([User, Workspace]) and only applies reloadEnvironment if that is not false; on failure it warns and keeps the current environment. reloadScopesFromDiskAtomically (settings.ts:653, earlier PR commit) snapshots all scope files, reloads each, and restores the snapshots on any failure — all-or-nothing. Same ?.(...) !== false pattern as the publication-time refresh already verified in round 6.
    2. runtimeEnvironmentApplied plumbing (workspace-service, SDK types/events, run-qwen-serve): reload() captures the field from reloadDaemonEnv (or false on reject), and exposes it additively in both the settings_reloaded event and the HTTP response (conditional spread: omitted when no env helper is wired). The reloadModelProviders path already consumed it (failed = result.runtimeEnvironmentApplied === false), so a degraded parent env now fail-closes the mutation's runtimeSync.status — proven end-to-end by mutant D5.

Mutation matrix over the delta guards (scratch worktree at the merge commit)

Every mutant is a single-point revert applied by exact-match replacement (anchor uniqueness asserted: D1 ×1, D2 ×1, D3 two 1-occurrence anchors, D4 ×1 per file, D5 ×1), restored via git checkout (tracked-dirty=0 asserted after each). Witness 04-mutation-matrix-delta.png; logs in logs/mutations/.

mutant / control result killing / pinning assertion
control (unmutated: facade reload subset, acpAgent deferred subset, run-qwen-serve, 2 web-shell files) green 10/10, 3/3, 357/357, 8/8
D1 deferred-activation guard reverted (acpAgent.ts) killed (3 red) load/resume defers standalone restore side effects… + keeps the current environment when deferred activation cannot refresh settingsexpected "spy" to be called 2 times, but got 1 times — reproduces round-5/6's M4c kill signature on the hardened path
D2 catch-arm runtimeEnvironmentApplied = false removed (workspace-service reload()) survivedcoverage gap no test drives a non-fatal reloadDaemonEnv rejection through reload(); the only reject-driven test (stops before child reload when the runtime generation closes) rethrows before the response is built, so the assignment is unobservable there. Behaviour with the guard is fail-closed by construction; a test to write, not a defect. Same-file positive control (D3) red ⇒ harness live
D3 field emission removed from response + event (workspace-service reload()) killed (1 red) surfaces a parent runtime environment reload failuretoMatchObject({ childReloaded: true, runtimeEnvironmentApplied: false }) failed
D4 mock path reverted to @qwen-code/webui (2 web-shell tests) killed (2 red + collect error) Missing "./daemon-react-sdk" specifier in "@qwen-code/webui" package; main-boot mounts into #root on a normal boot + clears the boot fallback… red
D5 primary producer runtimeEnvironmentApplied: true → false (run-qwen-serve.ts) killed (2 red) rebuilds runtime env from the immutable daemon base after workspace reloadexpected { status: 'failed' } to deeply equal { status: 'applied' } (the provider-sync path fail-closes on the producer's false — end-to-end wiring) + toMatchObject({ runtimeEnvironmentApplied: true })

4/4 load-bearing delta guards killed by their intended assertions; the 1 survivor is classified (coverage gap D2); suite control green; no mutant regressed. Read-site audit of the added field (AGENTS.md rule): runtimeEnvironmentApplied is set in every reloadDaemonEnv result path in run-qwen-serve.ts (9 producers) and consumed at workspace-service/index.ts:1454 (provider-sync fail-closed) plus surfaced in reload responses/events; no client-side reader exists yet (web-shell reads only runtimeSync.statusApp.tsx:11534, AuthMessage.tsx:304) — an observability hook, not a dead switch, since it is set and exposed; recorded as informational.

Targeted gates (exact counts, merged tree, serialized vitest; witness 05-targeted-gates.png)

suite result note
cli acpAgent.test.ts 535/535 round 6: 526 (+9 from delta/main)
cli acpAgent.worktree.test.ts 3/3
cli Session.test.ts 738/738 round 6: 724
cli server.test.ts 1120/1120 round 6: 1109; includes fan-out unit gates
cli run-qwen-serve.test.ts 357/357 identical count on the base arm too (A/A ledger)
cli workspace-service facade.test.ts 124/124 round 6: 123 (+1 delta test)
cli environment.test.ts 31/31
cli settingsWatcher.test.ts 46/46
cli routes/workspace-models.test.ts 24/24
core config.test.ts + modelRegistry.test.ts 665/665 round 6: 659
acp-bridge bridge.test.ts 827/827 round 6: 804
sdk DaemonClient.test.ts 377/377 round 6: 367
web-shell App.test.tsx + AuthMessage.dom.test.tsx + main-boot.test.tsx 591/591 includes the runtimeSync.status=failed toast/message tests
web-shell daemon/workspace/actions.test.ts 18/18 moved from webui by main's cutover; webui's old path no longer exists

Gate liveness: the mutation matrix's 4 killed mutants turned these same runners red with the intended assertions in the same tree. settings.test.ts is deliberately not gated — it is Finding F1. The old packages/webui/src/daemon/workspace/actions.test.ts from round 6's table no longer exists at this base (deleted by main's cutover, not by this PR — the PR touches zero webui files at this merge).

Findings (non-blocking)

  1. settings.test.ts environmental cluster persists at the new base tip — base 413b6d15d3: 162/174 passing; merged head: 163/176. The 12 base failure names re-appear byte-identically on head (scripted set comparison, witness 00); the single head-only failure is the PR's own should keep workspace settings empty when reloading the home directory, inside the same home-dir/env cluster. Not a PR regression; reproduces on both arms in this Linux container (author tested macOS only). Repro: cd packages/cli && npx vitest run src/config/settings.test.ts.
  2. D2 coverage gap (test to write): reload()'s catch arm (runtimeEnvironmentApplied = false when reloadDaemonEnv rejects) survived mutation — no test drives a non-fatal rejection through that path; the generation-closed test rethrows before the response exists. The guard itself is fail-closed and consistent with reloadModelProviders's catch; recommend a facade test with a rejecting reloadDaemonEnv asserting runtimeEnvironmentApplied: false in both the response and the settings_reloaded event.
  3. runtimeEnvironmentApplied has no client reader yet (informational): set by all producers, consumed server-side by the provider-sync fail-closed check, exposed additively in the reload response/event — but web-shell surfaces only runtimeSync.status. Matches the design doc's stated intent (observability); noted per the added-field read-site audit so the asymmetry is a conscious choice.
  4. The daemon's own error log still renders [object Object] on the fixed failure path (sibling of the bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart #10184 class, pre-existing, out of the PR's touched files). Head-run evidence: logs/head/head-main-2.daemon.log:43[ERROR] [DAEMON] route=POST /session/:id/model sessionId=22a02988-… [object Object] for the intentionally-failed B4 switch. Cause: the generic bridge-error path sendBridgeError (packages/cli/src/serve/server/error-response.ts:905–942) logs via three err instanceof Error ? … : String(err) sites (the daemonLog.error line, the emitDaemonLog error.message telemetry field, and the legacy stderr fallback); a JSON-RPC-shaped object error ({code: -32603, message: 'Internal error', data: …} — the exact shape the HTTP body carried) stringifies to [object Object]. Census: head daemon log = 1 occurrence (B4 only; A6 succeeded), base = 2 (A6 + B4) — identical behaviour both arms, so the PR neither caused nor changed it; the PR fixed the client-visible surfaces (SSE + readable HTTP details) while the operator-facing log/telemetry record of the same failure loses its message. The file is not in the PR's diff; an extractor already exists in the codebase (extractErrorMessage, used by the PR's SSE fix), so the follow-up is mechanical. Not blocking.
  5. failedFiles="[object Object]" in the daemon env-file warning — stands on both arms (re-driven this round via f2-probe.mjs). Pre-existing, out of scope, follow-up candidate.
  6. 37 remaining err instanceof Error ? … : String(err) siblings in bridge.ts (39 at the new base tip; PR converts exactly the two model_switch_failed emitters, diff −2/+2). Informational; scope matches the bug report, and the A/B proves the reported symptom is fixed. Note the round-6 census was scoped to bridge.ts; Finding 4 shows the same class also clusters (×3) in error-response.ts.
  7. Harness infra disclosure (clean round): all six daemon runs (2 head main, 1 head envfail, 1 head activeturn, 1 base main, 1 base envfail) booted first-try with zero infra failures — no load-tainted replacements were needed this round (round 6 needed three). Runtime env: node 22 container, 64 CPUs; vitest serialized per package tree.

Not covered

  • Reviewer Test Plan step 5 (ACP channel recreation E2E) — pinned by the acpAgent/Session/bridge suites (all green at the merged tree), not driven end-to-end. Steps 1–4 and 6 were driven E2E (A/B + envfail + activeturn).
  • Workspace-scoped fan-out E2E (user-scoped fan-out verified in round 6 with a two-runtime daemon; this round's delta does not touch fan-out) — pinned by server.test.ts fan-out unit tests (green) rather than a second E2E daemon.
  • Round 6's full 14-entry mutation matrix was not re-run — the delta matrix above covers the changed guards; round-6 guards' pins are re-asserted by the green gates that contain their killing tests (server/acpAgent/environment/DaemonClient/AuthMessage suites). The round-6 N4 mutant (secondary provider-reload envfail) specifically was not re-mutated.
  • Per-commit verification of the PR's 12 commits: depth-2 checkout; only the last three (3fcb3aee, f9abe3f7, eca0424f56) are individually reachable and were individually attributed; the earlier nine are verified as the aggregate HEAD^1..HEAD diff.
  • Main's advance itself (fe34a5cf..413b6d15d3, fix(cli): deliver teammate messages at tool-round boundaries, not whole-task end #9638 atop refactor(vscode-ide-companion): migrate chat to WebShell and qwen serve #9811's cutover, 498 files): verified only insofar as it interacts with this PR (merge integrity + the 11 auto-merged files + overlapping gates); its own commits are not individually verified. The metadata snapshot's baseRefOid (fe34a5cf) is older than the merge-ref base (413b6d15d3) — established by content marker (dynamicCommandTranslation present in fe34a5cf, removed by fix(cli): deliver teammate messages at tool-round boundaries, not whole-task end #9638); the lane builds the merge ref against the newer tip, which is what this round verified.
  • Browser-level Web Shell E2E — component/dom tests green instead (App.test.tsx, AuthMessage.dom.test.tsx, main-boot.test.tsx).
  • Full-repo npm run lint — the PR's own CI covers it; this round rebuilt the base tree and ran the affected suites instead.
  • Windows/Linux author-side runs (author-declared untested).
  • The lane's flakiness gate — separate advisory lane; this round's ledger entries are above (F4 row).

Methodology

Environment: CI merge-ref checkout (HEAD merge 95c31f5a11, HEAD^1 base 413b6d15d3, HEAD^2 head eca0424f56, depth 2; delta commits 3fcb3aee/f9abe3f7 reachable as objects), node:22-bookworm container, 64 CPUs. Merge integrity: per-file blob membership (43 PR files: 32 adopt the branch blob, 11 auto-merged where main's #9638 also touched), full-tree census that every non-PR file is byte-identical to base, no conflict markers, and no PR-marker line removed by the auto-merge (round 6's 3-way replay was not possible — the current branch point is not reachable as an object). Base control: worktree at HEAD^1, node_modules wired as a symlink farm with all 26 @qwen-code/* links re-pointed into the base tree (realpath-asserted; nested per-package node_modules mirrored, external deps shared — lockfile untouched by this PR, verified), fully rebuilt with the repo's own build scripts; base dist proven free of all six PR symbols with head dist as control-on-the-control. Harnesses (harness/) drive real daemons over real HTTP with a loopback OpenAI stub recording every request (model + Authorization) as the wire oracle; SSE streams censused live; raw logs in logs/{head,base}/. Mutation runs used a third scratch worktree at the merge commit (tmp/mut-tree) with the same farm plus head-tree dist/ symlinks, mutating source by exact-match single-point replacement and restoring via git checkout (tracked-dirty=0 asserted after each); all vitest invocations serialized per package tree. Evidence captures in evidence/ produced with scripts/verify-capture.mjs from the recorded run summaries and scripted re-prints. Assertion accounting: merge integrity 56 + A/B harnesses 61 (head main 2×13, base main 13, envfail 2×7, activeturn 8) + F2 probes 6 (3/arm) + mutation matrix 6 (4 kills + 1 classified survivor + suite control) + targeted gates 14 + F1 set comparison 3 + F4 ledger 2 + symbol census 9 (6 base-clean + 3 head-present) + delta attribution 2 + daemon-log [object Object] census 2 (Finding 4) = 161, all pass; fail counts only unexpected outcomes, of which there were none.

Flakiness gate log

rounds=5 files=18 skipped=0
file packages/acp-bridge/src/bridge.test.ts: (cd packages/acp-bridge) npx --no-install vitest run ./src/bridge.test.ts
file packages/cli/src/acp-integration/acpAgent.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/acpAgent.test.ts
file packages/cli/src/acp-integration/acpAgent.worktree.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/acpAgent.worktree.test.ts
file packages/cli/src/acp-integration/session/Session.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/Session.test.ts
file packages/cli/src/config/environment.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/environment.test.ts
file packages/cli/src/config/settings.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settings.test.ts
file packages/cli/src/config/settingsWatcher.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settingsWatcher.test.ts
file packages/cli/src/serve/routes/workspace-models.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/routes/workspace-models.test.ts
file packages/cli/src/serve/run-qwen-serve.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/run-qwen-serve.test.ts
file packages/cli/src/serve/server.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/server.test.ts
file packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/workspace-service/__tests__/facade.test.ts
file packages/core/src/config/config.test.ts: (cd packages/core) npx --no-install vitest run ./src/config/config.test.ts
file packages/core/src/models/modelRegistry.test.ts: (cd packages/core) npx --no-install vitest run ./src/models/modelRegistry.test.ts
file packages/sdk-typescript/test/unit/DaemonClient.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/DaemonClient.test.ts
file packages/web-shell/client/App.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/App.test.tsx
file packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/AuthMessage.dom.test.tsx
file packages/web-shell/client/daemon/workspace/actions.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/daemon/workspace/actions.test.ts
file packages/web-shell/client/main-boot.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/main-boot.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/acp-bridge/src/bridge.test.ts: P
  packages/cli/src/acp-integration/acpAgent.test.ts: P
  packages/cli/src/acp-integration/acpAgent.worktree.test.ts: P
  packages/cli/src/acp-integration/session/Session.test.ts: P
  packages/cli/src/config/environment.test.ts: P
  packages/cli/src/config/settings.test.ts: P
  packages/cli/src/config/settingsWatcher.test.ts: P
  packages/cli/src/serve/routes/workspace-models.test.ts: P
  packages/cli/src/serve/run-qwen-serve.test.ts: P
  packages/cli/src/serve/server.test.ts: P
  packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: 
  packages/core/src/config/config.test.ts: 
  packages/core/src/models/modelRegistry.test.ts: 
  packages/sdk-typescript/test/unit/DaemonClient.test.ts: 
  packages/web-shell/client/App.test.tsx: 
  packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: 
  packages/web-shell/client/daemon/workspace/actions.test.ts: 
  packages/web-shell/client/main-boot.test.tsx: 

verdict: timeout
summary: the 15-minute budget elapsed before two full rounds completed (0 done) — no flakiness signal either way

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/acpAgent.worktree.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 1 · packages/cli/src/config/environment.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settings.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settingsWatcher.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/routes/workspace-models.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/server.test.ts: P (exit 0)

Evidence images

00-merge-integrity-and-f1

01-ab-head-new-model-live

02-ab-base-rejects-new-model

03-envfail-and-activeturn

04-mutation-matrix-delta

05-targeted-gates

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on eca0424f567020c1c9ad730b32f0460b45f009d6 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 eca0424f567020c1c9ad730b32f0460b45f009d6既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

Runtime verification report — PR #10269

I built this PR into a real qwen serve bundle and drove the live daemon, its ACP child, and the Web Shell it serves, A/B against a bundle built from the merge base. Two mock OpenAI-compatible servers stand in for the two providers, and each logs the model plus the Authorization header it was called with and echoes its own label into the reply — so every turn proves which provider and which credential actually served it, not merely that a request returned 200.

Verdict: the fix is real, the whole reviewer test plan reproduces, and I found no regression. One test-coverage gap is confirmed by mutation (it matches a finding already reported and deferred on this PR), and one Web Shell refresh observation is worth a sentence from the author. Notably, the review bot reported it could not run a single test suite across the last rounds; the suites do pass here — 5,594 of them.

Arm Build
BEFORE fe34a5cf22 — the merge base of this PR with main
AFTER eca0424f56 — current PR head, including the round-8 fixes

1. Issue #10184 reproduces on the base, and the PR fixes it

One session is created before the provider install. Nothing is restarted between the install and the model switch.

daemon REST A/B

On the base the model is visible in GET /workspace/providers and still unusable — precisely the report in #10184. On the PR the same live session receives runtimeSync.status = applied, is not implicitly switched, selects the new route, and its next turn is answered by the new provider with the new credential (Bearer beta-secret-v1).

The same thing in the browser, against the Web Shell the daemon serves. Only the page was refreshed; the daemon process and its ACP child ran continuously:

web shell hot switch

web shell model picker

2. The [object Object] notice is fixed in the real UI

Same daemon response in both arms; only the message extraction differs.

web shell error notice

3. Failure, lifecycle and concurrency behave as documented

contract

Point by point against the reviewer test plan:

Step Result
1–2 · install after session creation, applied, select the route live ✅ HTTP 200, applied, switch 200, turn served by MOCKB
3 · install during an active turn ✅ install returned in 19 ms; the in-flight turn finished on its original generator (MOCKA:SLOW-DONE); the new model was selectable afterwards
4 · delete a model removed:true, clearedActiveModel:true, requiresRestart:false, runtimeSync applied; the session was not switched (its next turn still reached MOCKB); the stale route returned a readable 500; switching back to alpha worked
5 · rebuilt ACP child ✅ after SIGKILL of the child, the replacement selected the new model and presented the updated credential on the wire
6 · injected failures ✅ degraded parent env → HTTP 200 with runtimeSync failed, persistence not rolled back, provider still listed; no live child → deferred
— · concurrency (not in the plan) ✅ 8 installs interleaved with 8 session creations: every session created during the storm could select the last-installed model

4. The multi-workspace gap I raised earlier (F1) is closed

multi-workspace

With the daemon bound to two workspaces and a live session in each, a user-scope install through the unqualified route now reaches the secondary workspace's pre-existing session as well, and its next turn really lands on MOCKB with the new key. Workspace-scoped providers correctly stay primary-only, which matches the contract the author documented.

5. Both round-8 Critical fixes verified on the wire

  • R8-2POST /workspace/reload now reports runtimeEnvironmentApplied: true on a healthy reload and false when the parent-environment refresh fails closed, and the settings_reloaded SSE event carries the same flag (alongside envFileReadFailed: true). Verified against a live daemon with an unreadable workspace .env.
  • R8-1 — the deferred-activation settings reload is pinned by the suite: forcing settingsReloaded = true (i.e. applying the environment without the atomic reload) fails 3 tests.

6. Tests and mutation testing

All affected suites pass locally:

Package Result
packages/cli (9 touched files incl. run-qwen-serve, server, acpAgent, facade) 3125 / 3125
packages/acp-bridge 822 / 822
packages/core (modelRegistry, config) 665 / 665
packages/sdk-typescript (DaemonClient) 373 / 373
packages/web-shell (App, AuthMessage.dom, workspace actions, main-boot) 609 / 609
Total 5594 passed, 0 failed

Nine mutants against the PR's own suites — eight killed:

# Mutation Result
M1 parent-env failure no longer marks the sync failed killed (2)
M2 closed channel reports deferred even when the parent env was degraded (R8-1 posture) killed (1)
M3 child-reported per-Config failures ignored killed (1)
M4 F1 fix reverted — user-scope install stops fanning out to secondary runtimes killed (2)
M5 revert the structured error extractor (reintroduces [object Object]) killed (2)
M6 deferred activation applies the environment without the atomic settings reload killed (3)
M7 fail-closed env read reports runtimeEnvironmentApplied: true killed (1)
M8 DELETE route: a thrown runtime sync is reported as applied instead of failed survived
M9 Web Shell warns on deferred/absent runtimeSync, not only failed killed (2)

7. Findings

F-1 (Suggestion, already known). M8 survives — not just the workspace-models suite but all four serve suites. If syncModelProvidersRuntime() throws inside DELETE /workspace/models, the route sets runtimeSync = { status: 'failed' } (workspace-models.ts:331) and nothing asserts it; flipping that literal to 'applied' is invisible to the tests. The consequence would be a silently wrong applied for a sync that really failed, and therefore no Web Shell warning. This is the same gap already reported in the round-2/round-3 deferred lists and accepted as follow-up by the author — I am confirming it is real rather than asking for it now. The branch is hard to reach in practice (generation-closed throws are handled earlier by sendGenerationClosedError), so I am comfortable with it as follow-up.

F-2 (question, likely out of scope). On the PR arm I measured the Web Shell model picker of a live conversation:

picker BEFORE install                     -> alpha-model
POST /workspace/auth/provider             -> 200  runtimeSync applied
picker AFTER install, NO page reload      -> alpha-model          <- unchanged
picker AFTER a page reload                -> beta-model | alpha-model

The daemon side is correct throughout — the REST switch to beta-model(openai) succeeds immediately in that same session. What does not happen is a client-side refetch of the model list when the install arrives from outside this browser tab (another client, the SDK, or curl), even though a settings_changed event is delivered on the session stream. The in-UI install path presumably refreshes the app's own state, which is what the PR description describes, so I read this as out of scope rather than a defect — main behaves the same way. Worth one line from the author confirming that reading; a follow-up that refetches the model list on settings_changed would close the loop for multi-client setups.

No blocking issues found. I did not reproduce any of the failure modes the earlier rounds worried about: no lost persistence, no HTTP error on a degraded sync, no partially-initialized session escaping with a stale registry under concurrency, and no implicit model switch of a live session.


Summary

Fixes #10184 ✅ reproduced on the base, fixed on the PR, verified over REST and in a real browser
Reviewer test plan ✅ all six steps reproduce, plus a concurrency case the plan does not cover
Earlier F1 finding ✅ closed — verified at the wire level in a second workspace
Round-8 Critical fixes ✅ both verified (R8-2 end-to-end, R8-1 by mutation)
Regressions found none
Test strength 5594 tests pass; 8 of 9 mutants killed
Open items one confirmed coverage gap (already deferred), one Web Shell refresh question
Recommendation merge-ready from my side; F-1 and F-2 as follow-ups
Harness details
  • Both arms are real npm run bundle artifacts run as node dist/cli.js serve, not unit-test doubles. BASE = fe34a5cf22 (merge base), AFTER = eca0424f56 (current head). packages/acp-bridge needed a npm run build first in both arms or esbuild cannot resolve isScheduledTaskRunSource.
  • Daemon: isolated HOME, --token, --workspace ws-main --workspace ws-second, --channel-idle-timeout-ms 600000 (otherwise the channel is torn down between requests and per-child state never survives), --allow-private-auth-base-url (required for a 127.0.0.1 provider baseUrl — without it the install route returns 400 invalid_base_url).
  • Provider fixture: alpha-model pre-installed at user scope pointing at MOCKA:4501; beta-model installed at runtime pointing at MOCKB:4502. Each mock logs {label, model, auth} per call and prefixes its reply with its own label, so MOCKB:... in a transcript is proof of routing, and Bearer beta-secret-v1 in the log is proof of credential propagation.
  • Fault injection is real, not mocked: the workspace .env is replaced by a directory so the parent-environment refresh genuinely fails closed.
  • The ACP child is killed with a real SIGKILL (ps --ppid <daemon> → the --acp child) to test the replacement-child path.
  • Browser: headless Chromium against the Web Shell the daemon itself serves, authenticated with #token=.
  • Every scenario runs against a freshly reset daemon, home and workspaces.
中文版报告

PR #10269 运行时验证报告

我把这个 PR 构建成真实的 qwen serve bundle,驱动了实际运行的 daemon、它的 ACP child,以及由它托管的 Web Shell,并与 merge base 构建的 bundle 做 A/B。两个 mock OpenAI 兼容服务分别扮演两个 provider,各自记录被调用时的 model 与 Authorization 头,并在回复中带上自己的标签——因此每一次 turn 都能证明究竟是哪个 provider、用哪个凭据真正提供了服务,而不只是「请求返回了 200」。

结论:修复是真实有效的,Reviewer 测试计划六步全部可复现,未发现回归。 变异测试确认了一处测试覆盖缺口(与本 PR 上已报告并被 defer 的发现一致),另有一个 Web Shell 刷新行为值得作者一句说明。值得一提的是,评审 bot 在最近几轮都报告「零个测试套件得以运行」;而本地这些套件是通过的——共 5594 个。

构建
BEFORE fe34a5cf22 —— 本 PR 与 main 的 merge base
AFTER eca0424f56 —— 当前 PR head,含 round-8 修复

1. #10184 在 base 上可复现,PR 修复了它

Session 在安装 provider 之前创建;安装与模型切换之间不重启任何进程。

base 上模型在 GET /workspace/providers可见却不可用——正是 #10184 所报告的现象。PR 上同一个 live session 收到 runtimeSync.status = applied,不会被隐式切换,可以选中新 route,其下一次 turn 由新 provider 用新凭据(Bearer beta-secret-v1)作答。

浏览器中同样如此(截图见英文部分):只刷新了页面,daemon 进程及其 ACP child 全程未重启。

2. [object Object] 通知在真实 UI 中已修复

两臂的 daemon 响应完全相同,差别只在消息提取逻辑。

3. 失败、生命周期与并发行为符合文档

对照 Reviewer 测试计划逐条核对:

步骤 结果
1–2 · 创建 session 后安装、applied、live 选中 route ✅ HTTP 200、applied、切换 200、turn 由 MOCKB 提供
3 · 在 active turn 期间安装 ✅ 安装 19 ms 返回;进行中的 turn 用原 generator 完成(MOCKA:SLOW-DONE);结束后新模型可选
4 · 删除模型 removed:true, clearedActiveModel:true, requiresRestart:false, runtimeSync applied;session 被切换(下一次 turn 仍到 MOCKB);旧 route 返回可读的 500;切回 alpha 正常
5 · 重建 ACP child ✅ 对 child SIGKILL 后,替换 child 能选中新模型,并在链路上出示更新后的凭据
6 · 注入失败 ✅ 父进程环境降级 → HTTP 200runtimeSync failed,持久化未回滚,provider 仍在列表;无 live child → deferred
— · 并发(计划外补充) ✅ 8 次安装与 8 次 session 创建交错:风暴期间创建的每个 session 都能选中最后安装的模型

4. 我此前提出的多 workspace 缺口(F1)已闭环

daemon 绑定两个 workspace、各有一个 live session 时,经非限定路由安装的 user-scope provider 现在也能到达次要 workspace 中已存在的 session,其下一次 turn 确实落到 MOCKB 并使用新 key。workspace 作用域的 provider 仍正确保持 primary-only,与作者记录的契约一致。

5. 两个 round-8 Critical 修复均在链路上得到验证

  • R8-2 —— POST /workspace/reload 现在在健康重载时报告 runtimeEnvironmentApplied: true,在父进程环境刷新 fail-closed 时报告 false,且 settings_reloaded SSE 事件携带同一字段(并带 envFileReadFailed: true)。已用不可读的 workspace .env 对真实 daemon 验证。
  • R8-1 —— deferred activation 的 settings 重载已被测试钉住:强制 settingsReloaded = true(即跳过原子重载直接应用环境)会导致 3 个测试失败。

6. 测试与变异测试

受影响的套件本地全部通过:packages/cli 3125/3125、packages/acp-bridge 822/822、packages/core 665/665、packages/sdk-typescript 373/373、packages/web-shell 609/609,合计 5594 通过、0 失败

针对 PR 自带套件构造了 9 个变异体,杀死 8 个(完整表格见英文部分)。唯一存活的是 M8。

7. 发现

F-1(Suggestion,已知项)。 M8 存活——不仅对 workspace-models 套件存活,对全部四个 serve 套件都存活。若 syncModelProvidersRuntime()DELETE /workspace/models 内抛出,路由会设置 runtimeSync = { status: 'failed' }workspace-models.ts:331),但没有任何测试断言它;把该字面量改成 'applied' 对测试完全不可见。后果是:真正失败的同步会被静默报成 applied,Web Shell 因此不会给出警告。这与 round-2/round-3 deferred 列表中已报告、作者已接受作为后续项的缺口是同一个——我这里只是确认它是真实存在的,而非在本轮提出要求。该分支在实践中难以触达(generation-closed 抛出会更早被 sendGenerationClosedError 处理),因此作为后续项我认为可以接受。

F-2(问题,很可能在范围外)。 在 PR 臂上我测量了一个 live 会话的 Web Shell 模型选择器:

安装前的 picker                      -> alpha-model
POST /workspace/auth/provider        -> 200  runtimeSync applied
安装后、未刷新页面的 picker           -> alpha-model          <- 未变化
刷新页面后的 picker                  -> beta-model | alpha-model

daemon 侧全程正确——同一个 session 通过 REST 切换到 beta-model(openai) 立即成功。没有发生的是:当安装来自当前浏览器标签页之外(其他客户端、SDK 或 curl)时,客户端不会重新拉取模型列表,尽管 session 流上确实投递了 settings_changed 事件。UI 内的安装路径应当会刷新应用自身状态,这也正是 PR 描述所说的,因此我倾向认为这属于范围外而非缺陷——main 的行为是一样的。希望作者用一句话确认这一理解;后续可以考虑在收到 settings_changed 时重新拉取模型列表,以覆盖多客户端场景。

未发现阻断性问题。 此前几轮担心的失败模式我都没有复现:没有持久化丢失、降级同步没有变成 HTTP 错误、并发下没有初始化到一半且带着旧 registry 的 session 逃逸、live session 也没有被隐式切换模型。

总结

是否修复 #10184 ✅ base 上复现、PR 上修复,REST 与真实浏览器双重验证
Reviewer 测试计划 ✅ 六步全部复现,另补充了计划外的并发场景
此前的 F1 发现 ✅ 已闭环——在第二个 workspace 中于链路层面验证
Round-8 Critical 修复 ✅ 两项均验证(R8-2 端到端,R8-1 经变异测试)
发现的回归
测试强度 5594 个测试通过;9 个变异体杀死 8 个
待办 一处已确认的覆盖缺口(已 defer)、一个 Web Shell 刷新问题
建议 从我这边看可以合并;F-1 与 F-2 作为后续项

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Thanks for the thorough runtime verification. Confirming F-2 is out of scope for this PR: the supported mutation path refreshes the initiating Web Shell state and synchronizes daemon/ACP/session registries, while passive cross-client model-list refetch on settings_changed is a separate UI event-handling concern and remains unchanged from main. F-1 remains deferred as the already-recorded follow-up coverage gap.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

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

@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 218 passed · 0 failed · 218 total

Flakiness gate: ⚠️ timeout — only 2 of 5 rounds fit the 15-minute budget; the completed rounds agreed

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:218 通过 · 0 失败 · 218 总计

抖动门:⚠️ timeout — only 2 of 5 rounds fit the 15-minute budget; the completed rounds agreed

Verification report

PR #10269 — fix(serve): Hot-reload runtime model providers (follow-up round 8)

Verdict: merge-ready218/218 scripted assertions passed, 0 unexpected failures. Verified head: eca0424f567020c1c9ad730b32f0460b45f009d6 (git rev-parse HEAD^2); merge commit 95c31f5a1124bee20fc484706b77e1cf6f47883c; base tip 413b6d15d3d7bb17e22b05e07b008efb1cb7f43e (HEAD^1). The tree is byte-identical to round 7's verified tree — the merge-commit OID matches exactly, which by content addressing proves the entire input closure (every file, caller, dependency set, lockfile, config, and fixture). Round 8 therefore re-runs the evidence fresh rather than re-deriving scope: the A/B harness was rebuilt from source, the central A/B re-ran with 3 head / 2 base main cells plus envfail and active-turn cells on both sides, all 17 targeted gate suites re-ran, and every carried finding was re-measured, never diffed.

中文 — 判定:✅ 通过 · 可合入(agent 判定,follow-up 第 8 轮)
  • 结论merge-ready218/218 个脚本断言全部通过、0 个意外失败。本轮合并树与第 7 轮逐字节相同(合并提交 OID 完全一致 95c31f5a11,head eca0424f56、base 413b6d15d3),git 内容寻址本身就证明了完整输入闭包(文件、调用方、依赖、lockfile、配置、fixture 全部不变)。因此本轮不是重做范围选择,而是重跑证据:A/B harness 从源码重建,中央 A/B 重新执行(head 主流程 3 次、base 2 次、两臂各 2 次 envfail、head 2 次 activeturn),17 个定向门禁套件全部重跑,所有遗留 finding 全部复测。
  • A/B 结论(见证 01/02/03/04):先建 Session 再装 Provider——base 臂切换返回 500Model 'stub-model-1' not found for authType 'openai')且 SSE 出现字面量 [object Object]bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart #10184 全部症状)、响应无 runtimeSync 字段;head 臂 runtimeSync.status=applied,旧 Session 立即切换成功(200),stub wire 层证实后续请求携带安装时写入的 model+key。envfail 契约:.env 损坏(EISDIR)时 head 200 + runtimeSync.status=failed、provider 与 key 仍持久化、daemon 健康、会话留在原模型;base 对同种损坏完全静默(从不在变更时重读 env)。主动回合保护:turn 执行中安装(200 + applied),被拉长的当前 turn 用原 model+boot key 完成,之后新模型可选、下一 turn 用新凭据。全部逐格稳定(主流程 3+2 次、envfail 每臂 2 次、activeturn 2 次)。
  • 门禁(见证 05):17 个受影响套件全绿,合计 5456 用例、0 失败,逐套件计数与第 7 轮逐字节一致。
  • 上轮 findings 复测(见证 00):F1(settings.test.ts 环境性失败簇)12 个 base 失败名在 head 逐字节重现、唯一 head 独有失败仍是 PR 新测试且落在同簇;F2(failedFiles="[object Object]")两臂启动探针复现维持;F3(bridge.ts : String()39→37 维持;F4 两臂未变异运行均 357/357;第 4 项(daemon 日志 [object Object])head 1 处、base 2 处、两臂行为一致维持。均非阻塞。
  • 未覆盖:评审测试计划第 5 步(ACP 通道重建)仅由绿色套件钉住、未端到端驱动;第 6 轮完整变异矩阵未重跑(按"输入闭包逐字节相同"的显式豁免条款携带,其全部击杀断言在本轮重跑的门禁中再次为绿);其余范围限制见报告正文。

Previous-finding status table (re-measured at this head, never diffed)

Tree identity first: round 7 verified merge 95c31f5a11… / head eca0424f… / base 413b6d15…; round 8's checkout resolves git rev-parse HEAD/HEAD^1/HEAD^2 to exactly those OIDs (logs/identity.log), and git diff --shortstat HEAD^1..HEAD reproduces round 7's 43 files changed, 3025 insertions(+), 206 deletions(-). Anything whose input closure is the tree itself (the round-7 delta mutation matrix, the merge-integrity census, the read-site audit) is carried under that identity and marked carried (closure-identical); everything behavioral below was re-run this round.

# finding (round ≤ 7) severity status at merge 95c31f5a11 (head eca0424f56, base 413b6d15d3) re-measurement
F1 settings.test.ts environmental cluster; PR-new test lands in it non-blocking stands (re-measured) Fresh vitest runs on both arms: base tip 12 failed / 162 passed (174); merged head 13 failed / 163 passed (176). Scripted set comparison (logs/f1-comparison.txt): 12 byte-identical shared failures, 0 base-only; the single head-only failure is exactly the PR's should keep workspace settings empty when reloading the home directory, inside the same home-dir/env cluster. Not a PR regression; reproduces on both arms in this Linux container (author tested macOS only).
F2 daemon env-file warning logs failedFiles="[object Object]" non-blocking stands (re-measured) Re-driven on both arms via harness/f2-probe.mjs (disposable QWEN_HOME, .env replaced with a directory before boot, real daemon boot): [WARN] [DAEMON] failedFiles="[object Object]" … one or more runtime env files could not be read on head AND base (logs/f2-head.log, logs/f2-base.log). Also re-observed mid-run on head during the envfail cells. Pre-existing, out of scope.
F3 err instanceof Error ? … : String(err) siblings in bridge.ts informational stands (re-measured) Scripted census at this tree: 39 → 37 occurrences of : String( between HEAD^1 and HEAD; the PR diff on bridge.ts converts exactly the two model_switch_failed emitters to extractErrorMessage(err) (−2/+2). The A/B proves the reported symptom is gone on head ([object Object]=0 in every head SSE census).
F4 Flakiness-gate P→F on run-qwen-serve.test.ts (round-3 lane) could not be reproduced informational stands (not reproduced) Round-8 ledger: unmutated suite 357/357 on the merged head (targeted gates) and 357/357 on the base arm (logs/f4-base-ledger.log). Identical counts both arms, zero failures.
F5 (round-6) harness infra: load-tainted ACP boots on the shared runner infra not re-triggered All eleven round-8 daemon runs booted first-try and completed cell-for-cell; zero infra failures, no replacement runs needed.
F6 (round-6) N4 secondary envfail coverage gap; M6-clause pin drift informational carried (closure-identical) Tree is byte-identical to round 7's; the round-7 delta matrix (which re-pinned the adjacent D1/D5 guards) carries under identity. No code in this area changed.
R7-F2 D2 coverage gap: reload() catch arm runtimeEnvironmentApplied = false survived mutation non-blocking (test to write) carried (closure-identical) Same tree; the guard itself is fail-closed by construction and consistent with reloadModelProviders's catch. Still a test to write, not a defect.
R7-F3 runtimeEnvironmentApplied has no client reader yet informational stands (re-grepped) Re-grepped at this tree: produced in every reloadDaemonEnv result path in run-qwen-serve.ts (9 producers), captured/fail-closed/surfaced in workspace-service/index.ts (1369/1371/1423–1439/1454), exposed additively in reload responses/events; web-shell still reads only runtimeSync.status. Observability hook, not a dead switch.
R7-F4 daemon's own error log renders [object Object] on the fixed failure path non-blocking stands (re-measured) This round's daemon logs: head main runs = 1 occurrence each (the intentionally-failed B4 switch only; A6 succeeded), base main runs = 2 (A6 + B4) — identical behaviour both arms, so the PR neither caused nor changed it (logs/f4-f2-census.log). Cause unchanged: sendBridgeError's three String(err) sites in error-response.ts; extractErrorMessage already exists in-repo for a mechanical follow-up.

Central claim + A/B (re-measured fresh; harness rebuilt from source)

Central claim (carried): a provider installed (or model deleted) after a session exists becomes usable in that live session without restarting qwen serve; mutation responses expose runtimeSync (applied/deferred/failed); a failed runtime refresh never rolls back persistence and never turns a successful mutation into an HTTP error. The round-7 harness is not mounted between rounds, so it was rebuilt from the serve/route code at this merge commit (harness/ab-harness.mjs + harness/stub-server.mjs, mock-free): real node <tree>/packages/cli/dist/index.js serve per arm with a disposable QWEN_HOME/workspace, bearer token, --allow-private-auth-base-url; a loopback OpenAI-compatible stub records every request (model + Authorization) as the wire oracle; the session SSE stream is parsed live (buffered SSE framing; turn_complete as the turn-terminal event). Boot fixture: an explicit modelProviders.openai entry for fake-model (envKey OPENAI_API_KEY) + boot key in the daemon env; install uses providerId custom-openai-compatible (the built-in openai id is not installable — verified empirically), which merges by id+baseUrl so the boot entry survives install (B2 asserts that). Two harness iterations were needed to match the measured API semantics (prompt admits 202 and completes over SSE; one successful switch emits 2 model_switched events — the bridge publish plus a settings-reload rebroadcast); those iteration runs are excluded from the assertion tally as harness development, and every official run below used the final expectations.

Base control: worktree at HEAD^1 with node_modules wired as a symlink farm — external deps shared from the root install, all 24 root @qwen-code/* links plus every nested node_modules re-pointed into the base tree, realpath-asserted down to each target's package.json (harness/base-farm.sh; the first farm iteration had a root-scope retarget bug that readlink -f masked — caught and re-asserted with existence checks before any base run). Rebuilt with the repo's own node scripts/build.js --cli-only (exit 0). Control-on-the-control: base dist proven free of all six PR symbols (runtimeSync, syncModelProvidersRuntime, reloadModelProvidersDaemonEnv, reloadRuntimeOverlaySnapshotForModelProviders, runtimeEnvironmentApplied, reloadScopesFromDiskAtomically: 0 files across cli/core/acp-bridge dist), head dist non-zero for all six (logs/base-symbol-check.log).

Official runs: head main ×3, base main ×2, envfail ×2 per arm, activeturn ×2 (head) — all cell-for-cell stable, zero infra taint. Witnesses: 01-ab-head-live.png, 02-ab-base-live.png, 03-envfail-both-arms.png, 04-activeturn-generator-retention.png.

cell oracle base (413b6d15d3) ×2 runs head (merge 95c31f5a11) ×3 runs
D0 daemon boot GET /health 200 ✓ 200 ✓
A1 session before mutation POST /session {cwd} 200 ✓ 200 ✓
A2 control turn (boot model) stub wire + SSE turn_complete fake-model + Bearer sk-boot-10269 same ✓
A4 install after session POST /workspace/auth/provider 200, no runtimeSync 200, runtimeSync.status=applied
A5 provider status GET /workspace/providers stub model listed (visible, unusable) stub model listed
A6 switch in pre-existing session POST /session/:id/model 500 Model 'stub-model-1' not found for authType 'openai' 200 (+ _meta.qwenModelSwitch with installed baseUrl/masked key)
A7 SSE symptom (issue #10184) SSE census model_switch_failed=1, model_switched=0, literal [object Object]=1 model_switched=2, model_switch_failed=0, [object Object]=0
A8 post-switch turn stub wire boot model + boot key (stub never served the new route) ✓ stub-model-1 + Bearer sk-installed-10269
B1 delete model DELETE /workspace/models 200, no field 200, runtimeSync.status=applied
B2 gone from status; boot model kept GET /workspace/providers
B3 session not implicitly switched SSE census no new model_switched no new model_switched
B4 re-switch stale route 500 + census 500 + SSE [object Object]=2 total 500 + readable data.details, [object Object]=0 in SSE/HTTP (daemon stderr log still carries it — finding R7-F4)

Env-failure contract (--mode envfail, witness 03): user-level .env replaced with a directory (EISDIR on read) mid-run, then a mutation. Head ×2 (12/12 each): 200 + runtimeSync.status=failed, provider entry and API key still persisted to settings.json, daemon healthy, next turn still served on boot model + boot key. Base ×2 (12/12 each): 200, no runtimeSync field, persistence kept, daemon healthy — base never re-reads env at mutation time, so the same corruption stays silent there; the PR strictly increases observability and fail-closes the sync status without failing the mutation.

Active-turn generator retention (--mode activeturn, witness 04; Reviewer Test Plan step 3): stub holds the completion for 7 s; a provider install lands mid-turn (200 + runtimeSync.status=applied); the in-flight turn finishes on the original model + boot key (wire oracle); the new model is selectable afterward (200) and serves the next turn with the installed key. 2 runs × 13/13 checks.

Corrections

None this round — no prior description errors were found to stand.

Findings (non-blocking; all carried from prior rounds, all re-measured)

  1. settings.test.ts environmental cluster persists — F1 row above. Repro: cd packages/cli && npx vitest run src/config/settings.test.ts (13/176 fail on the merged head in this Linux container; 12 of the 13 fail identically on the base tip; author tested macOS only). The PR's own new test should keep workspace settings empty when reloading the home directory lands inside this cluster — its intent is pinned elsewhere by the green settingsWatcher/facade gates, but the test itself cannot demonstrate that in this environment.
  2. D2 coverage gap (test to write) — carried (closure-identical). reload()'s catch arm (runtimeEnvironmentApplied = false on reloadDaemonEnv rejection) has no test driving a non-fatal rejection through it; recommend a facade test with a rejecting reloadDaemonEnv asserting runtimeEnvironmentApplied: false in both the response and the settings_reloaded event.
  3. runtimeEnvironmentApplied has no client reader yet (informational) — re-grepped at this tree; server-side consumed (fail-closed at workspace-service/index.ts:1454) and surfaced additively, web-shell reads only runtimeSync.status. Matches the design's stated observability intent.
  4. The daemon's own error log still renders [object Object] on the fixed failure path — R7-F4 row above; re-measured at identical counts (head 1, base 2). Same bug class as bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart #10184 on the operator-log/telemetry surface; the PR fixed the client-visible surfaces. Follow-up is mechanical (extractErrorMessage at the three sendBridgeError sites in packages/cli/src/serve/server/error-response.ts); the file is outside this PR's diff.
  5. failedFiles="[object Object]" in the daemon env-file warning — F2 row above; stands on both arms. Pre-existing, out of scope, follow-up candidate.
  6. 37 remaining err instanceof Error ? … : String(err) siblings in bridge.ts — F3 row above; the PR converts exactly the two model_switch_failed emitters, matching the bug report's scope; the A/B proves the reported symptom is fixed. The same class also clusters (×3) in error-response.ts (finding 4).
  7. Harness infra disclosure (clean round): all eleven daemon runs (3 head main, 2 head envfail, 2 head activeturn, 2 base main, 2 base envfail) booted first-try with zero infra failures; no replacement runs were needed. Runtime env: node v22.23.2 container, 64 CPUs; vitest serialized per package tree.

Not covered

  • Reviewer Test Plan step 5 (ACP channel recreation E2E) — pinned by the acpAgent/Session/bridge suites (all green at the merged tree, re-run this round), not driven end-to-end. Steps 1–4 and 6 were driven E2E (A/B + envfail + activeturn).
  • Workspace-scoped fan-out E2E (verified in round 6 with a two-runtime daemon; untouched by this PR's delta) — pinned by server.test.ts fan-out unit tests, re-run green this round.
  • Round-6/7 mutation matrices were not re-run — carried under the proven-identical input closure (byte-identical merge OID ⇒ files, callers, lockfile, config, fixtures all unchanged; CI reinstalled from the same lockfile). Their killing assertions live in the suites this round re-ran green (acpAgent 535, facade 124, run-qwen-serve 357, main-boot 2, AuthMessage.dom 5), so every pin is re-asserted by a live gate; the D2 survivor remains classified as a coverage gap (finding 2).
  • Per-commit verification of the PR's 12 commits: depth-2 checkout — git rev-list HEAD^1..HEAD^2 returns 1 (shallow-boundary artifact) against the snapshot's 12 commits; the delta commits 3fcb3aeecf/f9abe3f7d3/eca0424f56 are reachable as objects and were individually attributed in round 7 (carried, closure-identical). The earlier nine remain verified as the aggregate HEAD^1..HEAD diff.
  • Main's advance itself (fe34a5cf..413b6d15d3, fix(cli): deliver teammate messages at tool-round boundaries, not whole-task end #9638 atop refactor(vscode-ide-companion): migrate chat to WebShell and qwen serve #9811's cutover): verified only insofar as it interacts with this PR (round 7's merge-integrity census carries under tree identity; overlapping gates re-ran green). The metadata snapshot's baseRefOid (fe34a5cf) remains older than the merge-ref base (413b6d15d3), as in round 7.
  • Browser-level Web Shell E2E — component/dom tests green instead (App.test.tsx 584, AuthMessage.dom.test.tsx 5, main-boot.test.tsx 2).
  • Full-repo npm run lint — the PR's own CI covers it; this round rebuilt the base tree and re-ran the affected suites instead.
  • Windows/macOS author-side runs (author-declared untested on Linux; F1 is the observable consequence in this container).
  • The lane's flakiness gate — separate advisory lane; this round's ledger entries are the F4 row.
  • Harness development runs (smoke1–smoke3, envfail/activeturn smokes) are excluded from the assertion tally: their failures were harness-shape bugs (install providerId, 202-vs-200 admission, SSE framing, per-switch event multiplicity), not PR behaviour; the official runs used the corrected expectations.

Methodology

Environment: CI merge-ref checkout (HEAD merge 95c31f5a11, HEAD^1 base 413b6d15d3, HEAD^2 head eca0424f56, depth 2), node:22-bookworm container, 64 CPUs; npm ci + npm run build pre-run by the lane at HEAD. Round-8 identity with round 7 was established by OID comparison of all three commits plus the reproduced diffstat (logs/identity.log) — the strongest form of the follow-up shortcut's "proven-identical input closure", since a commit OID determines the entire tree. Base control: worktree at HEAD^1, node_modules as a symlink farm with all 24 root @qwen-code/* links and every nested node_modules (depth-inclusive, including packages/channels/feishu) re-pointed into the base tree, realpath-asserted down to each target's package.json; rebuilt with node scripts/build.js --cli-only (exit 0); base dist proven free of all six PR symbols with the head dist as control-on-the-control (logs/base-symbol-check.log, logs/base-farm.log, logs/base-build2.log). Harnesses (harness/) drive real daemons over real HTTP with a loopback OpenAI stub recording every request (model + Authorization) as the wire oracle and buffered SSE parsing for event censuses; per-cell results are written as JSON (logs/**/results-*.json), daemon stdout/stderr per run in logs/**/daemon-*.log. Targeted gates: 17 suites serialized via npx --no-install vitest run <file> (logs/gates-clean.log); gate liveness is established by the mutation-killing tests they contain having gone red under round-7's mutants (carried) and by this round's F1 runs showing the same runners fail when the code under test fails. Evidence images were produced with scripts/verify-capture.mjs (captures 0005).

Flakiness gate log

rounds=5 files=18 skipped=0
file packages/acp-bridge/src/bridge.test.ts: (cd packages/acp-bridge) npx --no-install vitest run ./src/bridge.test.ts
file packages/cli/src/acp-integration/acpAgent.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/acpAgent.test.ts
file packages/cli/src/acp-integration/acpAgent.worktree.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/acpAgent.worktree.test.ts
file packages/cli/src/acp-integration/session/Session.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/Session.test.ts
file packages/cli/src/config/environment.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/environment.test.ts
file packages/cli/src/config/settings.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settings.test.ts
file packages/cli/src/config/settingsWatcher.test.ts: (cd packages/cli) npx --no-install vitest run ./src/config/settingsWatcher.test.ts
file packages/cli/src/serve/routes/workspace-models.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/routes/workspace-models.test.ts
file packages/cli/src/serve/run-qwen-serve.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/run-qwen-serve.test.ts
file packages/cli/src/serve/server.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/server.test.ts
file packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: (cd packages/cli) npx --no-install vitest run ./src/serve/workspace-service/__tests__/facade.test.ts
file packages/core/src/config/config.test.ts: (cd packages/core) npx --no-install vitest run ./src/config/config.test.ts
file packages/core/src/models/modelRegistry.test.ts: (cd packages/core) npx --no-install vitest run ./src/models/modelRegistry.test.ts
file packages/sdk-typescript/test/unit/DaemonClient.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/DaemonClient.test.ts
file packages/web-shell/client/App.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/App.test.tsx
file packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/messages/AuthMessage.dom.test.tsx
file packages/web-shell/client/daemon/workspace/actions.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/daemon/workspace/actions.test.ts
file packages/web-shell/client/main-boot.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/main-boot.test.tsx


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/acp-bridge/src/bridge.test.ts: PPP
  packages/cli/src/acp-integration/acpAgent.test.ts: PP
  packages/cli/src/acp-integration/acpAgent.worktree.test.ts: PP
  packages/cli/src/acp-integration/session/Session.test.ts: PP
  packages/cli/src/config/environment.test.ts: PP
  packages/cli/src/config/settings.test.ts: PP
  packages/cli/src/config/settingsWatcher.test.ts: PP
  packages/cli/src/serve/routes/workspace-models.test.ts: PP
  packages/cli/src/serve/run-qwen-serve.test.ts: PP
  packages/cli/src/serve/server.test.ts: PP
  packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: PP
  packages/core/src/config/config.test.ts: PP
  packages/core/src/models/modelRegistry.test.ts: PP
  packages/sdk-typescript/test/unit/DaemonClient.test.ts: PP
  packages/web-shell/client/App.test.tsx: PP
  packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: PP
  packages/web-shell/client/daemon/workspace/actions.test.ts: PP
  packages/web-shell/client/main-boot.test.tsx: PP

verdict: timeout
summary: only 2 of 5 rounds fit the 15-minute budget; the completed rounds agreed

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/acpAgent.worktree.test.ts: P (exit 0)
round 1 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 1 · packages/cli/src/config/environment.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settings.test.ts: P (exit 0)
round 1 · packages/cli/src/config/settingsWatcher.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/routes/workspace-models.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 1 · packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: P (exit 0)
round 1 · packages/core/src/config/config.test.ts: P (exit 0)
round 1 · packages/core/src/models/modelRegistry.test.ts: P (exit 0)
round 1 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/daemon/workspace/actions.test.ts: P (exit 0)
round 1 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 2 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/acpAgent.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/acpAgent.worktree.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 2 · packages/cli/src/config/environment.test.ts: P (exit 0)
round 2 · packages/cli/src/config/settings.test.ts: P (exit 0)
round 2 · packages/cli/src/config/settingsWatcher.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/routes/workspace-models.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/run-qwen-serve.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/server.test.ts: P (exit 0)
round 2 · packages/cli/src/serve/workspace-service/__tests__/facade.test.ts: P (exit 0)
round 2 · packages/core/src/config/config.test.ts: P (exit 0)
round 2 · packages/core/src/models/modelRegistry.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/DaemonClient.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/messages/AuthMessage.dom.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/daemon/workspace/actions.test.ts: P (exit 0)
round 2 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 3 · packages/acp-bridge/src/bridge.test.ts: P (exit 0)

Evidence images

00-identity-and-findings

01-ab-head-live

02-ab-base-live

03-envfail-both-arms

04-activeturn-generator-retention

05-targeted-gates

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on eca0424f567020c1c9ad730b32f0460b45f009d6 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 eca0424f567020c1c9ad730b32f0460b45f009d6既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

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

No blocking findings.

Checked:

  • Contract asymmetry: reloadModelProvidersConfig now uses new-instance-then-assign (new ModelRegistry(...) → assign modelsByAuthType + providerProtocolConfig) — no partial-replacement possible if constructor throws.
  • Atomicity: reloadScopesFromDiskAtomically snapshots both scopes before reload, rolls both back if either reloadScopeFromDisk returns false — correctly prevents a one-scope-fails-the-other-stale split.
  • Env fail-closed: reloadPrimaryDaemonEnv and reloadRuntimeOverlaySnapshotForModelProviders both return {runtimeEnvironmentApplied: false} early when envFileReadFailed — no partial env snapshot applied.
  • Secondary workspace coverage: syncModelProvidersRuntime in server.ts fans out to secondaryRuntimes when scope === SettingScope.User — user-scoped provider mutations now reach all active workspaces.
  • Client timeout: DEFAULT_PROVIDER_MUTATION_TIMEOUT_MS = 0 (no deadline) is applied only when !hasExplicitFetchTimeout — explicit client timeouts preserved.
  • Stale-completion race: handleDeleteModel and AuthMessage.save both carry sessionOwnerGuard.capture() + isCurrent() guards before dispatching status — stale completions silently drop.
  • Partial-persistence path: workspace-models.ts catch for WorkspaceSettingsPartialPersistError now calls syncModelProvidersRuntime when modelProviders is among committedWrites — tested in workspace-models.test.ts.
  • Broadcast-before-sync ordering: broadcastWrite loop executes before syncModelProvidersRuntime — confirmed by the invocation-order assertion in the new test.
  • Pre-publication refresh loop: createAndStoreSession while-loop breaks only when providerReloadRevision === this.modelProviderReloadRevisionbeforeSessionPublish (and the response built therein) sees the final consistent registry.
  • reloadModelProviders facade: seven test cases in facade.test.ts cover applied/deferred/failed/rejected parent-env/generation-closed paths, plus the reloadModelProvidersDaemonEnv-preferred-over-reloadDaemonEnv path.

Round 3 criticals cross-checked — all resolved at this head: R3-1 (partial Config), R3-2 (pre-publication race), R3-3 (one-scope rollback), R3-4 (partial-persist sync), R3-5 (env fail-closed), R3-6 (secondary workspaces), R3-7 (explicit timeout), R3-8 (stale completion).

Not covered (CI gaps — not a reason to withhold):

  • build-cli check is SKIPPED in CI — no CI build/typecheck/lint evidence. Author reports npm run build, npm run typecheck, npm run lint clean locally on macOS (Node 22.22.3).
  • Integration Tests (CLI, No Sandbox) SKIPPED.
  • Windows and Linux not tested.

Reviewed with AI assistance.

@doudouOUC
doudouOUC dismissed qwen-code-ci-bot’s stale review August 30, 2026 07:47

Already have 2 approves.

@doudouOUC
doudouOUC added this pull request to the merge queue Aug 30, 2026
Merged via the queue into main with commit 68c1faa Aug 30, 2026
168 of 178 checks passed
@doudouOUC
doudouOUC deleted the fix/issue-10184-runtime-model-provider-sync branch August 30, 2026 07:48
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ⚠️ not run — skipped - workflow run

Skipped because the PR is not open for verification (state=MERGED, draft=false).

中文 — 判定:⚠️ 未运行 · 已跳过

跳过原因:the PR is not open for verification (state=MERGED, draft=false)。

Qwen Code · sandboxed verification

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.

bug(serve): runtime-added model cannot be set as current in Web Shell until daemon restart

5 participants