Skip to content

feat(triage): assign one accountable owner when a PR opens, and when deferring - #9813

Open
yiliang114 wants to merge 27 commits into
mainfrom
feat/auto-request-pr-reviewer
Open

feat(triage): assign one accountable owner when a PR opens, and when deferring#9813
yiliang114 wants to merge 27 commits into
mainfrom
feat/auto-request-pr-reviewer

Conversation

@yiliang114

@yiliang114 yiliang114 commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

Motivation / 动机

Today, when a PR needs a human maintainer (e.g. a fork PR hitting the approval guardrail), the triage bot only @mentions someone — easily lost in notification noise, and nobody's Assigned filter ever shows the PR. Worse, assignment only happens in the "AI is unsure" fallback path, so most PRs that touch core areas never get an accountable owner at all.

目前 triage bot 在需要人工介入时只会 @mention,容易淹没在通知里,且没有任何人的 Assigned 过滤器会显示该 PR。更关键的是,assign 只发生在"AI 无法判断"的兜底路径,绝大多数触碰核心领域的 PR 从头到尾都没有一位责任人。

Changes / 改动

Two halves, one goal: every PR touching a mapped area ends up with exactly one accountable owner.

两部分改动,同一个目标:每个触碰已映射领域的 PR 都恰好有一位责任人。

1. Assign on open (the main path) — a new Assign PR owner workflow runs on pull_request_target (fork PRs covered; checkout stays on the trusted base ref). Routing is a pure function of the PR's changed file paths and .github/issue-owners.json (new optional paths field per area, first match wins) — no model runs and the script never reads PR title/body/comments, so untrusted PR text cannot steer who gets assigned. The pick reuses the exact load metric and rotation of issue assignment (shared with the existing issue-assignment script), re-verifies push access at write time, and no-ops once a mapped owner is already assigned or has reviewed, so repeated pushes never stack assignments.

1. PR 打开时即分配(主路径) — 新增 Assign PR owner workflow,触发于 pull_request_target(覆盖 fork PR;checkout 固定在可信 base ref)。路由是"PR 改动文件路径 + .github/issue-owners.json(新增可选 paths 字段,首匹配生效)"的纯函数——不跑模型、脚本从不读取 PR 标题/正文/评论,不可信的 PR 内容无法操纵分配结果。选人复用 issue 分配完全相同的负载口径与编号轮转(与现有 issue 分配脚本共用同一套选人逻辑),写入前复核 push 权限,且一旦某位映射 owner 已是 assignee 或已 review 即 no-op,反复 push 不会叠加分配。

2. Assign on defer (the fallback) — when the triage bot defers a PR to a human, it now resolves one maintainer deterministically (env override → owner map by labels → most recent human reviewer) and assigns the PR, instead of only mentioning.

2. defer 时分配(兜底路径) — triage bot 将 PR 移交给人类时,现在会确定性地解析一位 maintainer(环境变量 → 按 label 查 owner 地图 → 最近人类 reviewer)并 assign,而不是仅仅 mention。

Currently only the core area declares paths (packages/core/); other areas can opt in by adding a paths list — issue assignment ignores it.

目前只有 core 领域声明了 pathspackages/core/);其他领域加一个 paths 列表即可启用,issue 分配不受该字段影响。

3. Module-level routing — the longest matching path prefix wins, so a PR goes to the owner of the specific module it touches, not the whole-area pool. It only falls back to the area pool when no module claims the change, or the module owner authored the PR / lacks push access. The initial core module map was drafted from the last six months of per-directory commit history and is meant to be corrected in review.

3. 模块级路由 — 最长路径前缀优先:PR 分配给它实际触碰的那个模块的负责人,而不是整个领域的大池子。只有在没有任何模块认领该改动、或模块负责人就是 PR 作者/没有 push 权限时,才回落到领域池。初始的 core 模块映射由最近半年的分目录提交记录起草,请在 review 中校正。

How to verify / 验证方式

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@yiliang114 yiliang114 changed the title feat(ci): request an area reviewer on PRs by changed-file paths feat(ci): route PR reviews to area owners and refresh the owner pool Aug 23, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run at a44cc5a1 — two things changed since the last gate pass: the branch took in main (clearing the conflict that blocked the last run), and a fix commit landed answering the two routing blockers from @chiga0's human review. The gate re-evaluates the current shape.

Template: the body uses the headings it was opened with (Motivation / Changes / How to verify); main's template has since been renamed to What this PR does / Why it's needed / Reviewer Test Plan. Everything the current template asks for is present in substance — what, why, and a verify plan with the dry-run command and expected results — so on a PR three days and ten review rounds deep this is a hygiene note, not a gate failure.

Problem: real and observed, unchanged from earlier passes. Core-touching PRs fan review requests out to all five CODEOWNERS and nobody ends up specifically accountable; the defer fallback only @mentions, so nothing lands in anyone's Assigned filter. This revision attacks both halves — an owner assigned at open, and an owner assigned, not merely mentioned, when the triage bot defers.

Direction: aligned. Complements CODEOWNERS instead of replacing it, routes off the same reviewed owner map and load/rotation logic as issue assignment, and is a continuation of already-merged assignment work by a maintainer.

Size: no core-package paths — everything sits in .github/ automation and the triage skill doc. 389 production logic lines (288 script, 62 workflow, 37 issue-script delta, 2 ci.yml), 140 lines of config/doc (owner map 56, size baseline 3, skill doc 81), 657 test lines. Well under every threshold.

Approach: scope is right and unchanged; the only new code since the last gate is the two blocker fixes, both squarely inside the stated goal — no drive-bys. The standing non-blocking question from earlier rounds stays on the record: gh()/record()/canWrite() remain duplicated between the two assignment scripts (~40 lines) and could eventually be exported from the issue script.

Risk: no elevated risk signals — none of the changed files match the revert-correlated high-risk paths.

Moving on to code review. 🔍

中文说明

a44cc5a1 上重跑——上次门禁后有两处变化:分支合入了 main(清掉了上次阻塞的冲突),以及一个修复提交回应了 @chiga0 人工评审提出的两个路由阻断项。本次门禁重新评估当前形态。

模板:正文使用的是开 PR 时的旧标题(Motivation / Changes / How to verify);main 上的模板后来改名为 What this PR does / Why it's needed / Reviewer Test Plan。新模板要求的实质内容全部齐备——做了什么、为什么、以及含 dry-run 命令与预期结果的验证方案——因此对这样一个已评审十轮的三天老 PR,只作卫生提示,不作门禁拦截。

问题:真实且已观测,与早前结论一致。触碰 core 的 PR 会向全部 5 位 CODEOWNERS 扇出请求而没有明确责任人;defer 兜底只做 @mention,不会出现在任何人的 Assigned 过滤器里。本版本同时解决两半:打开时分配、defer 时分配(而非仅 mention)。

方向:对齐。补充而非替换 CODEOWNERS,复用同一份受评审的 owner 地图与负载/轮转逻辑,是 maintainer 已合入分配工作的延续。

规模:未触及核心包路径——全部在 .github/ 自动化与 triage skill 文档。389 行生产逻辑(脚本 288、workflow 62、issue 脚本增量 37、ci.yml 2),140 行配置/文档(地图 56、基线 3、skill 文档 81),657 行测试。远低于各阈值。

方案:范围合理且未变;上次门禁后新增的代码只有两个阻断项修复,都在既定目标之内,无夹带。早前各轮留下的非阻断问题继续记录在案:两个分配脚本间仍重复 gh()/record()/canWrite()(约 40 行),最终可从 issue 脚本导出。

风险:无升级风险信号——变更文件均未命中与高 revert 率相关的路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review — at the post-fix head

The shape is unchanged since the last full pass except for the merge of main and one fix commit, fix(triage): keep PR owner routing current, which answers the two blockers @chiga0 raised on the previous head. My independent proposal for this problem (paths field on the reviewed owner map, pull_request_target pinned to the trusted base, structured-data-only reads, longest-prefix match, least-loaded pick with rotation, pre-write re-check, idempotent no-op) still matches the implementation.

Both human-review blockers are fixed as prescribed, and pinned by tests.

  • Renamed-file sources invisible to the router — the files query now emits both filename and previous_filename per entry (each base64, so the newline-forging defence still holds), and a new test moves a file out of packages/core/ and asserts the core owner is still assigned; the stub log also pins that the query actually asks for the field.
  • Pre-write re-fetch not comparing the head — both fetches now carry headRefOid, and the write is skipped with a clean reason when the head moved during routing; the test pins that both fetches ask for the field, no pr edit happens, and the skip message lands. The residual window shrinks to the gap between the final re-fetch and the write — inherent to a non-transactional API flow, and exactly the fix the reviewer prescribed (skip, and let the queued run for the newer push take over).

Re-verified by reading at this head, beyond the findings ledger:

  • The trust model holds: checkout pinned to pull_request.base.sha via SHA-pinned actions/checkout v6.0.3, persist-credentials: false, sparse checkout lists both scripts (the entry script statically imports the issue script — dropping it would fail only after the bootstrap guard passed), GH_TOKEN step-scoped, pull-requests: write job-scoped, and the script still reads only structured fields — never title/body/comments.
  • The defer resolver heredoc in the skill doc imports matchArea, loadPolicy, openIssueCount, pickOwner — all four are exported by the issue script at this head (checked in the worktree), so the doc cannot drift from the module silently.
  • The size baseline is exact against the merged tree: assign-pr-owner.yml is 2125 bytes and the re-measured ci.yml is 79063 — both match the ratchet entries.
  • The review job's round 10 posted zero findings at this exact SHA. Its disclosed gaps (reverse audit not converging within its round cap, actionlint's embedded-shell limitation on the two workflow files) and its six deferred probes are test-strength and tooling notes — I looked them over and none is a correctness defect in the current code.
  • The carried backlog from earlier rounds (transient permission lookup dropping a candidate for one run, COMMENTED reviews counting as coverage, defer-assign without a coverage check) stays recorded, not blocking.
Changed files (9 of 9)
File What changed
.github/issue-owners.json optional paths per area plus eight module areas under core, each with one owner
.github/scripts/assign-issue-owner.mjs prefix validation for paths entries, exports the issue counter for reuse
.github/scripts/assign-issue-owner.test.mjs fixtures for every never-matching prefix shape
.github/scripts/assign-pr-owner.mjs the routing script: match, cover-check, head and permission re-check, assign
.github/scripts/assign-pr-owner.test.mjs 620-line guard suite: routing, apply boundary, filename forging, workflow invariants
.github/workflows/.size-baseline ratchet entries re-measured after the main merge
.github/workflows/assign-pr-owner.yml pull_request_target workflow, trusted-base sparse checkout, bootstrap guard
.github/workflows/ci.yml registers the new test file in HELPER_TESTS
.qwen/skills/triage/references/pr-workflow.md defer path resolves and assigns one maintainer deterministically

Testing evidence — this PR's own CI at the reviewed commit (not re-run here)

Per gate rules I did not build or run PR code. Every check the head's CI runs finished — zero failures, zero pending. The previously red Test (ubuntu-latest, Node 22.x) is green at this exact head (~28 min, run 32953606574).

Check Conclusion
Classify PR success
Test (ubuntu-latest, Node 22.x) success
Test (macos-latest, Node 22.x) skipped (CI profile)
Test (windows-latest, Node 22.x) skipped (CI profile)
Integration Tests (CLI, No Sandbox) skipped (CI profile)
build-cli skipped (CI profile)
web-shell E2E Smoke (ubuntu-latest, Node 22.x) success
Desktop Shell (ubuntu-22.04) success
Desktop Shell (windows-2022) success
Dependency CVE audit success
Secret scan (TruffleHog) success
Post Coverage Comment (ubuntu-latest, 22.x) success
Remind on force-push success

The skips are profile decisions this PR did not author: main's own #10059 moved the macOS/Windows lanes off pull requests, and the platform-sensitivity classifier skips platform lanes and build-cli for a .github/-only change. The new Assign PR owner workflow surfaces no check on this PR by design — it doesn't exist on the base yet; its first real run is the first PR opened after merge.

Sandboxed verification would settle the one gap CI cannot — and it is already in flight: the /verify sub-job of this triage trigger (run 32969599155) is running now and will post its own report. It exercises the live end-to-end assignment flow (match → fallback chain → write → idempotent skip) against the real API, which the stub-driven guard suite cannot. The last full A/B on the 46eb927 shape passed 72/72; both nits from it are fixed.

Real-scenario testing: N/A — unattended run, and this PR has no CLI/TUI surface (GitHub workflow automation only).

中文说明

代码审查 —— 修复后 head

自上次完整审查以来形态未变,仅合入 main 并新增一个修复提交,回应 @chiga0 在上个 head 提出的两个阻断项。我的独立方案仍与实现一致。

两个人工评审阻断项均按处方修复并有测试钉死:改名文件的源路径现在与目标路径一并逐条 base64 输出(换行伪造防御保持有效),新测试把文件移出 packages/core/ 并断言仍分配 core owner,桩日志同时钉死查询确实索取了该字段;写前重取现包含 headRefOid,head 在路由期间变化时给出干净的跳过理由,测试钉死两次取字段、无 pr edit、跳过文案落地。残余窗口收敛到最后一次重取与写入之间——非事务 API 流程的固有窗口,也正是评审者处方(跳过,让新 push 的排队运行接管)。

另行复读核实:信任模型成立(base.sha 检出、SHA 钉死的 checkout、凭据不落地、稀疏清单含两个脚本、token 步骤级、脚本从不读 PR 文本);skill 文档 defer heredoc 导入的四个符号在 issue 脚本中均已导出,文档不会与模块静默漂移;基线字节数与合并后实测精确一致(2125 / 79063);review job 第 10 轮在此 SHA 零发现,其披露的缺口(反审未收敛、actionlint 限制)与六条延后探针均为测试强度/工具备注,逐条看过,均非现行代码的正确性缺陷;早前各轮的遗留条目维持"已记录、不阻断"。

测试证据 —— 本 PR 自身 CI(未在此重跑)

按门禁规则未构建或运行 PR 代码。本 head 的 CI 全部完成:零失败、零挂起。此前红掉的 Test (ubuntu-latest, Node 22.x) 在本 head 转绿(约 28 分钟,run 32953606574)。跳过项均为 CI 配置判定:main 自身的 #10059 将 macOS/Windows 车道移出 PR,平台敏感度分类器对纯 .github/ 变更跳过平台车道与 build-cli。新 Assign PR owner workflow 按设计不出现在本 PR——base 上尚无此文件,首次真实运行在合入后的第一个 PR。

沙箱验证可补齐 CI 补不上的唯一缺口——且已在途:本次触发的 /verify 子作业(run 32969599155)正在运行,将单独发布报告,对真实 API 走一遍端到端分配流程;上一次完整 A/B(46eb927 形态)72/72 通过,两个 nit 均已修复。

真实场景测试:N/A——无人值守运行,且本 PR 无 CLI/TUI 界面。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the two blockers from the human review are fixed exactly as prescribed and pinned by tests, the review job posted zero findings at this SHA, CI is fully green at the exact head, and the conflict that blocked the last run is gone; what keeps this from a 5 is the residual non-transactional write window and the fact that @chiga0 hasn't re-confirmed the fixes yet.

Stepping back: my independent proposal for this problem is what landed — path-prefix routing over the reviewed owner map, least-loaded pick with PR-number rotation, one owner per PR, permission and coverage re-checked at write time, defer path assigning instead of mentioning. Every file in the diff serves that one goal. Ten rounds plus a human review shook out the hard parts (null-author shapes, filename forging, the snapshot-to-write window, bootstrap on a base without the script, renamed-file sources, mid-run head changes), and each is defended with a test now. The two things that made the last run defer — merge conflict and a red CI — are both resolved: the branch is MERGEABLE, and the head's CI finished with zero failures, including the ubuntu suite that was red before. The only new code since then is the blocker fix, which I checked line by line against the reviewer's own prescription.

Approving, pinned to the reviewed commit. Two notes for the humans:

  1. @chiga0 — the two blockers you raised are addressed by a44cc5a1 (previous_filename captured; headRefOid compared pre-write), each with a dedicated test; a re-look from you is still the right final check on them.
  2. Housekeeping: this approval supersedes the bot's own standing CHANGES_REQUESTED reviews from earlier rounds — GitHub counts each reviewer's latest review, so the decision updates without any dismissal.

One caveat, plainly: the sandboxed /verify run triggered alongside this triage is still in flight and will post its own report; if it surfaces something this pass missed, treat it as grounds to revisit — the approval is pinned to this SHA, so any push dismisses it anyway.

中文说明

置信度:4/5 —— 人工评审的两个阻断项已按处方修复并有测试钉死,review job 在此 SHA 零发现,CI 在该 head 全绿,上次阻塞的合并冲突已消除;没给 5 是因为残余的非事务写入窗口,以及 @chiga0 尚未复核修复。

退一步看:我对该问题的独立设想与最终实现一致——基于受评审地图的路径前缀路由、负载最低+编号轮转、每 PR 一位 owner、写前复核权限与覆盖、defer 改为分配。diff 中每个文件都服务于同一目标。十轮评审加一次人工评审逼出了所有难点(null 作者形态、文件名伪造、快照到写入窗口、缺脚本 base 的引导、改名源路径、运行中 head 变化),且如今每项都有测试防御。上次移交的两个原因——合并冲突与红色 CI——均已解决:分支 MERGEABLE,本 head CI 零失败(含此前红掉的 ubuntu 套件)。此后唯一的新代码是阻断项修复,已逐行对照评审者处方核实。

批准,钉在所审提交上。给人类的两点说明:

  1. @chiga0——你提出的两个阻断项已由 a44cc5a1 处理(捕获 previous_filename;写前比对 headRefOid),各配专门测试;最终复核仍以你的再看为准。
  2. 事务性说明:本批准取代 bot 自己早前各轮的 CHANGES_REQUESTED——GitHub 只计每位评审者的最新评审,决定状态无需 dismiss 即会更新。

一点坦白的保留:随本次触发的沙箱 /verify 仍在途、将单独发布报告;若它发现本审查遗漏的问题,应据此重审——批准钉在本 SHA,任何推送都会使其作废。

Qwen Code · qwen3.8-max

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

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

Three findings to address before this can land — the coverage check makes the routing a no-op on every core PR (CODEOWNERS auto-requests already occupy the pool), CI is red on the missing workflow size-baseline entry, and the new guard suite isn't wired into HELPER_TESTS. Details in my notes above. 🙏

@yiliang114 yiliang114 closed this Aug 23, 2026
@yiliang114
yiliang114 deleted the feat/auto-request-pr-reviewer branch August 23, 2026 15:31
@yiliang114
yiliang114 restored the feat/auto-request-pr-reviewer branch August 23, 2026 15:34
@yiliang114 yiliang114 reopened this Aug 23, 2026
@yiliang114
yiliang114 force-pushed the feat/auto-request-pr-reviewer branch from b58d991 to bafef3e Compare August 23, 2026 15:34
@github-actions

Copy link
Copy Markdown
Contributor

Please do not rebase or force-push to an active PR as it invalidates existing review comments. Note for future reference, the bots always squash all changes into a single commit automatically as part of the integration.

中文

请勿对活跃的 PR 执行 rebase 或 force-push,因为这会使已有的评审评论失效。另外,供日后参考:作为集成流程的一部分,机器人始终会自动将所有改动压缩(squash)为单个提交。

@yiliang114 yiliang114 changed the title feat(ci): route PR reviews to area owners and refresh the owner pool feat(ci): request an area reviewer on PRs by changed-file paths Aug 23, 2026

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/assign-pr-reviewer.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/assign-pr-reviewer.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment thread .github/scripts/assign-pr-reviewer.mjs
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.test.mjs Outdated
Comment thread .github/scripts/assign-issue-owner.mjs Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.test.mjs Outdated
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout — cap-4 round on the four Criticals of the 18:36Z review, pushed bafef3e00e..c716758550 (one non-force push; the red ubuntu Test at the old head is addressed by R1-6 + the code fixes).

R1-1 — coverage no-op FIXED (8cd770a2fd). The script now parses .github/CODEOWNERS, translates the matching patterns for the changed paths, and excludes exactly those auto-requested owners from both the coverage pool (alreadyCovered) and the eligibility filter. Targeted requests now fire on top of CODEOWNERS auto-requests while idempotency still suppresses repeats from this routing itself. Live dry-run against an open core PR that CODEOWNERS already covers: previously alreadyCovered -> skip, now would request @<area-owner>.

R1-2 — missing token scope FIXED (250376bd10). Job permissions gain issues: 'read', matching what openIssueCount() (gh issue list) needs; the permissions deepEqual guard updated in the same change.

R1-3 — 100-file cap FIXED (24f822b16b). New changedFiles() sources the list from gh api repos/.../pulls/N/files --paginate (the suggested shape); both PR reads go through it, so area matching no longer silently truncates on large PRs.

R1-6 — size ratchet FIXED (c716758550). .github/workflows/.size-baseline gains 2444 assign-pr-reviewer.yml, re-measured after this round's yml edits (2271 -> 2444 with the issues scope + CODEOWNERS checkout line). check-workflow-size.sh exits 0.

Verification: node --test over assign-pr-reviewer.test.mjs + assign-issue-owner.test.mjs = 65 pass / 0 fail (34 in this PR's suite, incl. new coverage-exclusion / eligibility-exclusion / pagination regressions, each revert-checked); check-workflow-size.sh clean; vitest mirror workflow-size.test.js green.

The 7 Suggestions from this review round are deliberately deferred to a follow-up round (cap budget).

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout — round-1 cap (4 of the 7 standing Suggestions fixed, one non-force push c716758550..837b7defc7):

  • R1-12 (339de6f277): reopened added back to the pull_request types list — the workflow now re-runs on all three default activity types, matching ci.yml's bare trigger; the guard suite pins the types array so a future drop fails CI.
  • R1-5 (837b7defc7): assign-pr-reviewer.test.mjs registered in HELPER_TESTS (.github/workflows/ci.yml), so the guard suite runs in CI alongside the other .github/scripts node:test suites.
  • R1-7 (04fd5e4dd8): the routing job's checkout is pinned to ref: '${{ github.event.pull_request.base.sha || github.sha }}' — routing inputs (issue-owners.json, assign-issue-owner.mjs, the executed script) are fetched from the base branch, not the PR's merge ref.
  • R1-10 (1/2) (5222e73f8f): author-exclusion filter covered — new stub case where the PR author is the mapped, zero-load would-be pick asserts a different owner is requested and the author never is; deleting the filter makes the test fail (mutant confirmed: it would run pr edit … --add-reviewer <author>).

Verification: node --test over the touched helper suites (same invocation HELPER_TESTS uses) 66/66 green (guard suite 35/35 incl. the new case); mutation checks red-on-revert for both the filter test and the reopened pin; prettier clean. Cumulative diff = 3 files, +31/−2.

Deferred to a future cap round (unchanged, still open): R1-9 (prefix-shape validation), R1-10 2/2 (case-insensitive idempotency test), R1-14 (dry_run input-definition pin).

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout — remaining 3 round-1 Suggestions fixed (one non-force push 837b7defc7..46eb927d4c, 0 unresolved):

  • R1-9 (01d1d67): loadPolicy now rejects paths entries with a leading / or missing trailing / — both verified silent-misroute shapes (sibling-dir leak via startsWith, never-matching CODEOWNERS-style spelling) are now loud config-load errors. Rejection tests for both shapes.
  • R1-10 (a4ad137): case-insensitive idempotency pin — alreadyCovered must count pending lazzyman and LaZzyMan requests against the checked-in mixed-case map. Mutation check: removing both toLowerCase() calls fails exactly the new test.
  • R1-14 (46eb927): pins the workflow_dispatch dry_run input definition (default: true, report-only) alongside the DRY_RUN consuming expression. Both mutants (default flip, input deletion) fail the new pin.

Verification: both guard suites node --test 70 passed / 0 failed; eslint clean on changed files; no workflow YAML touched (no size-baseline change). All 3 threads replied with SHA evidence and resolved.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (agent verdict) - workflow run

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

Scripted assertions: 72 passed · 0 failed · 72 total

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

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

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

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

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

Verification report

PR #9813 Deep Verification — feat(ci): request an area reviewer on PRs by changed-file paths

Verdict: findings — 72/72 scripted assertions passed (0 unexpected failures); the central claim is proven load-bearing by A/B; two non-blocking nits worth fixing pre-merge (Findings F1, F2).
Verified head: 46eb927d4c3ca94fd9a380c2386b4eece87188a9 (merge commit f42ac0b3, base tip fd9c452dc8).

中文摘要

结论:findings —— 全部 72 条脚本化断言通过,无意外失败;核心声明已通过 A/B 证明为承重改动;另有两个不阻塞合并的小问题(见 Findings F1、F2),建议合并前顺手修掉。

  • A/B 结论:两处关键 hunk 均为承重 —— ① CODEOWNERS 排除(8cd770a):还原后,在 GitHub 已自动请求全部 code owner 的真实场景下,脚本会误判"已有 mapped owner 在审"而永远 no-op,定向请求永不触发;HEAD 构建则正常追加一位非 CODEOWNERS owner。② 分页修复(24f822b):还原为 gh pr view --json files(100 条上限)后,120 个文件、唯一 core 文件位于第 115 位的 PR 会被静默漏路由;HEAD 构建走分页 REST 端点正常命中。
  • 安全模型全部实测通过:脚本对 gh 的全部调用做了普查 —— pr view 只取 state,isDraft,author,reviewRequests,latestReviews 五个结构化字段,不读标题/正文/评论;每次写入前对其余 7 位候选 owner 逐一复核 push 权限;fork 场景 403 优雅跳过、其他写错误仍然大声失败;写入前二次读取做 TOCTOU 复核(覆盖、diff 变化均会中止);大小写不敏感的幂等判断生效;作者永不被请求审自己。
  • 守卫测试套件非空跑:12 个变异体(逐一还原每个守卫 hunk + 1 个组合行 + 1 个异文件阳性对照)全部按预期翻红,未变异对照 70/70 全绿 —— 每个守卫都有测试钉死,无冗余防御、无死代码。
  • 向后兼容:新增 paths 字段对 issue 分配零影响(两份地图端到端 gh 调用序列逐字节一致,4/4)。
  • 门禁:HELPER_TESTS 全量 head 422/422、base 383/383(恰好 +39 = 新增测试数,零回归);actionlint/shellcheck/prettier/eslint 对改动文件全绿(actionlint 与 prettier 均用植入违规证明了门禁是活的)。
  • Findings:F1(nit).size-baseline 记录 2444 字节,但 PR 终态文件实为 2886 字节 —— 基线行在 PR 自身的后续提交中过期,虽因 4096 allowance 仍过闸,但棘轮"被评审的那一行"已失真;F2(nit)paths 校验放行 packages/core/../packages//core/ 这类永不匹配的条目,属于该 PR 自己的注释明确要防的"静默永久取消路由"同类问题,已给出测量过的候选修复。
  • 未覆盖:真实 GitHub 派发/写入(沙箱无凭据,replay 未校准);逐提交归因(浅克隆 depth 2);yamllint(容器无 pip);fork 只读 token 为 stub 模拟的 403 线形,非真实令牌。

Central claim

When a PR touches a mapped area's paths (core ships as packages/core/), the workflow requests a review from exactly one eligible area owner — least loaded, rotated by PR number — on top of GitHub's automatic CODEOWNERS requests; it no-ops when a mapped owner is already involved, and never reads PR text.

A/B table (wire oracle: real script driven through a logging gh stub; controls revert exactly one hunk each)

# Cell Scenario Oracle Result
02 head fresh core PR; all 5 CODEOWNERS owners already auto-requested (the live shape on PR open) exactly one pr edit --add-reviewer <owner>; owner ∈ mapped ∖ CODEOWNERS requested @…
03 control A (CODEOWNERS-exclusion reverted, 8cd770a) identical no pr edit; skip reason ✅ skips already reviewing — without the hunk the routing never fires on the only configured path
04 head 120 changed files, the only core file at index 115 area matched, one request requested @… via pulls/77/files --paginate
05 control B (file list via capped pr view --json files, 24f822b) identical no pr edit; skip reason ✅ skips no area path matched — silently unroutes

Witness: evidence/01-ab-codeowners-pagination.png (all 33 cells as printed, 33/33 PASS).
Full cell list (skip policy, fork-403 graceful vs other-errors loud, TOCTOU re-checks, permission tolerance, rotation determinism 77→pomelo-nwu / 78→DennisYu07, env validation, no-PR-text census): 01-ab-harness.mjs, log logs/01-ab-harness.txt.

Call census for one write run (scripted, from the stub log): 19 gh invocations — 2× pr view (fields exactly state,isDraft,author,reviewRequests,latestReviews), 2× paginated files, 7× collaborator permission (candidates only, all before the write), 7× open-issue load, 1× pr edit. No call touches title, body, comments, or reactions (asserted over the full log).

Corrections

  1. Test count. The description says "56 tests"; the two guard files actually contain 70 tests (39 in assign-pr-reviewer.test.mjs, 31 in assign-issue-owner.test.mjs), all green: # tests 70 / # pass 70 / # fail 0.
  2. "qwen-triage-workflow.test.mjs fails 42 tests on clean origin/main" does not reproduce in this container: the full HELPER_TESTS gate is green on both arms (head 422/422, base 383/383). Whatever environment produced the author's 42 failures, it is not the node:22-bookworm CI lane.
  3. Design doc trigger list. docs/design/2026-08-23-pr-reviewer-auto-assignment.md lists three pull_request types; the shipped workflow has four (reopened was added in commit 339de6f and is pinned by the guard suite). Doc-only drift.

Findings

F1 (nit) — the committed size baseline is already stale: 2444 recorded vs 2886 actual

The ratchet entry added by commit c716758 says 2444 assign-pr-reviewer.yml ("record the current 2444-byte size"), but later commits in this same PR — the reopened trigger (339de6f) and the base-sha checkout pin with its CODEOWNERS sparse line (04fd5e4) — grew the file, and the entry was never bumped. At the verified head the file is 2886 bytes.

wc -c .github/workflows/assign-pr-reviewer.yml          # 2886
grep assign-pr-reviewer .github/workflows/.size-baseline # 2444 assign-pr-reviewer.yml
git show HEAD^2:.github/workflows/assign-pr-reviewer.yml | wc -c  # 2886 — stale at final commit

Impact: the gate still passes (2886 ≤ 2444 + 4096 allowance), so this is not blocking — but the ratchet exists to make growth "a reviewed line", and the line being reviewed is 442 bytes behind reality, silently spending allowance the PR never asked for. The baseline file's own header says: "if the growth is real, bump the number and say why". Suggested fix: 2886 assign-pr-reviewer.yml.

F2 (nit) — paths validation accepts prefixes that can never match (../, //)

loadPolicy rejects empty entries, leading / (documented as "silently and permanently unroute the area"), and missing trailing / — but the sibling shapes with the same failure mode pass:

node -e 'import("./.github/scripts/assign-issue-owner.mjs").then(async m => {
  const raw = require("fs").readFileSync(".github/issue-owners.json","utf8");
  for (const p of ["packages/core/../", "packages//core/"]) {
    const j = JSON.parse(raw); j.areas[0].paths = [p];
    try { m.loadPolicy(JSON.stringify(j)); console.log("accepted:", p); }
    catch (e) { console.log("rejected:", p); }
  } })'
# accepted: packages/core/../
# accepted: packages//core/

API file paths are normalized repo-relative, so neither can ever match — the area silently unroutes, exactly the hazard the leading-slash rule exists to prevent. No misrouting is possible (failure is absence, not wrong target), and the map is a reviewed file, hence nit severity. Measured candidate fix (logs/05-candidate-fix.txt, patch in mutants/candidate-fix/patch.diff): add path.includes('//') || path.split('/').includes('..') to the predicate — guard suite stays 70/0 (it pins nothing along this axis), both hostile fixtures go red, checked-in map parses and routes identically. If adopted, ship with the fixture.

Not covered

  • Live GitHub behaviour. No credentials/network in this sandbox: no real workflow_dispatch dry-run, no real reviewer request, no real fork read-only token. The fork 403 cell replays the wire shape (HTTP 403 on pr edit), not the token semantics that produce it. The replay is uncalibrated — there is no real emitted artifact from a production run of this workflow to reproduce byte-for-byte (it has never run; first round, no previous-report.md). Calibration will become possible after the first real dispatch writes a step summary.
  • Per-commit attribution. Checkout is depth 2: git rev-list --count HEAD^1..HEAD^2 returns the shallow artifact 1 while the metadata snapshot lists 12 commits, so individual commits were not exercisable. Verified the aggregate HEAD^1..HEAD diff instead; commit messages were used only as hypotheses.
  • yamllint: container has no pip, so the pinned yamllint could not be installed (scripts/lint.js --setup fails at that step). actionlint covers the workflow YAML and was proven live; yamllint style rules on the new file remain unverified here.
  • Repo-wide npm run lint:ci and the full vitest profile were not run (CI covers them); I ran scoped eslint + prettier on the changed files and the test:scripts gate instead.
  • Pre-existing failures observed on both arms (attributed, not caused by the PR): workflow-size.test.js fails 1 test on head and base, byte-identical message — cd-cua-driver.yml grew to 42519 vs baseline 29715+4096; install-script.test.js fails to collect on head and base because the container ships no zip/unzip (A/A control).
  • Day-one arrival-rate math for the new trigger: depth-2 history prevents local PR-arrival counting. The job is bounded (timeout-minutes: 5, one node process, 19 API calls per write run, zero writes after the first request per PR thanks to idempotency). To confirm the event volume, a maintainer can run: gh api 'repos/QwenLM/qwen-code/pulls?state=all&per_page=100' --paginate --jq '[.[] | .created_at] | length' over the last 30 days.

Targeted gates executed

Gate Head Base Result
Guard suite (node --test on both files, the plan's exact command) 70/70, exit 0 n/a (files new) ✅ witness evidence/03-guard-suite-green.png
HELPER_TESTS full list (exact CI invocation) 422/422, exit 0 383/383, exit 0 ✅ +39 tests, zero regressions
npm run test:scripts (incl. size ratchet) 1592/1593 base measured for the two files that fail on head: workflow-size.test.js 180/181 (same sole failure), install-script.test.js same collection error sole failure cd-cua-driver.yml identical on both arms (pre-existing); the PR's 3 new ratchet tests are green (head 184 vs base 181 tests)
actionlint (repo-pinned binary, exact repo flags) clean ✅ gate proven live: planted types: ["not-a-real-type"] is caught
shellcheck exit 0 (pre-existing warnings only in untouched files)
prettier --check on the 7 prettier-parseable changed files clean ✅ proven live with a planted violation (--ignore-path /dev/null; prettier ignores files outside the project root by default)
eslint (scoped to the 3 changed .mjs) clean
Mutation matrix on the guard suite 12/12 mutants as predicted; control 70/70 ✅ witness evidence/02-mutation-matrix.png
Issue-assignment backward compat (head map vs base map, end-to-end) 4/4; gh logs byte-identical

Mutation matrix detail

Mutant Reverted guard Suite result Pinned by
M00 control none 70/70 green
M01 coverage-pool exclusion (8cd770a, hunk 1) 68/70 red does not treat CODEOWNERS auto-requests as coverage, requests on top of CODEOWNERS auto-requests
M02 pick exclusion (8cd770a, hunk 2) 68/70 red requests on top of CODEOWNERS auto-requests, never requests the PR author…
M03 both hunks together (combination row) 67/70 red — strictly more than either single revert union of the above
M04 --paginate dropped (24f822b) 69/70 red sources the changed-file list from the paginated files endpoint
M05 paths shape validation (01d1d67) 67/70 red the three rejects… map tests
M06 dispatch dry_run default true→false (46eb927) 69/70 red defaults manual dispatches to report-only
M07 author exclusion (5222e73) 69/70 red never requests the PR author to review their own work
M08 case-sensitive coverage match (a4ad137) 69/70 red matches requested reviewers against the map case-insensitively
M09 job issues: read scope (250376b) 69/70 red grants pull-requests:write to the job…
M10 reopened trigger (339de6f) 69/70 red fires on PR updates…
M11 repository if: guard 69/70 red runs only on the canonical repository
M12 positive control in the other file (pickOwner rotation) 68/70 red assign-issue-owner: owner selection — proves the runner collects both files

All reds are expected-vs-actual assertion failures (e.g. M02: The input did not match the regular expression /pr edit 77 .*--add-reviewer pomelo-nwu/ against the recorded stub log), not import or compile errors. Both CODEOWNERS-exclusion hunks are pinned independently — neither is redundant defence.

Methodology

Environment: the designated CI sandbox (container, no credentials), working tree at refs/pull/9813/merge (depth 2); npm ci + npm run build pre-done; Node v22.23.2. The PR changes no package.json/lockfile, so reusing the root node_modules is a clean control; the only non-builtin runtime dependency of the scripts is yaml, realpath /__w/qwen-code/qwen-code/node_modules/yaml (a real directory, shared, untouched by the PR) — no workspace symlinks cross the A/B boundary. All harnesses live in this artifact dir and drive the real .mjs scripts from dist-free source: 01-ab-harness.mjs (wire oracle; fake gh peer logs every invocation; control builds revert one hunk each in scratch copies), 02-mutation-matrix.mjs (scratch trees per mutant under mutants/, running the PR's own test files via node --test), 03-issue-compat.mjs, 04-extra-probes.mjs, 05-candidate-fix.mjs. Raw per-cell/per-mutant output: logs/ (incl. gate-helper-head.txt, gate-helper-base.txt, gate-guard-suite-head.txt, mutant-*.txt). Image evidence in evidence/ captured via scripts/verify-capture.mjs. Base arm used git worktree tmp/base-tree at HEAD^1, removed after the run.

Flakiness gate log

rounds=5 files=1 skipped=0
file .github/scripts/assign-pr-reviewer.test.mjs: (cd .) node --test ./.github/scripts/assign-pr-reviewer.test.mjs


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/assign-pr-reviewer.test.mjs: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/assign-pr-reviewer.test.mjs: P (exit 0)
round 2 · .github/scripts/assign-pr-reviewer.test.mjs: P (exit 0)
round 3 · .github/scripts/assign-pr-reviewer.test.mjs: P (exit 0)
round 4 · .github/scripts/assign-pr-reviewer.test.mjs: P (exit 0)
round 5 · .github/scripts/assign-pr-reviewer.test.mjs: P (exit 0)

Evidence images

01-ab-codeowners-pagination

02-mutation-matrix

03-guard-suite-green

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/assign-pr-reviewer.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/assign-pr-reviewer.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/scripts/assign-issue-owner.mjs Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/workflows/.size-baseline Outdated
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout update:

  • Changed: kept the trusted-base checkout boundary while making bootstrap runs skip cleanly until the base contains assign-pr-reviewer.mjs; widened the read-only token error match; refreshed the workflow size baseline; added a workflow invariant for the base ref pin.
  • Verified locally: node --test .github/scripts/assign-pr-reviewer.test.mjs, Prettier check, actionlint .github/workflows/assign-pr-reviewer.yml, git diff --check, and byte baseline match.
  • Pending: GitHub CI and automatic review are running on the new head.
  • Not changed in this pass: remaining non-critical suggestions are still open for a later bounded pass.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/assign-pr-reviewer.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .github/scripts/assign-pr-reviewer.mjs:150 — [review] four infrastructure helpers pasted verbatim from assign-issue-owner.mjs instead of imported

Convergence: round 3 posted 9 inline comment(s), 4 of them reported for the first time; the previous round posted 10 (10 new). Findings keep coming back to the same files: .github/scripts/assign-pr-reviewer.mjs (findings in round 2; 2 more now); .github/workflows/assign-pr-reviewer.yml (findings in round 2; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/assign-pr-reviewer.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

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

Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/scripts/assign-pr-reviewer.test.mjs Outdated
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/workflows/assign-pr-reviewer.yml Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
Comment thread .github/scripts/assign-issue-owner.mjs Outdated
Comment thread .github/scripts/assign-pr-reviewer.mjs Outdated
@yiliang114
yiliang114 marked this pull request as draft August 24, 2026 04:53
@yiliang114
yiliang114 force-pushed the feat/auto-request-pr-reviewer branch from 75d93aa to 5f3a251 Compare August 24, 2026 13:53
The defer path resolves the maintainer deterministically from the
existing owner map (same area/labels/load/rotation logic as issue
assignment) and assigns the PR to them, instead of an ambiguous
$QWEN_MAINTAINER_HANDLE / most-recent-reviewer chain. Replaces the
reviewer-request routing prototype entirely.
@yiliang114
yiliang114 force-pushed the feat/auto-request-pr-reviewer branch from 5f3a251 to d2c4cd6 Compare August 24, 2026 15:25
yiliang114 and others added 3 commits August 25, 2026 17:37
`gh pr view --json author` exports `"author": null` for deleted accounts;
guard both author dereferences so every later trigger skips gracefully
(exit 0) instead of throwing and running the assignment check red.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The routing tests only pinned core-skills and core-goals; a typo in any of
the six other module prefixes would silently reroute those PRs to the
generic fallback with the suite green. Probe every mapped prefix — fixed
literals, so a typo'd prefix fails instead of shifting the probe with it.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The assign-on-defer heredoc dereferenced pr.author.login unguarded; with
"author": null the eligibility filter threw and 2>/dev/null silently
bypassed deterministic owner resolution. Null-safe exclusion keeps the
resolver running, matching the jq fallback below it.

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

Copy link
Copy Markdown
Collaborator Author

Closeout — all 4 unresolved findings verified real at 93ada94e5 and fixed (single non-force push 93ada94e5..75098213b):

  • R7-1 Critical ×2: pr.author.login was dereferenced unguarded in assign-pr-owner.mjs (skipPrReason + eligibility loop) and in the assign-on-defer heredoc in pr-workflow.md — a deleted PR author ("author": null from gh pr view) crashed every subsequent trigger. Both sites now use pr.author?.login with graceful skip/null-safe fallback, matching the defenses this diff already had (review.author?.login, the jq select(.author.login != null)). Fixed in e69e250 + 7509821.
  • R4-5 Suggestion ×2 (the pair explicitly deferred to this round): routing tests now probe every mapped area prefix (all 12, fixed literals — a self-referential probe built from area.paths[0] was proven vacuous: corrupting a prefix moved the probe with it). Fixed in 354b06e.

Mutation checks: reverting either guard → 2 tests fail; corrupting one prefix in issue-owners.json → 1 test fails; all restored green. node --test on both assign scripts: 58/58 pass. eslint clean on changed files.

All 4 threads replied with evidence + SHA and resolved. Push auto-triggers re-review; no /triage.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI attribution for the failing Test (ubuntu-latest, Node 22.x) on 75098213b2 (run 32833280559): infrastructure, not this PR.

  • Every suite in the run reports green totals — 23874 passed (core batch), 21478 passed (599 files), 1691, 79, 606, 4233, 626, 148, 1659 passed across packages.
  • The only red is the runner itself: # ENOSPC has failed test steps mid-suite while the host looks... — the shared GitHub runner ran out of disk mid-suite (sdk-typescript step), and this PR only touches .github/workflows/* + triage scripts, nothing in the test path.

Leaving the re-run to maintainers / next push; no code change warranted.

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

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

  • .github/scripts/assign-pr-owner.mjs:100 — [review] five helper blocks byte-copied from assign-issue-owner.mjs instead of imported
  • .github/scripts/assign-pr-owner.mjs:162 — [review] changedFiles() runs before the skip checks
  • .github/scripts/assign-pr-owner.mjs:95 — [probe] the null-review-author guard in alreadyCovered is pinned by no test (mutation survives)
  • .qwen/skills/triage/references/pr-workflow.md:787 — [review] defer-assign stacks a second owner without a coverage check
  • .qwen/skills/triage/references/pr-workflow.md:723 — [probe] resolver's node invocation contradicts the skill's no-interpreter rule and slips past the node deny entry
  • .github/scripts/assign-pr-owner.mjs:91 — [probe] COMMENTED (comment-only) reviews count as coverage, permanently blocking assignment
中文说明

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

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

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

Skipped because the PR has merge conflicts, so refs/pull/9813/merge is unavailable — resolve conflicts and re-run.

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

跳过原因:the PR has merge conflicts, so refs/pull/9813/merge is unavailable — resolve conflicts and re-run。

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 75098213b2378a8c7fcdc87b8f273a3d2ebc90ea 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.

⚠️ 机器人在 75098213b2378a8c7fcdc87b8f273a3d2ebc90ea 上唯一的评审是 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.

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Correction to my earlier CI attribution: the exact failed log does not show an ENOSPC error. The red result is three unrelated ESLint integration tests timing out at 30s, followed by Vitest worker RPC Timeout calling "onTaskUpdate" errors. This PR does not touch those tests or their config paths, so the attribution remains runner/load flakiness rather than a PR-caused failure. No code change is warranted.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Stage 3–4 closeout: the review queue is clean (53/53 threads resolved; 0 unresolved), but the PR still needs a base refresh.

The current conflict is limited to two workflow files:

  • .github/workflows/ci.yml: keep this PR's assign-pr-owner.test.mjs entry in HELPER_TESTS while also taking main's new classify-platform-sensitivity.test.mjs entry and the rest of main's platform-lane changes.
  • .github/workflows/.size-baseline: keep this PR's 2125 assign-pr-owner.yml entry and re-measure the merged ci.yml size instead of choosing either stale side.

That resolution is mechanically clear, but I did not merge or push it from this worker because the required post-merge workflow/helper tests cannot be validated reliably here: this worktree's node_modules is a symlink to another checkout, and this worker is explicitly barred from running npm ci while another worker may be using the dependency tree.

The existing Ubuntu failure is unrelated runner/load flakiness, not a PR regression: three untouched ESLint integration tests timed out at 30s, followed by Vitest worker RPC Timeout calling \"onTaskUpdate\"; the PR-specific .github/scripts helper-test step had already passed. No code change is warranted for that failure.

Resolve the two mechanical conflicts from the main sync:

- ci.yml HELPER_TESTS: union of both sides' additions — main's
  ci/classify-platform-sensitivity.test.mjs in its inserted position
  plus this PR's trailing assign-pr-owner.test.mjs.
- .size-baseline: ratchet ci.yml to the merged file's actual byte size
  (79063), per the same-PR-update rule, instead of keeping either side's
  stale record.

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/assign-pr-owner.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .qwen/skills/triage/references/pr-workflow.md:722 — [review] the new assign-on-defer resolver heredoc has no test
  • .github/scripts/assign-issue-owner.mjs:90 — [probe] paths validation never pins tree/config agreement (stale directory silently unroutes the module)
  • .qwen/skills/triage/references/pr-workflow.md:741 — [probe] defer resolver routes labels-only and can never reach the module areas this PR adds
中文说明

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

未审查:reverse audit — did not converge within the reverse-audit round cap of 5。

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/assign-pr-owner.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Two routing-correctness blockers remain at the current head.

Comment thread .github/scripts/assign-pr-owner.mjs Outdated
Comment thread .github/scripts/assign-pr-owner.mjs Outdated

@chiga0 chiga0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Two routing-correctness blockers at the current head (confirmed independently of prior reviews).

CI: Ubuntu Node 22.x passes (25m 16s). build-cli, Integration Tests, and macOS/Windows Node tests are SKIPPED. The change is entirely .github/ scripts; no platform-sensitive code paths, so the cross-platform skips are non-material. build-cli skip is disclosed per coverage policy.

Checked: changedFiles() filename-decoding (base64 path, newline-injection defence); alreadyCovered() pool scope; matchedAreasByPath() longest-prefix sort; pre-write re-fetch fields; skipPrReason() null-author guard; workflow pull_request_target checkout pinning (base.sha, persist-credentials: false, sparse-checkout membership); isPathPrefix validation rules in loadPolicy.

Not checked: pr-workflow.md resolver heredoc end-to-end execution; integration of assign-pr-owner.mjs against the live GitHub API; Windows/macOS behaviour (no host).


Blocker 1 — renamed-file source paths are invisible to the router

changedFiles() uses .[].filename | @base64, which returns only the destination path. GitHub's pulls/:pr/files endpoint also exposes previous_filename for renamed/moved files, but this query discards it.

Trigger: any PR that moves a file out of a mapped area (e.g. packages/core/src/foo.tspackages/cli/src/bar.ts). The router sees only the destination, so the source area is never matched. The PR receives no assignment even though it removes code from a mapped area.

Fix: include both fields, e.g. .[].filename, (.[].previous_filename // empty) | @base64, so the returned list always covers the full set of affected paths.


Blocker 2 — pre-write re-fetch does not compare head SHA

The final re-fetch before gh pr edit --add-assignee checks state,isDraft,author,assignees,latestReviews but not headRefOid. The matched area was derived from the opening snapshot's file list; up to ~30 sequential API calls (one permission check + one load check per candidate) sit between that snapshot and this write.

Trigger: two pushes in rapid succession. With cancel-in-progress: false, runs serialise — Run A (from push 1) completes and assigns based on push 1's files; Run B (from push 2) starts, sees the assignee from Run A, and alreadyCovered returns true, permanently skipping re-evaluation even if push 2 changed which area applies.

Fix: include headRefOid in the re-fetch and bail out (skip, do not assign) when it has changed since the opening snapshot, so the queued run for the newer push handles the correct file list.


Reviewed with AI assistance.

Comment thread .github/scripts/assign-pr-owner.mjs Outdated
Comment thread .github/scripts/assign-pr-owner.mjs Outdated
@yiliang114
yiliang114 requested a review from chiga0 August 26, 2026 09:33

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/assign-pr-owner.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .github/scripts/assign-pr-owner.mjs:61 — [probe] equal-length prefix tie-break is pinned by no test (mutation flips the owner, suite stays green)
  • .qwen/skills/triage/references/pr-workflow.md:726 — [probe] assign-on-defer resolver heredoc is untested; 2>/dev/null hides module-load failures
  • .github/scripts/assign-pr-owner.mjs:93 — [probe] alreadyCovered's null-review-author guard survives mutation — no test supplies a null-author review
  • .github/scripts/assign-issue-owner.mjs:31 — [probe] isPathPrefix '.'-segment branch unpinned — mutant survives the whole suite
  • .github/scripts/assign-pr-owner.test.mjs:603 — [probe] workflow-invariant tests use partial patterns — head.ref/merge-ref spellings, widened guard, and mutable checkout tag all land green
  • .github/scripts/assign-pr-owner.test.mjs:171 — [probe] alreadyCovered's cross-area pool survives mutation — no test presents a mapped owner absent from areas[0]
中文说明

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

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

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/assign-pr-owner.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 26, 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: 153 passed · 0 failed · 153 total

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

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

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

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

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

Verification report

PR #9813 Deep Verification (round 2) — feat(triage): assign one accountable owner when a PR opens, and when deferring

Verdict: merge-ready — 153/153 scripted assertions passed (0 unexpected failures); both previous-round findings re-measured and fixed; the central claim is proven load-bearing by A/B; one non-blocking Suggestion (a missing test pin, Finding S1).
Verified head: a44cc5a1830082ad810d3c8aaf53b3ce66e363c3 (merge commit 0bdca48567, base tip 9b3ccee547).

中文摘要

结论:merge-ready —— 全部 153 条脚本化断言通过,无意外失败。这是跟进轮:上一轮的两个发现均已修复并重新测量(见下方状态表)。PR 已从上一轮的"请求 reviewer"原型重写为"分配 owner"方案(新增 assign-pr-owner.mjs + assign-pr-owner.yml workflow + 模块级路由 + triage skill 的 defer 分配路径)。

  • A/B 结论:中心声明得证 —— 真实脚本经日志化 gh stub 驱动,fresh core PR 恰好写入一次 pr edit --add-assignee(纯由文件路径路由,最长前缀命中模块、回落领域池);已覆盖/草稿/已合并/机器人/已删号作者全部优雅跳过;base 侧不存在该脚本与 workflow(特性缺失即对照)。4 个 hunk 级控制构建逐一还原关键改动后全部复现故障:还原 base64 解码 → 换行伪造文件名攻击成功;移除写入前 re-fetch → 叠加第二个 assignee;去掉 --paginate → 120 文件 PR 静默漏路由;去掉 headRefOid 相等检查 → 对过期 head 写入。
  • 安全模型实测:一次写入运行共 34 次 gh 调用全部普查 —— 两次 pr view 仅取 6 个结构化字段(无 title/body/comments)、15 次候选人 push 权限复核与 15 次负载查询全部发生在写入之前、恰好一次写入。fork 伪造文件名(含 CR/CRLF/反斜杠/星平面 unicode/base64 形同名等 8 个兄弟形状)全部保持"一名一条目"。
  • 上一轮 F2(paths 校验漏洞):原两个绕过夹具(packages/core/../packages//core/)连同 9 个兄弟形状现在全部被拒(base 脚本全部接受,A/B 成立),且在册地图照常解析、12 个前缀路由不变。
  • 上一轮 F1(size baseline 失真):assign-pr-reviewer.yml 已不存在;新基线条目 assign-pr-owner.yml=2125、ci.yml=79063 与 head 实际字节逐一相等。
  • 向后兼容:issue 分配端到端三格(base 脚本×base 地图 / head 脚本×base 地图 / head 脚本×head 地图)的 gh 调用序列逐字节一致,模块领域不会遮蔽 core。
  • defer 路径 replay(从提交版 markdown 逐字提取的 68 行 bash):20/20 —— 环境链 REPO→REPOSITORY→GITHUB_REPOSITORYPR_NUMBER→ISSUE_NUMBER 直通生效(两个控制构建证明修复前会漂移/静默死亡)、author: null 不中断、无 label 时 jq 兜底选最新人类 reviewer(真 jq 验证 null 守卫与机器人过滤,去掉 null-select 的旧过滤器在删除账号上直接中止)、$QWEN_MAINTAINER_HANDLE 优先、assign 失败不阻塞(|| true)。
  • 守卫套件:未变异对照 60/60 全绿;13 个变异体按预期全部翻红或被正确归类为存活(见矩阵)。唯一发现 S1:--paginate 无任何测试钉住(变异存活,行为已由本轮控制构建证明承重)——补一条测试即可,非阻塞。
  • 门禁:HELPER_TESTS head 431/431 vs base 402/402(恰好 +29,零回归);尺寸棘轮两臂均过;actionlint/shellcheck/prettier/eslint 对改动面全绿且均用植入违规证明是活的;2 个改动测试文件 × 5 轮无抖动。
  • 未覆盖:真实 GitHub 写入(沙箱无凭据,replay 未校准——该 workflow 从未跑过,无真实产物可对照);逐提交归因(depth 2);yamllint(容器 pip3 权限被拒);与 live main 的漂移核对(无网络)。

Previous-finding status (follow-up round)

The previous round verified head 46eb927d of the reviewer-request prototype. The PR has since been rewritten around assignment (the prototype was deleted wholesale), so every carried measurement was re-run at the new head rather than diffed.

# Finding Severity Status at new head
F1 .size-baseline stale within the PR (recorded 2444 vs actual 2886 for assign-pr-reviewer.yml) nit fixed / superseded — the file no longer exists and no stale entry remains; the replacing entries are byte-exact at head: assign-pr-owner.yml 2125=2125, ci.yml 79063=79063 (scripted, witness 06-gates.png), and the ratchet gate passes on both arms
F2 loadPolicy accepted never-matching paths entries (packages/core/../, packages//core/) nit fixed — both exact previous fixtures are now rejected, plus 9 sibling shapes (./, leading /, missing trailing /, \, ./.. segments, empty, non-string, [], non-array); the checked-in map still parses and all 12 prefixes still route (16/16, witness 03-f1f2-remeasure.png). A/B: the base script accepted all of them

The previous round's three Corrections (test count, author's 42-failure claim, design-doc trigger list) referred to the deleted prototype and no longer apply to this head.

Central claim

Every PR whose changed files touch a mapped area's paths gets exactly one accountable owner assigned — least loaded, rotated by PR number, module-level longest prefix first with the area pool as fallback — idempotently, with push access and live coverage re-verified before the write, and without ever reading PR text.

A/B table (wire oracle: real script driven through a logging gh stub; controls revert exactly one hunk each)

# Cell Scenario Oracle Result
A1 head fresh core PR, one candidate at load 0 exactly one pr edit --add-assignee, least-loaded owner assigned @DennisYu07 (0 open)
A2 base feature absence script & workflow exist at HEAD^1? ✅ both missing — the PR is the sole cause of any assignment
C-base64 control pre-fix newline split; forged x<LF>packages/core/poc as the only file area routed via phantom entry ✅ attack succeeds (one pr edit) — head skips it (A27)
C-toctou control pre-write re-fetch removed; owner lands mid-run second assignee stacked ✅ one pr edit on a covered PR — head skips (A21)
C-paginate control --paginate removed; core file is #120 of 120 area matched ✅ silently unroutes — head routes (A26)
C-headref control headRefOid equality check removed; head changes mid-run write aborted ✅ assigns against stale head — head skips (A23)

Witnesses: 01-ab-head-cells.png (43 cells as printed, 43/43 PASS) and 02-ab-controls.png (4/4). Cell inventory (all scripted in 01-ab-harness.mjs / 01b-controls.mjs, logs in logs/01-*.txt): idempotency vs mapped assignee and reviewer (case-insensitive) · unmapped assignee still routes · skip policy (merged/draft/bot/deleted-author/no-match/dry-run) · module routing (skills→wenshao, mixed files→longest prefix, runtime→yiliang114) · fallback on module-owner-as-author and on denied module owner · terminal skip when nobody passes the access check (both read and lookup-error routes) · author never self-assigned · rotation determinism (equal loads: PR77→LaZzyMan, PR78→doudouOUC, repeat-run identical) · rename counts previous_filename · 403 tolerated (exit 0) vs other errors re-thrown (exit 1).

Call census for one write run (scripted, from the stub log): 34 gh invocations — 2× pr view (fields exactly state,isDraft,author,assignees,latestReviews,headRefOid), 1× paginated files, 15× collaborator permission (all candidates, all pre-write), 15× open-issue load (all pre-write), 1× pr edit. No call mentions title, body, or comments anywhere in the log.

Corrections

  1. Body §1 routing rule. The description's first half says paths matching is "first match wins"; the implementation (and body §3) is longest matching prefix wins — "first match wins" is the label rule for issue areas, which module areas deliberately sit after. Doc-only clarification; no code change requested.

Findings

S1 (Suggestion, non-blocking) — --paginate is load-bearing but unpinned by any test

Mutation row M05 (drop the single '--paginate', line from changedFiles) leaves the full guard suite green (60/60) — no test distinguishes head from that mutant. The behaviour itself is load-bearing: control build C-paginate proves a 120-file PR whose only core file sits at #120 is silently unrouted without it (no area path matched), which is the exact failure class this PR's paths validation exists to prevent. Classification: coverage gap (behaviour right, nothing asserts it). One fixture would pin it — the suite's stub already branches on the files call, so serving 120 entries only when --paginate is present (as this round's harness does) and routing a core file at index 115+ turns the mutant red.

Informational — the two coverage checks are layered defence, both correct

Reverting only the initial alreadyCovered check (M03) leaves the suite green because the pre-write re-check subsumes it; reverting only the pre-write check (M02) turns three tests red; reverting both (M04) turns four red. The initial check is therefore redundant behaviourally — it exists to skip ~30 API calls on already-covered PRs — and is correct exactly as it stands. Not a finding.

Not covered

  • Live GitHub behaviour. No credentials/network in this sandbox: no real pull_request_target dispatch, no real assignment write, no real fork token. The 403 cell replays the wire shape (HTTP 403 on pr edit), not the token semantics that produce it. The replay is uncalibrated — the workflow has never run in production, so there is no real emitted artifact to reproduce byte-for-byte; calibration becomes possible after the first real run writes a step summary.
  • Per-commit attribution. Checkout is depth 2 (git rev-parse --is-shallow-repository = true): git rev-list HEAD^1..HEAD^2 returns the shallow artifact 1 while the metadata snapshot lists 25 commits, so individual commits were not exercisable. Verified the aggregate HEAD^1..HEAD diff; commit messages were used only as hypotheses.
  • yamllint: scripts/lint.js --setup fails at that step (pip3: Permission denied — same container blocker as the previous round). actionlint covers the workflow YAML and was proven live; yamllint style rules on the new file remain unverified here.
  • Drift against live main. No network/token to fetch current main. The merge ref was built cleanly by GitHub against base 9b3ccee5; the PR's own last commit is a conflict-resolution merge of origin/main whose two conflict files (ci.yml HELPER_TESTS union, .size-baseline ratchet to 79063) were both re-verified here.
  • PR-body verification claims ("verified against real PRs refactor(core): remove unused LruCache utility #9926/fix(review): reply carried findings into their thread, resolve fixed ones #9940/fix(cli): Rank skills last in root slash completion #9943") cannot be checked without API access.
  • Day-one arrival-rate math: depth-2 history prevents local PR-arrival counting. The job is bounded (timeout-minutes: 5, one node process, 34 API calls per write run, zero writes after the first assignment per PR thanks to idempotency, serialized per-PR concurrency). To confirm event volume, a maintainer can run: gh api 'repos/QwenLM/qwen-code/pulls?state=all&per_page=100' --paginate --jq '[.[] | select(.created_at > "2026-07-26")] | length'.
  • Working-tree divergence (environment note, not a PR finding). The container's checkout carried an uncommitted revert of .qwen/skills/triage/references/pr-workflow.md (the defer resolver deleted, i.e. the base text). All harnesses used the committed HEAD content — the defer block was extracted via git show HEAD:... — and the divergence was left untouched.
  • Repo-wide npm run lint:ci and the full vitest profile were not run (CI covers them); scoped prettier/eslint, the exact HELPER_TESTS invocation, the size-ratchet script + its vitest mirror, and the ownership-workflow vitest ran instead.

Targeted gates executed

Gate Head Base Result
HELPER_TESTS (exact CI invocation, YAML-extracted list) 431/431, exit 0 402/402, exit 0 ✅ +29 = the new tests, zero regressions (witness 06-gates.png)
Size ratchet check-workflow-size.sh exit 0 exit 0 ✅ baseline entries byte-exact at head (2125, 79063)
Size ratchet vitest mirror + ownership-workflow tests (test:scripts scope, 2 files) 202/202, exit 0 ✅ the previous round's pre-existing cd-cua-driver.yml size failure no longer reproduces at this head (main bumped its baseline to 49610); log gate-vitest-head.txt
Guard suite (mutation control, both files together) 60/60 n/a
Flakiness: 2 changed test files × 5 rounds 10/10 green ✅ no divergence (logs/flakiness.txt)
actionlint (repo-pinned 1.7.12, full tree) clean ✅ proven live: planted types: ["not-a-real-type"] caught
shellcheck (repo-pinned 0.11.0, full tree) exit 0; warnings only in untouched scripts/test-rewind-e2e.sh ✅ proven live (planted SC2034); the extracted defer block itself passes clean
prettier --check on the 7 changed files clean ✅ proven live via stdin reformat
eslint on the 4 changed .mjs clean
Issue-assignment backward compat (base/head × maps, end-to-end) gh logs byte-identical across all cells ✅ (9/9)
F2 sibling sweep through changedFiles decode 8/8 shapes one-entry-intact ✅ (16/16)

Mutation matrix detail (witness 05-mutation-matrix.png; 25/25 scripted, control 60/60)

Mutant Reverted guard Suite result Pinned by
M00 control none 60/60 green
M01 base64 decode → newline split 2 red untrusted filename decoding
M02 pre-write re-fetch removed 3 red apply boundary (the three TOCTOU tests)
M03 initial alreadyCovered only removed survives (green) — redundant defence (pre-write check subsumes it)
M04 both coverage checks removed (combination row) 4 red proves the set is load-bearing
M05 --paginate dropped survives (green) — coverage gap, see Finding S1
M06 canWrite always true 2 red denied/failing push-access tests
M07 non-permission edit errors swallowed 1 red re-throw test
M08 author exclusion removed 2 red self-assignment + fallback tests
M09 case-sensitive coverage pool 1 red case-insensitive coverage test
M10 paths validation disabled 1 red assign-issue-owner: owner map
M11 trigger pull_request_targetpull_request 1 red workflow invariants
M12 sparse-checkout sibling entry dropped 1 red workflow invariants
M13 pickOwner rotation broken (other file) 1 red positive control: runner collects both files

All reds are expected-vs-actual assertion failures, not import/syntax errors (scripted per row).

Methodology

Environment: the designated CI sandbox (container, no credentials), working tree at refs/pull/9813/merge (depth 2); npm ci + npm run build pre-done; Node v22.23.2, jq 1.6. The PR changes no package.json/lockfile (verified via diff stat), so reusing the root node_modules is a clean control; the scripts' only non-builtin dependency yaml realpath-resolves into the shared root tree, and no workspace symlinks cross the A/B boundary. Harnesses (all in this artifact dir, all driving real committed code): 01-ab-harness.mjs (43-cell wire oracle; logging gh stub in gh-stub/), 01b-controls.mjs (four hunk-revert scratch builds under mutants/c-*, each syntax-checked before running), 02-paths-validation.mjs (F2 re-measure vs base module), 03-compat.mjs + gh-issue-stub/ (issue-assignment compat), 04-defer-replay.mjs + gh-defer-stub/ (defer block extracted verbatim from git show HEAD:.qwen/skills/triage/references/pr-workflow.md — 68 lines, bash -n clean — driven under bash --noprofile --norc with session shell vars per the skill's convention), 05-mutation-matrix.mjs (scratch trees per mutant under mutants/suite-*, running the PR's own test files via node --test), 07-gates.mjs, 08-sibling-probes.mjs. Raw per-cell output in logs/ (incl. gate-helper-head.txt, gate-helper-base.txt, gate-vitest-head.txt, flakiness.txt). Assertion total: 43 (A/B) + 4 (controls) + 16 (F2) + 9 (compat) + 20 (defer) + 25 (matrix) + 18 (gates) + 16 (siblings) + 2 (vitest gate runs) = 153. Image evidence in evidence/ captured via scripts/verify-capture.mjs. The base arm used git worktree tmp/base-tree at HEAD^1, removed after the A/B cells were captured.

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/assign-issue-owner.test.mjs: (cd .) node --test ./.github/scripts/assign-issue-owner.test.mjs
file .github/scripts/assign-pr-owner.test.mjs: (cd .) node --test ./.github/scripts/assign-pr-owner.test.mjs


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/assign-issue-owner.test.mjs: PPPPP
  .github/scripts/assign-pr-owner.test.mjs: 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 · .github/scripts/assign-issue-owner.test.mjs: P (exit 0)
round 1 · .github/scripts/assign-pr-owner.test.mjs: P (exit 0)
round 2 · .github/scripts/assign-issue-owner.test.mjs: P (exit 0)
round 2 · .github/scripts/assign-pr-owner.test.mjs: P (exit 0)
round 3 · .github/scripts/assign-issue-owner.test.mjs: P (exit 0)
round 3 · .github/scripts/assign-pr-owner.test.mjs: P (exit 0)
round 4 · .github/scripts/assign-issue-owner.test.mjs: P (exit 0)
round 4 · .github/scripts/assign-pr-owner.test.mjs: P (exit 0)
round 5 · .github/scripts/assign-issue-owner.test.mjs: P (exit 0)
round 5 · .github/scripts/assign-pr-owner.test.mjs: P (exit 0)

Evidence images

01-ab-head-cells

02-ab-controls

03-f1f2-remeasure

04-defer-replay

05-mutation-matrix

06-gates

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM — both human-review blockers fixed as prescribed and pinned by tests, review job converged to zero findings at this SHA, and CI is fully green on this exact head. ✅

@wenshao

wenshao commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification: real Actions runs + live-queue replay

I verified this on a real stack rather than by reading the diff: six real GitHub Actions runs of assign-pr-owner.yml on a fork (real pull_request_target, real GITHUB_TOKEN, real gh), plus live dry-runs against the production GitHub API, plus a replay of the PR's own decision functions over the whole open queue (318 PRs / 939 issues).

Headline: the mechanism works — the one thing I could not settle locally (does pull-requests: write on GITHUB_TOKEN actually let you assign a PR?) is now settled: yes. But the real runs also turned up one failure mode that ends as a red ✗ check on the contributor's PR, and the live-queue replay shows the routing concentrates much more than intended. Details below.

Harness — what was real and what was substituted
Leg What ran
Real Actions assign-pr-owner.yml on wenshao/qwen-code, triggered by real pull_request_target (synchronize, ready_for_review) on a bot-authored PR. Two disclosed edits: the repo guard reads wenshao/qwen-code, and every area's owners collapses to ["wenshao"] (the only account with push access there). assign-pr-owner.mjs and assign-issue-owner.mjs were byte-identical to this PR (cmp verified). Fork restored afterwards.
Live API dry-runs DRY_RUN=true node .github/scripts/assign-pr-owner.mjs against QwenLM/qwen-code on 15 real PRs, with a wire-tee gh wrapper that logs every invocation and then execs the real binary.
Live-queue replay The PR's own exported matchedAreasByPath / alreadyCovered / skipPrReason / pickOwner over all 318 open PRs; permission + load pulled once per owner from the live API. Cross-checked: 15/15 agreement with the end-to-end live runs.
Defer path (part 2) The bash block extracted verbatim from pr-workflow.md and executed, with a gh shim that intercepts mutating verbs only.
Mutation matrix 8 single-guard mutations of the shipped scripts against the PR's own suite.

What holds up

1. Real pull_request_target run assigns correctly, from the trusted base. Run #33075069097 — the checkout step logs 2937a165d335630ca658839d1b434aab078faa0d, i.e. the base ref, never the PR head; the step then prints:

Area: core-runtime
Assignment: assigned @wenshao (0 open)

assigned

trusted base checkout

The PR really does end up assigned:

assignee on the PR

2. permissions: pull-requests: write is sufficient. No PAT needed — the default github.token assigned the PR. This was the open question; it is answered by a real run, not by reading docs.

3. Idempotent on repeated pushes. The next synchronize (#33075248717) prints Assignment: skipped — a mapped owner is already on the PR, and the PR still has exactly one assignee.

idempotent skip

4. Every skip branch reproduces on live production data (DRY_RUN=true, real PRs):

PR Result
#10282, #10275, #10233, #10226 Area: core-runtimewould assign @yiliang114
#10269 Area: core-config@qqqys
#10189 Area: core-skills@wenshao
#10260 core-goals has no eligible owner (author…); falling back to core@zjunothing
#10221 core-skills has no eligible owner (author…); falling back to core@callmeYe
#10283 skipped — no area path matched
#10280 skipped — PR is a draft (also confirmed on a real Actions run, #33074236778)
#10141 skipped — authored by a bot
#10149, #10236, #10245 skipped — a mapped owner is already on the PR

5. Dry-run writes nothing. The wire-tee ledger recorded 141 real gh calls, 0 mutating (pr edit / --add-assignee / -X POST|PATCH|PUT|DELETE: zero matches). The requested fields were state,isDraft,author,assignees,latestReviews,headRefOidno title, no body, no comments, so the "untrusted PR text cannot steer the assignment" claim is confirmed at the wire, not just in the comment block.

6. changedFiles() really does page past the 100-file cap — against the production API it returned 2656 paths for #9812 and 245 for #10124.

7. No regression to issue assignment. Replaying matchArea + skipReason over all 939 open issues with the base policy vs this PR's policy: 0 area drift, 0 skip drift, owner pool identical for every matched area. Six end-to-end assign-issue-owner.mjs dry-runs on real issues produced byte-identical output on both trees.

8. The new tests are load-bearing. 8/8 mutations went red:

CAUGHT (4)  matchedAreasByPath: drop longest-prefix ordering
CAUGHT (1)  alreadyCovered: ignore submitted reviews
CAUGHT (1)  skipPrReason: drop the draft guard
CAUGHT (2)  eligibility: stop excluding the PR author
CAUGHT (1)  pre-write: drop the head-changed race check
CAUGHT (2)  changedFiles: decode filenames as raw text instead of base64
CAUGHT (1)  isPathPrefix: allow a prefix without a trailing slash
CAUGHT (1)  loadPolicy: accept an empty paths list

node --test on both suites: 60 pass / 0 fail. The workflow size gate passes (assign-pr-owner.yml 2125 bytes, matching the baseline entry).


Findings

F1 — A failed assign shows up as a red ✗ on the contributor's PR (please fix before merge)

Two real runs failed, both surfacing as a failed check on the PR:

  • #33074859925 — the PR already had a coding-agent assignee (Copilot). gh pr edit --add-assignee goes through replaceActorsForAssignable, which re-asserts the whole actor set, and GitHub refuses:
    GraphQL: Assigning agents is not supported with GitHub App installation tokens.
    Use a user token (personal access token or OAuth token) instead. (replaceActorsForAssignable)
    
  • #33074405190gh issue list failed (the 'wenshao/qwen-code' repository has disabled issues), which is openIssueCount() throwing.

agent token failure

Neither message matches the graceful-skip filter, which only recognises /permission|403|resource not accessible by integration/i, so main() rethrows and the job exits 1.

Two asymmetries worth closing:

  • canWrite() deliberately degrades on a lookup failure (::warning:: + drop the candidate). openIssueCount() — now called up to 15 times per run for the core area — has no such tolerance, so one transient gh issue list hiccup (secondary rate limit, 5xx) fails the whole run. Wrapping it the same way seems in keeping with the existing intent.
  • The pr edit catch should probably also swallow the replaceActorsForAssignable refusal, or the script should fall back to gh api -X POST .../issues/{n}/assignees which does not touch the agent path.

Severity note: QwenLM/qwen-code currently has 0 open PRs with an agent assignee, so the first trigger is latent rather than active today. But assign-issue-owner failing is invisible (an issue), whereas assign-pr-owner failing is a red check a contributor sees on their own PR — the blast radius is genuinely different.

F2 — "Longest matching prefix wins" becomes "longest directory name wins" between siblings

Longest-prefix is a specificity rule only when one prefix nests inside the other (packages/core/ vs packages/core/src/skills/). Across sibling modules nothing nests, so the tie-break is literally string length. Replayed over the live queue: 12 of 59 routable PRs (20%) are decided this way.

#10268  core-config (@qqqys) beats core-runtime (@yiliang114) — "…/config/" is 2 chars longer than "…/core/"
#8169   core-telemetry (@zjunothing) beats core-runtime (@yiliang114) — "…/telemetry/" is 5 chars longer than "…/core/"
#10263  core-skills (@wenshao) beats core-memory (@wenshao) — same length (25); decided by JSON declaration order

The extreme case: #9812 touches 2656 files across every core module and routes to core-telemetry — because "telemetry" happens to be a longer word than "config", "agents" or "skills". Ranking by how many changed files each module claims (or majority-of-diff) would match the stated intent better. The equal-length case falling through to declaration order is worth documenting explicitly too.

F3 — The load metric counts issues only, so PR assignment has no feedback loop

Proven against the live API: gh issue list --assignee qqqys returns 41 numbers, gh pr list --assignee qqqys returns 10090 9406 3190overlap 0. Assigning a PR never raises the number openIssueCount() reads.

Consequence on today's queue: @callmeYe (1 open issue, 0 open PRs) is the minimum-load owner of the 15-person core fallback and absorbs 10 of 59 assignments — and stays the minimum afterwards, because those 10 PRs are invisible to the metric.

Compounding it: 7 of the 9 areas have exactly one owner, so load and rotation do nothing there at all. Replaying the whole open queue:

Assignee Would receive Open issues today
@yiliang114 35 (59%) 52 — already the highest
@callmeYe 10 (17%) 1
@qqqys 6 (10%) 41
@wenshao 5 (8%) 5
@zjunothing 3 (5%) 1

core-runtime (core/ + services/ + tools/ + utils/) is most of packages/core, and it has one owner — so the person already carrying the largest issue backlog receives the majority of PRs.

F4 — The module → owner map does not match the history it was drafted from

The PR says the map came from six months of per-directory commits and asks for correction in review, so here is that data (git log origin/main --since="6 months ago", emails mapped to logins via the commits API):

Area Mapped owner Their rank there Top 3 by commits
core-skills @wenshao 1 (225) wenshao 225, yiliang114 20, tanzhenxin 13
core-goals @qqqys 1 (33) qqqys 33, yiliang114 1, xurik 1
…/core/ @yiliang114 1 (81) yiliang114 81, doudouOUC 77, tanzhenxin 55
…/utils/ @yiliang114 2 (44) tanzhenxin 45, yiliang114 44, doudouOUC 43
core-memory @wenshao 3 (7) LaZzyMan 11, yiliang114 10, wenshao 7
core-agents @qqqys 4 (17) tanzhenxin 37, doudouOUC 24, yiliang114 20
core-extension @callmeYe 4 (8) DennisYu07 14, wenshao 8, LaZzyMan 8
…/services/ @yiliang114 4 (33) doudouOUC 61, wenshao 47, tanzhenxin 47
…/tools/ @yiliang114 5 (45) LaZzyMan 55, doudouOUC 55, tanzhenxin 51
core-config @qqqys 6 (28) doudouOUC 47, LaZzyMan 36, yiliang114 35
core-telemetry @zjunothing absent (0 in 6mo; 2 commits in 12mo) doudouOUC 51, tanzhenxin 14, yiliang114 10

Two things stand out:

  • core-telemetry@zjunothing is the weakest link: zero commits there in the last six months, two in twelve, against @doudouOUC's 51 in six. (@zjunothing does work in telemetry — it is their 3rd most-touched directory over 12 months — so this is a "wrong tier", not a random pick.)
  • @tanzhenxin is absent from the map entirely, yet is the pre-release: fix ci #1 committer in agents/, utils/, tools/ and Where is the config saved? #2–3 in services/, holds admin push access, and has 0 open issues assigned. That is the single most obvious addition.

Commit count is of course a proxy — if these owners were chosen for review load rather than authorship, that is a fine answer; it just is not what the PR description says the map was derived from.

F5 — Part 2 (the defer path) cannot fire today

matchArea() routes on labels, and the policy's only labels are category/core / scope/core. Across the last 400 PRs in this repo: 0 carry any category/* label, and exactly 3 carry any scope/* (windows, macos, ci-cd — none mapped). Those labels are issue-taxonomy labels; the triage bot does not apply them to PRs.

Running the pr-workflow.md bash block verbatim confirms it:

Case Result
Real PR #10282, real labels MAINTAINER=[] — owner-map branch returns nothing, reviewer fallback returns nothing → comment posted with no mention, no assign
Same PR, labels response stubbed to category/core MAINTAINER=[callmeYe]gh pr edit … --add-assignee callmeYe
Real PR #10245 (has human reviews) MAINTAINER=[qqqys] via the recency-sorted reviewer fallback
QWEN_MAINTAINER_HANDLE=someone wins immediately, 0 API calls

So all four branches are correct — but in production the deterministic owner-map branch is unreachable until PRs start carrying area labels. The new gh pr edit --add-assignee is still a real improvement over mention-only; the "same owner map as issue assignment" part just isn't live yet. Worth saying so in the PR description rather than letting it read as active.

(Also verified: the relative import './.github/scripts/assign-issue-owner.mjs' from a node --input-type=module heredoc does resolve against CWD on Node 24, so the documented "run it from the workspace root" instruction is correct.)

F6 — A review counts as coverage, so the existing backlog stays ownerless

alreadyCovered() treats a submitted review by any mapped owner as "this routing already happened". On the live queue, of the 162 PRs skipped for that reason:

  • 9 are covered by an actual assignee
  • 153 are covered only because a mapped owner left a review

New PRs are unaffected — at opened there are no reviews, so they get assigned, and the run I did confirms subsequent pushes then no-op. But synchronize fires on every push to the 153 backlog PRs and they will never acquire an owner. Given the motivation ("nobody's Assigned filter ever shows the PR"), a review arguably is exactly the weak signal this PR set out to replace. Worth a deliberate call: keep it (reviews are cheap and this avoids noise) or narrow it to assignees.

F7 — Minor

  • The bot filter /(\[bot\]|-bot)$/ misses GitHub App authors whose slug doesn't end in -bot. gh pr view --json author returns app/copilot-swe-agent for a Copilot PR → not treated as a bot. In-repo bots (qwen-code-ci-bot, qwen-code-dev-bot, dependabot[bot]) all match fine, so this is cosmetic today.
  • .size-baseline lowers ci.yml to 79063, but origin/main is at 80983 right now. After merging, ci.yml would sit ~81024 against a 83159 ceiling — passes, but leaves only ~2.1 KB of headroom for the next person editing ci.yml. Consider recording main's current size instead.
  • Rollout note (observed, not a defect): the workflow produced no runs at all until it was on the repository's default branch — worth remembering if anyone tries to smoke-test it from a branch.

Verdict

Recommend merge once F1 is addressed. It is the only finding that puts a red ✗ on a contributor's PR, and both halves of the fix are small and match patterns already in the file (canWrite's warn-and-continue, and a wider pr edit catch).

F2–F4 are tuning rather than correctness, but F4 is worth correcting before this starts routing — the PR explicitly asks reviewers to fix the map, and core-telemetry plus the missing @tanzhenxin are concrete. F5/F6 are mostly description accuracy: they change what the PR delivers today, not whether it is safe.

Everything the description claims about safety checks out at the wire: trusted-base checkout, no PR-authored text read, sparse credential-free checkout, push access re-verified live, pre-write re-fetch, base64 filename decoding.

中文版报告(点击展开)

维护者验证:真实 Actions 运行 + 全量队列回放

我没有停留在读 diff,而是搭了真实环境:在 fork 上真跑了 6 次 GitHub Actions(真实 pull_request_target、真实 GITHUB_TOKEN、真实 gh),配合对生产 GitHub API 的 live dry-run,再用 PR 自己导出的决策函数回放了整个开放队列(318 个 PR / 939 个 issue)。

结论先说:机制是work的。本地唯一无法回答的问题——GITHUB_TOKEN 只带 pull-requests: write 到底能不能给 PR 加 assignee——现在有了实证答案:。但真实运行同时暴露了一个会在贡献者 PR 上留下红叉的失败路径,全量回放也显示分配远比预期集中。

验证手段说明

验证腿 实际跑的东西
真实 Actions wenshao/qwen-code 上跑 assign-pr-owner.yml,由真实 pull_request_targetsynchronize / ready_for_review)在一个机器人作者的 PR 上触发。两处已披露的改动:仓库门改成 wenshao/qwen-code,各 area 的 owners 收敛为 ["wenshao"](fork 上唯一有 push 权限的账号)。两个 .mjs 脚本与本 PR 逐字节相同cmp 已验)。跑完已还原 fork。
线上 dry-run QwenLM/qwen-code 的 15 个真实 PR 跑 DRY_RUN=true,外挂一个**旁路记账(wire-tee)**的 gh 包装器:先记录调用,再 exec 真实二进制。
全量队列回放 用 PR 自己导出的 matchedAreasByPath / alreadyCovered / skipPrReason / pickOwner 跑全部 318 个开放 PR;权限与负载按 owner 各取一次线上真值。与端到端真实运行逐条比对 15/15 一致
defer 路径(第二部分) pr-workflow.md逐字提取那段 bash 并真实执行,gh 垫片只拦截写动作。
变异矩阵 对已发布脚本做 8 处单点变异,跑 PR 自带测试。

站得住的部分

  1. 真实 pull_request_target 运行正确分配,且检出的是可信 base运行 #33075069097 的 checkout 步骤日志显示 2937a165d335…,即 base ref,绝非 PR head;随后输出 Area: core-runtime / Assignment: assigned @wenshao (0 open)
  2. permissions: pull-requests: write 足够——不需要 PAT,默认 github.token 成功完成 assign。这是原本悬而未决的问题,现在由真实运行给出答案,而不是查文档推断。
  3. 重复 push 幂等:下一次 synchronize#33075248717)输出 skipped — a mapped owner is already on the PR,PR 上仍然恰好一个 assignee。
  4. 每条跳过分支都在真实线上数据上复现:core-runtime / core-config / core-skills 命中、作者回落到 core、无路径命中、draft、bot 作者、已覆盖,共 15 个真实 PR 全部符合预期。
  5. dry-run 零写入:台账记录 141 次真实 gh 调用,0 次写操作。请求字段只有 state,isDraft,author,assignees,latestReviews,headRefOid——不含 title / body / comments,"不可信 PR 文本无法操纵分配"这一点在协议层面得到确认。
  6. changedFiles() 确实翻过了 100 条上限:对 refactor: retire @qwen-code/webui #9812 返回 2656 条路径,对 refactor(core,cli): rename generic Gemini identifiers to Llm #10124 返回 245 条。
  7. issue 分配零回归:对全部 939 个开放 issue 用 base / head 两套策略跑 matchArea + skipReasonarea 漂移 0、skip 漂移 0,命中 area 的 owner 池完全一致;6 个真实 issue 的端到端 dry-run 两棵树输出逐字相同。
  8. 新增测试有辨别力:8 处变异全部被抓(8/8)。node --test 两套共 60 通过 / 0 失败;workflow 体积门通过。

问题清单

F1 — assign 失败会在贡献者 PR 上留下红叉(建议合并前修)

两次真实运行失败,且都表现为 PR 上的失败检查:

  • #33074859925:PR 上已有 coding agent(Copilot)assigneegh pr edit --add-assigneereplaceActorsForAssignable,会重设整个 actor 集合,GitHub 直接拒绝:Assigning agents is not supported with GitHub App installation tokens.
  • #33074405190gh issue list 失败(repository has disabled issues),即 openIssueCount() 抛错。

两条错误都不匹配 /permission|403|resource not accessible by integration/i 这个优雅跳过的过滤器,于是 main() 重新抛出,job 退出码 1。

有两处不对称值得补齐:

  • canWrite() 在查询失败时刻意降级(::warning:: + 丢掉候选人);而 openIssueCount()——现在 core area 一次运行最多要调 15 次——完全没有这层容忍,一次瞬时抖动就会让整个 run 变红。按同样方式包一层更符合既有意图。
  • pr edit 的 catch 建议也吞掉 replaceActorsForAssignable 这类拒绝,或改走 gh api -X POST .../issues/{n}/assignees(不触碰 agent 路径)。

严重性说明:QwenLM/qwen-code 目前 0 个开放 PR 带 agent assignee,所以第一条今天是潜伏风险而非现实故障。但 assign-issue-owner 失败是隐形的(在 issue 上),assign-pr-owner 失败是贡献者能直接看到的红叉——影响面确实不同。

F2 —「最长前缀优先」在兄弟模块之间退化成「目录名更长者胜」

只有当一个前缀嵌套在另一个里面时(packages/core/ vs packages/core/src/skills/),最长前缀才是"更具体"。兄弟模块之间不存在嵌套,于是判据就纯粹是字符串长度。线上队列回放:59 个可路由 PR 里有 12 个(20%) 是这样决出来的。

极端案例:#9812 改动 2656 个文件、横跨 core 全部模块,最终路由到 core-telemetry——只因为 "telemetry" 这个词比 "config"/"agents"/"skills" 更长。按各模块命中的文件数(或 diff 占多数的模块)排序会更贴合设计意图。另外等长情况(skills 与 memory 都是 25 字符)实际由 JSON 声明顺序决定,值得写进注释。

F3 — 负载口径只数 issue,PR 分配没有反馈闭环

线上实证:gh issue list --assignee qqqys 返回 41 条,gh pr list --assignee qqqys 返回 10090 9406 3190——交集为 0。分配 PR 永远不会抬高 openIssueCount() 读到的数字。

今天队列上的后果:@callmeYe(1 个开放 issue、0 个开放 PR)是 15 人 core 兜底池里的最小负载者,会吃下 59 个里的 10 个——而且分完之后仍然是最小负载者,因为这 10 个 PR 对该口径不可见。

叠加问题:9 个 area 里有 7 个只有一位 owner,负载与轮转在那里完全不起作用。全量回放分布:

被分配人 会收到 今日开放 issue
@yiliang114 35(59%) 52 —— 本来就是最高
@callmeYe 10(17%) 1
@qqqys 6(10%) 41
@wenshao 5(8%) 5
@zjunothing 3(5%) 1

core-runtimecore/ + services/ + tools/ + utils/)几乎就是整个 packages/core,却只有一位 owner——于是 issue 积压最重的人又接下了大部分 PR。

F4 — 模块 owner 映射与它自称的依据(提交历史)对不上

PR 说这份映射来自最近半年的分目录提交记录并请求 review 校正,那就把这份数据摆出来(git log origin/main --since="6 months ago",邮箱经 commits API 映射到 login):

Area 映射 owner 该目录内排名 提交数前三
core-skills @wenshao 1(225) wenshao 225, yiliang114 20, tanzhenxin 13
core-goals @qqqys 1(33) qqqys 33, yiliang114 1, xurik 1
…/core/ @yiliang114 1(81) yiliang114 81, doudouOUC 77, tanzhenxin 55
…/utils/ @yiliang114 2(44) tanzhenxin 45, yiliang114 44, doudouOUC 43
core-memory @wenshao 3(7) LaZzyMan 11, yiliang114 10, wenshao 7
core-agents @qqqys 4(17) tanzhenxin 37, doudouOUC 24, yiliang114 20
core-extension @callmeYe 4(8) DennisYu07 14, wenshao 8, LaZzyMan 8
…/services/ @yiliang114 4(33) doudouOUC 61, wenshao 47, tanzhenxin 47
…/tools/ @yiliang114 5(45) LaZzyMan 55, doudouOUC 55, tanzhenxin 51
core-config @qqqys 6(28) doudouOUC 47, LaZzyMan 36, yiliang114 35
core-telemetry @zjunothing 无记录(半年 0;一年 2 次提交) doudouOUC 51, tanzhenxin 14, yiliang114 10

两点最突出:

  • core-telemetry@zjunothing 是最弱的一环:半年内 0 次提交,一年内 2 次,而 @doudouOUC 半年 51 次。(@zjunothing 确实在 telemetry 干活——那是他一年里第 3 多的目录——所以这是"层级选错",不是随机指派。)
  • @tanzhenxin 完全不在映射里,但他是 agents/utils/tools/ 的第一提交人、services/ 第二三名,持有 admin 权限,且当前 0 个 issue 分配。这是最显而易见的补充人选。

当然提交数只是代理指标——如果这些 owner 是按 review 负担而非编码量选的,那完全合理;只是 PR 描述里说的依据不是这个。

F5 — 第二部分(defer 路径)今天根本触发不了

matchArea()label 路由,而策略里只有 category/core / scope/core 两个 label。最近 400 个 PR 里:0 个带任何 category/*,只有 3 个带 scope/*(windows / macos / ci-cd,都没映射)。这些是 issue 分类体系的 label,triage bot 不会打到 PR 上。

逐字执行 pr-workflow.md 里那段 bash 也印证了这一点:

场景 结果
真实 PR #10282、真实 label MAINTAINER=[]——owner 地图分支返回空,reviewer 兜底也返回空 → 评论不带 @mention、不 assign
同一 PR,仅把 label 响应打桩成 category/core MAINTAINER=[callmeYe]gh pr edit … --add-assignee callmeYe
真实 PR #10245(有人类 review) MAINTAINER=[qqqys],走按 submittedAt 排序的 reviewer 兜底
QWEN_MAINTAINER_HANDLE=someone 立即胜出,0 次 API 调用

四条分支逻辑都正确——但在生产环境里,"确定性 owner 地图"这条分支在 PR 开始带 area label 之前是不可达的。新增的 gh pr edit --add-assignee 相对"只 @mention"仍是实打实的改进;只是"与 issue 分配共用同一套选人逻辑"这部分还没真正生效。建议在 PR 描述里点明,别让人读成已经在跑。

(另外已验证:node --input-type=module heredoc 里的相对 import './.github/scripts/assign-issue-owner.mjs' 在 Node 24 上确实按 CWD 解析,所以文档里"从仓库根目录运行"的说明是对的。)

F6 — review 被当作"已覆盖",导致存量积压永远拿不到责任人

alreadyCovered() 把任何映射 owner 提交过的 review 视为"这次路由已经发生过"。线上队列里因此被跳过的 162 个 PR 中:

  • 9 个是真的有 assignee
  • 153 个只是因为某位映射 owner 留过 review

新 PR 不受影响——opened 时没有任何 review,所以会被分配,我的真实运行也确认了后续 push 会 no-op。但 synchronize 会在这 153 个存量 PR 的每次 push 上触发,而它们永远拿不到 owner。考虑到 PR 的动机正是"没有人的 Assigned 过滤器会显示该 PR",review 恰恰就是这个 PR 想要替换掉的弱信号。这里需要一个明确取舍:保留现状(review 便宜、能避免噪音),还是收窄成只看 assignee。

F7 — 次要

  • bot 过滤 /(\[bot\]|-bot)$/ 漏掉 slug 不以 -bot 结尾的 GitHub App 作者。gh pr view --json author 对 Copilot 的 PR 返回 app/copilot-swe-agent → 不会被判为 bot。仓库内现有的 bot(qwen-code-ci-botqwen-code-dev-botdependabot[bot])都能命中,所以今天只是观感问题。
  • .size-baselineci.yml 下调到 79063,而 origin/main 当前是 80983。合入后 ci.yml 约 81024,上限 83159——能过,但只给下一个改 ci.yml 的人留了 约 2.1 KB 余量。建议改成记录 main 的当前体积。
  • 上线提示(实测现象,非缺陷):这个 workflow 在放到仓库默认分支之前完全不产生任何 run——谁想从侧分支冒烟测试时值得记住。

结论

建议在处理 F1 后合并。 它是唯一会在贡献者 PR 上留下红叉的问题,而两半修复都很小,且与文件里已有的写法一致(canWrite 的 warn-and-continue,以及更宽的 pr edit catch)。

F2–F4 属于调优而非正确性,但 F4 值得在它开始真正路由之前修正——PR 自己就请求 review 校正这份映射,而 core-telemetry 与缺席的 @tanzhenxin 是很具体的两处。F5/F6 主要是描述准确性问题:它们改变的是这个 PR 今天交付了什么,而不是它是否安全。

描述中关于安全性的每一条都在协议层面得到确认:可信 base 检出、不读取任何 PR 正文、稀疏且无凭据的 checkout、写入前复核 push 权限、写入前重新拉取、文件名 base64 解码。

Actions runs used as evidence / 作为证据的 Actions 运行
Run Event Result What it shows
33074236778 synchronize skipped — PR is a draft; DRY_RUN: false correctly resolved from ${{ inputs.dry_run || 'false' }}
33074405190 ready_for_review openIssueCount() throws → job fails (F1)
33074642573 synchronize replaceActorsForAssignable refused for an app token (F1)
33074859925 synchronize same, reproduced
33075069097 synchronize Assignment: assigned @wenshao (0 open) — the real write succeeds
33075248717 synchronize skipped — a mapped owner is already on the PR — idempotent

run sequence

# Conflicts:
#	.github/workflows/.size-baseline
#	.github/workflows/ci.yml

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

  • changedFiles() fetch-before-skip ordering (D11-1) — already reported as a deferred finding in the round 6 and round 8 review bodies
  • assign-on-defer resolver heredoc untested (D11-2) — already reported as a deferred finding in the round 9 and round 10 review bodies
  • alreadyCovered null-review-author guard unpinned (D11-5) — already reported as a deferred finding in the round 8 and round 10 review bodies
  • $comment points at a contradicting design doc (D11-6) — already reported as a deferred finding in the round 6 and round 7 review bodies
  • bootstrap-guard invariant regex lacks a start anchor (D11-8) — already reported as a deferred finding in the round 6 review body

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

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/assign-pr-owner.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .github/scripts/assign-pr-owner.mjs:159 — [probe] 'never reads PR text' invariant unpinned
  • .github/scripts/assign-issue-owner.mjs:31 — [probe] paths validation accepts glob/whitespace prefixes
  • .github/scripts/assign-pr-owner.test.mjs:457 — [probe] previous_filename newline defense unpinned
中文说明

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

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

未审查:reverse audit — did not converge within the reverse-audit round cap of 5。

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/assign-pr-owner.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

Comment thread .qwen/skills/triage/references/pr-workflow.md
The triage lane's permissions.deny blocks any run_shell_command whose
text contains a backtick, so the template literal in canWrite() and the
backticked "author": null comment made the whole resolver command
EXECUTION_DENIED before approval. Use string concatenation, de-backtick
the comment, and pin the invariant with a witness test that turns red if
a backtick is reintroduced into the resolver block.

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

Copy link
Copy Markdown
Collaborator Author

CI failure classification for run 33157589820 at head a78d5d5: not caused by this PR.

  • Failed subtest: release note classification > updates labels after a lookup failure and exits non-zero in .github/scripts/classify-release-notes.test.mjs — a file this PR does not touch (diff is limited to issue/PR owner assignment scripts+tests, assign-pr-owner.yml, ci.yml, .size-baseline, and the triage workflow reference doc).
  • Local repro at this PR's head: node --test .github/scripts/classify-release-notes.test.mjs → 3/3 pass, including the failing subtest (910ms).
  • Same subtest failed in fix(ci): route release pipeline Linux jobs to the ECS runner pool #10036's run with the same shape (CI-only, passes locally; analysis in this comment).

Failed-jobs rerun triggered.

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.

4 participants