Skip to content

feat(web-shell): show workspace overview and a workspace menu in the sidebar - #10407

Merged
wenshao merged 15 commits into
mainfrom
feat/webshell-workspace-overview
Aug 31, 2026
Merged

feat(web-shell): show workspace overview and a workspace menu in the sidebar#10407
wenshao merged 15 commits into
mainfrom
feat/webshell-workspace-overview

Conversation

@wenshao

@wenshao wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Workspace rows in the Web Shell sidebar now tell you what a workspace contains and let you manage it from the row itself. The folder header shows session counts (waiting on you / running / total) and carries the full path as a tooltip; while a trusted workspace is expanded, the path is printed under the header followed by a chip row summarizing MCP servers (connected/enabled), skills, extensions, channels and context files. The MCP chip turns warning-colored when a server errored or discovery finished with an enabled server still not connected, and every runtime-discovered facet shows with a "not initialized yet" tooltip until the workspace's ACP child has reported in — a placeholder is never rendered as 0. The Projects label shows how many workspaces are registered once there is more than one.

The hover menu on a workspace row, which previously offered only Remove workspace on removable secondary workspaces, becomes a full workspace menu: Rename… (on daemons that advertise dynamic workspace registration; an empty name falls back to the folder name), Copy path, New task, New worktree task, a Manage group (MCP servers, Skills, Extensions, Channels, Settings — with the live counts next to the first four), Reload runtime and Remove workspace. Each entry appears only when the workspace's trust, lock and registration state allows it; untrusted rows that cannot be removed still show nothing, and locked (embedded) sidebars keep their current action area.

Facets are fetched through the existing workspace-qualified daemon routes, one request per facet, only while a workspace is expanded and trusted, polling every 30 s while the tab is visible plus a refetch on focus. Each facet fails independently, so an older daemon without one of the routes leaves that chip unknown and the others intact, and a facet keeps its last known value across a transient failure. Embedders can pass sidebar.workspaceOverview: false to keep plain folder headers, or { items: [...] } to pick the chips; two new sidebar callbacks (onOpenWorkspaceManagement, onNewWorktreeSession) let hosts wire the management entries and the worktree action.

This is layer A of #10399. The Manage group is offered on the daemon's primary workspace only, because the management pages still read the connection's bound workspace; binding them to an arbitrary workspace (layer B1) and a single daemon-side overview endpoint (layer C) are tracked in the issue.

Why it's needed

On main a workspace is a folder heading and nothing more: the sidebar cannot tell you how many workspaces are registered, whether anything is running in one, or whether its MCP servers are connected, and the only management action is removal. The daemon already exposes all of this per workspace and the SDK already wraps it; the sidebar simply never consumed it. See #10399 for the full diagnosis.

Reviewer Test Plan

How to verify

  1. Run the Web Shell (npm run dev in packages/web-shell against a qwen serve daemon with at least two --workspace registrations, or the served bundle) with one MCP server that cannot start.
  2. Expand a workspace: the header shows the session total (and a green running count while a prompt is in flight), the path appears under it, and the chip row shows MCP a/b in the warning tone with a tooltip naming the failed server count. Before any session has started in that workspace the MCP / Skills / Context chips show , not 0.
  3. Hover the row and open : on a secondary workspace expect Copy path, New task, New worktree task, Reload runtime, Remove workspace (Rename… appears when the daemon advertises dynamic_workspace_registration); on the primary workspace additionally the Manage group with counts. Rename updates the row label without a reload; Copy path puts the absolute path on the clipboard; Reload runtime issues POST /workspaces/<cwd>/reload; New worktree task opens a draft with the composer's git mode set to worktree; the Manage entries open the corresponding pages.
  4. Collapse a workspace and watch the Network panel filtered to /workspaces/: no facet requests while collapsed; on expand exactly one request per facet, then nothing until the 30 s tick or a window focus.
  5. Automated: cd packages/web-shell && npx vitest run client/components/sidebar (new suites for the model, hook, chips, menu and rename dialog plus the extended workspace-removal suite) and PLAYWRIGHT_PORT=5199 npx playwright test packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts (from packages/web-shell, drop the packages/web-shell/ prefix) (chips, counts, request gating and menu contents against the mock daemon). The full web-shell unit suite (211 files) and e2e suite (66 specs) pass locally; typecheck, ESLint and Prettier are clean.

Evidence (Before & After)

Before (main) After — expanded rows After — workspace menu
before after menu

Screenshots come from the repository's mock-daemon visual harness: two trusted workspaces, an MCP status with 2 connected / 1 failed / 1 disabled server and 12 skills.

Tested on

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

Environment (optional)

npm run dev (Vite) with the Playwright mock daemon; npm run build for the package succeeds.

Risk & Scope

  • Main risk or tradeoff: before the daemon-side overview endpoint lands, an expanded workspace costs five requests per fetch (plus the existing session and git polls). The fetch is gated on expanded + trusted + visible with a 30 s tick, so collapsed rows cost nothing; the e2e spec asserts no background growth once settled. Measured against the mock daemon (npm run dev, React StrictMode, 5 trusted workspaces all expanded, tab visible): 25 facet requests per 30 s tick — 50 over 60 s — next to the 33 session-catalog and git-status requests the same rows already made in that window (the initial round is doubled to 50 by StrictMode in dev; 25 in production). Layer C collapses that to 5 per tick. The MCP / Skills / Extensions / Channels management entries on the primary workspace open the existing pages, which are bound to the connection's workspace — that is why secondary rows do not get the group yet.
  • Not validated / out of scope: binding the management pages to a chosen workspace (layer B1), a cross-workspace overview page (B2) and GET /workspaces/:w/overview (C) are follow-ups in web-shell: sidebar shows nothing about a workspace beyond its name — add inline overview, a full workspace menu, and a per-workspace overview endpoint #10399. The Trust… action from the proposal was left out and is recorded as a follow-up in the design doc: the trust-change route only records a request that needs operator action and a daemon restart. Not tested on Windows/Linux locally; the change is frontend-only.
  • Breaking changes / migration notes: none. WorkspaceSection.headerActions gains a second argument (the overview snapshot); existing single-argument callers keep working. New optional sidebar props and types are additive; the default sidebar shows the overview, embedders can opt out with workspaceOverview: false.

Linked Issues

Part of #10399 (layer A).

中文说明

本 PR 的改动

Web Shell 侧栏的 workspace 行现在能直接告诉你这个工作区里有什么,并且能在行内管理它。文件夹标题显示会话计数(等待处理 / 运行中 / 总数),名称带完整路径 tooltip;已信任的工作区展开后,标题下方打印完整路径,随后是一行 chip:MCP 服务器(已连接/已启用)、技能、扩展、频道、上下文文件。当有服务器出错、或发现完成后仍有已启用的服务器未连接时,MCP chip 变为警告色;所有由运行时发现的 facet 在 ACP 子进程上报之前都显示 并提示「尚未初始化」——占位数据绝不会渲染成 0。注册了多个工作区时,Projects 标题显示数量。

workspace 行的悬停 菜单原来只在可移除的次级工作区上提供「移除工作区」一项,现在变成完整的工作区菜单:重命名…(daemon 声明动态注册能力时;留空则回退到文件夹名)、复制路径、新建任务、新建 Worktree 任务、「管理」分组(MCP 服务器、技能、扩展、频道、设置,前四项旁边显示实时计数)、重新加载运行时、移除工作区。每一项只在工作区的信任、锁定、注册状态允许时出现;不可移除的未信任行仍然什么都不显示,锁定(嵌入)模式的侧栏保持现有的操作区。

facet 数据通过现有的按工作区限定的 daemon 路由获取,每个 facet 一个请求,只在工作区处于展开且已信任时发起,标签页可见时每 30 秒轮询一次并在窗口获得焦点时刷新。各 facet 独立失败:旧 daemon 缺某条路由时只有对应 chip 显示未知,其余不受影响;瞬时失败时保留上一次的已知值。嵌入方可传 sidebar.workspaceOverview: false 保留原来的纯文件夹标题,或用 { items: [...] } 选择要显示的 chip;新增两个侧栏回调(onOpenWorkspaceManagementonNewWorktreeSession)供宿主接入管理入口和 worktree 动作。

本 PR 是 #10399 的 A 层。「管理」分组只在 daemon 的主工作区上提供,因为管理页面目前仍读取连接绑定的工作区;把页面绑定到任意工作区(B1 层)以及 daemon 端的单一概览端点(C 层)在 issue 中跟踪。

为什么需要

main 上的工作区只是一个文件夹标题:侧栏无法告诉你注册了几个工作区、某个工作区里是否有任务在跑、它的 MCP 服务器是否连上,唯一的管理动作是移除。daemon 早已按工作区暴露了这些信息,SDK 也已封装,只是侧栏从未消费。完整诊断见 #10399

审查测试计划

如何验证

  1. 运行 Web Shell(在 packages/web-shellnpm run dev,对接一个至少注册两个 --workspaceqwen serve,或直接用打包产物),配置一个无法启动的 MCP 服务器。
  2. 展开一个工作区:标题显示会话总数(有提示词在跑时显示绿色运行中计数),下方出现路径,chip 行里 MCP a/b 呈警告色,tooltip 标明失败数量。该工作区还没启动过任何会话时,MCP / 技能 / 上下文 chip 显示 而不是 0
  3. 悬停该行并打开 :次级工作区应看到 复制路径、新建任务、新建 Worktree 任务、重新加载运行时、移除工作区(daemon 声明 dynamic_workspace_registration 时会有 重命名…);主工作区额外有带计数的「管理」分组。重命名后行标签无需刷新即更新;复制路径把绝对路径放入剪贴板;重新加载运行时发出 POST /workspaces/<cwd>/reload;新建 Worktree 任务打开一个 git 模式已设为 worktree 的草稿;管理项打开对应页面。
  4. 折叠一个工作区并观察 Network 面板(过滤 /workspaces/):折叠时没有 facet 请求;展开时每个 facet 恰好一个请求,之后直到 30 秒周期或窗口获得焦点前没有新请求。
  5. 自动化:cd packages/web-shell && npx vitest run client/components/sidebar(模型、hook、chip、菜单、重命名对话框的新套件,以及扩展后的 workspace-removal 套件)和 PLAYWRIGHT_PORT=5199 npx playwright test packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts (from packages/web-shell, drop the packages/web-shell/ prefix)(对 mock daemon 验证 chip、计数、请求门控和菜单内容)。web-shell 全量单测(211 个文件)和 e2e(66 个用例)本地通过;typecheck、ESLint、Prettier 干净。

证据(改动前后)

改动前(main) 改动后 — 展开态 改动后 — 工作区菜单
before after menu

截图来自仓库自带的 mock daemon 视觉工具:两个已信任工作区,MCP 状态为 2 个已连接 / 1 个失败 / 1 个已禁用,12 个技能。

测试平台

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

环境(可选)

npm run dev(Vite)+ Playwright mock daemon;npm run build 打包成功。

风险与范围

  • 主要风险或取舍:在 daemon 端概览端点落地前,一个展开的工作区每次拉取要 5 个请求(外加既有的会话与 git 轮询)。拉取以展开 + 已信任 + 可见为门控并以 30 秒为周期,折叠行零成本;e2e 用例断言稳定后没有后台增长。对 mock daemon 的实测(npm run dev,React StrictMode,5 个已信任工作区全部展开,标签页可见):每 30 秒一轮 25 个 facet 请求——60 秒内 50 个——同一窗口内这些行既有的会话目录与 git 状态请求为 33 个(dev 下首轮被 StrictMode 翻倍为 50,生产为 25)。C 层会把它收敛到每轮 5 个。主工作区上的 MCP / 技能 / 扩展 / 频道管理项打开的是现有页面,这些页面绑定在连接的工作区上——这也是次级行暂不提供该分组的原因。
  • 未验证 / 不在范围内:把管理页面绑定到指定工作区(B1 层)、跨工作区概览页(B2)以及 GET /workspaces/:w/overview(C 层)作为 web-shell: sidebar shows nothing about a workspace beyond its name — add inline overview, a full workspace menu, and a per-workspace overview endpoint #10399 的后续。方案里的「信任…」动作没有做,已在设计文档的后续项中记录:trust 变更路由只是记录一个需要操作员处理并重启 daemon 的请求。本地未在 Windows/Linux 测试;改动仅限前端。
  • 破坏性变更 / 迁移说明:无。WorkspaceSection.headerActions 新增第二个参数(概览快照),现有单参数调用方不受影响。新增的侧栏 props 与类型都是增量的;默认侧栏显示概览,嵌入方可通过 workspaceOverview: false 关闭。

关联 Issue

属于 #10399(A 层)。

…sidebar

Workspace rows gain session counts, the full path and facet chips (MCP,
skills, extensions, channels, context files) while expanded, plus a
workspace menu with rename, copy path, new worktree task, management
entries, reload runtime and remove. Facets are fetched per expanded
trusted workspace through the existing workspace-qualified routes and an
uninitialized runtime is never rendered as zero.

Layer A of #10399.
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 28, 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 28, 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 1717b76. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

channel-editor-dark before/after

channel-editor-existing-dark before/after

channel-editor-existing-light before/after

channel-editor-light before/after

channel-manager-dark before/after

channel-manager-light before/after

code-review-artifact-dark before/after

code-review-artifact-light before/after

extensions-manager-dark before/after

extensions-manager-light before/after

git-mode-branch-dark before/after

git-mode-branch-light before/after

git-mode-chip-dark before/after

git-mode-chip-light before/after

git-mode-popover-dark before/after

git-mode-popover-light before/after

github-channel-editor-credential-dark before/after

github-channel-editor-credential-light before/after

github-channel-editor-dark before/after

github-channel-editor-light before/after

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 28, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the PR! Re-running the gate on the current head (1717b76) after the tenth review round.

Template looks good ✓ — the earlier note is resolved: the Before/After table now carries real screenshots from the mock-daemon visual harness instead of the unfilled placeholders.

Problem: planned feature, not speculation — this is layer A of #10399 (filed by the author), which documents the gap: the daemon already exposes all of this per workspace and the SDK wraps it, but the sidebar never consumed it. The design doc ships in the PR. No reproduction bar applies to a feature with a tracked design issue.

Direction: aligned. Consuming workspace data the daemon already serves is squarely inside the #10399 roadmap (A → B1 → B2 → C), frontend-only, with no backend changes and only additive sidebar props/types. Not a Claude Code parity item — this is qwen-code's own Web Shell surface.

Size: no core-module paths — everything sits in packages/web-shell/client/**. ~2,200 production lines (tests ~3,650, e2e harness ~450, docs ~230). Still above the 1,000-line large-PR advisory — informational only: the scope is one coherent feature layer, the B1/B2/C split already lives in the issue, and ten review rounds have converged the diff rather than grown it.

Approach: the shape remains right — a pure model module, one fetching hook gated on expanded + trusted + visible, a chip row, and the single-entry removal menu grown into a full state-gated workspace menu, reusing the existing workspace-qualified daemon routes and shared UI primitives. The only simpler alternative — the single daemon-side overview endpoint — is layer C and correctly deferred. The git-worktree intent state machine added in App.tsx is necessary complexity for the New worktree task entry, and round 10 scoped the hook's miss budgets per bookkeeping epoch with tests pinning the previously unpinned windows. No drive-by changes spotted.

Risk: no elevated risk signals (no high-risk path matches).

Moving on to code review. 🔍

中文说明

感谢贡献!在第十轮评审后对当前 head(1717b76)重新执行门禁。

模板完整 ✓ —— 此前提出的问题已解决:改动前后对比表现在附上了 mock daemon 视觉工具的真实截图,不再是未填写的占位符。

问题:规划中的功能,不是凭空设想——它是 #10399(作者本人提出)的 A 层,issue 中记录了「daemon 已按工作区暴露全部数据、SDK 也已封装,但侧栏从未消费」这一差距,设计文档随 PR 一起提交。有跟踪设计 issue 的功能类 PR 不适用复现门槛。

方向:对齐。消费 daemon 已有的工作区数据完全在 #10399 路线图内(A → B1 → B2 → C),纯前端改动,无后端变更,侧栏 props/类型均为增量。这不是 Claude Code 对齐项,而是 qwen-code 自己的 Web Shell 界面。

规模:未触及核心模块路径——全部改动位于 packages/web-shell/client/**。约 2,200 行生产代码(测试约 3,650 行、e2e 工具约 450 行、文档约 230 行)。仍高于 1,000 行大 PR 提示线,仅供参考:范围是一个完整内聚的功能层,B1/B2/C 拆分已在 issue 中,且十轮评审使 diff 收敛而非膨胀。

方案:结构依然合理——纯模型模块、一个以「展开 + 已信任 + 可见」为门控的拉取 hook、一行 chip,以及把原本只有「移除」单项的 菜单扩展为按状态门控的完整工作区菜单,复用既有的按工作区限定路由与共享 UI 原语。唯一更简的替代——daemon 端单一概览端点——是 C 层,已被正确延后。App.tsx 中新增的 git worktree 意图状态机是「新建 Worktree 任务」入口的必要复杂度,第十轮已把 hook 的未答预算按记账纪元划分,并用测试钉住了此前未覆盖的窗口。未发现夹带改动。

风险:无升级风险信号(未命中高风险路径)。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-read the diff at the commit in the footer — this replaces my earlier pass on the original submission, which ten review rounds have since reworked. The shape survived intact: a pure model, one gated fetching hook, chip row, and a state-gated menu over the existing workspace-qualified daemon routes, with the integration points (workspaceActions.updateWorkspace, workspace.refreshCapabilities, the catalog's nextCursor/truncated, the SDK handle's reload(), writeClipboardText, workspaceBasename) all pre-existing surface.

No critical blockers. What this pass confirmed:

  • The round-10 epoch fix is sound. Miss budgets now live per bookkeeping session: the epoch advances on cwd change and on disable, so a round launched before a reset can neither book misses into the fresh session nor zero them with a stale success — while rounds inside one unbroken session still accumulate, which the daemon-hang expiry case depends on. Three new tests pin exactly these windows (rejected round after an A→B→A round trip, stale success after a round trip, round held across a disable/enable cycle), and the epoch guard also subsumes the in-flight old-cwd window the earlier sandboxed verification found unpinned.
  • Fetch lifecycle stays careful: request-id invalidation so a stale round cannot land after the clear, per-facet catch(() => undefined) with summarization inside the wrapper (a malformed body isolates like a rejection), mergeOverviewSnapshots keeping last-known values across transient failures, expiry after three unanswered rounds.
  • Menu gating matches the design: rename needs dynamic_workspace_registration + a real path + a non-primary row (a primary rename would live in memory only); the Manage group needs primary + trusted + a wired callback (the pages read the connection's bound workspace — B1 is deferred, not faked); worktree needs trusted + a polled branch; reload needs trusted + a real path; untrusted non-removable rows still render nothing, and locked sidebars keep their existing action area.
  • The git-intent reset rule only acts on definitive answers (session exists, untrusted, or a branch-less answer for the current workspace) — a failed poll or in-flight refetch can no longer silently turn an armed worktree task into a plain session, and re-selecting the draft's own workspace from the composer picker keeps the intent.
  • The rename dialog mirrors the daemon store's 256-char cap and control-character rejection instead of discovering them as generic save failures; conventions hold (shared primitives, CSS modules on semantic variables, EN+ZH keys, design doc and e2e plan committed).

Non-blocking, carried on the record:

  • The sandboxed verification of the previous head reported the new 30 s-poll e2e test as speed-correlated (fails on machines where the page settles slower than ~1 s; page.clock.install() without pauseAt lets fake time advance with real time, shifting the poll phase). The spec is unchanged since — CI passes it here, but a slow runner can still trip it; the measured one-line fix (clock.pauseAt right after install) is in that report. Test-only, not a product defect.
  • Review-round ledger carry-overs, all deferred as non-blocking: retainedOverview is add-only (deliberate — the collapsed row's menu keeps its last counts — but an untrust event would also keep them); a doc sentence slightly overstates the fetch gate for custom headers; a coupled-counter mutant for per-facet miss independence ships green (the epoch tests narrow but don't close that axis).
sequenceDiagram
    participant P1 as WorkspaceSection
    participant P2 as useWorkspaceOverview
    participant P3 as Daemon workspace routes
    participant P4 as Chips and menu counts
    Note over P1: expanded and trusted
    P1->>P2: enabled, items, reloadToken
    P2->>P3: one GET per facet, in parallel
    P3-->>P2: answers (each facet fails alone)
    P2->>P2: summarize, book misses per epoch, merge over last known
    P2-->>P4: snapshot for chips and live counts
    loop every 30s while visible, plus window focus
        P2->>P3: refetch round
    end
Loading
Files changed (27 of 27 shown)
File What changed
.qwen/e2e-tests/2026-08-28-web-shell-workspace-overview.md E2E plan: baseline, local setup, scenarios, automated coverage map
docs/design/web-shell/web-shell-workspace-overview.md Layer-A design doc: counts, chips, menu, data flow, embedding, follow-ups (updated for the epoch bookkeeping)
packages/web-shell/client/App.test.tsx New App tests for the worktree session flow and the git-intent reset rules
packages/web-shell/client/App.tsx Wires overview options, management entries, worktree session creation; git intent now resets only on definitive answers and is keyed per workspace
packages/web-shell/client/components/sidebar/WebShellSidebar.module.css Registered-workspace count badge style next to the Projects label
packages/web-shell/client/components/sidebar/WebShellSidebar.tsx Rename, copy-path, reload handlers; per-row state-gated menu actions; primary session stats; rename dialog mount
packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx Extended: menu gating by trust, primary, capabilities; rename save; runtime reload; management targets
packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx Menu suite: action ordering, management counts, open-close signalling, unmount while open
packages/web-shell/client/components/sidebar/WorkspaceMenu.tsx New menu component laying out whatever gated actions it receives
packages/web-shell/client/components/sidebar/WorkspaceOverview.module.css Chip styles: warning, compact and unknown tones
packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx Chip values, tooltips, warning tone, compact mode, non-button role
packages/web-shell/client/components/sidebar/WorkspaceOverview.tsx Chip row renderer, formatOverviewValue, per-facet detail tooltips
packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx Prefill, save gating, clear-to-null fallback, busy lock, invalid names
packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.tsx Rename dialog; empty submits null; mirrors the daemon's length and control-character rules
packages/web-shell/client/components/sidebar/WorkspaceSection.module.css Header counts and path-line styles with a has() guard
packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx Header counts, chips gating, retained counts while collapsed
packages/web-shell/client/components/sidebar/WorkspaceSection.tsx Consumes the overview hook gated on expanded and trusted; header counts; passes the snapshot to headerActions
packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx Hook suite incl. the new epoch tests: rounds from before a round trip or disable cycle can neither book nor zero misses
packages/web-shell/client/components/sidebar/useWorkspaceOverview.ts Fan-out fetch, 30s visibility-gated poll, focus refetch; miss budgets now scoped per bookkeeping epoch
packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts Summarizers, unknown-versus-zero, warning rules, merge semantics
packages/web-shell/client/components/sidebar/workspaceOverviewModel.ts Pure model: summarizers, known and issue predicates, merge and expiry
packages/web-shell/client/e2e/utils/mockDaemon.ts Mock daemon learns scenario mcp plus the workspaces routes
packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts Playwright: chip values, counts, request gating incl. no background growth, menu contents, management navigation
packages/web-shell/client/i18n.tsx EN and ZH keys for menu entries, chips, counts, rename dialog
packages/web-shell/client/index.tsx Exports the new public option and target types
packages/web-shell/client/utils/gitModeIntent.test.ts Reset-rule matrix: definitive answers reset, transient gaps do not
packages/web-shell/client/utils/gitModeIntent.ts Extracted rule for when an armed git-mode intent must fall back

Test evidence (the PR's own CI via API — no PR code executed in this run)

Everything landed green on the reviewed commit — notably Test (ubuntu-latest, Node 22.x), which had hit the 60-minute job timeout on four consecutive attempts of the previous run, and the web-shell E2E smoke that exercises this PR's spec against the mock daemon.

Check Conclusion
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
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Secret scan (TruffleHog) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

The behavioural claims — chip values and warning tone, header counts, request gating per expanded/trusted/visible state, menu contents per workspace kind — are pinned by this PR's own suites, and the earlier sandboxed verification (previous head, one commit before this one) proved the central claim load-bearing with an A/B against base: exactly one request per facet on trusted expanded rows, zero on base, gating flips with collapse/re-expand. That run's two advisory findings: the speed-correlated 30 s-poll e2e test above (test-only; the epoch commit since did not touch it) and a coverage gap the epoch tests have now closed. A fresh @qwen-code /verify run against this exact head is already in flight from the /triage trigger and will post its own report — the remaining unverified surface is real-daemon behaviour (warning tone with a genuinely failing MCP server, placeholders before the ACP child reports), which the mock fixtures mirror and a maintainer run per the Reviewer Test Plan would settle.

中文说明

代码审查

在页脚所列提交上重新通读 diff——本次替代我早先对初始版本的审查,此后十轮评审已对代码做了大量打磨。整体形态保持完好:纯模型、一个门控拉取 hook、chip 行、基于既有按工作区限定路由的状态门控菜单;各接入点(workspaceActions.updateWorkspaceworkspace.refreshCapabilities、目录的 nextCursor/truncated、SDK 句柄的 reload()writeClipboardTextworkspaceBasename)均为既有接口。

无关键阻塞项。本次确认:

  • 第十轮的纪元修复是可靠的:未答预算按记账会话划分——纪元在 cwd 变更与禁用时推进,重置之前发起的轮次既不能向新会话记账、也不能用迟到的成功把预算清零;同一不间断会话内的轮次继续累计(daemon 挂起过期场景正依赖于此)。三条新测试恰好钉住这些窗口(A→B→A 往返后被拒的轮次、往返后迟到的成功、禁用/启用循环中被挂起的轮次),纪元守卫同时覆盖了早前沙箱验证发现未被钉住的在途旧 cwd 窗口。
  • 拉取生命周期依旧细致:请求 id 作废使过期轮次不会落在清空之后;每个 facet 独立 catch(() => undefined) 且摘要在包装器内完成(畸形响应体与拒绝同样隔离);mergeOverviewSnapshots 在瞬时失败时保留上次已知值;连续三轮未答后过期。
  • 菜单门控与设计一致:重命名需要 dynamic_workspace_registration + 真实路径 + 非主工作区(主工作区重命名只会存活在内存里);「管理」分组需要主工作区 + 已信任 + 已接回调(管理页读取连接绑定的工作区——B1 是延后,不是伪造);worktree 需要已信任 + 已轮询到分支;重新加载运行时需要已信任 + 真实路径;不可移除的未信任行依旧什么都不渲染,锁定侧栏保留既有操作区。
  • git 意图重置规则只对确定性答案生效(会话已存在、未信任、或当前工作区明确无分支)——轮询失败或进行中的刷新不再会把已装载的 worktree 任务悄悄变成普通会话;从作曲器选择器重新选中草稿自己的工作区会保留意图。
  • 重命名对话框镜像 daemon 注册存储的 256 字符上限与控制字符拒绝,而不是让用户在保存时撞上通用失败;项目约定保持(共享原语、基于语义变量的 CSS modules、中英文键、设计文档与 e2e 计划随代码提交)。

非阻塞、留档:

  • 上一个 head 的沙箱验证报告新的 30 秒轮询 e2e 用例与机器速度相关(页面 settle 超过 ~1 秒的机器上确定性失败;page.clock.install() 不带 pauseAt 时虚拟时间随真实时间推进,轮询相位漂移)。该用例此后未改动——本提交在 CI 上通过,但慢速运行器仍可能触发;报告中给出了实测有效的一行修复(install 后立即 clock.pauseAt)。仅测试问题,非产品缺陷。
  • 评审轮次遗留项(均按非阻塞延后):retainedOverview 只增不清(有意为之——折叠行的菜单保留最后计数——但取消信任时也会保留);设计文档一句关于拉取门控的表述略有出入;逐 facet 未答预算独立性的耦合计数器变异仍绿(纪元测试收窄但未完全闭合该轴)。

(流程图与文件清单见英文部分。)

测试证据(经 API 读取本 PR 自己的 CI——本次运行未执行任何 PR 代码)

受审提交上全部落绿——尤其值得注意:此前连续四次运行撞上 60 分钟任务超时的 Test (ubuntu-latest, Node 22.x) 已经通过,承载本 PR 用例(对 mock daemon)的 web-shell E2E 冒烟也是绿色。

CI 明细表见英文部分(机器可读区域由 finalize 任务维护)。

行为性结论——chip 数值与警告色、标题计数、按展开/信任/可见状态的请求门控、各类工作区的菜单内容——由本 PR 自带套件钉住;更早一次沙箱验证(上一个 head,距此一个提交)以 A/B 对照证明了中心声明是关键载荷:已信任展开行每个 facet 恰好一次请求、base 侧为零、折叠/重新展开时门控随之翻转。该次验证的两条参考级发现:上文提到的速度相关 30 秒轮询用例(仅测试;其后的纪元提交未触及该文件),以及一个覆盖缺口——现已被纪元测试闭合。针对本 head 的新一轮 @qwen-code /verify 已由本次 /triage 触发、正在运行,将单独发布报告——尚未验证的部分是真实 daemon 行为(真实失败的 MCP 服务器下的警告色、ACP 子进程上报前的 占位),mock 固件与真实路由一致,维护者按审查测试计划本地运行即可确认。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — ten rounds have converged this to a clean, coherent layer; the reservations are non-blocking (one speed-correlated e2e test, a few deferred ledger nits).

My independent proposal for "let a sidebar row tell you what a workspace contains and let you manage it" was exactly this shape — a pure model, one gated polling hook, a chip row and a state-gated menu over the existing workspace-qualified routes — and re-reading the final diff I did not find a simpler path it missed. Waiting for the single overview endpoint (layer C) was the only real alternative, and it stays correctly deferred. What tips this from "reviewed" to "ready": the hard parts are the ones that usually regress silently, and they are the ones pinned here — request gating is asserted against recorded traffic, a placeholder can never masquerade as zero, miss budgets are scoped per bookkeeping epoch with the round-trip and disable windows test-pinned after the last critical, and facets fail independently without blanking their siblings. The review arc also behaved the way it should: rounds six through ten landed only criticals, and the last round found no blockers on this commit. CI is fully green on it, including the previously timing-out unit job and the e2e smoke that runs this PR's spec.

The 4 rather than 5: the 30 s-poll e2e test is still speed-correlated on slow machines (the sandboxed verification measured it failing deterministically on a loaded runner; the one-line clock.pauseAt fix from that report is not in the spec), and real-daemon behaviour rests on the mock fixtures plus a pending /verify run and a maintainer pass per the test plan. Neither blocks.

Approving now, pinned to the reviewed commit — CI has already landed green, so no deferred approval is needed.

中文说明

Confidence: 4/5 —— 十轮评审已使这一层收敛到干净、内聚的状态;保留意见均为非阻塞项(一个与机器速度相关的 e2e 用例、少量延后的遗留小项)。

我对「让侧栏行能展示工作区内容并就地管理」的独立方案正是这个形态——纯模型、一个门控轮询 hook、一行 chip、基于既有按工作区限定路由的状态门控菜单——重读最终 diff 后,我仍未发现它遗漏的更简路径。等待单一概览端点(C 层)是唯一真正的替代方案,且仍被正确延后。让本 PR 从「已审」变为「可合」的关键在于:最难的部分恰恰是最容易悄悄回归的部分,而它们在这里都被钉住了——请求门控基于录制流量断言、占位绝不伪装成零、未答预算按记账纪元划分且往返/禁用窗口在上一个 critical 之后已有测试钉住、各 facet 独立失败而不连累其他。评审轨迹也符合预期:第六到第十轮只落 critical,最后一轮在本提交上未发现阻塞项。CI 在该提交上全绿,包括此前超时的单测任务与运行本 PR 用例的 e2e 冒烟。

给 4 而不是 5 的原因:30 秒轮询 e2e 用例在慢速机器上仍与速度相关(沙箱验证实测在负载运行器上确定性失败;报告给出的一行 clock.pauseAt 修复尚未进入用例);真实 daemon 行为目前依赖 mock 固件、一个进行中的 /verify 运行以及维护者按测试计划的本地验证。两者均不阻塞。

现在批准,批准固定在受审提交上——CI 已落绿,无需延迟批准。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.81% 85.81% 91.18% 84.76%
Core 88.91% 88.91% 90.58% 87.33%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.81 |    84.76 |   91.18 |   85.81 |                   
 src               |   86.53 |    82.86 |   88.88 |   86.53 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  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 |   75.07 |    77.54 |   93.73 |   75.07 |                   
  acpAgent.ts      |   74.22 |    77.45 |   93.04 |   74.22 | ...66,13344-13345 
  ...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.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...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.92 |    86.34 |   95.73 |   90.92 |                   
  Session.ts       |   90.29 |    85.09 |   95.13 |   90.29 | ...69,13496-13500 
  ...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.54 |   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.67 |    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.73 |    78.53 |   65.62 |   90.73 |                   
  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.94 |      100 |      50 |   98.94 | 106               
  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.46 |    88.72 |   90.68 |   89.46 |                   
  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 |   93.72 |    85.81 |   94.33 |   93.72 | ...1305,1312-1313 
  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 |   91.96 |    90.53 |   93.54 |   91.96 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.68 |     97.6 |   94.11 |   94.68 | 269,1334-1372     
  ...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.41 |    93.97 |   98.73 |   97.41 | ...6570-6614,6874 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  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.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  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 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1219,1254-1285 
  ...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 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  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   |   81.27 |    80.45 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  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 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...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.34 |    94.74 |    98.7 |   97.34 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...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,515,620,716    
  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     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  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.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.36 |    89.24 |     100 |   94.36 | ...36,669-670,818 
  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         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  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 | 46                
  ...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.38 |     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.37 |    90.47 |    95.3 |   94.37 |                   
  ...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        |    88.2 |    90.75 |   86.11 |    88.2 | ...2314,2316-2324 
  ...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.96 |     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 | ...1073,1075-1076 
  ...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 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...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.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...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 |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 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.72 |    95.47 |     100 |   99.72 |                   
  ...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 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...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.53 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.37 |    85.29 |   90.79 |   87.37 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.21 |     100 |     100 | 737               
  ...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 |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...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 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-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 |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-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 |     85.1 |     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.06 |    82.05 |   77.03 |   84.06 | ...9492,9510-9514 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   46.92 |     62.5 |   76.92 |   46.92 | ...1058,1070-1093 
  ...-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.45 |    91.44 |   71.75 |   89.45 | ...3253,3284-3285 
  ...-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.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...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.31 |    93.31 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.76 |     100 |   89.85 | ...06-207,275-296 
  ...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.72 |     80.5 |   94.53 |   80.72 |                   
  ...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.99 |    77.48 |   93.44 |   75.99 | ...5708,5765-5771 
  index.ts         |   83.61 |    80.67 |   91.22 |   83.61 | ...2465,2551-2552 
  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.63 |    79.08 |   92.96 |   86.63 |                   
  ...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.75 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.35 |     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.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.54 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.14 |    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 |    90.09 |      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 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.38 |    81.73 |   95.79 |   86.38 |                   
  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.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |    98.5 |    93.65 |     100 |    98.5 | ...98,600,824-825 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.73 |    83.11 |   94.35 |   86.73 | ...7167,7169-7170 
  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 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   84.74 |    75.29 |     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.31 |    80.47 |      90 |   83.31 | ...1055,1060,1067 
  ...extensions.ts |   89.91 |    79.47 |   93.93 |   89.91 | ...2340,2385-2386 
  ...-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 |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...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.41 |    86.11 |     100 |   76.41 | ...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.52 |    91.71 |   96.15 |   93.52 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...er-helpers.ts |   63.82 |    78.15 |   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.93 |    84.37 |     100 |   88.93 | ...74,891,954-963 
  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.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |    95.2 |     87.5 |     100 |    95.2 | 191-197           
  ...on-archive.ts |   92.43 |     90.3 |   97.61 |   92.43 | ...1140,1181-1182 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.88 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |     100 |    97.05 |     100 |     100 | 199,252,427       
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.27 |     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 |   89.96 |    87.66 |   91.48 |   89.96 |                   
  index.ts         |   89.62 |    87.32 |   90.24 |   89.62 | ...1411,1424,1438 
  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.06 |    88.57 |      95 |   93.06 |                   
  scheduler.ts     |   93.06 |    88.57 |      95 |   93.06 | ...62-364,416-420 
 ...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.65 |    78.58 |   72.18 |   71.65 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...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.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...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.7 |    84.48 |   91.66 |    84.7 |                   
  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 |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...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 |   74.07 |    80.32 |   78.81 |   74.07 |                   
  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 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  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.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...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 
  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 |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...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 |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...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.71 |    87.78 |   86.53 |   90.71 |                   
  ...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 |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |    96.07 |   76.92 |   92.35 | ...59-361,364-367 
  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.34 |    82.18 |    86.6 |   86.34 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      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 |      100 |     100 |     100 |                   
  ...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.99 |      100 |       0 |    3.99 |                   
  ...gerDialog.tsx |    3.99 |      100 |       0 |    3.99 | 79-137,140-678    
 ...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 |   69.22 |    71.81 |   61.11 |   69.22 |                   
  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    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.27 |   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 |    79.56 |    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.49 |    84.45 |   88.88 |   86.49 |                   
  ...dProcessor.ts |   85.53 |     85.2 |     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.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...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 |   88.85 |    85.07 |   85.18 |   88.85 | ...6260,6262,6367 
  ...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 |      42 |       75 |     100 |      42 | 42-44,53-59,62-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.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...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.64 |     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 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...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 |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  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.06 |     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.33 |     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      |   88.05 |    86.01 |   96.15 |   88.05 |                   
  ...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   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  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-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  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 |      90 |     87.5 |     100 |      90 | 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.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...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.75 |    95.93 |     100 |   98.75 | 292-293,488-489   
  ...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.22 |    89.79 |   96.14 |   92.22 |                   
  ...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.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...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.72 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  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.31 |    91.36 |     100 |   94.31 | ...34,440,443-447 
  ...-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  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...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.91 |    87.33 |   90.58 |   88.91 |                   
 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.53 |    84.82 |   94.55 |   90.53 |                   
  ...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   |   95.91 |    87.12 |   94.44 |   95.91 | ...76-478,601,728 
  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.77 |    86.68 |   75.86 |   77.77 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.12 |    90.74 |   97.05 |   92.12 | ...37-538,666-672 
  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.39 |    87.49 |   91.59 |   93.39 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  ...-test-mock.ts |   98.82 |    66.66 |   58.33 |   98.82 | 85                
  agent-core.ts    |   90.38 |    80.91 |   81.25 |   90.38 | ...2550,2596-2598 
  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.64 |     82.6 |      80 |   81.64 | ...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.86 |    90.47 |     100 |   93.86 | ...2213,2306-2309 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   93.17 |     83.6 |      95 |   93.17 | ...14,372,392-395 
  ...ow-sandbox.ts |    97.4 |    89.37 |     100 |    97.4 | ...1846,1852-1853 
  ...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   |   85.75 |     86.2 |   91.15 |   85.75 |                   
  TeamManager.ts   |   80.12 |    84.78 |   84.37 |   80.12 | ...2089,2112-2113 
  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.99 |    94.52 |      95 |   92.99 | ...29-330,415-425 
  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.3 |    88.53 |   78.38 |    86.3 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.86 |    87.79 |   76.28 |   84.86 | ...9561,9565-9567 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...ver-config.ts |   97.29 |      100 |   83.33 |   97.29 | 48-49             
  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.84 |    88.69 |   93.96 |   92.84 |                   
  ...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.48 |    88.27 |   91.91 |   92.48 | ...4688,4786-4787 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...09-510,555-561 
  ...lScheduler.ts |   90.22 |    84.96 |   94.73 |   90.22 | ...6488,6516-6532 
  ...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.8 |   96.66 |   95.21 | ...5769,5814-5815 
  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.2 |      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   
  stream-guards.ts |   91.16 |    93.18 |     100 |   91.16 | ...89,218-229,294 
  ...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.21 |    94.69 |     100 |   99.21 | 784-785,854       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.62 |    89.21 |   97.43 |   96.62 |                   
  ...tGenerator.ts |   97.71 |    89.13 |   97.43 |   97.71 | ...1539,1568,1579 
  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.41 |    90.86 |   96.33 |   92.41 |                   
  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      |    96.3 |    91.36 |     100 |    96.3 | ...1204-1205,1312 
  ...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.27 |    90.56 |     100 |   95.27 | ...52-153,166-167 
  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     |   89.16 |    86.49 |   93.61 |   89.16 |                   
  ...ive-safety.ts |    97.9 |     92.8 |     100 |    97.9 | 235-236,313-316   
  ...-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.1 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.96 |    84.05 |      83 |   84.96 | ...3159,3197-3198 
  ...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 |   78.91 |    86.04 |   85.71 |   78.91 | ...95,202,214-248 
  github.ts        |   92.61 |    87.44 |     100 |   92.61 | ...1310-1311,1321 
  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 | ...76,666,684-685 
  goal-runtime.ts  |   96.51 |    90.64 |   96.49 |   96.51 | ...1645-1646,1777 
  ...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.53 |     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         |   90.59 |    86.89 |   90.32 |   90.59 |                   
  ...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    |   85.68 |    82.96 |    92.3 |   85.68 | ...1289,1299-1302 
  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 |    89.13 |     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           |   94.64 |    94.01 |   96.72 |   94.64 |                   
  inbound-gate.ts  |   98.99 |    89.71 |     100 |   98.99 | 557-559           
  ...-directory.ts |     100 |      100 |     100 |     100 |                   
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.61 |    97.22 |     100 |   97.61 | 262-264           
  peer-routing.ts  |     100 |      100 |     100 |     100 |                   
  peer-send.ts     |   97.17 |     98.3 |   88.88 |   97.17 | 183-187           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   88.52 |    92.59 |   85.71 |   88.52 | 172-185           
  uds-inbox.ts     |   82.42 |    84.09 |     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        |   89.47 |    85.72 |    92.1 |   89.47 |                   
  ...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.71 |    81.14 |   94.44 |   90.71 | ...17,640,657-663 
  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.43 |    83.16 |   77.77 |   78.43 | ...1493,1506-1508 
  ...ent-config.ts |   92.22 |    84.78 |      92 |   92.22 | ...64,473-474,478 
  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      |   97.21 |    95.29 |     100 |   97.21 | ...29,341,345-347 
  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 |   79.76 |    76.84 |      80 |   79.76 | ...69-473,476,482 
  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 |     79.1 |   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.44 |    91.62 |   71.77 |   84.44 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |   98.51 |    86.48 |     100 |   98.51 | 264-265           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    90.19 |     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 |   88.26 |     91.9 |   82.35 |   88.26 | ...1374,1480-1484 
  rule-parser.ts   |    94.9 |    92.81 |     100 |    94.9 | ...1552,1586-1588 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.06 |    95.23 |     100 |   99.06 |                   
  system-prompt.ts |   99.06 |    95.23 |     100 |   99.06 | 235               
 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.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    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.67 |    86.35 |   96.59 |   90.67 |                   
  ...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.77 |    96.56 |     100 |   97.77 | ...1098,1241-1249 
  ...ingService.ts |   92.25 |    87.59 |   94.79 |   92.25 | ...2924,2939-2940 
  ...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.11 |    89.74 |   98.03 |   94.11 | ...1366,1775-1776 
  cronTasksFile.ts |   95.88 |       92 |     100 |   95.88 | ...72,381-382,520 
  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.8 |    96.73 |     100 |    98.8 | 630,684-685,743   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.09 |    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.56 |       75 |    97.8 |   84.56 | ...2666,2688,2702 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.33 |    87.47 |   91.72 |   89.33 | ...4207-4208,4249 
  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 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.06 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.06 |     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 | 289-290           
 ...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.93 |    89.34 |   98.36 |   88.93 |                   
  ...ter-schema.ts |     100 |    98.18 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.75 |    86.38 |   97.56 |   85.75 | ...1653,1730-1731 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   94.14 |    95.23 |     100 |   94.14 | 47-52,65-66,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.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   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.73 |    86.34 |   90.34 |   87.73 |                   
  ...erQuestion.ts |      90 |    82.75 |   92.85 |      90 | ...01-402,409-410 
  ...-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   |   96.52 |    95.55 |    87.5 |   96.52 | 37-38,53-54       
  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 
  ...fier-input.ts |     100 |      100 |     100 |     100 |                   
  ...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 |        0 |       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.14 |     93.2 |     100 |   98.14 | ...1269,1324-1325 
  ...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.13 |    93.93 |    92.3 |   99.13 | 255-257           
  ...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  |   86.86 |    93.18 |      75 |   86.86 | ...20-426,568-575 
  ...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   |   88.67 |     87.5 |   85.71 |   88.67 | ...2-48,72-73,129 
  ...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.72 |    82.95 |   86.53 |   80.72 | ...1106,1114-1115 
  ...-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.2 |    89.79 |   93.75 |    96.2 | ...10,260-265,428 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...67-568,584-590 
  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.53 |   89.71 |   87.26 |                   
  agent.ts         |   85.88 |    87.66 |   87.35 |   85.88 | ...4277,4311-4321 
  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.79 |    89.75 |    96.9 |   92.79 |                   
  ...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   |   99.49 |    96.29 |     100 |   99.49 | 224               
  ...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 |    93.58 |      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.64 |    84.87 |    92.3 |   91.64 | ...00,415-420,580 
  ...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.51 |     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.24 |     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.6 |     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.32 |     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 |    35.71 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...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.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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

Test Plan (not a blocker): client/e2e/web-shell.workspace-overview.spec.tsno such file or directory; npm run buildexit 2.

中文说明

Test Plan(非阻断):client/e2e/web-shell.workspace-overview.spec.tsno such file or directory; npm run buildexit 2

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

Comment thread packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx
Comment thread packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx
Comment thread packages/web-shell/client/components/sidebar/WorkspaceMenu.tsx
Comment thread packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx
- e2e: call the mock daemon's replay helper with its object form
- stop fetching facets behind a custom (locked) header renderer and for
  the synthetic fallback workspace, which has nothing to display them
- keep a row's last session counts while it is collapsed
- rename: accept the daemon's 256-character display-name cap and treat a
  failed capabilities refresh after a successful rename as converged
- chips: use the sidebar's warning token and say "unavailable" rather than
  "not initialized" for daemon-side facets; drop the unread loading state
- record the Trust… deferral and the measured fan-out cost in the design
  doc; pin the reviewed behaviours with tests (hooks facet, user-question
  attention, poll default, in-flight invalidation, copy path, reload
  feedback, overview opt-out, worktree task)
@wenshao

wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator Author

Addressed the review round at 7af1806 — all 25 threads replied to and resolved. Summary: fixed the three Criticals (e2e replay helper called with its object form; no facet fetch behind a custom locked header renderer, nor for the synthetic fallback workspace; rename cap raised to the daemon's 256), kept a collapsed row's last session counts, split the rename mutation from the capabilities refresh, switched the chip warning tone to --warning-color, added an 'unavailable on this daemon' tooltip for daemon-side facets, dropped the unread loading/reload from the hook, recorded the Trust… deferral and the measured fan-out cost (5 expanded workspaces: 25 facet requests per 30 s tick) in the design doc, and pinned every remaining suggestion with a test (sidebar unit suites 256 → 18 files green, full web-shell unit suite 4475 green, full e2e 66 green locally). Two of the new tests were checked against the mutants named in the threads (disabled={unchanged}, dropped in-flight guard) and go red as expected.

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 28, 2026

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

Not explored to full depth (tool budget reached): chunk 4: executing WorkspaceMenu.test.tsx under vitest (no node_modules in the shared review worktree; a full monorepo install exceeds this chunk's budget — verification…; chunk 8: could not execute WorkspaceSection.test.tsx — the worktree has no node_modules , and I did not run a full monorepo install in the shared review tree; correct….

Test Plan (not a blocker): client/e2e/web-shell.workspace-overview.spec.tsno such file or directory; npm run buildexit 2.

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

  • packages/web-shell/client/components/sidebar/WebShellSidebar.tsx:1374 — [probe] public workspaceOverview: { items } option never populated by any test; ternary-collapse mutation survives
  • packages/web-shell/client/components/sidebar/WebShellSidebar.tsx:5395 — [probe] Projects workspace-count badge has only negative coverage; threshold-flip mutation survives
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:483 — [probe] primary sessionStats branch unwitnessed by unit tests; the e2e witness is post-merge-only
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:611 — [probe] header attention-count branch has no test witness; branch-off mutation left 256 tests green
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:653 — [probe] nextCursor '+' truncation render wiring unreachable by any test
  • packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx:156 — [probe] menu newSession action has no dispatch witness; rewiring mutant survived 169 tests
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.tsx:48 — [probe] mcp zero-denominator guard in formatOverviewValue has no test witness (channels half covered by post-merge e2e)
  • packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.tsx:43 — [probe] busy dismiss-guard and submit-handler busy || term have no test witness; mutants survive
  • packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx:156 — [probe] requested.size > 0 term of active never exercised; guard-removal mutant survives
  • packages/web-shell/client/components/sidebar/workspaceOverviewModel.ts:213 — [review] WorkspaceOverviewSnapshot.fetchedAt has zero read sites; merge stamps false freshness after fully failed rounds
中文说明

未探索到全部深度(达到工具调用预算):chunk 4:executing WorkspaceMenu.test.tsx under vitest (no node_modules in the shared review worktree; a full monorepo install exceeds this chunk's budget — verification…;chunk 8:could not execute WorkspaceSection.test.tsx — the worktree has no node_modules , and I did not run a full monorepo install in the shared review tree; correct…

Test Plan(非阻断):client/e2e/web-shell.workspace-overview.spec.tsno such file or directory; npm run buildexit 2

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

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

Comment thread packages/web-shell/client/components/sidebar/workspaceOverviewModel.ts Outdated
Comment thread packages/web-shell/client/components/sidebar/WebShellSidebar.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WebShellSidebar.tsx
Comment thread packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx Outdated
- context files are answered by the daemon from disk, so a workspace
  without a QWEN.md renders a known 0 instead of "not initialized"
- offer "New worktree task" only when the git poll reports a branch
- keep retained session counts only while the catalog query is disabled,
  not across a source switch on an expanded row
- tests: daemon-rejected rename keeps the dialog open, clipboard stub is
  restored, the display-name cap is pinned exactly, worktree gating
@wenshao

wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator Author

Round 2 addressed at fd3939b — 6 threads replied to and resolved. Both Criticals: context files are now a daemon-side facet (a workspace without a QWEN.md shows 0, not 'not initialized'), and 'New worktree task' is offered only on rows whose git poll reports a branch. Also: retained collapsed-row counts no longer leak across a source switch on an expanded row, the rename-rejected path and the exact 256 cap are pinned by tests, and the clipboard stub is restored after the copy-path test. Locally: sidebar suites 18 files / 260 green, full web-shell unit suite 4479 green, full e2e 66 green, tsc/ESLint/Prettier clean. The earlier CI red on 7af1806 was runner-load flakiness in files this PR does not touch (core shellAstParser timing, web-shell MessageList/SkillsManagerPage timeouts); the failed job was re-run and passed.

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 28, 2026

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

Test Plan (not a blocker): client/e2e/web-shell.workspace-overview.spec.tsno such file or directory.

Convergence: round 3 posted 9 inline comment(s), 9 of them reported for the first time; the previous round posted 6 (6 new). Findings keep coming back to the same files: packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx (findings in round 2; 2 more now); packages/web-shell/client/components/sidebar/WorkspaceSection.tsx (findings in round 1; 2 more now). The rate of new findings is not falling. 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. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. 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.)

中文说明

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

Test Plan(非阻断):client/e2e/web-shell.workspace-overview.spec.tsno such file or directory

收敛情况:第 3 轮发布了 9 条行内评论,其中 9 条是首次提出;上一轮发布了 6 条(其中 6 条首次提出)。发现反复回到同一批文件:packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx(第 2 轮已出过发现,本轮又有 2 条);packages/web-shell/client/components/sidebar/WorkspaceSection.tsx(第 1 轮已出过发现,本轮又有 2 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。本轮没有未决的 Critical,因此"合入后把剩余 Suggestion 线程转到后续 issue"是一个可选的结束方式——已合入的 PR 不会继续发散。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx
Comment thread packages/web-shell/client/components/sidebar/WorkspaceOverview.tsx
Comment thread packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx Outdated
- primary row shows no counts while its session source is switching,
  instead of the previous source's numbers
- poll git whenever header actions are wired, so the worktree entry no
  longer depends on the diff handler being present
- render no chips until the first overview round lands
- tests: primary-removal guard, branch-gated worktree entry on a non-git
  secondary workspace, untrusted rows never fetch, MCP disabled-server
  arithmetic, context file count, in-progress discovery is not a failure,
  and a deterministic wait for Radix's outside-press listener
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

Round 3 addressed at dfece46 — 9 threads replied to and resolved. Behaviour: the primary row shows no counts while its session source is switching (explicit null from the sidebar, no retained fallback); the git poll runs whenever header actions are wired so the worktree entry no longer depends on the diff handler; the chip row renders only once the first overview round has landed, so an in-flight fetch never reads as 'unavailable'. Tests: every named mutant was run against the new/strengthened cases and turns them red (primary-removal guard, branch-gated worktree entry on a non-git secondary, untrusted rows never fetch, MCP disabled-server arithmetic, context file count, in-progress discovery is not a failure); the outside-dismissal menu test now waits for Radix's macrotask listener registration and passes 8/8 locally. Full web-shell unit suite 4484 green, e2e 66 green, tsc/ESLint/Prettier clean.

@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 explored to full depth (tool budget reached): chunk 4: executed the test file ( npx vitest run client/components/sidebar/WorkspaceMenu.test.tsx ) — could not run because no node_modules exists in the review worktr….

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

Test Plan (not a blocker): client/e2e/web-shell.workspace-overview.spec.tsno such file or directory.

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

  • packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx:69 — [probe] channels zero-guard has no test; guard deletion ships green and chip/menu render 0/0 for no-channels workspaces
  • packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx:3266 — [probe] overview-off headerCounts assertion vacuous (zero sessions); the overviewEnabled && half of the stats gate is unpinned
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx:203 — [probe] hooks tooltip disabled:false branch unpinned; a constant-disabled mutant ships green ('N hooks (disabled)' on active hooks)
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:490 — [probe] overviewItems pass-through (hook items + WorkspaceOverview items) untested; the embedding items knob can be silently severed
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:146 — [probe] compact prop consumers (pathCompact class, compact pass-through) untested; tight-width label-less chips unpinned
  • packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx:2982 — [probe] primary-menu not.toContain('Rename…') vacuous (fixture lacks the feature); a !ws.primary mutant in canRename ships green
  • packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx:138 — [probe] triggerClassName/contentStyle pass-throughs untested; trigger styling and portal z-index unpinned
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx:196 — [probe] chipUnknown class branch untested; unknown facets would lose the dimmed tone and look identical to real data
  • packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts:278 — [probe] channel 'starting' runtime state unexercised; a classification refactor folding it into connected ships green
  • packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx:800 — [probe] dead workspaceGit fixture: beforeEach re-installs the handle without it, 175 poll TypeErrors per full-suite run

Convergence: round 4 posted 6 inline comment(s), 6 of them reported for the first time; the previous round posted 9 (9 new). Findings keep coming back to the same files: packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx (findings in round 3; 3 more now); packages/web-shell/client/components/sidebar/WorkspaceSection.tsx (findings in round 3; 2 more now); packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx (findings in round 3; 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. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

未探索到全部深度(达到工具调用预算):chunk 4:executed the test file ( npx vitest run client/components/sidebar/WorkspaceMenu.test.tsx ) — could not run because no node_modules exists in the review worktr…

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

Test Plan(非阻断):client/e2e/web-shell.workspace-overview.spec.tsno such file or directory

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

收敛情况:第 4 轮发布了 6 条行内评论,其中 6 条是首次提出;上一轮发布了 9 条(其中 9 条首次提出)。发现反复回到同一批文件:packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx(第 3 轮已出过发现,本轮又有 3 条);packages/web-shell/client/components/sidebar/WorkspaceSection.tsx(第 3 轮已出过发现,本轮又有 2 条);packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx(第 3 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx Outdated
Comment thread packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx Outdated
- retained session counts are tagged with the source they were computed
  for, so a collapsed row drops them after a global source switch
- a locked sidebar with a custom header passes no header actions, so the
  section skips the git poll that only feeds them
- tests: primary-row wiring (no session list) for the loading guard,
  attention badge and truncation marker, overview reaches header actions,
  skills/extensions/channels tooltips, locked rows never poll git
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

Round 4 addressed at 05b8389 — 6 threads replied to and resolved. The Critical (a collapsed secondary row keeping the previous source's counts after a global source switch) is fixed by tagging the retained counts with their source; the locked-sidebar git poll is closed off caller-side by passing no header actions under a custom header renderer; the remaining suggestions are pinned by tests (primary-row wiring for the loading guard, attention badge and '+' marker, overview reaching the header actions, skills/extensions/channels tooltips, locked rows never polling git), each verified red against the named mutant. Locally: sidebar suites 269 green, full web-shell unit suite 4488 green, e2e 66 green, tsc/ESLint/Prettier clean.

…ce-overview

# Conflicts:
#	packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx
#	packages/web-shell/client/components/sidebar/WorkspaceSection.tsx
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

Merged origin/main (c1f8a42) into the branch at 76f1208 to clear the conflict with #10416 in WorkspaceSection: main's search/pinned split (searchedSessionsvisibleSessions) and this PR's overview block are both kept, and both sides' new WorkspaceSection test suites are retained. No rebase, so existing review threads stay anchored. On the merged tree: web-shell unit suite 4676 green, e2e 66 green, tsc/ESLint clean.

- an armed branch/worktree intent no longer resets on a transient
  git-status gap; only a session, an untrusted workspace, a no-branch
  answer or a draft workspace switch clears it
- the workspace header action wrapper stays visible while its menu is
  open, so Escape returns focus to the trigger
- the git poll runs only when a consumer of the branch is wired (diff
  chip or worktree entry outside a locked sidebar)
- the worktree entry shares the new-task re-entrancy guard, busy state
  and catalog refresh
- the menu's management section is one flat group; facet summaries are
  isolated per facet so a malformed body cannot blank the whole round
- tests for each of the above plus the items/cwd/re-enable transitions,
  placeholder overwrite on merge, skills placeholder, and action order
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

Round 5 addressed at a910a03 — 14 threads replied to and resolved. The Critical (an armed worktree intent silently cleared by a transient git-status gap) is fixed by resetting the intent only on definitive answers — session exists, workspace untrusted, git answered no branch, or the draft's workspace was switched — via a small pure helper with unit tests plus an App-level test that rejects one refetch round and asserts the intent survives (red under the previous behaviour). Also: the header action wrapper stays visible while its menu is open; the git poll runs only when the diff chip or an unlocked worktree entry consumes the branch; the worktree entry shares the new-task re-entrancy guard and catalog refresh; the manage section is one flat group; facet summaries are isolated per facet. Every named mutant was run against the new tests and turns them red. Locally: sidebar suites 19 files green, full web-shell unit suite 4693 green, e2e 66 green, tsc/ESLint/Prettier clean. On CI: the earlier reds on this branch were all 60-minute job timeouts / cascaded cancels on the self-hosted pool (Test ubuntu ×4, E2E Smoke's 20-minute step), not test failures.

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

⚠️ Downgraded from Request changes to Comment: self-PR; CI failing: web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment (ubuntu-latest, 22.x), Test (ubuntu-latest, Node 22.x); PR head advanced during review: reviewed 518f92c, PR is now at a910a03 (+1 unreviewed commit(s) touching 14 file(s)). Partially reviewed — gaps disclosed. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

Not reviewed: the executable-script lint — the report is stale or its diff could not be verified; re-run qwen review script-lint.

Not reviewed: reverse audit — an auditor ran and opened its brief, but no agent was launched with the prompt the CLI built — the launch was written by hand, and what the agent was actually asked is not what this skill certifies.

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

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

  • packages/web-shell/client/components/sidebar/workspaceOverviewModel.ts:75 — [review] D5-1 doc comment lists context among ACP-discovered facets — five agreeing authorities contradict it; a maintainer trusting it 'fixes' the known-gate and e…
  • packages/web-shell/client/components/sidebar/WebShellSidebar.module.css:1871 — [review] D5-2 Projects badge pairs --muted-foreground on --sidebar-accent: ~2.27:1 in the light theme; six sibling precedents use --sidebar-accent-foreground (~1…
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.module.css:28 — [review] D5-3 the overview chips replicate the same 2.27:1 light-theme pair in a different new file — a badge-only fix leaves the chips unfixed; dark theme passe…
  • packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts:186 — [review] R5-27 'nothing keeps polling' settle-check is vacuous for ≥1.5s intervals and the final re-check flakes against the by-design 30s poll — pin the cadence with …
  • packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts:233 — [review] R5-28 the e2e worktree comment claims the draft opens in THAT workspace but no assertion checks the target — a wrong-cwd regression ships green (anchor unreso…

Convergence: round 5 posted 29 inline comment(s), 29 of them reported for the first time. Findings keep coming back to the same files: packages/web-shell/client/components/sidebar/WorkspaceSection.tsx (findings in rounds 3, 4; 6 more now); packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx (findings in round 4; 4 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.)

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

中文说明

⚠️ 已从请求修改降级为评论:self-PR; CI failing: web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment (ubuntu-latest, 22.x), Test (ubuntu-latest, Node 22.x); PR head advanced during review: reviewed 518f92c, PR is now at a910a03 (+1 unreviewed commit(s) touching 14 file(s))。 仅完成部分审查,审查缺口已披露。 建议见行内评论。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。

未审查:the executable-script lint — the report is stale or its diff could not be verified; re-run qwen review script-lint

未审查:反向审计——有审计 agent 运行并打开了自己的 brief,但没有 agent 是用 CLI 构建的 prompt 启动的——启动 prompt 是手写的,agent 实际被要求做的并不是本 skill 所认证的内容。

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

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

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

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

— glm-5.3 via Qwen Code /review (v0.22.2)

Comment thread packages/web-shell/client/App.tsx Outdated
Comment thread .qwen/e2e-tests/2026-08-28-web-shell-workspace-overview.md Outdated
Comment thread packages/web-shell/client/components/sidebar/WebShellSidebar.tsx
Comment thread packages/web-shell/client/components/sidebar/WebShellSidebar.tsx
Comment thread packages/web-shell/client/components/sidebar/WebShellSidebar.tsx
Comment thread packages/web-shell/client/components/sidebar/useWorkspaceOverview.ts Outdated
Comment thread packages/web-shell/client/components/sidebar/workspaceOverviewModel.ts Outdated
Comment thread packages/web-shell/client/e2e/utils/mockDaemon.ts
Comment thread packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts
- the sidebar's worktree arm is dropped when another session start ran
  while the creation was in flight
- header totals honour the daemon's page-level truncated flag as well as
  a next cursor, on both the primary and secondary derivations
- rename is offered on registration-backed rows only; the rename dialog
  refuses control characters before the request is sent
- the header menu keeps the row's last overview snapshot while collapsed
  and its live counts are part of the items' accessible names
- a custom header still fetches the overview when header actions consume
  it; a facet reads as unavailable after three unanswered rounds and a
  cwd change never carries the previous workspace's facets over
- mock daemon: per-workspace overview facets; e2e asserts the secondary
  row's own counts and pins the 30 s poll with a fake clock
- main-boot.test mocks the provider module main.tsx imports (also opened
  separately against main)
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

Round 6 addressed at acef9f3 — 29 threads replied to and resolved (several were already covered by a910a03 and are marked as such). Judged and kept: the stale-arm race is closed with a composer-source-version token, header totals honour the daemon's truncated flag, rename is offered on registration-backed rows only (persistence, not trust), control characters are refused in the dialog, the menu keeps the row's last snapshot while collapsed and exposes counts to assistive tech, a custom header with header actions still fetches, facets expire after three unanswered rounds, and a cwd change clears the snapshot; the mock daemon serves per-workspace facets and the e2e pins the secondary row's own counts plus the 30 s cadence with a fake clock. One deliberate limitation is stated in-thread (the sidebar-side truncated flag cannot be driven through the mocked legacy sessions hook). Separately, main's web-shell unit suite fails at collection in main-boot.test.tsx since #9811 moved daemon-react-sdk out of @qwen-code/webui (the mock path is stale) — that one-line fix is #10526 against main and is carried here too so this branch's Test job can go green. Locally on the merged tree: web-shell unit suite 5331 green, e2e 65 green, tsc/ESLint/Prettier clean; every named mutant turns its new test red.

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

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

  • context-listed-among-ACP-discovered-facets doc comment (workspaceOverviewModel.ts:75) — already reported (round 5 deferred list, D5-1, review 5058918480)
  • write-only WorkspaceOverviewSnapshot.fetchedAt (workspaceOverviewModel.ts:218) — already reported (round 2 deferred list, review 5054597661; named again in round 5's duplicate list)

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

Test Plan (not a blocker): client/e2e/web-shell.workspace-overview.spec.tsno such file or directory.

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

  • packages/web-shell/client/components/sidebar/WorkspaceOverview.tsx:123 — [review] compact-mode chip aria-label unexposed on role-less span (Chromium AX probe)
  • packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx:1410 — [review] zero-parameter headerActions mocks: TS2493/TS18048 at five sites, invisible to CI typecheck
  • packages/web-shell/client/App.tsx:8752 — [review] draft-workspace-switch intent resets untested; deleting both keeps 583/583 green
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.tsx:109 — [review] expired runtime-discovered facet shows 'not initialized yet' forever instead of 'unavailable'
  • packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx:448 — [review] visibilityState redefine never restored; a mid-window failure leaks 'hidden' into later tests

Convergence: round 6 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 14 (14 new). Findings keep coming back to the same files: packages/web-shell/client/components/sidebar/useWorkspaceOverview.ts (findings in round 5; 1 more now). (Evidence: the previous round was recovered from a marker this account did not post and merged over this account's own entries, so some of those rounds and its counts 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.)

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

中文说明

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

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

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

Test Plan(非阻断):client/e2e/web-shell.workspace-overview.spec.tsno such file or directory

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

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

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

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

Comment thread packages/web-shell/client/components/sidebar/useWorkspaceOverview.ts Outdated
The SDK's request deadline equals the overview poll cadence, so while a
daemon hangs every round times out just after the next tick has replaced
it and never reached the miss bookkeeping; facets could freeze on their
pre-hang counts for the whole hang. Misses are now recorded for every
round that lands, and a superseded round that observes an expiry drops
those facets without merging its stale data. A round from a previous cwd
is ignored entirely.
@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

Round 7 addressed at a4aaed4 — the one Critical (superseded timeout rounds never reaching the miss bookkeeping, so a hung daemon froze the chips) is fixed by counting misses on every landed round and letting a superseded round drop expired facets without merging its stale data; verified red under the old ordering. Locally on the merged tree: web-shell unit suite 5333 green, e2e overview spec green, tsc/ESLint/Prettier clean. CI: the branch's Test (ubuntu) and E2E Smoke remain 60-/20-minute timeouts on the self-hosted pool (28–30 runs in flight all day); #10526 shows the identical trio. Nothing else is pending on the code side.

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

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

  • compact-mode chip aria-label unexposed on role-less span (WorkspaceOverview.tsx:123) — already reported (round 6 deferred list, review 5059570999)
  • doc comment lists context among ACP-discovered facets (workspaceOverviewModel.ts:75) — already reported (round 5 deferred D5-1, review 5058918480; named again in round 6)
  • draft-workspace-switch intent resets untested (App.tsx:8752) — already reported (round 6 deferred list, review 5059570999)

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

Test Plan (not a blocker): client/e2e/web-shell.workspace-overview.spec.tsno such file or directory.

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

  • packages/web-shell/client/App.tsx:1356 — [review] workspaceOverview: false App-level forwarding untested — dropping the forwarding line keeps all 583 App tests green
  • packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx:3249 — [review] worktree-gate test confounds branch gate with primary flag — adding !ws.primary keeps 103/103 green
  • packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx:294 — [review] cwd-isolation guard (useWorkspaceOverview.ts:145) load-bearing but unpinned — guard-deletion mutant 20/20 green, probe flips
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.tsx:101 — [review] unknown items in the public workspaceOverview.items option crash the whole Web Shell via ICONS[item] and the root ErrorBoundary
  • packages/web-shell/client/App.test.tsx:1139 — [review] createNewSession(workspaceCwd) seam unpinned — createNewSession() mutant keeps 583 tests green, flip probe reds
  • packages/web-shell/client/components/sidebar/WebShellSidebar.tsx:454 — [review] onNewWorktreeSession void-return contract skips bumpWorkspaceReload/refreshWorkspace, diverging from the sibling onNewSession
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:554 — [review] sessionsActive ? undefined : retainedStats guard unpinned — mutant survives 46+103 tests, flip probe reds
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:513 — [review] retainedOverview never cleared when the overview is disabled — the menu keeps stale counts, contradicting the prop JSDoc
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:681 — [review] headerCounts stats.total > 0 gate unpinned — empty workspaces would render a bare '0' badge; mutant 149/149 green
  • packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts:45 — [review] e2e worktree assertions hang on the global gitStatus mock — wrong-cwd polling mutant stays green
  • packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts:325 — [review] clock-driven cadence e2e fails deterministically on loaded runners — Playwright's installed clock syncs real time during startup waits; product exonerated by …

Convergence: round 7 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 1 (1 new). The rate of new findings is not falling. Batching the remaining fixes and verifying them before the next push keeps the loop from re-deriving the same set; this PR's reviews already resolve to a critical posting floor. (Observation only — nothing was withheld from this review because of this observation.)

Residual risk: this loop is persistently critical — Criticals stood in the previous round's work-list and stand again this round (1 Critical(s)), the rate of first-time findings is not falling (this round 1, previous 1), and the standing Critical backlog is not shrinking. The severity floor will not converge it. Recommendation: land-with-residual-risk — the exit is a maintainer risk-acceptance decision (merge, carrying the residual risk), not another review round. Residual-risk inventory for that decision (maintainer to complete):

standing Critical attack surface attacker-dependency blast radius
(each standing Critical)

Advisory only — it does not block this review.

中文说明

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

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

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

Test Plan(非阻断):client/e2e/web-shell.workspace-overview.spec.tsno such file or directory

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

收敛情况:第 7 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 1 条(其中 1 条首次提出)。新发现的产出速度没有下降。把剩余修复攒成一批、验证后再推送,可以避免循环反复推导同一组发现;本 PR 的评审已解析为 critical 发布下限。(仅为观察——本轮评审未因此扣留任何内容。)

残余风险:本循环处于 persistently-critical 形态——上一轮工作清单中的 Critical 本轮依然存在(本轮 1 条 Critical),首次发现的速率没有下降(本轮 1,上一轮 1),且未决 Critical 积压没有减少。severity floor 无法使其收敛。建议:land-with-residual-risk——出口是 maintainer 的风险接受决定(合入并承担残余风险),而非再开一轮评审。供该决定使用的残余风险清单(maintainer 填写):按每条未决 Critical 列出「攻击面 · 攻击者依赖性 · 影响范围」三栏。仅为建议——不阻断本次评审。

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

Comment thread packages/web-shell/client/App.tsx Outdated
The sidebar's worktree entry armed the intent after createNewSession
settled, guarded by a composer-version token. Two gaps remained: a prompt
submitted while the previous session was still clearing read the reset
intent and got the current branch, and a draft re-targeted through the
sidebar during the await kept the token so the arm still landed.

createNewSession now takes the git intent and writes both the state and
the ref in the same synchronous step that resets the previous one, so the
intent belongs to that draft from the start; the sidebar entry passes
worktree and no post-await arm exists. The invalidation effect also
re-runs on intent changes so an intent set while a session already exists
is cleared at once.
@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

Round 8 (1 Critical) addressed in 8e4ebb2.

The worktree intent is no longer armed after createNewSession settles; it is passed in and set in the same synchronous step that resets the previous intent, so the very first prompt of the draft — even one admitted while the previous session is still clearing — sees it, and re-targeting the draft resets it like any other intent. The composer-version token is gone with the post-await arm. The invalidation effect also re-runs on intent changes so an intent set while a session exists is cleared immediately.

Verification: two new App tests (prompt during in-flight clear gets worktree; sidebar re-target during the await drops it), both red under the named mutants; client/App.test.tsx 585 green; full web-shell unit suite 5335 green; web-shell.workspace-overview.spec.ts 3 green against the dev server; tsc and ESLint clean. All 91 review threads are resolved.

中文说明

第 8 轮(1 条 Critical)已在 8e4ebb2 处理。

worktree 意图不再在 createNewSession 落定后武装,而是作为参数传入,在重置上一个意图的同一个同步步骤里设置,因此草稿的第一个提示——即使是在上一个 session 仍在清理时提交的——也能看到它;重新定向草稿会像其它意图一样把它重置。composer 版本 token 随事后武装一起删除。失效 effect 也会在意图变化时重跑,session 已存在时设进来的意图立即清掉。

验证:新增两个 App 测试(清理进行中提交提示拿到 worktree;await 期间经侧栏切换工作区则丢弃),在对应变异下都变红;client/App.test.tsx 585 绿;web-shell 全量单测 5335 绿;web-shell.workspace-overview.spec.ts 对 dev server 3 绿;tsc 与 ESLint 干净。91 条评审线程全部已 resolve。

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

Not explored to full depth (tool budget reached): "agent 6c": local execution of the four new App tests — blocked because @qwen-code/sdk (packages/sdk-typescript) has no built dist/ in this worktree and its build scrip….

Test Plan (not a blocker): client/e2e/web-shell.workspace-overview.spec.tsno such file or directory.

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

  • packages/web-shell/client/App.tsx:8773 — [review] composer-seam draft reset untested
  • packages/web-shell/client/App.tsx:12690 — [review] management/overview App seams untested
  • packages/web-shell/client/App.tsx:8692 — [review] same-tick ref-write window untested
  • packages/web-shell/client/App.test.tsx:11203 — [review] hand-rolled deferred instead of file's helper

Convergence: round 8 posted 2 inline comment(s), 2 of them reported for the first time; the previous round posted 1 (1 new). Findings keep coming back to the same files: packages/web-shell/client/App.tsx (findings in round 7; 2 more now). The rate of new findings is not falling. 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. Batching the remaining fixes and verifying them before the next push keeps the loop from re-deriving the same set; this PR's reviews already resolve to a critical posting floor. (Observation only — nothing was withheld from this review because of this observation.)

Residual risk: this loop is persistently critical — Criticals stood in the previous round's work-list and stand again this round (2 Critical(s)), the rate of first-time findings is not falling (this round 2, previous 1), and the standing Critical backlog is not shrinking. The severity floor will not converge it. Recommendation: land-with-residual-risk — the exit is a maintainer risk-acceptance decision (merge, carrying the residual risk), not another review round. Residual-risk inventory for that decision (maintainer to complete):

standing Critical attack surface attacker-dependency blast radius
(each standing Critical)

Advisory only — it does not block this review.

中文说明

未探索到全部深度(达到工具调用预算):"agent 6c"local execution of the four new App tests — blocked because @qwen-code/sdk (packages/sdk-typescript) has no built dist/ in this worktree and its build scrip…

Test Plan(非阻断):client/e2e/web-shell.workspace-overview.spec.tsno such file or directory

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

收敛情况:第 8 轮发布了 2 条行内评论,其中 2 条是首次提出;上一轮发布了 1 条(其中 1 条首次提出)。发现反复回到同一批文件:packages/web-shell/client/App.tsx(第 7 轮已出过发现,本轮又有 2 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,可以避免循环反复推导同一组发现;本 PR 的评审已解析为 critical 发布下限。(仅为观察——本轮评审未因此扣留任何内容。)

残余风险:本循环处于 persistently-critical 形态——上一轮工作清单中的 Critical 本轮依然存在(本轮 2 条 Critical),首次发现的速率没有下降(本轮 2,上一轮 1),且未决 Critical 积压没有减少。severity floor 无法使其收敛。建议:land-with-residual-risk——出口是 maintainer 的风险接受决定(合入并承担残余风险),而非再开一轮评审。供该决定使用的残余风险清单(maintainer 填写):按每条未决 Critical 列出「攻击面 · 攻击者依赖性 · 影响范围」三栏。仅为建议——不阻断本次评审。

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

Comment thread packages/web-shell/client/App.tsx Outdated
Comment thread packages/web-shell/client/App.tsx
…pace draft moves

Two paths still dropped a worktree intent that nothing had invalidated.

Re-selecting the draft's own workspace from the composer picker (Radix
fires onValueChange for the checked row too) went through the draft
branch of switchWorkspace and hit the reset added for real switches. The
branch now compares the target with the selected workspace before it
overwrites the ref and skips only the reset when they match; the cwd
re-set and composer version bump stay as before.

Arming a worktree intent from another workspace's row while the draft
workspace had a definitive no-branch answer (a non-repo primary) was
undone in the same commit: activeWorkspaceCwd already pointed at the new
workspace but selectedWorkspaceGitStatus still held the old answer, which
the git-status effect clears only after the commit. The reset check now
keys the status by workspaceCwd, the same rule the git_status_changed
mirror effect uses, so a status for a workspace being left never decides
for the new one. A definitive no-branch answer for the draft's own
workspace still clears the intent.
@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

Round 9 (2 Critical) addressed in 254fdc0.

Both were real: re-selecting the draft's own workspace from the composer picker hit the draft-branch reset added for real switches (now guarded by a same-target compare taken before the ref is overwritten; only the reset is skipped), and a worktree intent armed from another workspace's row was undone by the previous draft workspace's stale no-branch status in the same commit (the reset check now keys the status by workspaceCwd, the same rule as the git_status_changed mirror effect).

Verification: three new App tests, each red under its named mutant (guard removed / raw status / status clause dropped); client/App.test.tsx 588 green; full web-shell unit suite 5338 green; web-shell.workspace-overview.spec.ts + web-shell.git-mode.spec.ts 8 green against the dev server; tsc and ESLint clean. All 93 review threads resolved. The PR body's e2e path is now repo-relative so the test-plan probe can find it.

中文说明

第 9 轮(2 条 Critical)已在 254fdc0 处理。

两条都成立:从作曲器选择器重选草稿自身的工作区会撞上为真实切换加的草稿分支重置(现在在覆写 ref 之前做同目标比较,相同则只跳过重置);从另一工作区行置位的 worktree 意图会在同一次提交里被上一个草稿工作区的陈旧无分支状态清掉(重置检查现在按 workspaceCwd 对齐状态,与 git_status_changed 镜像 effect 同一规则)。

验证:新增三个 App 测试,各自在对应变异体(去守卫 / 原始状态 / 去状态子句)下变红;client/App.test.tsx 588 绿;web-shell 全量单测 5338 绿;web-shell.workspace-overview.spec.ts + web-shell.git-mode.spec.ts 对 dev server 8 绿;tsc 与 ESLint 干净。93 条评审线程全部已 resolve。PR 描述里的 e2e 路径改为仓库相对路径,便于 test-plan 探针定位。

@wenshao

wenshao commented Aug 30, 2026

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: ❌ not passed — findings reported (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: 50 passed · 2 failed · 52 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 检查

脚本断言:50 通过 · 2 失败 · 52 总计

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

Verification report

PR 10407 deep verification — feat(web-shell): show workspace overview and a workspace menu in the sidebar

Verdict: findings — assertions: 50 pass / 2 fail / 52 total (see assertions.json) — verified head: 2a83a40d1a8439403a5a6bbaf6962804aa84d4b3 (base tip 168a88c02e2dfab3e8f968009d0d5d3a42b9b1b6)

Two reviewer-worthy findings, neither a product defect: the PR's new 30 s-poll e2e test is speed-correlated (fails deterministically on machines where the page settles slower than ~1 s; measured failing on this runner, measured fix validated), and one of the hook's two cwd-isolation guards (the in-flight stale-round check) is not pinned by any test. The central behavior is proven load-bearing by an A/B against base.

中文摘要

结论:findings(非产品缺陷,两处值得评审关注的问题)。

  • A/B 结论:中心声明得证。在 head 上,展开且已信任的工作区每个 facet 恰好发起一次请求(mcp/skills/extensions/channels/context 各 1 次,hooks 默认不请求),折叠后不再有新请求,重新展开恰好再来一轮,未信任行即使展开也从不请求;5 个默认 chip 按行渲染且计数正确(MCP 2/3Skills 2Extensions 1/2Channels 1/1Context 2)。base 侧同一场景 0 次 facet 请求、0 个 chip。35/35 条脚本化断言通过(见 03-ab-assertions.png01-ab-head-gating.png02-ab-base-silent.png)。
  • e2e 线路 oracle:PR 自带 3 个用例,2 个通过(chip/计数/按工作区隔离/折叠再展开、主/次工作区菜单精确清单与 worktree 预备);第 3 个「30 秒轮询」用例在本机(慢速共享 runner)确定性失败——原因是 page.clock.install() 未暂停时钟,页面 settle 的真实耗时(本机约 4 秒)使轮询相位提前,29 秒窗口内落下一整轮请求。产品行为本身正确:探针实测轮询间隔自注册起恰好 30 秒(+5@31s+10@61s,修复后的时钟暂停版探针在本机通过)。
  • 变异矩阵:9 个变异(含阳性对照),8 个被既有测试杀死(占位永不渲染为 0、警告色、跨瞬时失败保留、3 次未答即不可用(含挂起期被取代轮)、enabled 门控等均已钉住);1 个存活(M5:在途旧 cwd 轮守卫),组合行证明 settled 态由兄弟守卫(reset effect)钉住,M5 覆盖的是无人钉住的在途窗口——属覆盖缺口(建议补一条夹具),非缺陷。
  • 定向门槛:typecheck 干净;sidebar 目录套件 18 文件 / 316 用例 / 0 失败;removal+rename 单独跑 110/110 通过。全量单测在本容器两臂均不干净(head 246/5352 失败,base A/A 201/3542 失败、53 个文件更多),142 条失败两臂字节级同名;PR 触及文件的 head 独有失败单独运行全部通过——判定为环境/负载问题而非 PR 引入(见正文表格与 07-gates-and-aa-summary.png)。
  • 未覆盖:逐提交归属(浅克隆仅 3 个提交可达,12 个提交不可达,验证的是聚合 diff);真实 qwen serve daemon(mock daemon 证明线路形状与处理,非真实路由);PR 全量 e2e(66 用例)仅跑了新增 overview 用例;Windows/Linux 视觉。

Central claim and A/B

Central claim: expanded, trusted workspaces fetch one request per overview facet from the workspace-qualified daemon routes, render chips, and stop fetching when collapsed/untrusted; uninitialized runtimes never render as 0.

A byte-identical harness (verify-ab.test.tsx in this artifact dir) renders WebShellSidebar in jsdom against a recording fake client in both trees; the driver applies per-arm expectations. Scenario: primary trusted /tmp/project, secondary trusted /tmp/other, untrusted /tmp/danger; rows start expanded by default; phases P1 mounted → P2 collapse other → P3 re-expand other.

Cell Environment Oracle Result
head P1 PR build, 3 rows expanded facet spy counts + [data-web-shell-workspace-overview] chips trusted rows: 1 call per facet (mcp/skills/extensions/channels/memory; hooks 0 = opt-in); untrusted row: client never reached; 10 chips with correct counts (01-ab-head-gating.png)
head P2 other collapsed counts unchanged; chips 10→5 no fetch on collapse; chips dropped
head P3 other re-expanded counts +1 per facet; chips back to 10 gating flips back on
base P1–P3 base worktree 168a88c02e, identical harness same oracles 0 facet calls, 0 chips in every phase (02-ab-base-silent.png)

Scripted expectations over both arms: 35/35 passed (03-ab-assertions.png). Base-side control purity: the only internal dependency in play is @qwen-code/sdk (symlink → packages/sdk-typescript, dist built at HEAD); the PR touches no file outside packages/web-shell/ (+docs), so base code runs against a byte-identical SDK. readlink -f node_modules/@qwen-code/sdk = /__w/qwen-code/qwen-code/packages/sdk-typescript (unchanged by the PR); the base worktree has no local node_modules, resolution walks up to the shared root.

Secondary claims verified:

  • Uninitialized facets never render 0: mutation M1 (treat uninitialized MCP as known) is killed by keeps the idle placeholder unknown rather than reporting zero and siblings.
  • MCP warning tone (failed server, or discovery complete with an enabled server still down): mutation M2 (both branches disabled) killed by flags an issue when a server failed or never came up after discovery + the chip-rendering test.
  • Facet keeps last known value across a transient failure, goes unavailable after 3 unanswered rounds — including while every round is superseded during a daemon hang: mutations M3/M4 killed, M4 by both drops a facet after consecutive unanswered rounds and expires facets during a hang even though every round is superseded.
  • Embedder knobs are live, not dead switches: workspaceOverview: false (removal-suite test 3518), { items: ['mcp'] } (test 3423), onOpenWorkspaceManagement and onNewWorktreeSession both exercised by the e2e menu test below.

Findings

F1 (Suggestion) — the new 30 s-poll e2e test is speed-correlated: it fails on machines where the page settles slower than ~1 s

polls an expanded workspace once per 30 s tick and not faster (client/e2e/web-shell.workspace-overview.spec.ts:303) failed twice in two runs on this (loaded, shared) runner:

Error: expect(received).toHaveLength(expected)
Expected length: 11
Received length: 16

Attribution, measured with an instrumented probe (fixed-poll-spec.probe.ts in the artifact dir):

  1. No focus event fired anywhere (focus log empty) — the refetch-on-focus path is not involved.
  2. Advancing the fake clock 1 s at a time, the extra round lands at baseline+26 s, never at +30 s from the baseline:
    PROBE t=25s count=11   PROBE t=26s count=16   PROBE t=32s count=16
    
  3. page.clock.install() without pauseAt keeps fake time advancing with real time. The overview interval is registered ~4 s after install() (page load + settle takes that long in real time here), so its first tick sits at baseline+26 s — inside the spec's runFor(29_000) window. The spec implicitly assumes settle takes <1 s: on the author's machine it holds; here it deterministically fails. This is the speed-correlated class: retries: 2 in CI does not absorb it — a given machine is consistently on one side of the margin.

The product behavior is correct: the same probe shows the interval fires exactly 30 fake-seconds after registration (registered ≈ fake −4 s → tick at baseline+26 s, next would be +56 s), and the validated fix reproduces the spec's intent deterministically on this same machine:

PROBE-FIX settled=11
PROBE-FIX after-29s=11 (no early tick)
PROBE-FIX after-31s=16 (one tick round)
PROBE-FIX after-61s=21 (second tick round)
Suggested fix (measured)

Freeze the fake clock while the page settles, so the baseline and the interval registration share one fake instant:

await page.clock.install();
await page.clock.pauseAt(Date.now());
await gotoSession(page, scenario, daemon);

Measured on this runner: hostile case (slow settle) goes clean — no tick at 29 s, exactly +5 at 31 s, +10 at 61 s; the assertions the spec already contains are unchanged. The suite count for the spec file is unchanged (1 test, now deterministic). The probe validated this exact patch; the first two tests of the spec are unaffected (they do not install the clock).

F2 (Suggestion) — the in-flight stale-round cwd guard survives deletion: its window is pinned by no test

Mutation matrix (control green at 53/53 first; 04-mutation-matrix.png):

Row Mutation (guard removed) Overview suites (53 tests) Classification
C1 control: summarizeSkills total +1 (same file as M1) KILLED 7 failed harness live ✓
M1 uninitialized MCP counts as known KILLED 3 placeholder-never-zero pinned
M2 MCP warning tone off (both branches) KILLED 2 warning pinned
M3 merge carry-over removed KILLED 4 transient-failure retention pinned
M4 miss expiry >=> (4 rounds instead of 3) KILLED 2 expiry pinned incl. superseded-hang case
M5 if (cwd !== cwdRef.current) return; removed SURVIVED 0 failed see combination rows
M6 enabled gating removed KILLED 4 gating pinned
M5B cwd reset effect removed (M5's sibling) KILLED 1 pinned by never carries a facet from the previous cwd into the next one
M5C both cwd guards removed KILLED 1 same single test

The settled-state handoff is pinned only by the reset effect; the reload-time guard is the sole defence for the window where a slow round from the old cwd lands after the switch (requestIdRef is not bumped on cwd change, so nothing else stops it). No test exercises that window: the existing cwd test settles the first workspace before switching. The guard itself is correct — this is a coverage gap, not a defect. The fixture that would pin it: render /w, switch to /w2 while /w's round is still pending, let the stale round land, assert its facets are not merged into /w2's snapshot. (Suite is green at head and green with the guard deleted — the axis is unpinned, so the test should ship with any future change there.)

Targeted gates

  • Typecheck (npm run typecheck, web-shell): clean (exit 0).
  • Sidebar directory suite (the PR's own review command, isolated): 18 files, 316 tests, 0 failed (06-sidebar-gate-head.png).
  • Overview model/hook/chip suites: green at head, 53/53 (mutation control run).
  • Removal + rename suites in isolation: 110/110 green (see full-suite adjudication below).
  • New e2e spec (wire oracle, real chromium headless against the mock daemon's recorded HTTP): 2/3 passed; the failing test is F1 above (05-e2e-overview-spec.png). The passing tests assert: chip texts and tooltips, per-workspace count isolation (secondary shows its own Skills3/Context2/MCP0, catching any cross-workspace leak), distinct-facet set per workspace (channels, extensions, mcp, memory, skills — hooks stay opt-in), collapse drops chips / re-open refetches, exact menu item lists for primary (with Manage group + live counts) and secondary (without), New worktree task arming the composer's Worktree mode, MCP management entry opening the MCP page.

Full web-shell unit suite — adjudicated environmental via a base A/A (07-gates-and-aa-summary.png):

Run Result
head, contended (e2e vite + playwright + tsc running alongside) 300 failed / 5353 (42 files) — kept as logs/junit-contended-run.xml
head, isolated 246 failed / 5352 (29 files)
base A/A, isolated 201 failed / 3542 (53 files) — base fails more files than head
byte-identical (file, test) failures on both arms 142 (junit name-level comparison; base's junit lists 229 failure records for the 201 summary failures, retries included)

Every head-only failure in a PR-touched file (20 tests across WebShellSidebar.workspace-removal.test.tsx and WorkspaceRenameDialog.test.tsx) passes when run isolated on head (110/110), as does a sample of head-only failures from untouched files (46/46 across 4 files). The dominant signature is Test timed out in 5000ms (142 of the contended run's 300) plus render-not-found assertions — the shape of this loaded shared runner, not of the diff. The full-suite green the PR description reports was not reproducible on either arm in this container; the targeted gates above are the reliable numbers. Full name-level comparison: logs/failure-comparison.json.

Not covered

  • Per-commit attribution: the checkout is depth 2; git rev-list HEAD^1..HEAD^2 returns 1 commit at the shallow boundary while the metadata lists 12. The aggregate HEAD^1..HEAD diff is what was verified; individual commit claims (the six review-round fix lists) were exercised only as the aggregate.
  • Real daemon: all wire evidence is against the repo's Playwright mock daemon (route interception), which proves the request shapes, paths, gating and UI handling — the wire shape, not that a real qwen serve answers these routes identically in production.
  • The PR's full e2e suite (66 specs) — only the new web-shell.workspace-overview.spec.ts ran here.
  • Rename flow is unit-tested only (the e2e scenario does not advertise dynamic_workspace_registration); Windows/Linux rendering; layer B1/B2/C follow-ups (out of this PR's scope by design).
  • A repo-wide gate was not run (only the web-shell workspace); other packages are untouched by the diff.
  • The full-suite failures adjudicated above remain unexplained at root-cause level (A/A proves they are not the PR's; chasing the container's jsdom/timer pathology was out of scope).

Methodology

Environment: CI verify container (node:22-bookworm, user node, no sudo/apt), working tree at the merge ref, npm ci + npm run build pre-run; Chromium headless shell 149 installed by this round (system libs already sufficient). A/B: git worktree add tmp/base-tree HEAD^1 (base tip confirmed equal to baseRefOid from the metadata); a byte-identical jsdom harness (verify-ab.test.tsx) was copied into both trees and rendered WebShellSidebar through the same module mocks the repo's own removal suite uses, with a per-cwd recording client; measurements were emitted as JSON and judged by assert-ab.mjs. Wire oracle: the PR's own e2e spec plus an instrumented probe (fixed-poll-spec.probe.ts) that logged window focus events and facet-request counts per fake-clock second; poll cadence was bisected at 1 s resolution. Mutations: exact-string patches in a scratch worktree (tmp/mut-tree), each applied-then-restored by run-mutation.mjs, run against workspaceOverviewModel.test + useWorkspaceOverview.test + WorkspaceOverview.test (53 tests), with the tree verified clean afterwards. Gates: npm run typecheck and vitest full suite in packages/web-shell. Raw logs and the harnesses live in this artifact dir (logs/, ab-*.json, *.mjs, *.tsx). Note: the working tree arrived with .qwen/e2e-tests/2026-08-28-web-shell-workspace-overview.md already deleted (unstaged); left untouched, no code impact.

Flakiness gate log

e2e suite, out of gate scope: packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts
rounds=5 files=9 skipped=1
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/sidebar/WebShellSidebar.workspace-removal.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceMenu.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceOverview.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceRenameDialog.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceSection.test.tsx
file packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/useWorkspaceOverview.test.tsx
file packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/workspaceOverviewModel.test.ts
file packages/web-shell/client/utils/gitModeIntent.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/utils/gitModeIntent.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/web-shell/client/App.test.tsx: PPP
  packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: PPP
  packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: PPP
  packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: PPP
  packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: PPP
  packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: PP
  packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: PP
  packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: PP
  packages/web-shell/client/utils/gitModeIntent.test.ts: 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/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 1 · packages/web-shell/client/utils/gitModeIntent.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 2 · packages/web-shell/client/utils/gitModeIntent.test.ts: P (exit 0)
round 3 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)

Evidence images

01-ab-head-gating

02-ab-base-silent

03-ab-assertions

04-mutation-matrix

05-e2e-overview-spec

06-sidebar-gate-head

07-gates-and-aa-summary

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.

Not explored to full depth (tool budget reached): chunk 15: none (I skipped executing the new tests because the worktree has no installed dependencies; that is a disclosure, not a ceiling-stopped check — the static trace…; chunk 2: executed the new tests in packages/web-shell/client/App.test.tsx to confirm they pass (no node_modules in the worktree or parent checkout; a full npm ci + build….

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

  • packages/web-shell/client/components/sidebar/WebShellSidebar.tsx:1117 (+2 locations) — [probe] N+ lower-bound nextCursor arm unwitnessed at both summarizeSessions call sites
  • packages/web-shell/client/components/sidebar/WebShellSidebar.tsx:2686 — [probe] handleNewWorktreeSession's failure branch has no test witness
  • packages/web-shell/client/components/sidebar/WorkspaceMenu.tsx:116 — [probe] empty-actions transition dismantles an open menu without the close signal
  • packages/web-shell/client/components/sidebar/workspaceOverviewModel.ts:218 — [review] WorkspaceOverviewSnapshot.fetchedAt has zero production read sites
  • packages/web-shell/client/App.test.tsx:11135 — [probe] transient-failure intent test never asserts the failing refetch round ran
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.tsx:123 — [probe] overview chip accessible name sits in aria-label on a role-less span (generic naming prohibited)
  • packages/web-shell/client/components/sidebar/WorkspaceSection.tsx:511 — [probe] retainedOverview is add-only — defeats the hook's clear-on-disable
  • packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx:249 — [probe] stale-cwd discard test cannot detect removal of the cwd guard
  • packages/web-shell/client/App.test.tsx:11234 — [probe] in-flight-clear prompt test resolves the clear before submitting — sync ref write unwitnessed
  • packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx:3392 — [probe] worktree double-submission guard's release arm is unwitnessed
  • packages/web-shell/client/e2e/utils/mockDaemon.ts:131 — [review] WorkspaceOverviewOverrides lacks a channels key — per-workspace channels isolation untestable
  • packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx:235 — [probe] chipUnknown class has zero test witnesses
  • packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx:352 — [probe] reset-on-success branch has no witness for the never-reset mutant
中文说明

未探索到全部深度(达到工具调用预算):chunk 15:none (I skipped executing the new tests because the worktree has no installed dependencies; that is a disclosure, not a ceiling-stopped check — the static trace…;chunk 2:executed the new tests in packages/web-shell/client/App.test.tsx to confirm they pass (no node_modules in the worktree or parent checkout; a full npm ci + build…

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

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

The miss bookkeeping in reload() runs for every landed round on purpose —
during a daemon hang every round is superseded before it lands, and only
their observed misses can expire a facet. But it also ran for rounds
launched before a reset boundary: a round held in flight across a cwd
round trip (A→B→A passes the cwd guard) or across a collapse/expand cycle
landed after missesRef was reset and booked into the fresh session,
shortening the three-round grace, or — landing successfully — refilled
the budget so a frozen count outlived it.

Budgets are now scoped by an epoch that advances at the two reset
boundaries (cwd change, disable); a round captures the epoch at launch
and books nothing if a reset happened while it was in flight. Rounds
inside one unbroken session still all count, and the hang-expiry test
pins that a per-round epoch bump would break.
@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

Round 10 (1 Critical) addressed in 1717b76.

The overview miss budget is now scoped to one bookkeeping session: an epoch advances at the two reset boundaries (cwd change, section disable), and a round launched before a reset can neither book misses into the fresh session nor refill it with a stale success. Superseded rounds inside one unbroken session still count — the hang-expiry behaviour is unchanged and its test now also pins that a per-round epoch would break it.

Verification: three new hook regressions (A→B→A stale failure, stale success past the grace, collapse/expand twin), each red under its named mutant and one mutant per reset site; hook suite 23 green; sidebar suites 319 green; full web-shell unit suite 5355 green; overview e2e 3 green; tsc and ESLint clean. All 94 review threads resolved.

中文说明

第 10 轮(1 条 Critical)已在 1717b76 处理。

概览 miss 预算现在以单个记账会话为作用域:纪元在两个重置边界(cwd 切换、区块禁用)自增,重置前启动的轮次既不能把 miss 记进新会话,也不能用陈旧成功重填预算。同一不间断会话内被取代的轮次仍然计数——卡死过期行为不变,其测试现在同时钉住「逐轮自增会破坏它」。

验证:新增三个 hook 回归(A→B→A 陈旧失败、宽限期后的陈旧成功、折叠/展开孪生),各自在对应变异体下变红,两个重置位各有一个变异体覆盖;hook 套件 23 绿;sidebar 套件 319 绿;web-shell 全量单测 5355 绿;overview e2e 3 绿;tsc 与 ESLint 干净。94 条评审线程全部已 resolve。

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

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

  • retainedOverview is add-only — defeats the hook's clear-on-disable (WorkspaceSection.tsx:760-763) — already reported (round 9 deferred list, review 5061621856)

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

  • docs/design/web-shell/web-shell-workspace-overview.md:99 — [probe] doc fetch-gate sentence contradicts the code gate — a custom header with wired headerActions does fetch
  • packages/web-shell/client/components/sidebar/useWorkspaceOverview.ts:163 — [probe] per-facet miss-budget independence unpinned — coupled-counter mutant ships 23/23 green
中文说明

已审查——无阻断问题。

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

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

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

@wenshao

wenshao commented Aug 30, 2026

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: ❌ not passed — findings reported (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: 63 passed · 0 failed · 63 total

Flakiness gate: ✅ 9 changed test file(s) x 5 identical rounds, no divergence

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

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

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

抖动门:✅ 9 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR 10407 deep verification (follow-up round) — feat(web-shell): show workspace overview and a workspace menu in the sidebar

Verdict: findings — assertions: 63 pass / 0 fail / 63 total (see assertions.json) — verified head: 1717b763e04ab3b20e24f96a034c6112a2ffb350 (base tip 40889bad75935d5da3e29bff32a48b2044c5ad57)

One commit landed since the previous round (1717b763, +12 production lines): overview miss budgets are now scoped by an epoch that advances at the two bookkeeping-reset boundaries. The delta is fully verified — of the 17 mutation rows, 16 are killed and the one survivor (M5) is predicted redundant defence by the layered-guard analysis, its three new tests are non-vacuous with exact kill attribution, and it resolves previous finding F2. Previous finding F1 stands: the 30 s-poll e2e test is unchanged and remains speed-correlated (it passed on this round's clean runs, but the measured margin — settle 128–145 ms vs a 1 s threshold — crossed that threshold under the previous round's load, failing 2/2 there). One reviewer-worthy item remains; no product defect found.

中文 — 判定:findings · 63 通过 / 0 失败 / 63 总计

结论:findings(仅剩一条建议级发现,无产品缺陷)。

  • 本轮增量(上轮之后仅新增提交 1717b763:把概览未答轮次的预算限定在一次簿记会话内,产品代码 +12 行):机制得证——17 行变异中 16 行被杀,唯一存活的 M5 按分层守卫分析属冗余防御;「每轮自增 epoch」变异被挂起过期测试杀死(与提交说明的声明一致);完整回退该机制(D-PRE 行)使 3 个新测试全红——新测试非空洞。
  • 上轮发现状态:F2(在途旧 cwd 轮守卫无人钉住,属覆盖缺口)已解决——epoch 机制以被钉住的方式关闭了同一窗口,原守卫降级为冗余防御(组合行证明)。F1(30 秒轮询 e2e 用例与机器速度相关)仍然成立——spec 未被增量改动;本轮干净环境下通过,但用页内假时钟直接测得注册→基线间隔为 128/145/128 毫秒,阈值为 1 秒;上轮有负载时该间隔约 4 秒并确定性失败 2/2。建议修复(settle 期间 page.clock.pauseAt)在新 head 上再次验证:节奏精确为 11 → 31 秒 +5 → 61 秒 +10。
  • A/B 结论:中心声明在新 head 上再次得证(重测,非沿用):展开且已信任的行每 facet 恰好一次请求(MCP2/3Skills2Extensions1/2Channels1/1Context2 五个 chip),折叠即停、未信任行零请求;base 侧同一场景 0 请求 0 chip。34/34 条脚本断言通过(01-ab-head-gating.png02-ab-base-silent.png)。
  • 门槛:typecheck 干净(并以植入错误证明门禁存活);侧栏目录套件 18 文件 / 319 用例 / 0 失败(05-sidebar-gate-head.png);web-shell 全量单测本轮全绿(239 文件 / 5355 用例 / 0 失败)——上轮的环境性失败在空闲容器中没有复现,无需再归因。e2e 概览用例本轮 3/3 通过(06-e2e-overview-pass.png)。
  • 未覆盖:逐提交归属(浅克隆);真实 qwen serve daemon(mock daemon 只证明线路形状);PR 全量 e2e(66 用例)仅跑概览 spec;Windows/Linux 视觉;B1/B2/C 层后续。

Previous-finding status (round 1 verified head 2a83a40d → round 2 head 1717b763)

# Finding (round 1) Severity Status at the new head
F1 The new 30 s-poll e2e test is speed-correlated: fails on machines where the page settles slower than ~1 s (measured failing 2/2 on the loaded runner; page.clock.install() without pauseAt lets fake time run with real time) Suggestion Stands. The spec file is byte-identical (the delta touches only useWorkspaceOverview.ts + its tests). Re-measured at the new head: the spec passed in both of this round's runs (clean window), and the margin probe now measures the deciding quantity model-independently — in-page fake-time from interval registration to baseline: 128 / 145 / 128 ms over 3 samples against the 1000 ms threshold. Round 1 measured ~4 s under contention on this same runner class (failing 2/2). The distribution crosses the threshold with load, which is the speed-correlated class; a green run here proves only this window was fast enough. The suggested fix (pauseAt while the page settles) was re-validated at the new head: exact intended cadence, no early tick (see 04-f1-margin-and-fix.png).
F2 The in-flight stale-round cwd guard (if (cwd !== cwdRef.current) return;, mutation M5) survived deletion: its window was pinned by no test — classified coverage gap, guard itself correct Suggestion Fixed. The delta adds an epoch mechanism that closes the same window: a round captures epochRef at launch and returns if a reset (cwd change or disable) advanced it while in flight. Mutation D1 (epoch check disabled) is killed by exactly the three new tests; D2/D3 (either bump removed) are killed by the matching round-trip / disable-cycle tests; the combination row (cwd guard + epoch check both off) is killed — while M5 alone still survives, i.e. the cwd guard is now redundant defence, not a coverage gap: every window the tests can reach is guarded twice and one of the two is pinned. The only residual the cwd guard uniquely covers is the render-to-effect-flush sliver, which jsdom's synchronous act() flushing cannot produce. No action needed; the guard is harmless and clarifies intent.

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

Central claim: expanded, trusted workspaces fetch one request per overview facet from the workspace-qualified daemon routes, render chips, and stop fetching when collapsed/untrusted; uninitialized runtimes never render as 0.

A byte-identical harness (verify-ab.test.tsx in this artifact dir) renders WorkspaceSection directly in jsdom in both trees with a per-cwd recording client; expectations branch on AB_ARM. Scenario: trusted primary /tmp/project, trusted secondary /tmp/other, untrusted /tmp/danger, all expanded; phases P1 mounted → P2 collapse other → P3 re-expand other.

Cell Environment Oracle Result
head P1 PR build 1717b763, 3 rows expanded facet spy counts + [data-web-shell-workspace-overview] chips trusted rows: 1 call per facet (mcp/skills/extensions/channels/memory; hooks 0 = opt-in); untrusted row never reaches the client; 5 chips per trusted row with texts MCP2/3 Skills2 Extensions1/2 Channels1/1 Context2 (01-ab-head-gating.png)
head P2 other collapsed counts unchanged; chips 10→5 no fetch on collapse; chips dropped
head P3 other re-expanded counts +1 per facet on other; chips back to 10 gating flips back on
base P1–P3 base worktree 40889bad, identical harness same oracles 0 facet calls, 0 chips in every phase (02-ab-base-silent.png)

Scripted expectations: 26/26 head + 8/8 base = 34/34 passed. Base-control purity: tmp/base-tree has no local node_modules (resolution walks up to the shared root); the PR touches nothing outside packages/web-shell (+2 docs), so the root-installed @qwen-code/sdk (realpath packages/sdk-typescript, dist built at HEAD) is byte-equivalent for both arms; the daemon-react-sdk module the harness mocks via importOriginal is also untouched by the PR (verified in the aggregate diff). Note the base tip moved since round 1 (168a88c040889bad, the PR merged main again after round 1 verified it); the metadata snapshot's baseRefOid (168a88c0…) has drifted from the live merge ref — the local HEAD^1 was used throughout.

Delta verification — 1717b763 "scope overview miss budgets to one bookkeeping session"

Delta since the round-1 verified head (git diff 2a83a40d..1717b763, the object is present locally): 3 files — useWorkspaceOverview.ts +12, useWorkspaceOverview.test.tsx +113, design doc ±5. The mechanism: epochRef advances at both reset boundaries (cwd-change effect, disable branch) and reload() drops any round whose captured epoch is stale — so a round held in flight across a cwd round trip (A→B→A passes the cwd guard) or a collapse/expand cycle can neither book misses into the fresh session nor zero them with a stale success.

Mutation matrix, scratch worktree at head, suites = workspaceOverviewModel.test + useWorkspaceOverview.test + WorkspaceOverview.test (56 tests, baseline green 56/56; 03-mutation-matrix.png, per-row logs in logs/mut-*.log):

Row Mutation Result Failed tests (attribution)
C0 unmutated baseline GREEN 56/56
C1 control, model file: summarizeSkills total +1 KILLED 10 harness live
C2 control, hook file: miss increment +2 KILLED 5 expiry + hang + all 3 new tests (control lands in the mutated file)
M1 uninitialized MCP counts as known KILLED 3 placeholder-never-zero
M2 MCP warning tone off (both branches) KILLED 4 warning tone
M3 merge carry-over removed KILLED 7 transient-failure retention
M4 miss expiry >=> KILLED 4 expiry
M5 in-flight cwd guard removed (round-1 survivor) SURVIVED 56/56 see combination rows
M6 enabled gating removed KILLED 6 gating
M5B cwd reset effect emptied KILLED 3 cwd carry-over
M5C both cwd guards removed KILLED 3 same
D1 DELTA: epoch check disabled KILLED 3 all three new tests
D2 DELTA: no epoch bump on cwd change KILLED 2 the two round-trip tests
D3 DELTA: no epoch bump on disable KILLED 1 the disable/enable-cycle test
D23 DELTA: both bumps removed (check live but dead) KILLED 3 the bumps are the load-bearing part
D4 DELTA: per-round epoch bump KILLED 1 expires facets during a hang even though every round is superseded — exactly the pin the commit message claims
D-PRE DELTA: full revert (D1+D2+D3) KILLED 3 vacuity check: the new tests fail against the un-fixed code, on their intended assertions (miss-budget booking)
M5D1 COMBINATION: cwd guard + epoch check both off KILLED 3 same 3 tests — epoch check alone accounts for every observable kill

Read: every hunk of the delta is load-bearing and individually pinned; the new tests are non-vacuous (D-PRE) with correct kill attribution (D1/D2/D3 map 1:1 onto the scenarios they were written for); the design invariant "superseded rounds must still count during a daemon hang" is pinned (D4). F2's former gap is closed by construction: the in-flight window is now guarded by the epoch check, which three tests pin.

Findings

F1 (Suggestion, carried) — the 30 s-poll e2e test remains speed-correlated; margin now measured directly

polls an expanded workspace once per 30 s tick and not faster (client/e2e/web-shell.workspace-overview.spec.ts:303) is unchanged by the delta. At the new head:

  • Spec run pre-release: fix ci #1 (this round): 3/3 passed (06-e2e-overview-pass.png), and the capture re-run agreed.

  • Margin probe (3 samples, model-independent: Date.now() read inside the page under the fake clock, so no clock-flow model is assumed):

    sample settle (registration → baseline) spec-would
    1 145 ms PASS
    2 128 ms PASS
    3 128 ms PASS

    The test fails iff settle ≥ 1000 ms (first tick at registration+30 s lands inside the spec's runFor(29_000) window). Round 1 measured settle ≈ 4 s on this runner class under contention and the spec failed 2/2 (Expected length: 11 / Received length: 16). The margin therefore crosses its threshold with runner load — the speed-correlated class; retries does not absorb a load-correlated failure. An earlier probe iteration that reported settle ≈ 3 s was a measurement artifact (it assumed each clock step advanced exactly 1 s while the flowing clock also advanced during inter-step waits) — superseded by the fake-timestamp probe above.

  • The product behavior is correct: the interval fires exactly 30 fake-seconds after registration, and the validated fix reproduces the spec's intent deterministically at the new head: PROBE-FIX settled=11 at29=11 at31=16 at61=21.

Suggested fix (re-validated at the new head)

Freeze the fake clock while the page settles, so baseline and interval registration share one fake instant:

await page.clock.install();
await page.clock.pauseAt(Date.now());
await gotoSession(page, scenario, daemon);

Re-measured at 1717b763: no tick at 29 s, exactly +5 at 31 s, +10 at 61 s — the spec's own assertions unchanged, now deterministic regardless of settle time.

No new findings this round. In particular: no regressions surfaced by the full suite (green), no chip/gating behavior change beyond the delta's intent, and the epoch mechanism introduces no observable cost (same request counts as round 1's A/B).

Targeted gates

  • Typecheck (tsc -p tsconfig.json --noEmit in packages/web-shell): clean, exit 0. Liveness proven: a planted const __gate_probe: number = "not a number" produced error TS2322 at the exact location; file restored clean afterwards.
  • Sidebar directory suite (the PR's own review command): 18 files, 319 tests, 0 failed at head (05-sidebar-gate-head.png) — 316 from round 1 plus the 3 delta tests.
  • Full web-shell unit suite at head: 239 files, 5355 tests, 0 failed (exit 0, isolated, no contention). Round 1's environmental failures (246 failed at head under a contended container, adjudicated via a base A/A) did not reproduce in this quieter container — the full-suite green the PR description claims is reproducible at the new head; no A/A was needed this round because there was nothing to attribute.
  • e2e overview spec (wire oracle, chromium headless shell 149 against the repo's mock daemon): 3/3 passed this run; the poll test's caveat is F1 above.

Not covered

  • Per-commit attribution: depth-2 checkout — git rev-list HEAD^1..HEAD^2 returns 1 at the shallow boundary while the metadata lists 15 commits. The aggregate HEAD^1..HEAD diff is what was verified. (The round-1→round-2 delta, in contrast, was verified exactly: 2a83a40d exists locally.)
  • Real daemon: all wire evidence is against the Playwright mock daemon (route interception) — the wire shape and the UI's handling of it, not that a real qwen serve answers these routes identically. The delta's motivating premise (SDK deadline == poll cadence during a daemon hang) is exercised only through the hook's fake timers, not a hanging daemon.
  • The PR's full e2e suite (66 specs) — only web-shell.workspace-overview.spec.ts ran.
  • Rename flow is unit-tested only; Windows/Linux rendering; layer B1/B2/C follow-ups (out of scope by design).
  • A repo-wide gate was not run; the diff touches only packages/web-shell (+docs), and only that workspace was gated.
  • The F1 margin probe measured 3 samples in one load window; the load-side of the distribution (>1 s settle) is carried from round 1's measurements rather than re-driven this round (reproducing a loaded-runner state on demand is not controllable from inside the container).

Methodology

Environment: CI verify container (node:22-bookworm, user node, node v22.23.2), working tree at the merge ref 060466ba (HEAD^1 = base tip 40889bad, HEAD^2 = verified head 1717b763), npm ci + npm run build pre-run; Playwright 1.61.1 with chromium headless shell 149 installed this round at $PLAYWRIGHT_BROWSERS_PATH (/__w/_temp/pw-browsers). A/B: git worktree add tmp/base-tree HEAD^1; a byte-identical jsdom harness (verify-ab.test.tsx) copied into both trees rendered WorkspaceSection through one I18nProvider with a per-cwd recording client whose facet methods resolve daemon-shaped fixtures; measurements emitted as ABRESULT JSON and judged by arm-specific expectations inside the test. Mutations: exact-string patches applied to a scratch worktree (tmp/mut-tree) by run-mutation.mjs, each restored via git checkout with the tree verified clean; suites run via npx --no-install vitest run (summary lines re-parsed from logs/mut-*.log with ANSI stripped). e2e: the PR's own spec plus probe files (deleted after running) that measured, in the page's fake time, the interval-registration-to-baseline distance and the pauseAt-fixed cadence; raw logs in logs/. Gates: tsc --noEmit (with a planted-violation liveness check), vitest sidebar directory and full suite in packages/web-shell. Both scratch worktrees were removed after the A/B cells and matrix were captured; the working tree was restored to its arrival state (the pre-existing unstaged deletion of .qwen/e2e-tests/2026-08-28-web-shell-workspace-overview.md was left untouched). Evidence images were produced with scripts/verify-capture.mjs.

Flakiness gate log

e2e suite, out of gate scope: packages/web-shell/client/e2e/web-shell.workspace-overview.spec.ts
rounds=5 files=9 skipped=1
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/sidebar/WebShellSidebar.workspace-removal.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceMenu.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceOverview.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceRenameDialog.test.tsx
file packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/WorkspaceSection.test.tsx
file packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/useWorkspaceOverview.test.tsx
file packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/components/sidebar/workspaceOverviewModel.test.ts
file packages/web-shell/client/utils/gitModeIntent.test.ts: (cd packages/web-shell) npx --no-install vitest run ./client/utils/gitModeIntent.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/web-shell/client/App.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: PPPPP
  packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: PPPPP
  packages/web-shell/client/utils/gitModeIntent.test.ts: PPPPP

verdict: pass
summary: 9 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 1 · packages/web-shell/client/utils/gitModeIntent.test.ts: P (exit 0)
round 2 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 2 · packages/web-shell/client/utils/gitModeIntent.test.ts: P (exit 0)
round 3 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 3 · packages/web-shell/client/utils/gitModeIntent.test.ts: P (exit 0)
round 4 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 4 · packages/web-shell/client/utils/gitModeIntent.test.ts: P (exit 0)
round 5 · packages/web-shell/client/App.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/sidebar/WebShellSidebar.workspace-removal.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/sidebar/WorkspaceMenu.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/sidebar/WorkspaceOverview.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/sidebar/WorkspaceRenameDialog.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/sidebar/WorkspaceSection.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/sidebar/useWorkspaceOverview.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/components/sidebar/workspaceOverviewModel.test.ts: P (exit 0)
round 5 · packages/web-shell/client/utils/gitModeIntent.test.ts: P (exit 0)

Evidence images

01-ab-head-gating

02-ab-base-silent

03-mutation-matrix

04-f1-margin-and-fix

05-sidebar-gate-head

06-e2e-overview-pass

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.

LGTM, looks ready to ship — CI green on the reviewed commit and ten review rounds have converged. ✅

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Independent static review @ head 1717b76 / 独立静态审查 @ head 1717b76

Static review only — no tests executed. Four module batches (data layer: polling hook + pure model + git-intent rules / presentation components / integration wiring / e2e + mock daemon + docs) walked all 27 files against the head tree. This PR has been through ten review rounds; this pass re-verified the final state independently rather than trusting that ledger.

纯静态审查(未运行测试)。4 个模块批次(数据层:轮询 hook + 纯模型 + git 意图规则 / 展示组件 / 集成接线 / e2e+mock daemon+文档)走查全部 27 个文件并对照 head tree。此 PR 已经历十轮评审,本轮为独立复核而非采信既有结论。

What I verified / 核验内容

All six load-bearing claims hold against the code, not the description:

六项关键声明均经代码证实:

  1. Placeholders never masquerade as zero / 占位绝不伪装成零formatOverviewValue consults isOverviewFacetKnown first (runtime facets gate on initialized === true; context is daemon-side and always known); unknown renders with a tooltip distinguishing "not initialized yet" from "daemon does not support this route" (WorkspaceOverview.tsx:100-133).
  2. Triple-gated fetching / 三重门控拉取 — expanded ∧ trusted (WorkspaceSection) ∧ document.visibilityState === 'visible' inside the interval, plus focus refetch; on collapse/untrust the in-flight round is invalidated via requestIdRef/epochRef bumps so it cannot land after the clear (useWorkspaceOverview.ts:188-207).
  3. Independent facet failure with carry-over / facet 独立失败且保留已知值 — the facet() wrapper isolates rejections and malformed 200 bodies per facet; mergeOverviewSnapshots keeps last-known values for unanswered facets.
  4. Epoch-scoped miss budgets / 纪元隔离的未答预算 — verified the double guard (cwd comparison + epoch comparison) after the await: a pre-reset round can neither book misses into the fresh session nor zero them with a stale success; superseded rounds may only drop facets already at 3+ misses, never merge stale data (useWorkspaceOverview.ts:146-180). Booking superseded rounds is deliberate and correct given the SDK 30 s deadline equals the poll cadence (daemon-hang expiry depends on it).
  5. Git-intent reset only on definitive answers / git 意图只在确定性答案时重置gitModeIntentMustReset fires on session-exists / untrusted / answered-without-branch for the current workspace; the production producer only ever passes undefined on transient poll failures, so an armed worktree intent survives transient gaps; the intent is written in the synchronous step of session creation, not armed after an await (App.tsx wiring).
  6. Menu gating matches the deferred-binding design / 菜单门控与延后绑定设计一致 — Rename requires dynamic_workspace_registration + absolute path + non-primary; the Manage group requires primary + trusted + a wired callback; untrusted non-removable rows render nothing (not even the container); locked sidebars keep their existing action area. The rename dialog mirrors the daemon store's trim → 256-char → control-char → empty-means-clear rules exactly.

Deletion audit: every invariant of the old single-item ⋮ menu (untrusted+non-removable → null, removal gating, destructive aria-label carrying the cwd, submit-in-flight trigger disable, focus suppression on menu close) is rebuilt in the new WorkspaceMenu wiring. WorkspaceSection.headerActions gaining a second argument is purely additive — the single production call site is updated and a single-parameter callback stays assignable. Cross-contracts checked against the head tree: the mock daemon's new /workspaces/:w/{mcp,skills,extensions,memory,hooks} shapes match the real daemon routes and SDK types (including initialized: false placeholder semantics and the extensions route returning a projection, not a manager status); all 36 new i18n keys exist in EN and ZH and are referenced; every CSS variable the chips consume is defined in both themes.

删除审计:旧单项 ⋮ 菜单的全部不变量(未信任且不可移除 → null、移除门控、带 cwd 的 destructive aria-label、提交中禁用触发器、菜单关闭时的焦点抑制)均在新 WorkspaceMenu 接线中重建;headerActions 第二参数纯增量,唯一生产调用点已更新且单参回调仍可赋值。跨契约对照 head tree 核实:mock daemon 新增路由形状与真实路由及 SDK 类型一致(含 initialized: false 占位语义、extensions 返回投影而非管理器状态);36 个新 i18n 键中英文齐备且全部被引用;chip 使用的 CSS 变量在两套主题均有定义。

Findings — no Critical, no Important / 发现——无 Critical、无 Important

  1. 🟢 Nit — WorkspaceOverview.tsx:117-126: the chip's title/aria-label sit on a plain <span> (generic elements do not support accessible naming), while role="listitem" is on the wrapper div. In full mode the visible label compensates; in compact mode a screen reader announces bare numbers like "3/4" with no context. Move title/aria-label onto the role="listitem" div. chip 的 title/aria-label 挂在无 role 的 span 上(generic 元素不支持可访问命名),role="listitem" 却在外层 div;compact 模式下读屏只会听到无上下文的 "3/4"。建议把两属性移到 role="listitem" 的 div 上。

  2. 🟢 Nit — WebShellSidebar.tsx:2640-2712: handleNewWorktreeSession is a line-for-line copy of handleNewSession (re-entrancy guard, busy state, bumpWorkspaceReload, catalog refresh, abort-error routing); only the creation callback differs, as the comment itself notes. Both share creatingSessionRef, so a future fix to one path silently diverges from the other. Extract a shared runner taking the creation callback as a parameter. handleNewWorktreeSessionhandleNewSession 逐行同构(防重入、忙碌态、刷新逻辑全同),仅创建回调不同且共享 creatingSessionRef,未来单侧修复会产生静默漂移;建议抽出接受创建回调的共享执行器。

Carried on the record from prior rounds, not re-reported: the 30 s-poll e2e's page.clock.install() without pauseAt (speed-correlated on slow runners, test-only), retainedOverview being add-only by design, and the doc sentence slightly overstating the fetch gate. I also re-probed the e2e's hard request-count assertions and found them safe as written: the assertion windows are ~1.5 s, far too short for the 30 s interval to intrude.

历轮留档项不重复上报:30 秒轮询用例缺 pauseAt 的速度相关问题(仅测试)、retainedOverview 有意只增不清、设计文档一句门控表述出入。另复核了 e2e 的硬请求数断言:断言窗口约 1.5 秒,30 秒轮询不可能闯入,无需改动。

CI

Green at this head across the board, including Test (ubuntu-latest, Node 22.x) (24 m, previously timing out) and the web-shell E2E smoke that runs this PR's spec against the mock daemon.

head 上 CI 全绿,包括此前连续超时的 Test (ubuntu)(24 分钟)与运行本 PR 用例的 web-shell E2E 冒烟。

Verdict / 结论

✅ Approve — an independent four-batch pass over the final head found no Critical and no Important issues; the two nits above are worth folding in opportunistically but do not block. The hard parts of this feature — request gating, placeholder semantics, epoch-scoped expiry, facet isolation, and the git-intent lifecycle — are exactly the parts that usually regress silently, and each one checks out against the code with tests pinning it.

✅ 批准——四个批次对最终 head 的独立走查未发现 Critical 与 Important;上述两条 Nit 值得顺手收掉但不阻塞。本特性最容易静默回归的部分(请求门控、占位语义、纪元过期、facet 隔离、git 意图生命周期)逐一在代码层面核验成立且有测试钉住。

@wenshao
wenshao added this pull request to the merge queue Aug 31, 2026
Merged via the queue into main with commit cd5d5af Aug 31, 2026
124 of 126 checks passed
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.

3 participants