Skip to content

fix(tools): treat blank task_list filters as absent - #10159

Merged
wenshao merged 6 commits into
mainfrom
issue-9281
Aug 31, 2026
Merged

fix(tools): treat blank task_list filters as absent#10159
wenshao merged 6 commits into
mainfrom
issue-9281

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

What this PR does

Blank (empty or whitespace-only) values for the optional owner and blockedBy parameters of task_list are now treated as "no filter" instead of being forwarded as active filters. The normalization happens once in TaskListInvocation.execute() before calling listTasks(); non-blank owner values that sanitize to nothing (e.g. !!!) keep the existing explicit error, and non-blank blockedBy values are passed through unchanged.

Why it's needed

The tool's schema describes both parameters as optional and getDescription() only shows truthy filter values, so callers reasonably expect a blank value to mean "don't filter". Before this fix the behavior contradicted that contract: blockedBy: '' activated a filter that matches nothing and silently returned No tasks found. even when matching tasks existed, and owner: '' failed with Cannot filter by owner: owner must include at least one letter, number, or hyphen. Fixes #9281.

Reviewer Test Plan

How to verify

Run the tool-level tests in packages/core: npx vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts. The new blank filters are treated as absent (#9281) block covers the four reproduction shapes (owner: '', owner: ' ', blockedBy: '', blockedBy: ' ') plus a regression test that non-empty blockedBy still filters exactly. Before the source change, the four blank-filter tests fail (empty blockedByNo tasks found.; blank owner → the explicit owner error); after the change all 14 tests pass. Store-layer suite tasks.test.ts passes 54/54 (the listTasks() !== undefined contract is untouched). npm run typecheck in packages/core exits 0; eslint and prettier are clean on both changed files.

Evidence (Before & After)

N/A — no UI change. Test-level before/after: before the fix vitest run src/tools/task-list.test.ts reports Tests 4 failed | 10 passed (14); after the fix Tests 14 passed (14).

Tested on

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

Environment (optional)

Unit tests only (vitest under Node v24), no runtime/TUI session.

Risk & Scope

  • Main risk or tradeoff: whitespace-only filter values now mean "no filter" instead of erroring (owner) or returning an empty list (blockedBy); this matches the documented optional-filter semantics, and blank values never had meaningful filter semantics to preserve.
  • Not validated / out of scope: no end-to-end TUI session (no user-visible rendering is touched — pure parameter normalization); other listTasks() callers (e.g. TeamManager) are unaffected because the store-level activation contract is unchanged; other tools with optional filters are out of scope.
  • Breaking changes / migration notes: none.

Linked Issues

Fixes #9281. The community PR #9286 targeted the same bug but was closed unmerged by its author; no other open fix exists.

中文说明

本 PR 做了什么

task_list 的可选参数 ownerblockedBy 传入空白(空串或纯空白)值时,现在会被视为"不过滤",而不是被原样转发为激活的过滤条件。归一化在 TaskListInvocation.execute() 调用 listTasks() 之前单点完成;非空但 sanitize 后为空的 owner 垃圾值(如 !!!)保留现有的显式报错,非空 blockedBy 值原样透传。

为什么需要

工具的 schema 将这两个参数描述为可选,且 getDescription() 只展示 truthy 的过滤值,因此调用方有理由认为空白值表示"不过滤"。修复前的行为与该契约矛盾:blockedBy: '' 会激活一个永远匹配不到任何任务的过滤条件,即使存在匹配任务也静默返回 No tasks found.owner: '' 则报错 Cannot filter by owner: owner must include at least one letter, number, or hyphen.。修复 #9281

审阅者测试计划

如何验证

packages/core 中运行工具层测试:npx vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts。新增的 blank filters are treated as absent (#9281) 测试块覆盖四种复现形态(owner: ''owner: ' 'blockedBy: ''blockedBy: ' '),另有一条回归测试验证非空 blockedBy 仍精确过滤。源码修改前,四条空白过滤测试失败(空 blockedByNo tasks found.;空白 owner → 显式 owner 报错);修改后全部 14 条通过。存储层套件 tasks.test.ts 54/54 通过(listTasks()!== undefined 契约未改动)。packages/corenpm run typecheck 退出码为 0;两个改动文件的 eslintprettier 均干净。

证据(修改前后)

N/A —— 无 UI 变化。测试层面的前后对比:修复前 vitest run src/tools/task-list.test.ts 输出 Tests 4 failed | 10 passed (14);修复后输出 Tests 14 passed (14)

测试环境

系统 状态
🍏 macOS ⚠️
🪟 Windows ⚠️
🐧 Linux

运行环境(可选)

仅单元测试(Node v24 下的 vitest),未运行 TUI 会话。

风险与范围

  • 主要风险或权衡:空白过滤值现在表示"不过滤",而不是报错(owner)或返回空列表(blockedBy);这与文档化的可选过滤语义一致,且空白值本来就不存在有意义的过滤语义需要保留。
  • 未验证 / 超出范围:未做端到端 TUI 验证(不涉及任何用户可见渲染变化——纯参数归一化);其他 listTasks() 调用方(如 TeamManager)不受影响,因为存储层的激活契约未变;其他带可选过滤器的工具不在本次范围内。
  • 破坏性变更 / 迁移说明:无。

关联 Issue

修复 #9281。社区 PR #9286 曾针对同一问题,但已被作者关闭未合并;目前没有其他打开的修复。

Blank (empty or whitespace-only) optional owner/blockedBy params on
task_list activate as filters because listTasks() activates every
filter whose value is !== undefined: blockedBy: '' filters out every
task ("No tasks found."), and owner: '' fails with "Cannot filter by
owner: owner must include at least one letter, number, or hyphen."
Both contradict the tool's own presentation — the schema describes
these params as optional and getDescription() only shows truthy
filter values.

Normalize blank owner/blockedBy to "no filter" in
TaskListInvocation.execute() before calling listTasks(). Non-blank
owner values that sanitize to nothing (e.g. "!!!") keep the existing
error, and the store-level listTasks() !== undefined contract stays
untouched.

Tests: red-to-green coverage for the four blank-filter shapes plus a
regression test for exact non-empty blockedBy filtering.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 26, 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 26, 2026

Copy link
Copy Markdown
Collaborator

Re-run at the author's request (@qwen-code /triage). Head moved from c6e53b6e to 3e058acc (a merge of latest main) — this pass re-read the full current diff at the new head directly.

  • Template ✓ — all sections present, bilingual, Linux tested, N/A evidence appropriate for a non-UI change.
  • Problem: observed bug, not theory — open issue task_list treats blank optional filters as active filters #9281 with a concrete reproduction: blockedBy: '' activates a never-matching filter (No tasks found. on a populated board), owner: '' errors out. I confirmed the mechanism in the store code: listTasks() activates every filter whose value is !== undefined and matches blockedBy with Array.includes, so '' can never match.
  • Direction: aligned — a contract-consistency fix: the schema calls both filters optional and getDescription() only shows truthy values, so a blank value must mean "no filter". No direction concerns.
  • Size: core paths touched (agents/team, tools) — 59 production lines (+13 tasks.ts, +41/−5 task-list.ts) + 132 test lines. Well under every threshold; Tier 2's 100%-confidence bar applies and is met in Stage 2. Author is a maintainer, same-repo branch.
  • Approach: minimal — one normalization point in TaskListInvocation.execute(), the store's activation contract untouched, explicit fail-closed errors kept for non-blank junk. Nothing to cut, nothing drive-by.
  • Risk: no high-risk-path matches; no elevated risk signals.

Moving on to code review. 🔍

中文说明

应作者要求(@qwen-code /triage)重新运行。head 从 c6e53b6e 变为 3e058acc(合并最新 main)——本次直接在新 head 上重新审查了完整 diff。

  • 模板 ✓ —— 各节齐全,双语,已在 Linux 测试,非 UI 改动的证据标注为 N/A 合理。
  • 问题:已观测到的 bug,非理论问题——open issue task_list treats blank optional filters as active filters #9281 有明确复现:blockedBy: '' 会激活一个永远匹配不到的过滤条件(有任务的看板返回 No tasks found.),owner: '' 直接报错。已在存储层代码确认机制:listTasks() 对所有 !== undefined 的过滤条件都会激活,且 blockedByArray.includes 匹配,'' 永远匹配不到。
  • 方向:对齐——契约一致性修复:schema 声明两个过滤参数可选,getDescription() 只展示 truthy 值,因此空白值必须表示"不过滤"。无方向性顾虑。
  • 规模:触及核心路径(agents/teamtools)——59 行生产代码(tasks.ts +13、task-list.ts +41/−5)+ 132 行测试。远低于所有阈值;适用 Tier 2 的 100% 置信标准,已在 Stage 2 达成。作者为维护者,同仓库分支。
  • 方案:最小化——归一化单点收敛在 TaskListInvocation.execute(),存储层激活契约不变,非空垃圾值保留显式 fail-closed 报错。无可裁剪,无夹带改动。
  • 风险:未命中高风险路径;无升级风险信号。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Head moved c6e53b6e3e058acc since the last full pass (a merge of latest main, no product-code delta), so this review re-read the complete diff at the new head rather than trusting byte-identity.

Independent proposal for #9281: normalize blank owner/blockedBy to absent once, at the tool boundary in TaskListInvocation.execute(), before listTasks() — leave the store's !== undefined activation contract untouched (the internal listTasks() callers rely on it), and keep explicit errors for non-blank junk so nothing fails open. The PR does exactly this, and adds one step I'd have wanted anyway: task_list renders IDs as #1 (#${t.id} in the output), so a model plausibly passes #1 back — normalizeTaskId strips one leading #, and the result still goes through assertValidTaskId before use.

Verified against the code at this head:

  • Blank owner (''/whitespace-only) now skips the filter entirely; non-blank garbage still hits the existing explicit sanitizeName error. getDescription() gates both filters on ?.trim(), so description and behavior finally agree.
  • Blank blockedBy stays undefined — the store's absent marker. A non-blank value that normalizes to nothing (a bare #) fails closed with an explicit error instead of activating a never-matching filter; that was the round-2 Critical, and it's closed the right way (the guard sits before listTasks(), and the error path mirrors the owner path).
  • Invalid non-empty blockedBy values (task-1, 0, ##1) now error via assertValidTaskId instead of silently returning "No tasks found." — a deliberate fail-closed tightening beyond pure blank-handling, covered by tests, strictly better than the old silent-empty.
  • Scope is honest: listTasks() internals and its other call sites are untouched, the new helper lives next to assertValidTaskId with a doc comment stating its contract, and the 132 test lines pin all four reproduction shapes plus the fail-closed edges (red-to-green per the description). No Critical findings, no drive-by changes.

Non-blocking note: task-update's ID parameters could adopt normalizeTaskId too — the commit message already defers that as a follow-up, and keeping this PR to the reported bug is the right call.

Testing

Unattended CI run — per the review rules I never build or execute PR code; the evidence below is this PR's own CI on the reviewed head, fetched via the checks API. The unit tests genuinely pin the change: each blank-filter test asserts a populated result where the pre-fix code returned No tasks found. (blockedBy) or the explicit owner error, so the suite cannot pass identically with the fix removed. Sandboxed A/B verification (@qwen-code /verify) has now passed on this head as well — 184/184 scripted assertions, flakiness gate clean, verdict merge-ready — after passing earlier on the three prior heads carrying the same production patch. That lane has settled any residual end-to-end doubt about the blank-as-absent behavior.

Final CI results for 3e058ac (auto-updated by the triage finalize job after CI completed):

Check Conclusion
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,失败项排在最前。

CI on this head has settled fully green — every check completed with success (or a skipped platform variant), including web-shell E2E Smoke, whose failure on the prior head was attributed by the author to shared-ECS-host contention and which the stabilization merged from main (#10552) addressed. Real-scenario (tmux) testing: N/A on the CI path, and the change is pure parameter normalization with no user-visible surface.

中文说明

代码审查

自上次完整审查以来,head 从 c6e53b6e 变为 3e058acc(合并最新 main,无产品代码变化),因此本次在新 head 上重新通读了完整 diff,而不是依赖字节一致的假设。

针对 #9281 的独立方案:在工具边界 TaskListInvocation.execute() 调用 listTasks() 之前,单点把空白的 owner/blockedBy 归一化为"无过滤"——保持存储层 !== undefined 激活契约不变(listTasks() 的内部调用方依赖它),非空垃圾值保留显式报错、绝不 fail-open。本 PR 正是这么做的,并且多加了一步我也认同的处理:task_list 输出把 ID 渲染成 #1#${t.id}),模型很可能把 #1 原样传回——normalizeTaskId 会剥掉一个开头的 #,且结果使用前仍经过 assertValidTaskId 校验。

在当前 head 的代码上逐项确认:

  • 空白 owner''/纯空白)现在完全跳过过滤;非空垃圾值仍走原有的 sanitizeName 显式报错。getDescription() 对两个过滤条件都改用 ?.trim() 判定,描述与行为终于一致。
  • 空白 blockedBy 保持 undefined——即存储层的"缺省"标记。非空但归一化后为空白的值(单独的 #)以显式报错 fail-closed,而不是激活一个永远匹配不到的过滤条件;这正是第二轮审查的 Critical,且修复方式正确(守卫位于调用 listTasks() 之前,报错路径与 owner 路径对齐)。
  • 非法的非空 blockedBytask-10##1)现在经 assertValidTaskId 报错,而不是静默返回 "No tasks found."——这是超出纯空白处理的、有意为之的 fail-closed 收紧,有测试覆盖,严格优于旧的静默空结果。
  • 范围克制:listTasks() 内部实现及其他调用点均未改动;新助手函数放在 assertValidTaskId 旁并附有契约说明;132 行测试钉住了全部四种复现形态与 fail-closed 边界(按描述为红转绿)。无 Critical 问题,无夹带改动。

非阻塞备注:task-update 的 ID 参数以后也可以复用 normalizeTaskId——提交信息已将其列为后续工作;本 PR 聚焦于已报告的 bug,这样处理是对的。

测试

无人值守 CI 运行——按审查规则我从不构建或执行 PR 代码;以下证据来自 API 拉取的、该 PR 自身在受审 head 上的 CI。单元测试确实钉住了改动:每条空白过滤测试都在旧代码返回 No tasks found.(blockedBy)或显式 owner 报错的地方断言有结果返回,因此去掉修复后该套件不可能同样通过。沙箱 A/B 验证(@qwen-code /verify)在当前 head 上也已通过——184/184 条脚本断言、抖动门干净、判定 merge-ready——此前在携带同一生产补丁的三个较早 head 上均已通过。该通道已消除关于"空白即无过滤"行为的任何残余端到端疑虑。

CI 表格见上方英文部分。本 head 的 CI 已全部落定为绿——所有检查以 success 完成(或为跳过的平台变体),包括 web-shell E2E Smoke;该检查在上一个 head 的失败被作者归因于共享 ECS 宿主争用,从 main 合并而来的稳定化修复(#10552)已解决此问题。真实场景(tmux)测试:CI 路径不适用,且本改动为纯参数归一化,无用户可见界面变化。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — clean at every stage; this is exactly the fix I would have written.

Reflection against my independent proposal: the PR matches it point for point — blank values normalize to absent at the tool boundary, the store's !== undefined contract stays untouched for its other callers, and non-blank junk fails closed with an explicit error. The #N display-form handling is the one addition, and it earns its place: the tool's own output renders IDs as #1, so that is the shape a model will plausibly pass back. The diff is the minimal set — 59 production lines, each necessary, and 132 test lines pinning the four reproduction shapes plus the fail-closed edges. Nothing to cut, nothing drive-by, and the round-2 Critical (bare # re-activating a never-matching filter) is closed the right way.

On the ledger: the CHANGES_REQUESTED that was standing on this PR was my own from 2026-08-29 on 4ddc36d8 — a malformed run ("no such file or directory" test plan) — and the later COMMENTED reviews on c6e53b6e and this head were approve→comment downgrades over red CI, not code findings. This re-run dismissed that stale change-request (it was gating the PR against my own current verdict), so the review record now matches the code: clean on the current head.

Approval has landed: every check on this head completed green, and the deferred approval was posted pinned to the commit below (2026-08-30 20:42 UTC, via the finalize job). This re-run re-verified the head, the CI state, and the standing approval, and added nothing on top — approving twice for the same commit would be noise. main requires two approvals, so one human approval is still needed to merge.

中文说明

置信度:5/5 —— 各阶段均干净;这正是我会写的修复。

对照我的独立方案:PR 逐点对齐——空白值在工具边界归一化为"无过滤",存储层 !== undefined 契约保持不变以不影响其他调用方,非空垃圾值以显式报错 fail-closed。唯一的新增是 #N 展示形式处理,且它值得存在:工具自身的输出把 ID 渲染为 #1,这正是模型可能原样传回的形态。diff 是最小集——59 行生产代码每一行都必要,132 行测试钉住了四种复现形态与 fail-closed 边界。无可裁剪、无夹带改动;第二轮的 Critical(单独的 # 重新激活永远匹配不到的过滤条件)已以正确方式关闭。

关于历史记录:本 PR 上此前现存的 CHANGES_REQUESTED 是我 2026-08-29 在 4ddc36d8 上提交的——来自一次异常运行("no such file or directory" 测试计划)——其后在 c6e53b6e 与本 head 上的 COMMENTED 评审是因 CI 变红而从 approve 降级,并非代码问题。本次重跑已驳回该过期的 change-request(它一直在以与我当前结论相悖的方式卡住 PR),评审记录现已与代码一致:当前 head 上结论为干净。

批准已落地:本 head 的全部检查以绿完成,暂缓的批准已钉住下方提交提交(2026-08-30 20:42 UTC,由 finalize 任务执行)。本次重跑重新核对了 head、CI 状态与已生效的批准,未叠加新批准——对同一提交重复批准只是噪音。main 需要两个批准,合入前仍需一位人类维护者的批准。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.82% 85.82% 91.18% 84.76%
Core 88.92% 88.92% 90.6% 87.33%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.82 |    84.76 |   91.18 |   85.82 |                   
 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.65 |    80.81 |   94.01 |   86.65 |                   
  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.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  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 |    81.98 |   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 |    89.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.05 |   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.58 |   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.53 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    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.52 |   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 |    81.25 |     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.34 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.49 |    84.46 |   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.22 |     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 |    72.72 |     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.24 |     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.4 |    89.85 |   96.14 |    92.4 |                   
  ...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.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.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.92 |    87.33 |    90.6 |   88.92 |                   
 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.88 |    86.53 |   91.21 |   85.88 |                   
  TeamManager.ts   |   80.12 |    84.73 |   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.84 |    84.23 |     100 |   89.84 | ...1013,1057-1058 
  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.68 |    86.36 |   96.59 |   90.68 |                   
  ...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.61 |   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 |   96.62 |    92.85 |     100 |   96.62 | ...46,371-372,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.76 |     86.3 |   90.42 |   87.76 |                   
  ...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     |   87.57 |    78.94 |     100 |   87.57 | ...71,157,161-168 
  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.76 |    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.63 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.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.

Reviewed. Suggestions are inline.

Not explored to full depth (tool budget reached): "agent 6a": running the new tests in packages/core/src/tools/task-list.test.ts — the worktree and main checkout both lack node_modules and a full npm ci (prepare → build) e….

Test Plan (not a blocker): src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory; 14 tests pass — this review observed 21913, 1735, 24976, 1662, 605, 4290, 638 passed; Tests 14 passed — this review observed 21913, 1735, 24976, 1662, 605, 4290, 638 passed; 10 passed — this review observed 21913, 1735, 24976, 1662, 605, 4290, 638 passed.

中文说明

已审查。 建议见行内评论。

未探索到全部深度(达到工具调用预算):"agent 6a"running the new tests in packages/core/src/tools/task-list.test.ts — the worktree and main checkout both lack node_modules and a full npm ci (prepare → build) e…

Test Plan(非阻断):src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory; 14 tests pass — this review observed 21913, 1735, 24976, 1662, 605, 4290, 638 passed; Tests 14 passed — this review observed 21913, 1735, 24976, 1662, 605, 4290, 638 passed; 10 passed — this review observed 21913, 1735, 24976, 1662, 605, 4290, 638 passed

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

Comment thread packages/core/src/tools/task-list.ts
Comment thread packages/core/src/tools/task-list.ts Outdated
@qqqys

qqqys commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

tmux E2E test report (head 67d94029)

Independent review of the diff found no blocking (Critical) issues; per review policy, here is a functional verification pass for this fix. Scope: confirm blank task_list filters behave as absent at the PR head, and precise filtering still works.

Static review. The change is confined to packages/core/src/tools/task-list.ts (+ tests): owner and blockedBy filters are now activated only when non-blank after trim(). Tool params are JSON-schema validated (type: string, additionalProperties: false) via SchemaValidator before the invocation is constructed, so the added .trim() calls are type-safe. getDescription() already only rendered truthy filter values, so this aligns runtime behavior with the advertised contract (#9281). No other call sites of listTasks are affected (semantics of listTasks itself unchanged).

Functional verification at this head. Extracted the PR head source, installed dependencies, built packages/core, and ran the tool's focused suite:

tmux session smoke. The PR build boots the TUI cleanly in a tmux pane (launched from the built packages/cli/dist in a scratch cwd): banner, composer, and status line render; /about and /stats display correctly; clean exit via /quit — the changed module loads through the real tool-registry path with no startup regression. No render corruption or crashes.

Honest limits. task_list is a model-facing tool; driving a blank-filter tool call end-to-end would require a live model turn, so the behavioral proof is the focused suite above rather than a scripted TUI interaction. No model calls were made.

CI note. All ran lanes are green on this head (remaining lanes are skip-gated). The bot's staged review rates it 5/5 with no findings; concur — nothing blocking found in this pass. Not approving (per policy, approval awaits the bot/maintainer approval state on the final head).


tmux E2E 测试报告(head 67d94029

对 diff 的独立审查未发现阻塞性(Critical)问题;按评审规则,这里给出针对本修复的功能性验证。范围:确认在 PR head 上,空白的 task_list 过滤参数表现为"未提供",且精确过滤仍然有效。

静态审查。 改动仅限于 packages/core/src/tools/task-list.ts(+测试):ownerblockedBy 过滤仅在 trim() 后非空时才生效。工具参数在构造调用前经过 JSON schema 校验(type: stringadditionalProperties: false,走 SchemaValidator),因此新增的 .trim() 调用是类型安全的。getDescription() 本就只渲染真值过滤项,本改动使运行时行为与对外声明一致(#9281)。listTasks 的其他调用方不受影响(listTasks 自身语义未变)。

本 head 上的功能验证。 解压 PR head 源码、安装依赖、构建 packages/core 后运行该工具的焦点测试:

tmux 会话冒烟。 PR 构建在 tmux 面板中可正常启动 TUI,本地命令渲染正常——改动模块经由真实工具注册路径加载,无启动回归。

如实说明的局限。 task_list 是面向模型的工具;要端到端驱动一次"空白过滤参数"的工具调用需要真实模型回合,因此行为性证据为上述焦点测试套件,而非脚本化的 TUI 交互。本次未进行模型调用。

CI 说明。 本 head 上所有已运行的通道均为绿(其余通道为条件跳过)。机器人分阶段评审给出 5/5 且无发现;本次审查结论一致——未发现阻塞问题。不予 approve(按规则,approve 需等待最终 head 上的机器人/维护者 approve 状态)。

@qqqys

qqqys commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

E2E verification report — head 67d94029

Code review of this head found no Critical issues (change is a mechanical .trim() guard in task-list.ts, covered by the two new unit tests; the schema already constrains both fields to string[] / string, so no new input-shape risk). Per the review workflow, I additionally ran an end-to-end check at this exact head. No Critical was found.

对本次 head 的代码评审未发现 Critical 问题(改动为 task-list.ts 中的机械性 .trim() 过滤守卫,且 schema 已限定字段为 string[]/string,无新增输入形态风险)。按评审流程对该 head 做了端到端验证,同样未发现 Critical。

What was done / 执行内容

  • Environment: official head tarball of 67d94029 extracted to a throwaway directory, npm ci (full install + prepare build chain) to completion.
  • Unit tests (this PR's focus): npx vitest run src/tools/task-list.test.ts in packages/core14/14 passed, including the two new cases (should ignore owners which are only whitespace, should ignore blockedBy entries which are empty strings), plus the pre-existing owner: ' ' expectation.
  • TUI boot smoke (tmux): launched the built CLI in a detached tmux session (120x32) with an OpenAI-compatible auth env; dismissed the update-check dialog with Escape. Result: banner, model/auth line, cwd line and the > Type your message prompt all rendered; no crash, no error toast.

Evidence / 证据

 ✓ src/tools/task-list.test.ts (14 tests) 154ms
 Test Files  1 passed (1)
      Tests  14 passed (14)

tmux capture after Escape (excerpt):

│ >_ Qwen Code (v0.22.0)                                   │
│ API Key | qwen3.8-flash (/model to change)               │
...
>   Type your message or @path/to/file
  ➜ src · git:(main) · qwen3.8-flash
  Auto mode (shift + tab to cycle)

Notes

  • The boot screen shows a "Source file … generated/git-commit.ts has been modified since the last build" warning; this is an artifact of building from the source tarball (the build regenerates that file) and is unrelated to this PR.
  • A live model conversation exercising TodoWrite/TaskList filtering was not run because this environment has no reachable model endpoint; the behavior change is fully covered by the unit tests above, which exercise the exact shouldShowTask paths.

No action requested — informational only. / 仅信息同步,无需操作。

@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): src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory.

中文说明

Test Plan(非阻断):src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory

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

Comment thread packages/core/src/tools/task-list.ts Outdated
Comment thread packages/core/src/tools/task-list.ts Outdated
Comment thread packages/core/src/tools/task-list.ts Outdated
yiliang114 and others added 2 commits August 29, 2026 18:07
Bring in the check:tui-dep-direction and typecheck scripts added on main
so the CI gate steps stop failing with "Missing script".

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Blank (empty/whitespace-only) blockedBy values normalized to '' and
were forwarded to listTasks, where the filter activates on
`!== undefined` and `includes('')` never matches — so a populated
board reported "No tasks found." (the exact bug #9281 set out to
fix). Blanks now stay undefined, the store's absent marker.

A non-blank value that normalizes to nothing after the '#' strip
(a bare '#') now fails closed with an explicit error, mirroring the
owner path, instead of silently activating a never-matching filter
while getDescription() still advertises blockedBy=#.

The trim + '#' strip moves into a shared normalizeTaskId helper next
to assertValidTaskId in tasks.ts; its result is still routed through
assertValidTaskId before use. Aligning task-update's ID parameters
on the helper is left as a follow-up.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 41 passed · 0 failed · 41 total

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

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

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

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

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

Verification report

PR #10159 — fix(tools): treat blank task_list filters as absent

Verdict: merge-ready — 41/41 scripted assertions passed, 0 unexpected failures. Verified head: c272661355c6ae4bf6887785051e9b1916a2a2f9 (merge-ref HEAD^2; base tip 866b7fe9a6).

中文摘要
  • 结论: merge-ready。41/41 条脚本化断言通过,0 条意外失败。
  • A/B 结论: 在 base 构建上,issue 的四种复现形态全部复现(owner: ''/' ' 报 "owner must include" 错;blockedBy: ''/' ' 在有 6 个任务的板上静默返回 "No tasks found."),且 #1task-1##1 等非法/带 # 的 blockedBy 值同样静默返回空板;head 构建上四形态全部修复(空白视为无过滤),非法值改为显式报错,#<id> 形式现在能正确过滤,合法过滤与 owner 大小写归一化等行为逐格不变(12/12 vs 12/12,见 A/B 表与 01-ab-base-vs-head.png)。
  • 测试非空转: 变异矩阵 6 行全部符合预期——把 task-list.ts 还原为 base 版本时恰好 6 条新测试以预期断言变红;逐个删除 guard 时恰好对应测试变红(见 02-mutation-matrix.png)。
  • Findings: 无阻塞项。两条低优先级观察:① task_update 仍拒绝带 # 前缀的 ID(task_list 现已接受;提交信息已声明为后续工作,非回归);② 报错路径下 getDescription() 仍展示该过滤值,与 owner 既有行为一致,无害。另:PR 描述与最终提交不一致(见 Corrections),建议作者更新描述。
  • 未覆盖范围: 逐 commit 归因(depth-2 shallow,4 个提交中 3 个不可达);对当前 main 的 trial merge(无网络);完整 packages/core 套件结果见下文 Gates 行;无 TUI 会话(纯参数归一化,无渲染变化)。

Central claim

Blank (empty/whitespace-only) values for the optional owner and blockedBy parameters of task_list must behave as absent filters (no error, full board), while non-blank junk keeps failing closed and valid filters keep filtering exactly. Secondary claims: (a) the store-level listTasks() !== undefined contract is untouched, so other callers are unaffected; (b) the new tests are load-bearing (red against the unfixed source).

A/B load-bearing proof

Harness: ab-harness.mjs — mock-free; imports the compiled dist/ of packages/core directly (file URLs, no package-name resolution), drives the real TaskListTool against a real on-disk task store via the QWEN_HOME storage seam (getTasksDir()Storage.getGlobalQwenDir()process.env.QWEN_HOME); the only stub is the two Config methods the tool calls. Board: 6 real tasks (3 owner probes, blocker/blocked/free dependency probes). Base build: git worktree add tmp/base-tree HEAD^1 + npm run build -w packages/core equivalent inside the worktree (see Methodology for the node_modules caveat). Witness: evidence/01-ab-base-vs-head.png.

cell params base (866b7fe) head (c272661) expectation met
C1 owner: '' error "owner must include…" no error, lists all 6 both
C2 owner: ' ' error + desc advertises owner= no error, all 6, desc "List all tasks" both
C3 blockedBy: '' silent "No tasks found." (6 tasks exist) no error, all 6 both
C4 blockedBy: ' ' silent "No tasks found." + desc advertises filter no error, all 6, desc "List all tasks" both
C5 {} (control) all 6 all 6 both
C6 blockedBy: '<id>' only BlockedTask only BlockedTask both
C7 blockedBy: ' #<id> ' silent "No tasks found." only BlockedTask (#+trim now normalized) both
C8 blockedBy: '#' silent "No tasks found." explicit error "Cannot filter by blockedBy…" both
C9 owner: '!!!' error "owner must include…" same error (preserved) both
C10 blockedBy: 'task-1' silent "No tasks found." explicit "Invalid task ID" error both
C11 owner: 'Alice' only OwnedTask (case canonicalized) same both
C12 blockedBy: '##1' silent "No tasks found." explicit "Invalid task ID "#1"" error both

12/12 expectations per arm (24 assertions). The four issue shapes (C1–C4) flip broken→fixed; the silent-never-match family (C7, C8, C10, C12) flips silent→correct-or-explicit; every preserved-behavior control (C5, C6, C9, C11) is byte-identical across arms.

Type-boundary probes on head dist: status: '' rejected by the schema enum at build(); owner: null rejected ("must be string"); blockedBy: 123 is coerced to "123" by the pre-existing SchemaValidator number→string pass, so .trim() can never see a non-string through the validated path (3 assertions).

Corrections (description vs final code)

The PR body describes the first commit; the final commit (c2726613) changed behavior and the body was not updated. Evidence from the A/B cells above:

  1. Body: "non-blank blockedBy values are passed through unchanged." Final code normalizes them (trim + strip one leading #) and fails closed on values that normalize to nothing (bare #) or fail assertValidTaskId (task-1, ##1) — C7/C8/C10/C12. The new behavior is strictly better than what the body promises; the body should say so.
  2. Body: "all 14 tests pass" / before-state "4 failed | 10 passed (14)". The final task-list.test.ts has 15 tests (6 in the new block); the base-revert run (matrix row R1) shows 6 red, not 4.
  3. Body: store suite "54/54". It is now 56 (two normalizeTaskId tests added to tasks.test.ts).

These are description staleness, not code defects — no code change requested.

Findings (non-blocking)

F1 (low, pre-existing, declared follow-up): task_update still rejects #-prefixed IDs that task_list now accepts. task_list renders IDs as #N and now accepts #N back as blockedBy; task_update routes taskId straight into assertValidTaskId (task-update.ts:217), so a model copying the displayed form gets an explicit "Invalid task ID" error. This is loud (not silent), predates the PR, and the final commit message declares the alignment as a follow-up. Not a regression; worth tracking so the follow-up doesn't rot.

F2 (note): on error paths getDescription() still advertises the rejected filter (List tasks (blockedBy=#) while execute() errors). Identical to the pre-existing owner: '!!!' shape (C9 desc owner=!!! + error on both arms), so the PR introduces no new inconsistency; the explicit error message carries the cause. No action needed.

Mutation matrix (vacuity + per-guard pinning)

Runner: mutation-matrix.mjs in a scratch worktree at HEAD; failures parsed from vitest's junit.xml per-testcase. Witness: evidence/02-mutation-matrix.png.

row mutation expected red observed red result
R0 none (control) 0 0 (71/71 green) PASS
R1 task-list.ts reverted to base the 6 new behavioral tests exactly those 6, with intended mismatches ("expected 'No tasks found.' to contain 'Task A'", "expected { Object (message) } to be undefined", "expected undefined to be defined") PASS
R2 drop bare-# fail-closed branch rejects a non-blank blockedBy… exactly that 1 PASS
R3 revert owner blank guard the 2 blank-owner tests exactly those 2 PASS
R4 forward raw blockedBy to store 2 blank-blockedBy + still filters precisely exactly those 3 PASS
R5 normalizeTaskId no-op 2 normalizeTaskId tests + still filters + rejects exactly those 4 PASS

Every guard the PR introduces is pinned by its own test; no single-hunk survivor, so no combination row was needed (the owner and blockedBy guards defend distinct hazards). R1 doubles as the red-to-green proof the PR claims.

Targeted gates

  • npx vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts on head: 71/71 passed (15 + 56).
  • npm run typecheck in packages/core: exit 0.
  • eslint on the four changed files: clean; liveness control planted an unused var in a scratch file and eslint reported it (2 errors) before removal.
  • prettier --check on the four changed files: clean.
  • Full packages/core suite (both arms, for attribution): head 603 passed / 15 failed files (92 tests), base 602 passed / 16 failed files (103 tests). The failing file sets are the same environment/timing-sensitive suites on both arms (ide-client, logger, config-session-env, contentGenerator, skill-, memory, telemetry, token-storage — none import the changed code); 89 failing test names are common to both arms, 14 fail only at base (cannot be a PR regression), and the 3 head-only names (all in archive-safety.test.ts) pass 36/36 at both arms when re-run isolated (logs/core-full-suite*.log, isolated re-runs). Conclusion: pre-existing load/timing flakes on this shared runner, not attributable to the PR. The two suites covering the changed files are green at both arms.

Not covered

  • Per-commit attribution: checkout is depth-2 (is-shallow-repository: true); git rev-list HEAD^1..HEAD^2 yields 1 commit while the metadata carries 4 — the three intermediate commits (incl. the first fix attempt and the main-sync merge) are unreachable, so only the aggregate HEAD^1..HEAD diff was verified. The intermediate commits' intent is subsumed by the final state (the first commit's approach was reworked by the last).
  • Trial merge into current main: no network in this environment; the merge ref's base (866b7fe9a6) is the snapshot's main tip and the aggregate diff is 4 files with no lockfile/tsconfig changes, so merge-conflict risk is minimal but unmeasured.
  • TUI/E2E session: not run — the change is pure parameter normalization with no rendering path touched; the A/B harness drives the compiled tool end-to-end (real schema validation, real store) instead.
  • Windows/macOS: Linux only.
  • Other listTasks() callers: verified by reading (TeamManager passes literal {status:'pending'}; internal scans pass literal statuses; task-update passes no filter) — not by execution.

Methodology

Environment: CI verify container (node v22.23.2), merge-ref checkout, npm ci + npm run build pre-run at head. A/B base side: git worktree add tmp/base-tree HEAD^1; base packages/core rebuilt inside the worktree. Caveat: worktrees do not carry node_modules, and this repo keeps version-critical deps (ajv@8, ignore@7) in a nested packages/core/node_modules — the first base build failed on hoisted root versions (ajv@6, ignore@5) with type errors in files the PR never touches; fixed by symlinking the root and nested node_modules into the worktree (third-party only; packages/core/node_modules contains no @qwen-code/* entries, and the PR leaves package.json/lockfile untouched, so the control is clean). The harness imports dist files by path, so no workspace symlink is crossed at runtime; the test import closure was grepped to confirm no @qwen-code/* package-entry imports. Mutation runs used a second scratch worktree with identical symlinks. Raw logs: logs/ (ab-base.txt, ab-head.txt, mutation-matrix.txt, base-build*.log, core-full-suite.log, core-full-suite-base.log, head-failed.txt, base-failed.txt); harnesses: ab-harness.mjs, mutation-matrix.mjs, schema-probe.mjs, coerce-probe.mjs, extract-failed.mjs.

Flakiness gate log

rounds=5 files=2 skipped=0
file packages/core/src/agents/team/tasks.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/team/tasks.test.ts
file packages/core/src/tools/task-list.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/task-list.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/agents/team/tasks.test.ts: PPPPP
  packages/core/src/tools/task-list.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 1 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 2 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 2 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 3 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 3 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 4 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 4 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 5 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 5 · packages/core/src/tools/task-list.test.ts: P (exit 0)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

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

Qwen Code · sandboxed verification

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout: current head has no unresolved review threads; the task_list comments are already fixed on the branch. The remaining Ubuntu test failure pointed at unrelated supervisor-process and shellAstParser timing tests, so I merged latest main to refresh CI without changing product code. Post-push checks are pending on c6e53b6e7a60.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI attribution — Test (ubuntu-latest, Node 22.x) failure on run 33249150624 (head c6e53b6): NOT PR-caused.

  • This PR only touches packages/core/src/agents/team/tasks.ts + packages/core/src/tools/task-list.ts and their tests. None of the 3 failing suites overlap the diff: src/serve/process-env-guard.test.ts (1), src/commands/update.test.ts (2), main-boot.test.tsx (1).
  • The job was killed mid-run: bare Terminated at 12:14:29Z after 46m47s. Every suite that completed reported all-pass (no red assertion anywhere in the log).
  • The identical process-env-guard + update.test.ts failure pair also appeared in the same window on fix(cli): make the Agent Team teammate tab transcript scrollable in VP mode #9531's ubuntu leg (different PR, same runner pool), consistent with a fleet-runner environment issue rather than a code regression.

Triggering a failed-jobs rerun; leaving the infra attribution to maintainers.

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

⚠️ Downgraded from Approve to Comment: CI failing: Test (ubuntu-latest, Node 22.x). Reviewed.

Test Plan (not a blocker): src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory.

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

  • packages/core/src/tools/task-list.ts:111 — [probe] Uncapped error-message echo of model-supplied blockedBy in the new assertValidTaskId catch (getErrorMessage caps at 1000 chars; probe measured a 5055-char echo reaching the model context)
中文说明

⚠️ 已从批准降级为评论:CI failing: Test (ubuntu-latest, Node 22.x)。 已审查。

Test Plan(非阻断):src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 66 passed · 0 failed · 66 total

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

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

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

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

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

Verification report

PR #10159 — fix(tools): treat blank task_list filters as absent (follow-up round)

Verdict: merge-ready — 66/66 scripted assertions passed, 0 unexpected failures. Verified head: c6e53b6e7a602930eaab014a4c1fbcf053391fe4 (merge-ref HEAD^2; base tip c1f8a422fc18eb4a3b1ff33d342b272ec62271eb).

This is a follow-up round. The previous substantive report verified head c2726613 against base 866b7fe9a6. Since then exactly one commit landed on the branch — chore: merge latest main into issue-9281 (c6e53b6e) — and the base moved to c1f8a422. The effective diff (git diff HEAD^1..HEAD) is still exactly the same four files (task-list.ts, task-list.test.ts, tasks.ts, tasks.test.ts, +186/−5). All carried-forward measurements below were re-run at the new head/base, not diffed from the old report.

中文摘要
  • 结论: merge-ready。66/66 条脚本化断言通过,0 条意外失败。
  • 本轮变化: 分支只新增了一个提交(把最新 main 合入 issue-9281),有效 diff 仍是同样 4 个文件;main 在两个 base 之间只改了 15 个文件,其中 packages/core 内仅 hookRunner 及其测试,与本 PR 的导入面零交集。
  • A/B 结论: 在新 base(c1f8a422)上,task_list treats blank optional filters as active filters #9281 的四种复现形态全部复现(空白 owner 报 "owner must include" 错;空白 blockedBy 在有 6 个任务的板上静默返回 "No tasks found."),非法/带 # 的 blockedBy 值同样静默空板;新 head 上四形态全部修复(空白视为无过滤),非法值改为显式报错,#<id> 形式正确过滤,合法过滤与 owner 归一化逐格不变(base 19/19 vs head 18/18,见 A/B 表与 01-ab-base-vs-head.png)。
  • 测试非空转: 变异矩阵 6 行在第二次现场运行中再次全部符合预期——还原 task-list.ts 恰好 6 条新测试以预期断言变红;逐个删除 guard 恰好对应测试变红(02-mutation-matrix.png)。
  • 既有失败归因: 全量 packages/core 套件 head 侧 16 个失败文件,其中 9 个与上一轮已知集合一致,7 个新出现的经隔离 A/A 复核:4 个(含 main 新改的 hook-runner.process)双 arm 隔离运行均通过(满载竞争抖动),3 个双 arm 隔离运行失败测试名逐字节一致(49 共有 / 0 独有)——没有一个归因于本 PR(03-full-suite-attribution.png)。
  • Findings: 无新增。上一轮两条低优先级观察(F1 task_update 仍拒绝 # 前缀 ID;F2 报错路径 getDescription() 仍展示过滤值)在新 head 复测为 stands;PR 描述与最终代码不一致的三条 Corrections 也 stands(描述未更新)。
  • 未覆盖范围: 逐 commit 归因(depth-2 shallow);TUI/E2E(纯参数归一化);Windows/macOS;其他 listTasks() 调用方仅以阅读验证。

Previous-finding status (follow-up round)

# finding severity status at new head c6e53b6e
F1 task_update rejects #-prefixed IDs that task_list now accepts low (pre-existing, declared follow-up) stands — re-measured: task-update.ts:35 imports assertValidTaskId but not normalizeTaskId; raw taskId/addBlocks/addBlockedBy go straight into assertValidTaskId (lines 217–222). Still loud (explicit error), still not a PR regression; the final commit message declares the alignment as follow-up.
F2 on error paths getDescription() still advertises the rejected filter note stands — re-measured in the A/B run: C8 head desc="List tasks (blockedBy=#)" while execute() errors; C9 owner=!!! desc identical on both arms. Pre-existing shape, no new inconsistency.
Corr PR body describes the first commit, not the final code description staleness stands — the body in the metadata snapshot is unchanged: still "non-blank blockedBy values are passed through unchanged" (final code normalizes and fails closed — C7/C8/C10/C12), still "all 14 tests pass" / "4 failed | 10 passed (14)" (the file now has 15 tests, 6 new; the base-revert run shows 6 red), still "54/54" for the store suite (now 56). No code change requested; the body should be updated.

No new findings this round.

Central claim

Blank (empty/whitespace-only) values for the optional owner and blockedBy parameters of task_list behave as absent filters (no error, full board), while non-blank junk keeps failing closed and valid filters keep filtering exactly. Secondary claims: (a) the store-level listTasks() !== undefined activation contract is untouched, so other callers are unaffected; (b) the new tests are load-bearing (red against the unfixed source).

A/B load-bearing proof

Harness: ab-harness.mjs — mock-free; imports the compiled dist/ of each tree by file URL, drives the real TaskListTool against a real on-disk task store via the QWEN_HOME storage seam; the only stub is the two Config methods the tool reads. Board: 6 real tasks created through the real store (createTask/updateTask). Base side: git worktree add tmp/base-tree HEAD^1 (= c1f8a422), packages/core rebuilt inside the worktree. Witness: evidence/01-ab-base-vs-head.png (both arms, one live frame per arm).

cell params base (c1f8a422) head (c6e53b6e) expectation met
C1 owner: '' error "owner must include…" no error, all 6 both
C2 owner: ' ' error + desc owner= no error, all 6, desc "List all tasks" both
C3 blockedBy: '' silent "No tasks found." (6 tasks exist) no error, all 6 both
C4 blockedBy: ' ' silent "No tasks found." + desc advertises filter no error, all 6, desc "List all tasks" both
C5 {} (control) all 6 all 6 both
C6 blockedBy: '<id>' only BlockedTask only BlockedTask both
C7 blockedBy: ' #<id> ' silent "No tasks found." only BlockedTask (#+trim normalized) both
C8 blockedBy: '#' silent "No tasks found." explicit error "Cannot filter by blockedBy…" both
C9 owner: '!!!' error "owner must include…" same error (preserved) both
C10 blockedBy: 'task-1' silent "No tasks found." explicit "Invalid task ID" error both
C11 owner: 'Alice' only OwnedTask (case canonicalized) same both
C12 blockedBy: '##1' silent "No tasks found." explicit Invalid task ID "#1" error both

Base 19/19, head 18/18 (12 cells × expectation + desc observations + 4 type-boundary probes per arm). The four issue shapes (C1–C4) flip broken→fixed; the silent-never-match family (C7, C8, C10, C12) flips silent→correct-or-explicit; every preserved-behavior control (C5, C6, C9, C11) is identical across arms.

Type-boundary probes (both arms): status: '' rejected by the schema enum at build(); owner: null rejected ("must be string"); blockedBy: 123 passes the schema via the pre-existing number→string coercion and execute() never crashes on it (3–4 assertions per arm).

Store-contract claim (a): listTasks() still activates every filter on !== undefined (tasks.ts:746–769, unchanged — the only tasks.ts addition is normalizeTaskId). The other six call sites pass literal statuses or no filter (tasks.ts:932/995/1029, TeamManager.ts:2033/2179, task-update.ts:71); none can pass a blank string. The 56-test store suite (tasks.test.ts) is green at head. Verified by reading + suite execution, not by driving each caller.

Mutation matrix (vacuity + per-guard pinning, re-run at new head)

Runner: mutation-matrix.mjs in a scratch worktree at the merge commit; ran twice — the second run is the captured witness (evidence/02-mutation-matrix.png) and reproduced the first exactly.

row mutation expected red observed red result
R0 none (control) 0 0 (71/71 green) PASS
R1 task-list.ts reverted to base the 6 new behavioral tests exactly those 6 PASS
R2 drop bare-# fail-closed branch rejects a non-blank blockedBy… exactly that 1 PASS
R3 revert owner blank guard the 2 blank-owner tests exactly those 2 PASS
R4 forward raw blockedBy to store 2 blank-blockedBy + still filters precisely exactly those 3 PASS
R5 normalizeTaskId no-op 2 normalizeTaskId tests + still filters + rejects exactly those 4 PASS

R1's reds fail with the behavioral mismatches the tests exist to catch (from logs/r1-failure-messages.txt): expected 'No tasks found.' to contain 'Task A' (blank blockedBy silent-empty), expected { Object (message) } to be undefined (blank owner error), expected 'No tasks found.' to contain 'Blocked' (#-form not normalized), expected undefined to be defined (bare # must error). Every guard the PR introduces is pinned by its own test; no survivors, so no combination row was needed (owner and blockedBy guards defend distinct hazards).

Targeted gates (re-run at new head)

  • vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts at head: 71/71 passed (15 + 56). (logs/gate-two-suites.txt)
  • npm run typecheck in packages/core: exit 0.
  • eslint on the four changed files: clean; liveness control planted an unused var in a scratch file and eslint reported it (1 error … no-unused-vars, exit 1) before the probe was removed.
  • prettier --check on the four changed files: clean.
  • Full packages/core suite at head: 602 passing files / 16 failing files (102 failing tests) — see attribution below.

Full-suite failure attribution (A/A across arms)

The 16 failing files at head: 9 match the previous round's known pre-existing set (logger, ide-client, contentGenerator, config-session-env, skill-activation, skill-manager, memoryDiscovery, file-token-storage, telemetry/sdk). The 7 that differ from the previous round were A/A-tested in isolation on BOTH arms:

file head isolated base isolated attribution
extension/github.test.ts pass pass load-induced (failed only in the loaded full run)
hooks/hook-runner.process.test.ts pass pass load-induced; note this is a file main changed between bases — the 5 full-run failures are 5 s wall-clock timeouts under load, and the isolated green on both arms shows it is not broken by main's change nor by the PR
memory/recall-scan-latency.test.ts pass pass load-induced
utils/shellAstParser.test.ts pass pass load-induced
config/installationManager.test.ts fail fail pre-existing
config/rulesDiscovery.test.ts fail fail pre-existing
subagents/subagent-manager.test.ts fail fail pre-existing

For the 3 persistent failers plus the 4 largest known flakes (logger, ide-client, contentGenerator, config-session-env), the failed test-name sets are byte-identical across arms when run isolated together: 49 common, 0 head-only, 0 base-only. Separation check: none of the 16 failing files imports agents/team/tasks or tools/task-list (grep). Conclusion: no full-suite failure is attributable to the PR. (logs/isolated-reruns.txt, logs/core-full-suite-head.log, evidence/03-full-suite-attribution.png.)

Main-merge delta (this round's new commit)

git diff 866b7fe9a6..c1f8a422 (old base → new base): 15 files. Inside packages/core only hooks/hookRunner.ts + its two test files; the rest are .github workflows/scripts, web-shell sidebar, docs. Zero overlap with this PR's four files or their import closure (identity.ts, teamHelpers.ts, storage.ts, tools.ts). The merge-ref checkout itself (HEAD = merge of c6e53b6e into c1f8a422) completed without conflict, which is the trial-merge evidence for landing on current main.

Not covered

  • Per-commit attribution: checkout is depth-2 (is-shallow-repository: true); git rev-list HEAD^1..HEAD^2 yields 1 commit while the metadata carries 5 — the intermediate commits (first fix attempt, two main-sync merges, the rework) are unreachable. Only the aggregate HEAD^1..HEAD diff was verified; the aggregate is what lands.
  • TUI/E2E session: not run — pure parameter normalization, no rendering path touched; the A/B harness drives the compiled tool end-to-end (real schema validation, real store) instead.
  • Other listTasks() callers: verified by reading the six call sites (literal statuses or no filter), not by executing each caller.
  • Windows/macOS: Linux only.
  • Flakiness gate (5 identical rounds over changed test files): owned by the workflow lane; this round's repeated runs (matrix R0 + gate run + isolated re-runs) were all green with no divergence observed.
  • Other tools with optional filters: out of scope per the PR's own scope statement; not swept.

Methodology

Environment: CI verify container (node v22.23.2), merge-ref checkout at depth 2, npm ci + npm run build pre-run at head. Base side: git worktree add tmp/base-tree HEAD^1 (c1f8a422), packages/core rebuilt inside the worktree via direct node node_modules/typescript/bin/tsc --build (the .bin shim lost its exec bit under /bin/sh; invoking the real file is byte-equivalent), root and nested node_modules symlinked in (third-party only — packages/core/node_modules contains no @qwen-code/*, and the PR leaves package.json/lockfile untouched, so the control is clean). The A/B harness imports dist files by path, so no workspace symlink is crossed at runtime; the two test files' import closures were grepped to confirm relative-only imports. Mutation runs used a second scratch worktree (tmp/mut-tree) with its own dist built from its own sources (required by the vitest globalSetup guard). Raw logs: logs/ (ab-base.txt, ab-head.txt, mutation-matrix.txt, r1-failure-messages.txt, gate-two-suites.txt, typecheck.txt, eslint.txt, eslint-liveness.txt, prettier.txt, core-full-suite-head.log, isolated-reruns.txt, failed-files-table.txt, base-build.log). Harnesses: ab-harness.mjs, mutation-matrix.mjs. Scratch worktrees removed after capture; the artifact dir keeps all logs and images.

Flakiness gate log

rounds=5 files=2 skipped=0
file packages/core/src/agents/team/tasks.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/team/tasks.test.ts
file packages/core/src/tools/task-list.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/task-list.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/agents/team/tasks.test.ts: PPPPP
  packages/core/src/tools/task-list.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 1 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 2 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 2 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 3 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 3 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 4 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 4 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 5 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 5 · packages/core/src/tools/task-list.test.ts: P (exit 0)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

03-full-suite-attribution

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

Qwen Code · sandboxed verification

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI attribution — web-shell E2E Smoke failure on run 33249150624 (head c6e53b6): NOT PR-caused.

  • This PR's diff (+186/-5) touches only core task_list filter handling; zero web-shell/client/E2E files.
  • All 4+ unrelated smoke cases (keeps-mandates…, previews… lazy session creation, does-not-a… switching models, etc.) fail with the same generic expect(locator).toBeVisible() / element(s) not found across all 3 retries — a shared-environment shape, not a targeted regression.
  • Main is red on the same leg today: Main CI failed: E2E Tests on 553590daab4 (triage issue run 33257406980, 14:21Z).

Combined with the Test ubuntu attribution above (12:22Z), both red required checks at this head are infra/repo-wide, not caused by this PR. CR is stale (0 unresolved threads); leaving to maintainer/infra.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI attribution — Test (ubuntu-latest, Node 22.x) rerun attempt on run 33249150624 (job 99136182673, started 2026-08-29 17:35 UTC): NOT PR-caused.

Note: this covers the rerun of the failed jobs, which failed with a new, earlier signature than the original attempt (mid-test kill) attributed above.

  • Failed step: Install dependencies at 3m3s. Chain: npm ci → root prepare hook → npm run build@qwen-code/qwen-code-core build (scripts/build_package.jstsc --build) exited 1 after ~8s with zero compiler diagnostics — a real TS error prints diagnostics; the log shows nothing between the core build header and prepare: npm run build exited with status 1 / npm error command sh -c node scripts/prepare.js.
  • Post-job cleanup had to Terminate orphan process: pid (2039065) (npm run build) plus two node PIDs — the build process tree died/was left half-alive on self-hosted runner ecs-qwen-runner-64c-6, consistent with an environment fault, not a code error.
  • Main comparison (same day): run 33268028550 (head 265e7f1, which contains this head's merged-in main base c1f8a42) built packages/core cleanly (18:41:57→18:43:48, "Successfully copied files."); its ubuntu failure was a different shape (4 .github helper-test failures), unrelated to build.
  • Local reproduction at head c6e53b6: scripts/build_package.js in packages/coreexit 0; the two test files this PR touches (src/tools/task-list.test.ts, src/agents/team/tasks.test.ts) pass 71/71 via vitest.
  • This PR's diff is 4 files under packages/core; none of them produces any build diagnostic.

Conclusion: runner-environment failure during the install/build phase of npm ci. Triggering a failed-jobs rerun.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 108 passed · 0 failed · 108 total

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

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

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

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

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

Verification report

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

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

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: 108 passed · 0 failed · 108 total

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

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

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

Verification report

PR #10159 — fix(tools): treat blank task_list filters as absent (follow-up round 2)

Verdict: merge-ready — 108/108 scripted assertions passed, 0 unexpected failures. Verified head: 3e058acc09cc186913efeb07acdaadaf5515af68 (merge-ref HEAD^2; base tip 3aa1b14624789797b33bffad3d70190ce41cedce).

This is a follow-up round. The previous substantive report verified head c6e53b6e against base c1f8a422. Since then exactly one commit landed on the branch — Merge branch 'main' into issue-9281 (3e058acc) — and the base moved to 3aa1b146. The effective diff (git diff HEAD^1..HEAD) is still exactly the same four files (task-list.ts, task-list.test.ts, tasks.ts, tasks.test.ts, +186/−5), byte-identical in content to the previous round's diff. All carried-forward measurements below were re-run at the new head/base, not diffed from the old report.

中文摘要
  • 结论: merge-ready。108/108 条脚本化断言通过,0 条意外失败。
  • 本轮变化: 分支只新增一个把最新 main 合入 issue-9281 的合并提交;有效 diff 仍是同样 4 个文件、内容逐字节不变。main 在两个 base 之间动了 662 个文件(packages/core 内 61 个,含新的 ipc/peer-send、mcp-classifier-input 等),其中与本 PR 导入闭包相交的只有 tools/tools.ts(纯注释 hunk)与 config/config.ts(无关的 MCP classifier 配置项),两臂同等包含,不影响 A/B 纯度。
  • A/B 结论: 在新 base(3aa1b146)上 task_list treats blank optional filters as active filters #9281 四种复现形态全部复现(空白 owner 报错;空白 blockedBy 在 6 任务板上静默 "No tasks found."),静默永不匹配族(#id#task-1##1)同样复现;新 head 上四形态全部修复,非法值显式报错,合法过滤与 owner 归一化逐格不变(base 24/24 vs head 29/29,见 A/B 表与 01-ab-base-vs-head.png)。
  • 测试非空转: 变异矩阵 7 行(含正对照)两次现场运行均全部符合预期——还原 task-list.ts 恰好 6 条新测试以预期断言变红;逐 guard 删除恰好对应测试变红(02-mutation-matrix.png)。
  • 既有失败归因: head 全量 626 个测试文件中 21 个失败(127 个失败用例,且该轮与一次中断的矩阵运行抢 CPU,放大了负载型 flake);批量 A/A 归因:13 个双臂失败测试名逐字节一致(既有),6 个双臂批量运行均绿(负载型),2 个批量差异经单文件隔离复核双臂均绿(03-full-suite-attribution.png)——0 个归因于本 PR,且 21 个文件无一导入本 PR 模块(脚本化分离检查)。
  • Findings: 无新增。上一轮两条低优先级观察(F1 task_update 仍拒绝 # 前缀 ID;F2 报错路径 getDescription() 仍展示过滤值)在新 head 复测为 stands;PR 描述与最终代码不一致的 Corrections 也 stands(描述仍未更新)。
  • 未覆盖范围: 逐 commit 归因(depth-2 shallow);TUI/E2E(纯参数归一化);Windows/macOS;其他 listTasks() 调用方以阅读 + 存储层 A/B 验证。

Previous-finding status (follow-up round)

# finding severity status at new head 3e058acc
F1 task_update rejects #-prefixed IDs that task_list now accepts low (pre-existing, declared follow-up) stands — re-measured by scripted check: task-update.ts imports assertValidTaskId but not normalizeTaskId; raw taskId/addBlocks/addBlockedBy go straight into assertValidTaskId (lines 217–222). Still loud (explicit error), still not a PR regression; the commit message declares the alignment as follow-up.
F2 on error paths getDescription() still advertises the rejected filter note stands — re-measured in the A/B run: C8 head desc="List tasks (blockedBy=#)" while execute() errors "Cannot filter by blockedBy…"; C9 owner=!!! desc identical on both arms. Pre-existing shape, no new inconsistency.
Corr PR body describes the first commit, not the final code description staleness stands — the body in the metadata snapshot is unchanged: still "non-blank blockedBy values are passed through unchanged" (final code normalizes and fails closed — C7/C8/C10/C12), still "all 14 tests pass" / "4 failed | 10 passed (14)" (the file now has 15 tests, 6 new; the base-revert matrix row shows 6 red), still "54/54" for the store suite (now 56). No code change requested; the body should be updated.

No new findings this round.

Central claim

Blank (empty/whitespace-only) values for the optional owner and blockedBy parameters of task_list behave as absent filters (no error, full board), while non-blank junk keeps failing closed and valid filters keep filtering exactly. Secondary claims: (a) the store-level listTasks() !== undefined activation contract is untouched, so other callers are unaffected; (b) the new tests are load-bearing (red against the unfixed source).

A/B load-bearing proof

Harness: ab-harness.mjs — mock-free; imports the compiled dist/ of each tree by file URL, drives the real TaskListTool against a real on-disk task store via the QWEN_HOME storage seam; the only stub is the two Config methods the tool reads (getTeamContext, getTeamManager). Board: 6 real tasks created through the real store (createTask/updateTask, BlockedTask blockedBy #1). Base side: git worktree add tmp/base-tree HEAD^1 (= 3aa1b146), packages/core rebuilt inside the worktree with tsc --build. Control checks: base dist contains 0 occurrences of normalizeTaskId (head dist: present), and readlink -f of the base dist file resolves inside the base tree; the harness never imports the @qwen-code/qwen-code-core specifier (root node_modules/@qwen-code/* are relative symlinks into the head tree), and the tests' import closure was grepped to confirm relative-only imports. Witness: evidence/01-ab-base-vs-head.png (both arms, one live frame).

cell params base (3aa1b146) head (3e058acc) expectation met
C1 owner: '' error "owner must include…" no error, all 6 both
C2 owner: ' ' error + desc owner= no error, all 6, desc "List all tasks" both
C3 blockedBy: '' silent "No tasks found." (6 tasks exist) no error, all 6 both
C4 blockedBy: ' ' silent "No tasks found." + desc advertises filter no error, all 6, desc "List all tasks" both
C5 {} (control) all 6 all 6 both
C6 blockedBy: '1' only BlockedTask only BlockedTask both
C7 blockedBy: ' #1 ' silent "No tasks found." only BlockedTask (#+trim normalized) both
C8 blockedBy: '#' silent "No tasks found." explicit error "Cannot filter by blockedBy…" both
C9 owner: '!!!' error "owner must include…" same error (preserved) both
C10 blockedBy: 'task-1' silent "No tasks found." explicit "Invalid task ID" error both
C11 owner: 'Alice' only OwnedTask (case canonicalized) same both
C12 blockedBy: '##1' silent "No tasks found." explicit Invalid task ID "#1" error both

Base 24/24, head 29/29 expectations met (12 cells × per-cell expectations + desc observations + store cells + 4 type-boundary assertions per arm). The four issue shapes (C1–C4) flip broken→fixed; the silent-never-match family (C7, C8, C10, C12) flips silent→correct-or-explicit; every preserved-behavior control (C5, C6, C9, C11) is identical across arms.

Store-contract cells (identical expectations on both arms, both pass): listTasks(team, {blockedBy: ''}) → 0 (the !== undefined activation contract is unchanged — this is what made the bug possible, and the PR deliberately leaves it alone); listTasks(team, {}) → 6; listTasks(team, {blockedBy: '1'}) → 1; listTasks(team, {owner: 'Alice'}) → 1.

Type-boundary probes (both arms, identical): status: '' rejected by the schema enum at build(); owner: null rejected ("must be string"); blockedBy: 123 passes the schema via the pre-existing number→string coercion and execute() never crashes on it (matches nothing → "No tasks found.").

Store-contract claim (a), callers: 7 listTasks() call sites enumerated at the new head — task-update.ts:71 (no filter), tasks.ts:932/995 (status: 'in_progress' literal), tasks.ts:1029 (no filter), TeamManager.ts:2136/2282 (status: 'pending' literal), plus the tool itself. None can pass a blank string. Verified by reading + scripted grep, plus the store-level A/B cells above.

Mutation matrix (vacuity + per-guard pinning, at new head)

Runner: mutation-matrix.mjs in a scratch worktree (tmp/mut-tree) at the merge commit; vitest runs the two affected suites from src directly (the import closure contains no package-entry imports, so mutations are what the tests load). Ran twice — both runs 7/7 rows as expected (logs/mutation-matrix.txt, logs/mutation-matrix-run2.txt). Witness: evidence/02-mutation-matrix.png.

row mutation expected red observed red result
R0 none (control) 0 0 (71/71 green) PASS
R1 task-list.ts reverted to base the 6 new behavioral tests exactly those 6 PASS
R2 drop bare-# fail-closed branch rejects a non-blank blockedBy… exactly that 1 PASS
R3 revert owner blank guard the 2 blank-owner tests exactly those 2 PASS
R4 forward raw blockedBy to store (no gate/normalize/validate — the blockedBy guard set reverted together) 2 blank-blockedBy + still filters + rejects exactly those 4 PASS
R5 normalizeTaskId no-op 2 normalizeTaskId tests + still filters + rejects exactly those 4 PASS
R6 positive control: 'No tasks found.''Nothing here.' pre-existing returns empty when no tasks exist exactly that 1 PASS

R1's reds fail with the behavioral mismatches the tests exist to catch (from logs/r1-failure-messages.txt): expected 'No tasks found.' to contain 'Task A' (blank blockedBy silent-empty), expected { Object (message) } to be undefined (blank owner error), expected 'No tasks found.' to contain 'Blocked' (#-form not normalized), expected undefined to be defined (bare # must error). Every guard the PR introduces is pinned by its own test; R4 is the combination row for the layered blockedBy guards (blank gate + normalization + fail-closed + validation) and shows the set is load-bearing; no single-guard survivor needed a combination reclassification.

Targeted gates (at new head)

  • vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts: 71/71 passed (logs/gate-two-suites.txt).
  • npm run typecheck in packages/core: exit 0 (logs/typecheck.txt).
  • eslint on the four changed files: clean (logs/eslint.txt); liveness control: a planted unused variable in a scratch file was reported (2 problems (2 errors) incl. no-unused-vars, logs/eslint-liveness.txt) before the probe was removed.
  • prettier --check on the four changed files: clean (logs/prettier.txt).

Full-suite attribution

Full packages/core suite at head: 626 files — 604 passed | 21 failed | 1 skipped; 127 failing tests (logs/core-full-suite-head.log). Note this run overlapped an aborted matrix attempt for ~10 of its 16 minutes, inflating load-induced flakes; the attribution below separates them.

Batched A/A: all 21 failing files run in one vitest run per arm (head main tree, base-tree), failing-test-name sets compared per file (batch-attribute.mjs, logs/attribution-run2.txt, logs/attribution-table.json):

category files detail
pre-existing (identical failing-test names on both arms) 13 config-session-env (1), installationManager (2), rulesDiscovery (1), contentGenerator (1), logger (31), ide-client (18), file-token-storage (5), memoryDiscovery (6), skill-activation (1), skill-manager (4), subagent-manager (3), shellAstParser (1), shellReadOnlyChecker (1)
load-induced (green batched on both arms) 6 agent-headless, anthropicContentGenerator, keychain-token-storage, recall-delivery-eval, telemetry/sdk, shell-ast-parser-lazy
batch-only divergence, green isolated on BOTH arms 2 archive-safety (head 2/base 0 in batch; isolated 1 passed (1) on both arms), hook-runner.process (different single timing test per arm in batch; isolated 1 passed (1) on both arms) — logs/isolated-followup.txt

Separation check (scripted): none of the 21 failing files imports tools/task-list or agents/team/tasks. Conclusion: 0 of 21 full-suite failures attributable to the PR (evidence/03-full-suite-attribution.png). Overlap with the previous round's set: the three persistent failers (installationManager, rulesDiscovery, subagent-manager) persist with identical counts; the previous round's load-induced set remains load-induced; the new entries are files main added or changed between bases (recall-delivery-eval, shell-ast-parser-lazy, archive-safety, keychain-token-storage, anthropicContentGenerator), all pre-existing-or-load on both arms.

Main-merge delta (this round's new commit)

git diff c1f8a422..3aa1b146 (old base → new base): 662 files, +43524/−16439. Inside packages/core: 61 files (+7896/−497), mostly new subsystems (ipc/peer-send, mcp-classifier-input, session-service rework). Of those, only two intersect the PR's import closure: tools/tools.ts (a comment-only hunk documenting the MCP classifier default) and config/config.ts (an unrelated permissions.autoMode.mcp.forwardArguments settings field). Both arms of the A/B include them equally, so the A/B delta remains exactly the PR's change. The merge-ref checkout itself (HEAD = merge of 3e058acc into 3aa1b146) completed without conflict and the effective diff is exactly the four PR files — the trial-merge evidence for landing on current main.

Not covered

  • Per-commit attribution: checkout is depth-2 (is-shallow-repository: true); git rev-list HEAD^1..HEAD^2 yields 1 commit while the metadata carries 6 — the intermediate commits are unreachable. Only the aggregate HEAD^1..HEAD diff was verified; the aggregate is what lands.
  • TUI/E2E session: not run — pure parameter normalization, no rendering path touched; the A/B harness drives the compiled tool end-to-end (real schema validation, real store) instead.
  • Other listTasks() callers: verified by reading the seven call sites (literal statuses or no filter) plus the store-level A/B cells, not by executing each caller.
  • Other tools with optional filters: out of scope per the PR's own scope statement; not swept.
  • Windows/macOS: Linux only.
  • Flakiness gate (5 identical rounds over changed test files): owned by the workflow lane; this round's repeated runs (matrix R0 ×2 attempts, gate run, isolated re-runs) were green with no divergence observed.

Methodology

Environment: CI verify container (node v22.23.2), merge-ref checkout at depth 2, npm ci + npm run build pre-run at head. Base side: git worktree add tmp/base-tree HEAD^1 (3aa1b146), packages/core rebuilt inside the worktree via node node_modules/typescript/bin/tsc --build; root and nested node_modules symlinked in (third-party only — packages/core/node_modules contains no @qwen-code/*, and the PR leaves package.json/lockfile untouched, so the control is clean). The A/B harness imports dist files by file URL, so no workspace symlink is crossed at runtime; the realpath of the base dist file was asserted to resolve inside the base tree, and the base dist was asserted to contain zero normalizeTaskId occurrences. Mutation runs used a second scratch worktree (tmp/mut-tree) with its own dist built once from unmutated sources (vitest globalSetup guard); vitest transforms src directly and the two test files' import closures are relative-only, so mutations are what the tests load. Raw logs: logs/ (ab-base.txt, ab-head.txt, mutation-matrix.txt, mutation-matrix-run2.txt, r1-failure-messages.txt, gate-two-suites.txt, typecheck.txt, eslint.txt, eslint-liveness.txt, prettier.txt, core-full-suite-head.log, final-checks.txt, attribution-run2.txt, attribution-table.json, isolated-followup.txt, batch-head.json, batch-base.json, vitest-R*.json). Harnesses: ab-harness.mjs, mutation-matrix.mjs, final-checks.mjs, batch-attribute.mjs.

Evidence images

01-ab-base-vs-head

02-mutation-matrix

03-full-suite-attribution

Qwen Code · sandboxed verification

Flakiness gate log

rounds=5 files=2 skipped=0
file packages/core/src/agents/team/tasks.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/team/tasks.test.ts
file packages/core/src/tools/task-list.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/task-list.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/agents/team/tasks.test.ts: PPPPP
  packages/core/src/tools/task-list.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 1 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 2 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 2 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 3 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 3 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 4 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 4 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 5 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 5 · packages/core/src/tools/task-list.test.ts: P (exit 0)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

03-full-suite-attribution

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.

⚠️ Downgraded from Approve to Comment: CI failing: web-shell E2E Smoke (ubuntu-latest, Node 22.x). Reviewed.

Test Plan (not a blocker): src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory; 14 tests pass — this review observed 1818 passed; Tests 14 passed — this review observed 1818 passed; 10 passed — this review observed 1818 passed.

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

  • packages/core/src/tools/task-list.test.ts:227 — [probe] #-prefixed blockedBy test lacks a negative control (a mutation dropping #N filtering ships green)
中文说明

⚠️ 已从批准降级为评论:CI failing: web-shell E2E Smoke (ubuntu-latest, Node 22.x)。 已审查。

Test Plan(非阻断):src/tools/task-list.test.tsno such file or directory; src/agents/team/tasks.test.tsno such file or directory; 14 tests pass — this review observed 1818 passed; Tests 14 passed — this review observed 1818 passed; 10 passed — this review observed 1818 passed

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 184 passed · 0 failed · 184 total

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

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

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

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

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

Verification report

PR #10159 — fix(tools): treat blank task_list filters as absent (follow-up round 3)

Verdict: merge-ready — 184/184 scripted assertions passed, 0 unexpected failures. Verified head: 3e058acc09cc186913efeb07acdaadaf5515af68 (merge-ref HEAD^2; base tip 3aa1b14624789797b33bffad3d70190ce41cedce; merge commit e0f3e298).

This is a follow-up round with zero delta: HEAD^1 and HEAD^2 are byte-identical OIDs to what round 2 verified (the branch did not move and main did not move). The effective diff (git diff HEAD^1..HEAD) is the same four files (task-list.ts, task-list.test.ts, tasks.ts, tasks.test.ts, +186/−5), sha256 212131f0…530aeb. Per the follow-up rule every carried measurement was re-run fresh at this head anyway, not diffed from the old report; the one place the identical-input-closure shortcut is taken (full-suite attribution) names exactly what was compared.

中文摘要
  • 结论: merge-ready。184/184 条脚本化断言通过,0 条意外失败。
  • 本轮变化: 零增量——HEAD^13aa1b146)与 HEAD^23e058acc)与上一轮验证的 OID 逐字节相同,分支与 main 均未移动;有效 diff 仍是同样 4 个文件(+186/−5)。按跟进轮规则,所有沿用的测量均在新 head 上重新执行而非沿用旧报告数字。
  • A/B 结论: base 臂 task_list treats blank optional filters as active filters #9281 四种复现形态全部复现(空白 owner 报错;空白 blockedBy 在 6 任务板上静默 "No tasks found."),静默永不匹配族(#1#task-1##1)同样复现;head 臂四形态全部修复,非法值显式报错,合法过滤与 owner 归一化逐格不变(两臂各 36/36 断言,见 A/B 表与 01-ab-base-vs-head.png)。
  • 测试非空转: 变异矩阵 7 行两次现场运行均全部符合预期——整文件还原 task-list.ts 恰好 6 条新测试以行为断言变红(expected 'No tasks found.' to contain 'Task A' 等);逐 guard 删除恰好对应测试变红;R4 组合行证明 blockedBy guard 集合整体承重(02-mutation-matrix.png)。
  • 既有失败归因: 两轮 head/base OID 完全相同 ⇒ 合并树内容相同(全量套件测量的输入闭包被证明未变,引用了所比较的内容);在本 head 重新执行脚本化分离检查:上一轮 21 个失败测试文件全部解析成功(27 个匹配文件),无一导入本 PR 模块,27/27 通过。
  • Findings: 无新增。F1(task_update 拒绝 # 前缀)、F2(报错路径描述仍展示过滤值)、Corr(PR 描述过期)均复测为 stands
  • 未覆盖范围: 全量套件未重跑(输入闭包证明相同 + 分离检查重跑);逐 commit 归因(depth-2 shallow);TUI/E2E(纯参数归一化);Windows/macOS。

Previous-finding status (follow-up round)

# finding severity status at head 3e058acc (re-measured)
F1 task_update rejects #-prefixed IDs that task_list now accepts low (pre-existing, declared follow-up) stands — fresh scripted check: task-update.ts:35 imports assertValidTaskId only; task-update.ts:217/219/222 feed raw taskId/addBlocks/addBlockedBy into it with no normalizeTaskId. Still loud (explicit Invalid task ID error), still not a PR regression; the commit message declares the alignment a follow-up.
F2 on error paths getDescription() still advertises the rejected filter note stands — re-observed in this round's A/B run: head C8 prints desc="List tasks (blockedBy=#)" while execute() errors Cannot filter by blockedBy…; C9 owner=!!! and C10 blockedBy=task-1 descs are identical across both arms (logs/ab-head.txt). Pre-existing shape, not introduced or worsened by the PR.
Corr PR body describes the first commit, not the final code description staleness stands — re-measured: body still says "non-blank blockedBy values are passed through unchanged" (final code normalizes and fails closed — C7/C8/C10/C12 below), still "all 14 tests pass" / "4 failed | 10 passed (14)" (the file now has 15 tests and matrix row R1 reds 6, not 4), still "54/54" for the store suite (now 56 — this round's gate run). No code change requested; the body should be updated before merge.

No new findings this round.

Central claim

Blank (empty/whitespace-only) values for the optional owner and blockedBy parameters of task_list behave as absent filters (no error, full board), while non-blank junk keeps failing closed and valid filters keep filtering exactly. Secondary claims: (a) the store-level listTasks() !== undefined activation contract is untouched, so other callers are unaffected; (b) the new tests are load-bearing (red against the unfixed source).

A/B load-bearing proof

Harness: ab-harness.mjs — mock-free; imports each tree's compiled dist/ by file URL, drives the real TaskListTool against a real on-disk task store via the QWEN_HOME storage seam; the only stub is the two Config methods the tool reads (getTeamContext, getTeamManager). Board: 6 real tasks created through the real store (createTask/updateTask; Blocked blockedBy the Blocker's id). Base side: git worktree add tmp/base-tree HEAD^1 (= 3aa1b146), packages/core rebuilt inside the worktree with tsc --build (54 s), root and nested node_modules symlinked (the nested one contains only third-party packages — no @qwen-code/*). Control checks (printed in the witness): base dist contains 0 occurrences of normalizeTaskId (head dist: 2), and readlink -f of the base dist file resolves inside the base tree. Witness: evidence/01-ab-base-vs-head.png (both arms, one live frame, exit 0).

cell params base (3aa1b146) head (3e058acc) expectation met
C1 owner: '' error "owner must include…" no error, all 6 both
C2 owner: ' ' error + desc owner= no error, all 6, desc "List all tasks" both
C3 blockedBy: '' silent "No tasks found." (6 tasks exist) no error, all 6 both
C4 blockedBy: ' ' silent "No tasks found." + desc advertises filter no error, all 6, desc "List all tasks" both
C5 {} (control) all 6 all 6 both
C6 blockedBy: '1' only Blocked only Blocked both
C7 blockedBy: ' #1 ' silent "No tasks found." only Blocked (#+trim normalized) both
C8 blockedBy: '#' silent "No tasks found." explicit error "Cannot filter by blockedBy…" both
C9 owner: '!!!' error "owner must include…" same error (preserved) both
C10 blockedBy: 'task-1' silent "No tasks found." explicit Invalid task ID "task-1" error both
C11 owner: 'Alice' only Owned (case canonicalized) same both
C12 blockedBy: '##1' silent "No tasks found." explicit Invalid task ID "#1" error both

Base 36/36, head 36/36 assertions passed (12 cells with per-cell expectations incl. desc observations + 4 store cells + 4 type-boundary probes per arm). The four issue shapes (C1–C4) flip broken→fixed; the silent-never-match family (C7, C8, C10, C12) flips silent→correct-or-explicit; every preserved-behavior control (C5, C6, C9, C11) is identical across arms.

Store-contract cells (identical expectations on both arms, all pass): listTasks(team, {blockedBy: ''}) → 0 (the !== undefined activation contract at tasks.ts:761-764 is unchanged — this is what made the bug possible, and the PR deliberately leaves it alone); listTasks(team, {}) → 6; listTasks(team, {blockedBy: '1'}) → 1; listTasks(team, {owner: 'Alice'}) → 1.

Type-boundary probes (both arms, identical outcomes): status: '' rejected by the schema enum at build(); owner: null rejected ("must be string"); blockedBy: 123 and owner: 456 pass the schema via the pre-existing fixStringValues number→string coercion (schemaValidator.ts) and execute() never crashes on them (matches nothing → "No tasks found.").

Store-contract claim (a), callers: 7 listTasks() call sites enumerated at this head — task-update.ts:71 (no filter), tasks.ts:932/995 (status: 'in_progress' literal), tasks.ts:1029 (no filter), TeamManager.ts:2136/2282 (status: 'pending' literal), plus the tool itself. None can pass a blank string. Verified by reading + grep, plus the store-level A/B cells above.

Mutation matrix (vacuity + per-guard pinning, re-run at this head)

Runner: mutation-matrix.mjs in a scratch worktree (tmp/mut-tree) at the merge commit; vitest runs the two affected suites from src directly (the import closure is relative-only, so mutations are what the tests load); dist was built once from unmutated sources before any mutation. Mutations are exact string replacements, each occurrence-count-guarded; files git-restored between rows. Ran twice live — both runs 7/7 rows exactly as expected (logs/mutation-matrix.txt is the second run; the first was identical modulo a runner-side name-comparison fix). Witness: evidence/02-mutation-matrix.png.

row mutation expected red observed red result
R0 none (control) 0 0 (71/71 green) PASS
R1 task-list.ts reverted to base (whole file) the 6 new behavioral tests exactly those 6 PASS
R2 drop bare-# fail-closed branch rejects a non-blank blockedBy… exactly that 1 PASS
R3 revert owner blank guard the 2 blank-owner tests exactly those 2 PASS
R4 blockedBy guard set reverted together (raw value forwarded to store — combination row) 2 blank-blockedBy + still filters + rejects exactly those 4 PASS
R5 normalizeTaskId → no-op (return raw) 2 normalizeTaskId tests + still filters + rejects exactly those 4 PASS
R6 positive control: 'No tasks found.''Nothing here.' pre-existing returns empty when no tasks exist exactly that 1 PASS

R1's reds fail with the behavioral mismatches the tests exist to catch (logs/r1-failure-messages.txt): expected 'No tasks found.' to contain 'Task A' (blank blockedBy silent-empty), expected { Object (message) } to be undefined (blank owner error), expected 'No tasks found.' to contain 'Blocked' (#id form not normalized), expected undefined to be defined (bare # must error) — not import/setup breakage. Every guard the PR introduces is pinned by its own test; R4 shows the layered blockedBy guard set is load-bearing as a set; no survivor needed classification. R6 landed in the same file as its mutant and turned exactly one test red, so the harness is proven able to fail.

Targeted gates (re-run at this head)

  • vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts in packages/core: 71/71 passed (15 + 56; logs/gate-two-suites.txt).
  • npm run typecheck in packages/core: exit 0 (logs/typecheck.txt).
  • eslint on the four changed files: clean (logs/eslint.txt); liveness control: a planted unused variable in a scratch file was reported (1 problem (1 error), @typescript-eslint/no-unused-vars, logs/eslint-liveness.txt) before the probe was removed.
  • prettier --check on the four changed files: clean (logs/prettier.txt).

Full-suite attribution (carried over on a proven-identical input closure)

Round 2 ran the full packages/core suite (626 files, 21 failing, 127 failing tests) and attributed 0 failures to the PR via a batched A/A across both arms. That measurement's input closure is the entire merged tree — which is proven identical this round: HEAD^1 and HEAD^2 are byte-identical OIDs to round 2's, a conflict-free merge of identical trees is tree-identical, and the effective diff hash matches round 2's reported +186/−5 over the same four files. Rather than re-running the 16-minute load-dependent suite, the separation check was re-run fresh at this head: all 21 previously-failing test-file names resolved (27 matching files, some names match more than one file) and none imports tools/task-list or agents/team/tasks — 27/27 pass (logs/separation-check.txt). The attribution's code property (no failing file touches the PR's modules) therefore holds at this head; the per-run failing counts were environmental/load properties of the same tree.

Corrections

  • PR body staleness (carried, still uncorrected): the description says "non-blank blockedBy values are passed through unchanged" — the final code normalizes them (normalizeTaskId) and fails closed on junk (C7–C12). It cites "all 14 tests pass" / "4 failed | 10 passed (14)" — the file now has 15 tests with 6 new behavioral ones (R1 reds 6, not 4), and the store suite is 56, not 54. This is a description correction, not a code change request.

Findings

None new this round. Carried F1/F2/Corr all stand (see status table).

Not covered

  • Full packages/core suite re-run: carried over on the proven-identical input closure above (OIDs compared: HEAD^1/HEAD^2 identical to round 2's; effective diff hash matches), with the separation check re-executed fresh. Load-dependent per-run failure counts may differ between runs; the attribution property was what was carried.
  • Per-commit attribution: checkout is depth-2 (is-shallow-repository: true); git rev-list HEAD^1..HEAD^2 yields 1 commit while the metadata carries 6 — intermediate commits unreachable. Only the aggregate HEAD^1..HEAD diff was verified; the aggregate is what lands.
  • TUI/E2E session: not run — pure parameter normalization, no rendering path touched; the A/B harness drives the compiled tool end-to-end (real schema validation, real store) instead.
  • Other listTasks() callers: verified by reading the seven call sites (literal statuses or no filter) plus the store-level A/B cells, not by executing each caller.
  • Other tools with optional filters: out of scope per the PR's own scope statement; not swept.
  • Windows/macOS: Linux only.
  • Flakiness gate (5 identical rounds over changed test files): owned by the workflow lane; this round's repeated runs (gate run, matrix R0 control ×2, A/B twice per arm incl. the capture run) were green with no divergence observed.

Methodology

Environment: CI verify container (node v22.23.2), merge-ref checkout at depth 2, npm ci + npm run build pre-run at head. Base side: git worktree add tmp/base-tree HEAD^1 (3aa1b146), packages/core rebuilt inside the worktree via node node_modules/typescript/bin/tsc --build (54 s); root and nested node_modules symlinked (third-party only — packages/core/node_modules contains no @qwen-code/*, and the PR leaves package.json/lockfile untouched, so the control is clean). The A/B harness imports dist files by file URL, so no workspace symlink is crossed at runtime; the base dist realpath was asserted to resolve inside the base tree and the base dist was asserted to contain zero normalizeTaskId occurrences. Mutation runs used a second scratch worktree (tmp/mut-tree) at the merge commit with dist built once from unmutated sources; vitest transforms src directly and the two test files' import closures are relative-only, so mutations are what the tests load. Both scratch worktrees were removed after the A/B cells and matrix were captured. Raw logs: logs/ (ab-base.txt, ab-head.txt, mutation-matrix.txt, matrix-summary.json, r1-failure-messages.txt, gate-two-suites.txt, typecheck.txt, eslint.txt, eslint-liveness.txt, prettier.txt, separation-check.txt; the per-row vitest JSON reports were parsed into mutation-matrix.txt/matrix-summary.json and the 16 MB coverage-laden originals dropped to keep the artifact small). Harnesses: ab-harness.mjs, mutation-matrix.mjs, separation-check.mjs.

Flakiness gate log

rounds=5 files=2 skipped=0
file packages/core/src/agents/team/tasks.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/team/tasks.test.ts
file packages/core/src/tools/task-list.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/task-list.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/agents/team/tasks.test.ts: PPPPP
  packages/core/src/tools/task-list.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 1 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 2 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 2 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 3 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 3 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 4 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 4 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 5 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 5 · packages/core/src/tools/task-list.test.ts: P (exit 0)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot's only review on 3e058acc09cc186913efeb07acdaadaf5515af68 is a COMMENTED one, which carries no vote — so it has no verdict of its own on this commit, and main needs two approving reviews: an approval left by another account is a separate vote and does not count as the bot's own. Two different things look like this, and the stage-3 comment above says which: the triage skill deferring on purpose at 3/5 — a fork refactor hitting the approval guardrail, or a core change escalated for maintainer awareness, both normal outcomes — or an earlier approval that a push dismissed, leaving only the comment behind, which needs a fresh review.

⚠️ 机器人在 3e058acc09cc186913efeb07acdaadaf5515af68 上唯一的评审是 COMMENTED不带票 —— 因此它在该 commit 上没有自己的裁决,而 main 需要两个批准(其他账号的批准是另一张票)。有两种情况长这样,上方的 stage-3 评论会说明是哪一种:triage skill 在 3/5 时有意 defer(fork refactor 命中审批护栏,或核心改动被升级交由维护者把关,两者都是正常结果);或者更早的批准被一次推送作废、只剩下这条评论,此时需要重新评审。

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 90 passed · 0 failed · 90 total

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

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

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

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

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

Verification report

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

PR #10159 — fix(tools): treat blank task_list filters as absent (follow-up round 4)

Verdict: merge-ready — 90/90 scripted assertions passed, 0 unexpected failures. Verified head: 3e058acc09cc186913efeb07acdaadaf5515af68 (merge-ref HEAD^2; base tip 3aa1b14624789797b33bffad3d70190ce41cedce; merge commit e0f3e2986b42cc67b3d06bbfc4183293aac782bd).

This is a follow-up round with zero delta: HEAD^1 and HEAD^2 are byte-identical OIDs to what rounds 2 and 3 verified, and the effective diff (git diff HEAD^1..HEAD) hashes to sha256 212131f0190155d1ebbfce3687bba83f6c917ab68d0219273d2e95cd47530aeb — the identical value round 3 reported for the same four files (+186/−5). Per the follow-up rule, every carried measurement was re-run fresh at this head (A/B both arms, full mutation matrix, all targeted gates, F1/F2/Corr re-measurement); the only measurement carried on the identical-input-closure shortcut (full-suite attribution) names exactly what was compared, and its separation property was re-checked fresh in contrapositive form.

中文摘要
  • 结论: merge-ready。90/90 条脚本化断言通过,0 条意外失败。
  • 本轮变化: 零增量——HEAD^13aa1b146)、HEAD^23e058acc)与第 2、3 轮逐字节相同,有效 diff 的 sha256 与第 3 轮报告完全一致(同样 4 个文件,+186/−5)。按跟进轮规则,所有沿用测量均在新 head 上重新执行:A/B 两臂、7 行变异矩阵、全部门禁、F1/F2/Corr 复测。
  • A/B 结论: base 臂完整复现 task_list treats blank optional filters as active filters #9281 四种形态(空白 owner 显式报错;空白 blockedBy 在 6 任务板上静默 "No tasks found.")及静默永不匹配族(#1#task-1##1);head 臂四形态全部修复、垃圾值显式报错、合法过滤与 owner 归一化逐格不变(base 38/38、head 39/39,见 A/B 表与 01-ab-base-vs-head.png)。
  • 测试非空转: 变异矩阵 7 行现场运行全部符合预期——整文件还原恰好 6 条新行为测试以行为断言变红(expected 'No tasks found.' to contain 'Task A' 等);逐 guard 删除恰好对应测试变红;R4 组合行证明 blockedBy guard 集合整体承重(02-mutation-matrix.png)。
  • Findings: 无新增。F1(task_update 拒绝 # 前缀)、F2(报错路径描述仍展示过滤值)、Corr(PR 描述过期)均复测为 stands
  • 未覆盖范围: 全量套件未重跑(输入闭包证明相同 + 新跑的逆否分离检查:导入本 PR 模块的全部 5 个测试文件均绿);逐 commit 归因(depth-2 shallow);TUI/E2E(纯参数归一化);Windows/macOS。

Previous-finding status (follow-up round)

# finding severity status at head 3e058acc (re-measured)
F1 task_update rejects #-prefixed IDs that task_list now accepts low (pre-existing, declared follow-up) stands — fresh grep at this head: task-update.ts:35 imports assertValidTaskId only; task-update.ts:217/219/222 feed raw taskId/addBlocks/addBlockedBy into it; zero normalizeTaskId occurrences in the file. Still loud (explicit Invalid task ID error), not a PR regression; the commit message declares the alignment a follow-up.
F2 on error paths getDescription() still advertises the rejected filter note stands — re-observed in this round's fresh A/B run: head C8 prints desc "List tasks (blockedBy=#)" while execute() errors Cannot filter by blockedBy…; C9 (owner=!!!) and C10 (blockedBy=task-1) descs are byte-identical across both arms (logs/ab-head.txt, logs/ab-base.txt). Pre-existing shape, not introduced or worsened by the PR.
Corr PR body describes the first commit, not the final code description staleness stands — re-measured at this head: body still says "non-blank blockedBy values are passed through unchanged" (final code normalizes via normalizeTaskId and fails closed — cells C7/C8/C10/C12), still "all 14 tests pass" / "4 failed | 10 passed (14)" (the file now has 15 tests; R1 reds 6, not 4), still "54/54" for the store suite (now 56 — this round's gate run: ✓ src/agents/team/tasks.test.ts (56 tests)). No code change requested; the body should be updated before merge.

No new findings this round.

Central claim

Blank (empty/whitespace-only) values for the optional owner and blockedBy parameters of task_list behave as absent filters (no error, full board), while non-blank junk keeps failing closed and valid filters keep filtering exactly. Secondary claims: (a) the store-level listTasks() !== undefined activation contract is untouched, so other callers are unaffected; (b) the new tests are load-bearing (red against the unfixed source).

A/B load-bearing proof

Harness: ab-harness.mjs — mock-free; imports each tree's compiled dist/ by file URL, drives the real TaskListTool against a real on-disk task store via the QWEN_HOME storage seam (fresh temp home per arm); the only stub is the Config object (the two methods the tool reads: getTeamContext, getTeamManager). Board: 6 real tasks created through the real store (createTask/updateTask; Blocked blockedBy the Blocker's id). Base side: git worktree add tmp/base-tree HEAD^1 (= 3aa1b146), packages/core rebuilt inside the worktree via npm run build (34 s), root and nested node_modules symlinked (the nested one contains 11 third-party packages, 0 @qwen-code/*; the PR leaves package.json/lockfile untouched). Control checks (printed in the witness): base dist contains 0 occurrences of normalizeTaskId (head dist: 2), and realpathSync of the base dist file resolves inside the base tree. Witness: evidence/01-ab-base-vs-head.png (both arms, one live frame, exit 0). Raw logs: logs/ab-base.txt, logs/ab-head.txt.

cell params base (3aa1b146) head (3e058acc) expectation met
C1 owner: '' error "owner must include…" no error, all 6 both
C2 owner: ' ' error + desc List tasks (owner= ) no error, all 6, desc "List all tasks" both
C3 blockedBy: '' silent "No tasks found." (6 tasks exist) no error, all 6 both
C4 blockedBy: ' ' silent "No tasks found." + desc advertises filter no error, all 6, desc "List all tasks" both
C5 {} (control) all 6 all 6 both
C6 blockedBy: '1' only Blocked only Blocked both
C7 blockedBy: ' #1 ' silent "No tasks found." only Blocked (#+trim normalized) both
C8 blockedBy: '#' silent "No tasks found." explicit error "Cannot filter by blockedBy…" (desc still blockedBy=# — F2) both
C9 owner: '!!!' error "owner must include…" same error (preserved) both
C10 blockedBy: 'task-1' silent "No tasks found." explicit Invalid task ID "task-1" error both
C11 owner: 'Alice' only Owned (case canonicalized) same both
C12 blockedBy: '##1' silent "No tasks found." explicit Invalid task ID "#1" error both

Base 38/38, head 39/39 assertions passed (12 tool cells with per-cell expectations incl. desc observations + 4 store cells + 4 type-boundary probes + 2 control checks per arm). The four issue shapes (C1–C4) flip broken→fixed; the silent-never-match family (C7, C8, C10, C12) flips silent→correct-or-explicit; every preserved-behavior control (C5, C6, C9, C11) is identical across arms.

Store-contract cells (identical expectations on both arms, all pass): listTasks(team, {blockedBy: ''}) → 0 (the !== undefined activation contract is unchanged — this is what made the bug possible, and the PR deliberately leaves it alone); listTasks(team, {}) → 6; listTasks(team, {blockedBy: '1'}) → 1; listTasks(team, {owner: 'alice'}) → 1.

Type-boundary probes (both arms, identical outcomes): status: '' rejected by the schema enum at build(); owner: null rejected ("must be string"); blockedBy: 123 and owner: 456 pass the schema via the pre-existing fixStringValues number→string coercion and execute() never crashes on them (matches nothing → "No tasks found.").

Mutation matrix (vacuity + per-guard pinning, re-run at this head)

Runner: mutation-matrix.mjs in a scratch worktree (tmp/mut-tree) at the merge commit; vitest runs the two affected suites from src directly (the import closure is relative-only, so mutations are what the tests load); dist was built once from unmutated sources before any mutation. Mutations are exact string replacements, each occurrence-count-guarded; files git-restored between rows. Ran live three times this round (first run exposed a parser bug on my side — trailing timing suffix not stripped — fixed and re-run); the two clean runs and the captured run are all 7/7 rows exactly as expected. Witness: evidence/02-mutation-matrix.png (live run). Raw: logs/mutation-matrix.txt, logs/r1-failure-messages.txt.

row mutation expected red observed red result
R0 none (control) 0 0 (71/71 green) PASS
R1 task-list.ts reverted to base (whole file) the 6 new behavioral tests exactly those 6 PASS
R2 drop bare-# fail-closed branch rejects a non-blank blockedBy… exactly that 1 PASS
R3 revert owner blank guard the 2 blank-owner tests exactly those 2 PASS
R4 blockedBy guard set reverted together (raw value forwarded to store — combination row) 2 blank-blockedBy + still filters + rejects exactly those 4 PASS
R5 normalizeTaskId → no-op (return raw) 2 normalizeTaskId tests + still filters + rejects exactly those 4 PASS
R6 positive control: 'No tasks found.''Nothing here.' pre-existing returns empty when no tasks exist exactly that 1 PASS

R1's reds fail with the behavioral mismatches the tests exist to catch (logs/r1-failure-messages.txt): expected 'No tasks found.' to contain 'Task A' (blank blockedBy silent-empty), expected { Object (message) } to be undefined (blank owner error), expected 'No tasks found.' to contain 'Blocked' (#id form not normalized), expected undefined to be defined (bare # must error) — not import/setup breakage. Every guard the PR introduces is pinned by its own test; R4 shows the layered blockedBy guard set is load-bearing as a set; no survivor needed classification. R6 landed in the same file as the mutated code and turned exactly one test red, so the harness is proven able to fail.

Targeted gates (re-run at this head)

  • vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts in packages/core: 71/71 passed (15 + 56; logs/gate-two-suites.txt).
  • npm run typecheck in packages/core: exit 0 (logs/typecheck.txt).
  • eslint on the four changed files: clean (logs/eslint.txt); liveness control: a planted unused variable in a scratch file was reported (1 problem (1 error), @typescript-eslint/no-unused-vars, logs/eslint-liveness.txt) before the probe was removed.
  • prettier --check on the four changed files: clean (logs/prettier.txt).

Full-suite attribution (carried over on a proven-identical input closure, separation re-checked fresh)

Round 2 ran the full packages/core suite (626 files, 21 failing test files, 127 failing tests) and attributed 0 failures to the PR via a batched A/A across both arms. That measurement's input closure is the entire merged tree, which is proven identical this round: HEAD^1 (3aa1b146) and HEAD^2 (3e058acc) are byte-identical OIDs to rounds 2 and 3, a conflict-free merge of identical trees is tree-identical, and the effective diff hash (sha256 212131f0…530aeb) matches round 3's reported +186/−5 over the same four files. What was compared: the two parent OIDs, the PR-head OID, and the effective-diff sha256.

Rather than re-running the ~16-minute load-dependent suite, the separation property was re-established fresh at this head in contrapositive form: the complete set of test files importing either changed module is exactly five — agents/team/tasks.test.ts, tools/task-list.test.ts (the PR's own, green in the gate above), tools/task-create.test.ts, tools/task-update.test.ts, tools/team-lifecycle.test.ts — and the three non-PR importers run green at this head: 3 files, 32/32 passed (logs/separation-check.txt). Any test that touches the PR's modules passes; therefore no failing test elsewhere can be caused by them.

Corrections

  • PR body staleness (carried, still uncorrected): the description says "non-blank blockedBy values are passed through unchanged" — the final code normalizes them (normalizeTaskId) and fails closed on junk (C7–C12). It cites "all 14 tests pass" / "4 failed | 10 passed (14)" — the file now has 15 tests with 6 new behavioral ones (R1 reds 6, not 4), and the store suite is 56, not 54. This is a description correction, not a code change request.

Findings

None new this round. Carried F1/F2/Corr all stand (see status table).

Not covered

  • Full packages/core suite re-run: carried over on the proven-identical input closure above, with the separation property re-established fresh (contrapositive: all five importers of the changed modules green, 32/32 + 71/71). Load-dependent per-run failure counts may differ between runs; the attribution property was what was carried.
  • Per-commit attribution: checkout is depth-2 (is-shallow-repository: true); git rev-list HEAD^1..HEAD^2 yields 1 commit while the metadata carries 6 — intermediate commits unreachable. Only the aggregate HEAD^1..HEAD diff was verified; the aggregate is what lands.
  • TUI/E2E session: not run — pure parameter normalization, no rendering path touched; the A/B harness drives the compiled tool end-to-end (real schema validation, real store) instead.
  • Other listTasks() callers: verified by reading the seven call sites (literal statuses or no filter) plus the store-level A/B cells, not by executing each caller.
  • Other tools with optional filters: out of scope per the PR's own scope statement; not swept.
  • Windows/macOS: Linux only.
  • Flakiness gate (5 identical rounds over changed test files): owned by the workflow lane; this round's repeated live runs (gate, matrix ×3, A/B ×2 per arm incl. the capture runs) were green with no divergence observed.

Methodology

Environment: CI verify container (node v22), merge-ref checkout at depth 2, npm ci + npm run build pre-run at head. Base side: git worktree add tmp/base-tree HEAD^1 (3aa1b146), packages/core rebuilt inside the worktree (34 s); root and nested node_modules symlinked (third-party only — packages/core/node_modules holds 11 packages, 0 @qwen-code/*; lockfile untouched, so the control is clean). The A/B harness imports dist files by file URL, so no workspace symlink is crossed at runtime; the base dist realpath was asserted to resolve inside the base tree and the base dist was asserted to contain zero normalizeTaskId occurrences. Mutation runs used a second scratch worktree (tmp/mut-tree) at the merge commit with dist built once from unmutated sources; vitest transforms src directly and the two test files' import closures are relative-only, so mutations are what the tests load. Both scratch worktrees were removed after the cells and matrix were captured; vitest byproducts (junit.xml, coverage/) deleted; git status clean at end. Assertion tally: 38 (base arm) + 39 (head arm) + 7 (matrix rows, captured run) + 5 (gate checks: two suites, typecheck, eslint, eslint-liveness, prettier) + 1 (separation check) = 90, all passed; the first matrix run's parser bug was a harness-side iteration, fixed and re-run, and is not counted as a PR failure. Raw logs: logs/ (ab-base.txt, ab-head.txt, mutation-matrix.txt, r1-failure-messages.txt, r1-full-vitest.txt, gate-two-suites.txt, typecheck.txt, eslint.txt, eslint-liveness.txt, prettier.txt, separation-check.txt). Harnesses: ab-harness.mjs, mutation-matrix.mjs. Evidence: evidence/01-ab-base-vs-head.png, evidence/02-mutation-matrix.png.

Flakiness gate log

rounds=5 files=2 skipped=0
file packages/core/src/agents/team/tasks.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/team/tasks.test.ts
file packages/core/src/tools/task-list.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/task-list.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/agents/team/tasks.test.ts: PPPPP
  packages/core/src/tools/task-list.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 1 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 2 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 2 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 3 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 3 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 4 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 4 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 5 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 5 · packages/core/src/tools/task-list.test.ts: P (exit 0)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

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

Qwen Code · sandboxed verification

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot
qwen-code-ci-bot dismissed their stale review August 30, 2026 21:10

Superseded — this CHANGES_REQUESTED came from a malformed triage run on 4ddc36d (2026-08-29) and no longer reflects the review state: full re-reviews on c6e53b6 and 3e058ac found no code findings, CI on 3e058ac settled fully green, sandboxed /verify passed 184/184 assertions on it, and an approval pinned to 3e058ac stands. Dismissing my own stale review so it stops gating the PR.

该评审来自 2026-08-29 在 4ddc36d 上的一次异常运行,已被后续完整复审取代,不再反映当前评审状态(3e058acc 上 CI 全绿、沙箱验证 184/184 通过、已有钉住该提交的批准),现驳回我自己留下的过期评审。

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 189 passed · 0 failed · 189 total

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

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

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

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

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

Verification report

PR #10159 — fix(tools): treat blank task_list filters as absent (follow-up round 5)

Verdict: merge-ready — 189/189 scripted assertions passed, 0 unexpected failures. Verified head: 3e058acc09cc186913efeb07acdaadaf5515af68 (merge-ref HEAD^2; base tip 3aa1b14624789797b33bffad3d70190ce41cedce; merge commit e0f3e2986b42cc67b3d06bbfc4183293aac782bd).

This is a follow-up round with zero delta: HEAD^1 and HEAD^2 are byte-identical OIDs to what rounds 2–4 verified, and the effective diff (git diff HEAD^1..HEAD) hashes to sha256 212131f0190155d1ebbfce3687bba83f6c917ab68d0219273d2e95cd47530aeb — byte-identical to the value rounds 3 and 4 reported for the same four files (+186/−5). Per the follow-up rule every measurement was re-run fresh at this head anyway (A/B both arms including the capture run, mutation matrix twice live, all targeted gates, separation check, F1/F2/Corr re-measurement). The only carried measurement — round 2's full-suite attribution — rests on the strongest form of the identical-input-closure shortcut: the entire merged tree is provably identical. What was compared: the base OID (3aa1b146…), the PR-head OID (3e058acc…), and the effective-diff sha256 above.

中文摘要
  • 结论: merge-ready。189/189 条脚本化断言通过,0 条意外失败。
  • 本轮变化: 零增量——HEAD^13aa1b146)、HEAD^23e058acc)与第 2–4 轮逐字节相同,有效 diff 的 sha256 与第 3、4 轮报告完全一致(同样 4 个文件,+186/−5)。即便如此,本轮仍按跟进轮规则在新 head 上重新执行了全部测量:A/B 两臂(含证据截图的现场运行)、变异矩阵现场运行两次、全部门禁、分离检查、F1/F2/Corr 复测。唯一沿用的测量(第 2 轮全量套件归因)基于已证明完全相同的输入闭包(整棵树 OID 与 diff 哈希均逐字节一致),并写明了对比内容。
  • A/B 结论: base 臂完整复现 task_list treats blank optional filters as active filters #9281 四种形态(空白 owner 显式报错;空白 blockedBy 在 6 任务板上静默 "No tasks found.")及静默永不匹配族(#1#task-1##1);head 臂四形态全部修复、垃圾值显式报错、合法过滤与 owner 归一化逐格不变(base 94/94、head 82/82,见 A/B 表与 01-ab-base-vs-head.png)。
  • 测试非空转: 变异矩阵 7/7 行现场运行全部符合预期——整文件还原恰好 6 条新行为测试以行为断言变红;逐 guard 删除恰好对应测试变红;R4 组合行证明 blockedBy guard 集合整体承重;R6 阳性对照证明 harness 能够失败(02-mutation-matrix.png)。
  • Findings: 无新增。F1(task_update 拒绝 # 前缀、未用 normalizeTaskId)、F2(报错路径描述仍展示过滤值)、Corr(PR 描述过期)均复测为 stands
  • 未覆盖范围: 全量套件未重跑(输入闭包证明相同,分离性质以 32/32 + 71/71 现场复验);逐 commit 归因(depth-2 shallow,6 个 commit 仅 1 个可达);TUI/E2E(纯参数归一化);Windows/macOS。

Previous-finding status (follow-up round)

# finding severity status at head 3e058acc (re-measured)
F1 task_update rejects #-prefixed IDs that task_list now accepts low (pre-existing, declared follow-up) stands — fresh grep at this head: grep -c normalizeTaskId src/tools/task-update.ts0; the file imports assertValidTaskId (line 35) and feeds raw taskId/dependency ids into it at lines 217/219/222 — the same lines round 4 cited. Still loud (explicit Invalid task ID error), not a PR regression; the commit message declares the alignment a follow-up.
F2 on error paths getDescription() still advertises the rejected filter note stands — re-observed in this round's fresh A/B run: head C8 prints desc "List tasks (blockedBy=#)" while execute() errors Cannot filter by blockedBy…; C9 (owner=!!!) and C10 (blockedBy=task-1) descs are byte-identical across both arms (logs/ab-head.txt, logs/ab-base.txt). Pre-existing shape (base C2 desc advertises the rejected owner= too), not introduced or worsened by the PR.
Corr PR body describes the first commit, not the final code description staleness stands — re-measured at this head: body still says "non-blank blockedBy values are passed through unchanged" (final code normalizes via normalizeTaskId and fails closed — cells C7/C8/C10/C12), still "all 14 tests pass" / "4 failed | 10 passed (14)" (the file now has 15 tests and R1 reds 6, not 4), still "54/54" for the store suite (now 56 — this round's gate run: ✓ src/agents/team/tasks.test.ts (56 tests)). No code change requested; the body should be updated before merge.

No new findings this round.

Central claim

Blank (empty/whitespace-only) values for the optional owner and blockedBy parameters of task_list behave as absent filters (no error, full board), while non-blank junk keeps failing closed and valid filters keep filtering exactly. Secondary claims: (a) the store-level listTasks() !== undefined activation contract is untouched, so other callers are unaffected; (b) the new tests are load-bearing (red against the unfixed source, per-guard).

A/B load-bearing proof

Harness: ab-harness.mjs — mock-free w.r.t. the unit under test; imports each tree's compiled dist/ by file URL, drives the real TaskListTool against a real on-disk task store via the QWEN_HOME storage seam (fresh temp home per arm, set before import); the only stub is the Config object (the two methods the tool reads: getTeamContext, getTeamManager). Board: 6 real tasks created through the real store (createTask/updateTask; Blocked blockedBy the Blocker's id 1). Base side: git worktree add tmp/base-tree HEAD^1 (= 3aa1b146), packages/core rebuilt inside the worktree (node ../../scripts/build_package.js, logs/base-build.txt), root and nested node_modules symlinked — the nested one holds 11 third-party packages and 0 @qwen-code/*, and the PR leaves package.json/lockfile untouched, so the control is clean. Control checks (printed in the witness): base dist contains 0 occurrences of normalizeTaskId (head dist: 3), and realpathSync of each arm's dist entry resolves inside that arm's tree. Witness: evidence/01-ab-base-vs-head.png (live capture run of both arms, command exit 0). Raw logs: logs/ab-base.txt, logs/ab-head.txt.

cell params base (3aa1b146) head (3e058acc) expectation met
C1 owner: '' error "owner must include…" no error, all 6 both
C2 owner: ' ' error + desc List tasks (owner= ) no error, all 6, desc "List all tasks" both
C3 blockedBy: '' silent "No tasks found." (6 tasks exist) no error, all 6 both
C4 blockedBy: ' ' silent "No tasks found." + desc advertises filter no error, all 6, desc "List all tasks" both
C5 {} (control) all 6 all 6 both
C6 blockedBy: '1' only Blocked only Blocked both
C7 blockedBy: ' #1 ' silent "No tasks found." only Blocked (#+trim normalized) both
C8 blockedBy: '#' silent "No tasks found." explicit error "Cannot filter by blockedBy…" (desc still blockedBy=# — F2) both
C9 owner: '!!!' error "owner must include…" same error (preserved) both
C10 blockedBy: 'task-1' silent "No tasks found." explicit Invalid task ID "task-1" error both
C11 owner: 'Alice' only Owned (sanitized match) same both
C12 blockedBy: '##1' silent "No tasks found." explicit Invalid task ID "#1" error both

Base 94/94, head 82/82 scripted checks passed (12 tool cells with per-check expectations including desc observations + 4 store cells + 4 type-boundary probes + 2 control checks per arm). The four issue shapes (C1–C4) flip broken→fixed; the silent-never-match family (C7, C8, C10, C12) flips silent→correct-or-explicit; every preserved-behavior control (C5, C6, C9, C11) is identical across arms.

Store-contract cells (identical expectations on both arms, all pass): listTasks(team, {blockedBy: ''}) → 0 (the !== undefined activation contract is unchanged — this is what made the bug possible, and the PR deliberately leaves it alone); listTasks(team, {}) → 6; listTasks(team, {blockedBy: '1'}) → 1 (Blocked); listTasks(team, {owner: 'alice'}) → 1 (Owned).

Type-boundary probes (both arms, identical outcomes): status: '' rejected at build() by the schema enum; owner: null rejected ("must be string"); blockedBy: 123 and owner: 456 pass the schema via the pre-existing fixStringValues number→string coercion and execute() never crashes on them (matches nothing → "No tasks found.").

Mutation matrix (vacuity + per-guard pinning, re-run at this head)

Runner: mutation-matrix.mjs in a scratch worktree (tmp/mut-tree) at the merge commit, dist built once from unmutated sources to satisfy the vitest globalSetup guard (logs/mut-tree-build.txt); vitest runs the two affected suites from src directly (relative-only import closures, so the mutations are what the tests load). Mutations are exact string replacements, each occurrence-count-guarded; files git-restored between rows; results parsed from vitest's JSON reporter (logs/mut-R*.json). Ran live twice this round (tee'd run + capture run) — both 7/7. Witness: evidence/02-mutation-matrix.png. Raw: logs/mutation-matrix.txt.

row mutation expected red observed red result
R0 none (control) 0 0 (71/71 green) PASS
R1 task-list.ts reverted to base (whole file) the 6 new behavioral tests exactly those 6 PASS
R2 drop bare-# fail-closed branch rejects a non-blank blockedBy… exactly that 1 PASS
R3 revert owner blank guard the 2 blank-owner tests exactly those 2 PASS
R4 blockedBy guard set reverted together (raw value forwarded to store — combination row) 2 blank-blockedBy + still filters + rejects exactly those 4 PASS
R5 normalizeTaskId → no-op (return raw) 2 normalizeTaskId tests + still filters + rejects exactly those 4 PASS
R6 positive control: 'No tasks found.''Nothing here.' pre-existing returns empty when no tasks exist exactly that 1 PASS

R1's reds fail with the behavioral mismatches the tests exist to catch — expected 'No tasks found.' to contain 'Task A' (blank blockedBy silent-empty), expected { Object (message) } to be undefined (blank owner error), expected 'No tasks found.' to contain 'Blocked' (#id form not normalized), expected undefined to be defined (bare # must error) — not import/setup breakage. Every guard the PR introduces is pinned by its own test; R4 shows the layered blockedBy guard set is load-bearing as a set (reverting either half alone is covered by R2/R3); R6 landed in the same file as the mutated code and turned exactly one test red, so the harness is proven able to fail. No survivors needed classification.

Targeted gates (re-run at this head)

  • vitest run src/tools/task-list.test.ts src/agents/team/tasks.test.ts in packages/core: 71/71 passed (15 + 56; logs/gate-two-suites.txt).
  • npm run typecheck (tsc --noEmit) in packages/core: exit 0 (logs/typecheck.txt).
  • eslint on the four changed files: clean, exit 0 (logs/eslint.txt); liveness control: a planted unused variable in a scratch file was reported (1 problem (1 error), @typescript-eslint/no-unused-vars, logs/eslint-liveness.txt) before the probe was removed.
  • prettier --check on the four changed files: clean (logs/prettier.txt).

Full-suite attribution (carried over on a proven-identical input closure; separation re-checked fresh)

Round 2 ran the full packages/core suite and attributed 0 failures to the PR via a batched A/A across both arms. That measurement's input closure is the entire merged tree, which is proven identical this round — this is the shortcut's strongest form, not a file-hash argument: HEAD^1 (3aa1b146) and HEAD^2 (3e058acc) are byte-identical OIDs to rounds 2–4, a conflict-free merge of identical trees is tree-identical, and the effective-diff sha256 (212131f0…530aeb) matches rounds 3–4. What was compared: the two parent OIDs, the PR-head OID, and the effective-diff sha256.

The separation property was re-established fresh at this head in contrapositive form: the complete set of test files importing either changed module is exactly five — agents/team/tasks.test.ts, tools/task-list.test.ts (the PR's own, green in the gate above), tools/task-create.test.ts, tools/task-update.test.ts, tools/team-lifecycle.test.ts — and the three non-PR importers run green at this head: 3 files, 32/32 passed (logs/separation-check.txt). Any test that touches the PR's modules passes; therefore no failing test elsewhere can be caused by them.

Corrections

  • PR body staleness (carried, still uncorrected): the description says "non-blank blockedBy values are passed through unchanged" — the final code normalizes them (normalizeTaskId) and fails closed on junk (C7–C12). It cites "all 14 tests pass" / "4 failed | 10 passed (14)" — the file now has 15 tests with 6 new behavioral ones (R1 reds 6, not 4), and the store suite is 56, not 54. This is a description correction, not a code change request.

Findings

None new this round. Carried F1/F2/Corr all stand (see status table).

Not covered

  • Full packages/core suite re-run: carried over on the proven-identical input closure above, with the separation property re-established fresh (contrapositive: all five importers of the changed modules green — 32/32 + 71/71). Load-dependent per-run failure counts may differ between runs; the attribution property was what was carried.
  • Per-commit attribution: checkout is depth-2 (git rev-parse --is-shallow-repository → true); git rev-list HEAD^1..HEAD^2 yields 1 commit while the metadata carries 6 — intermediate commits unreachable. Only the aggregate HEAD^1..HEAD diff was verified; the aggregate is what lands.
  • TUI/E2E session: not run — pure parameter normalization, no rendering path touched; the A/B harness drives the compiled tool end-to-end (real schema validation at build(), real on-disk store) instead.
  • Other listTasks() callers: verified via the store-level A/B cells (contract unchanged on both arms) and the 32/32 separation run, not by executing every caller's full flow.
  • Other tools with optional filters: out of scope per the PR's own scope statement; not swept.
  • Windows/macOS: Linux only.
  • Flakiness gate (5 identical rounds over changed test files): owned by the workflow lane; this round's repeated live runs (gate, matrix ×2, A/B ×2 per arm incl. the capture runs) were green with no divergence observed.

Methodology

Environment: CI verify container (node v22.23.2), merge-ref checkout at depth 2, npm ci + npm run build pre-run at head. Base side: git worktree add tmp/base-tree HEAD^1 (3aa1b146), packages/core rebuilt inside the worktree; root and nested node_modules symlinked (third-party only — packages/core/node_modules holds 11 packages, 0 @qwen-code/*; lockfile untouched, so the control is clean). The A/B harness imports dist files by file URL, so no workspace symlink is crossed at runtime; each arm asserted its dist realpath resolves inside its own tree and the base dist asserted zero normalizeTaskId occurrences. Mutation runs used a second scratch worktree (tmp/mut-tree) at the merge commit with dist built once from unmutated sources (vitest globalSetup guard requirement); vitest transforms src directly and the two test files' import closures are relative-only, so mutations are what the tests load. Both scratch worktrees were removed after the cells and matrix were captured; vitest byproducts (junit.xml, coverage/) deleted; git status clean at end. Assertion tally: 94 (base arm) + 82 (head arm) + 7 (matrix rows) + 5 (gate checks: two suites, typecheck, eslint, eslint-liveness, prettier) + 1 (separation check) = 189, all passed; expected base-arm failures were encoded as expectations, so fail counts unexpected outcomes only. Raw logs: logs/ (ab-base.txt, ab-head.txt, base-build.txt, mut-tree-build.txt, mutation-matrix.txt, mut-R0…R6.json, gate-two-suites.txt, typecheck.txt, eslint.txt, eslint-liveness.txt, prettier.txt, separation-check.txt). Harnesses: ab-harness.mjs, ab-run.sh, mutation-matrix.mjs. Evidence: evidence/01-ab-base-vs-head.png, evidence/02-mutation-matrix.png.

Flakiness gate log

rounds=5 files=2 skipped=0
file packages/core/src/agents/team/tasks.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/team/tasks.test.ts
file packages/core/src/tools/task-list.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/task-list.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/agents/team/tasks.test.ts: PPPPP
  packages/core/src/tools/task-list.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 1 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 2 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 2 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 3 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 3 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 4 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 4 · packages/core/src/tools/task-list.test.ts: P (exit 0)
round 5 · packages/core/src/agents/team/tasks.test.ts: P (exit 0)
round 5 · packages/core/src/tools/task-list.test.ts: P (exit 0)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

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

Qwen Code · sandboxed verification

@wenshao

wenshao commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification — real-CLI A/B at head 3e058ac

I built a local verification environment and ran this PR through the real qwen CLI, not just the unit suite. Verdict up front: the fix is correct and merge-ready — please refresh the PR description before merging, because it describes the first commit, not the code that is actually shipping.

Setup

  • Worktrees at merge-base 3aa1b14 and PR head 3e058ac; full core + cli build from the PR worktree; run as node packages/cli -p … --auth-type openai --approval-mode yolo --output-format json.
  • The model is a scripted mock OpenAI provider, so every task_list argument shape is emitted deterministically and the tool result the model receives is captured verbatim from the provider transcript.
  • Real team runtime: QWEN_CODE_ENABLE_AGENT_TEAM=1, isolated QWEN_HOME per arm, real on-disk task board built through the real tools — team_create → 3 × task_createtask_update(#2, addBlockedBy:["1"]).
  • The two arms differ only by swapping the two compiled files the PR touches (dist/src/agents/team/tasks.js, dist/src/tools/task-list.js). Same toolchain, same node_modules, same board.

This is one level above the sandboxed rounds already on this PR: those drove TaskListTool directly, this goes through the real tool registry, schema validation and model→provider→tool loop. Same conclusion, reached independently.

1. The bug reproduces and is fixed at the real tool boundary

real-CLI A/B

All four reproduction shapes from #9281 fail on the base arm and are correct on the PR arm, with the controls unmoved:

call before (3aa1b14) after (3e058ac)
task_list({}) full board full board (unchanged)
task_list({ blockedBy: "" }) No tasks found. ✅ full board
task_list({ blockedBy: "␣␣␣" }) No tasks found. ✅ full board
task_list({ owner: "" }) Cannot filter by owner: … ✅ full board
task_list({ owner: "␣␣␣" }) Cannot filter by owner: … ✅ full board
task_list({ blockedBy: "1" }) #2 only #2 only (unchanged)
task_list({ owner: "!!!" }) explicit error explicit error (guard kept)

The display layer moved with it: at base, getDescription() for {owner:"␣␣␣"} rendered List tasks (owner= ) — advertising a filter the same call then rejected. At head it renders List all tasks, matching what actually happens.

2. The new tests are load-bearing

tests + residual asymmetry

Checking out only the PR's two test files onto the merge-base source: Tests 8 failed | 63 passed (71) — 6 in task-list.test.ts, 2 in tasks.test.ts. At PR head: 71 passed (71). Every new assertion is red without the source change.

3. No collateral

  • npx vitest run src/agents/team src/tools in packages/core at head: 108 files / 3585 tests, all pass.
  • eslint + prettier --check clean on all four changed files.
  • npm run typecheck: core and cli clean. The one red workspace, integrations/external-context-mem0, fails with identical errors at the merge-base — pre-existing and unrelated to this PR.
  • The store-level listTasks() activation contract is untouched, and the blockedBy filter has exactly one caller (task-list.ts), so no other consumer moves.
  • CI on this PR: 16 pass, 0 fail.

Findings

① The PR description is stale — please update before merge. (the only thing I'd block on, and it's prose, not code)

The body describes commit 67d9402 and predates 4ddc36d / c272661. Three concrete mismatches:

  • It says "non-blank blockedBy values are passed through unchanged". They are not: the final code runs normalizeTaskId() (trim + strip one leading #) and then assertValidTaskId(), so #1 now resolves to 1, and # / task-1 / 01 now return a tool error where they previously returned No tasks found.
  • Because of that, "Breaking changes / migration notes: none" understates the change: task_list can now surface an error on an input that previously produced an empty list. I think that behavior is the right call — failing closed and loudly beats a silent empty board, which is the same principle as the fix itself — but it should be stated.
  • The test counts are off: task-list.test.ts has 15 tests (not 14) with 6 reds at base (not 4), and tasks.test.ts has 56 (not 54), because the PR itself adds normalizeTaskId and its two tests.

② Follow-up, non-blocking: #N is now accepted by task_list only. Reproduced on the real CLI at head (bottom half of the second screenshot): task_update({taskId:"#1"}), task_update({addBlockedBy:["#1"]}) and task_update({taskId:"␣1␣"}) all still fail with Invalid task ID. Since task_list's own output renders IDs as #1, a model that copies the rendered form now succeeds in one tool and fails in its neighbours. normalizeTaskId is exported from the store layer with a doc comment about "callers", but has exactly one. The errors are loud and self-correcting, so this is a follow-up, not a merge blocker — the commit message already declares it as such.

③ Out of scope, FYI: task_list({ owner: null }) — a very common way for a model to serialize an absent optional, the same defect class as #9281 — is still rejected upstream with params/owner must be string. No change inside the tool can reach that; it would need a schema change. Worth a separate issue rather than growing this PR.

Verdict

Approve. The fix is minimal, correct at the real tool boundary, tested with load-bearing regression tests, and clean on lint/typecheck/suite. Merge once the description is refreshed to match the shipped code; findings ② and ③ are follow-ups.

中文完整版

维护者验证 —— 在 head 3e058ac 上的真实 CLI A/B

我在本地搭建了验证环境,用真实 qwen CLI 跑通了这个 PR,而不只是跑单测。结论先行:修复正确、可以合入 —— 但请在合入前更新 PR 描述,因为它描述的是第一个 commit,而不是实际要发布的代码。

环境

  • 在 merge-base 3aa1b14 与 PR head 3e058ac 各建 worktree;从 PR worktree 完整构建 core + cli;以 node packages/cli -p … --auth-type openai --approval-mode yolo --output-format json 运行。
  • 模型侧是脚本化的 mock OpenAI provider,因此每一种 task_list 参数形态都是确定性发出的,模型收到的工具返回直接从 provider 传输记录中逐字提取。
  • 真实 team 运行时:QWEN_CODE_ENABLE_AGENT_TEAM=1、每臂独立 QWEN_HOME、通过真实工具建出真实的磁盘任务板 —— team_create → 3 × task_createtask_update(#2, addBlockedBy:["1"])
  • 两臂替换 PR 触及的两个编译产物(dist/src/agents/team/tasks.jsdist/src/tools/task-list.js)。工具链、node_modules、任务板完全相同。

这比本 PR 上已有的沙箱轮次高一层:那些直接驱动 TaskListTool,而这次走的是真实工具注册表、schema 校验以及 模型→provider→工具 的完整回路。结论一致,但是独立得到的。

1. 缺陷在真实工具边界上复现,并被修复

#9281 的四种复现形态在 base 臂全部失败、在 PR 臂全部正确,且对照组不动:

调用 修复前(3aa1b14 修复后(3e058ac
task_list({}) 完整任务板 完整任务板(不变)
task_list({ blockedBy: "" }) No tasks found. ✅ 完整任务板
task_list({ blockedBy: "␣␣␣" }) No tasks found. ✅ 完整任务板
task_list({ owner: "" }) Cannot filter by owner: … ✅ 完整任务板
task_list({ owner: "␣␣␣" }) Cannot filter by owner: … ✅ 完整任务板
task_list({ blockedBy: "1" }) #2 #2(不变)
task_list({ owner: "!!!" }) 显式报错 显式报错(守卫保留)

展示层也跟着一起修好了:base 上 {owner:"␣␣␣"}getDescription() 渲染为 List tasks (owner= ) —— 宣告了一个同一次调用随后又拒绝掉的过滤器。head 上渲染为 List all tasks,与实际行为一致。

2. 新增测试确实承重

只把 PR 的两个测试文件签出到 merge-base 源码上:Tests 8 failed | 63 passed (71) —— task-list.test.ts 6 条、tasks.test.ts 2 条。在 PR head 上:71 passed (71)。没有源码改动时,每一条新断言都是红的。

3. 无附带影响

  • head 上 packages/core 执行 npx vitest run src/agents/team src/tools108 个文件 / 3585 条测试全绿
  • 四个改动文件的 eslintprettier --check 均干净。
  • npm run typecheckcorecli 干净。唯一飘红的 workspace integrations/external-context-mem0 在 merge-base 上报完全相同的错误 —— 属于既存问题,与本 PR 无关。
  • 存储层 listTasks() 的激活契约未改动,且 blockedBy 过滤器只有一个调用方(task-list.ts),因此没有其他消费者受影响。
  • 本 PR 的 CI:16 通过,0 失败。

结论清单

① PR 描述已过期 —— 请在合入前更新。(唯一需要卡的点,而且只是文字,不是代码)

描述对应的是 commit 67d9402,早于 4ddc36d / c272661。三处具体不符:

  • 描述称 "非空 blockedBy 值原样透传"。实际并非如此:最终代码会执行 normalizeTaskId()(trim + 去掉一个前导 #),再执行 assertValidTaskId(),因此 #1 现在会解析为 1,而 # / task-1 / 01 现在会返回工具错误,而此前返回的是 No tasks found.
  • 因此,"破坏性变更 / 迁移说明:无" 低估了这次变化:task_list 现在会对此前只返回空列表的输入抛出错误。我认为这个行为是对的 —— 快速且显式地失败胜过静默的空任务板,这与修复本身的原则一致 —— 但应当写明。
  • 测试数量对不上:task-list.test.ts 现在是 15 条(不是 14),base 上红 6 条(不是 4);tasks.test.ts56 条(不是 54),因为 PR 自己新增了 normalizeTaskId 及其两条测试。

② 后续项,不阻塞:#N 目前只有 task_list 接受。 已在 head 的真实 CLI 上复现(第二张截图下半部分):task_update({taskId:"#1"})task_update({addBlockedBy:["#1"]})task_update({taskId:"␣1␣"}) 仍然以 Invalid task ID 失败。由于 task_list 自身的输出就把 ID 渲染成 #1,模型照抄这个展示形态时,会出现"在一个工具里成功、在相邻工具里失败"的割裂。normalizeTaskId 从存储层导出、注释里写着"callers",但实际只有一个调用方。报错足够响亮且模型可自纠,所以这是后续项而非合入阻塞 —— commit message 里也已声明为 follow-up。

③ 范围外,供参考: task_list({ owner: null }) —— 模型序列化"缺省可选参数"时非常常见的一种写法,与 #9281 属于同一缺陷类 —— 仍会在上游被 params/owner must be string 拒绝。这一点在工具内部无法修复,需要改 schema。建议另开 issue,而不是把本 PR 撑大。

判定

Approve。 修复足够小、在真实工具边界上正确、有承重的回归测试,lint / typecheck / 测试套件均干净。把描述更新到与实际代码一致后即可合入;② 和 ③ 作为后续项处理。

@wenshao
wenshao added this pull request to the merge queue Aug 31, 2026
Merged via the queue into main with commit 2f2e953 Aug 31, 2026
97 of 99 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.

task_list treats blank optional filters as active filters

4 participants