Skip to content

fix(web-shell): Polish transcript, sidebar, and manager page visuals - #10157

Merged
wenshao merged 3 commits into
QwenLM:mainfrom
wenshao:fix/web-shell-visual-polish
Aug 27, 2026
Merged

fix(web-shell): Polish transcript, sidebar, and manager page visuals#10157
wenshao merged 3 commits into
QwenLM:mainfrom
wenshao:fix/web-shell-visual-polish

Conversation

@wenshao

@wenshao wenshao commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Polishes four visual issues in the Web Shell UI, found during a full screenshot walkthrough of 16 surfaces in both dark and light themes:

  • Bold emphasis in assistant messages is visible again. Markdown bold previously rendered at nearly the same weight as body text, so **important** passages were indistinguishable from the surrounding prose.
  • Sidebar session names stay readable when a session needs attention. The attention pill previously took so much horizontal space that a name like "Deploy to staging" collapsed to "Deplo". The pill now shows a short label ("Approval" / "Input", with shortened Chinese equivalents) while the full text remains available to assistive technology.
  • The refresh button on the manager pages (Extensions, Agents, Skills, MCP) is capitalized consistently instead of rendering as lowercase "refresh".
  • Code review result stat cards no longer wrap labels like "high confidence" onto two lines; the cards lay out evenly at any panel width.

Why it's needed

A visual audit of the Web Shell surfaced several places where information hierarchy broke down: emphasized text carried no emphasis, session names became unreadable exactly when they mattered most (a session waiting on the user), stat card labels wrapped mid-phrase, and button casing was inconsistent across surfaces. Each fix is small, but together they remove a layer of visual noise from everyday use.

Reviewer Test Plan

How to verify

  • Run the visual screenshot suite: cd packages/web-shell && npm run test:e2e:visuals — all screenshot tests pass, and the session-transcript, sidebar-attention, extensions-manager, and code-review-artifact captures show the differences below.
  • Unit tests for the touched areas pass: npx vitest run client/components/sidebar client/components/artifacts/CodeReviewArtifactDetail.test.tsx client/components/messages/Markdown.test.ts from packages/web-shell (129 tests green).
  • Expected results: bold text in assistant replies is visibly bolder than body text; a sidebar row for a session waiting on approval shows most of the session name plus a compact "Approval" pill; code review stat cards keep every label on one line; the refresh button reads "Refresh".

Evidence (Before & After)

Close-ups of each changed region (dark theme; full-page captures in both themes are in the collapsed section below).

Session transcript — **streamed** now reads as bold:

Before After
before after

Sidebar — session names survive the attention pill:

Before After
before after

Manager pages — consistent button casing:

Before After
before after

Code review stat cards — labels stay on one line:

Before After
before after
Full-page captures (dark & light)

Session transcript (dark):

Before After
before after

Sidebar attention pill (dark):

Before After
before after

Extensions manager (dark):

Before After
before after

Code review stat cards (dark):

Before After
before after

Session transcript (light):

Before After
before after

Sidebar attention pill (light):

Before After
before after

Extensions manager (light):

Before After
before after

Code review stat cards (light):

Before After
before after

Tested on

OS Status
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

Environment (optional)

Web Shell visual regression harness (mock daemon), captured in both dark and light themes; unit tests via vitest.

Risk & Scope

  • Main risk or tradeoff: minimal — the changes are a font-weight bump, a grid minimum width, label copy, and one component reading a shorter label; the sidebar pill keeps the full status text for assistive technology, and behavior is otherwise unchanged.
  • Not validated / out of scope: Windows/Linux rendering was not captured locally (the layouts are fluid and labels no longer wrap regardless of font metrics); the duplicate page title pattern shared by all manager pages was reviewed and intentionally left as-is because it is consistent across Extensions, Agents, Skills, and MCP.
  • Breaking changes / migration notes: none.

Linked Issues

N/A

中文说明

本次 PR 内容

对 Web Shell 界面的四个视觉问题进行打磨,问题来自一次覆盖 16 个界面、明暗双主题的全面截图走查:

  • 助手消息中的加粗重新可见。此前 Markdown 加粗的字重与正文几乎相同,**重点** 内容与周围文字无法区分。
  • 侧边栏会话名在会话需要用户处理时保持可读。此前状态 pill 占用过多横向空间,"Deploy to staging" 这样的名字会被挤成 "Deplo"。现在 pill 显示短文案("Approval" / "Input",中文同样缩短),完整文案仍保留给辅助技术读取。
  • 管理页面(Extensions、Agents、Skills、MCP)的刷新按钮大小写统一,不再显示为小写 "refresh"。
  • Code review 结果的统计卡片标签(如 "high confidence")不再折成两行,卡片在任意面板宽度下排列整齐。

为什么需要

一次对 Web Shell 的视觉走查发现了多处信息层级失效的地方:强调文本没有强调效果、会话名在最需要可读的时刻(会话等待用户处理时)反而不可读、统计卡片标签在词中间折行、按钮大小写跨界面不一致。每处修复都很小,但合在一起能明显减少日常使用中的视觉噪音。

评审测试计划

如何验证

  • 运行视觉截图套件:cd packages/web-shell && npm run test:e2e:visuals——全部截图测试通过,session-transcriptsidebar-attentionextensions-managercode-review-artifact 四组截图可看到上述差异。
  • 受影响区域的单元测试通过:在 packages/web-shell 下运行 npx vitest run client/components/sidebar client/components/artifacts/CodeReviewArtifactDetail.test.tsx client/components/messages/Markdown.test.ts(129 个测试全绿)。
  • 预期结果:助手回复中的加粗明显比正文粗;等待批准的会话在侧边栏中能显示大部分会话名并带一个紧凑的 "Approval" pill;code review 统计卡片标签全部保持单行;刷新按钮显示为 "Refresh"。

证据(修复前后)

见上方英文正文的改动区域特写与整页明暗主题对比截图。

测试环境

OS Status
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

运行环境(可选)

Web Shell 视觉回归工具(mock daemon),明暗双主题截图;单元测试使用 vitest。

风险与范围

  • 主要风险或取舍:极低——改动仅为字重提升、网格最小宽度、文案与一处短标签读取;侧边栏 pill 的完整状态文案仍对辅助技术可用,其余行为不变。
  • 未验证 / 范围外:未在本机截取 Windows/Linux 渲染效果(布局为流式,标签在任何字体度量下都不会再折行);所有管理页共有的"面包屑 + 页内大标题"模式经评审后有意保留,因为 Extensions、Agents、Skills、MCP 四页保持一致。
  • 破坏性变更 / 迁移说明:无。

关联 Issue

@wenshao

wenshao commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator Author

Test report

  • Visual screenshot suite (npm run test:e2e:visuals in packages/web-shell): all screenshot tests pass on this branch; the four affected surfaces (session-transcript, sidebar-attention, extensions-manager, code-review-artifact) were captured in both dark and light themes and reviewed manually — see the before/after tables in the PR description.
  • Unit tests: npx vitest run client/components/sidebar client/components/artifacts/CodeReviewArtifactDetail.test.tsx client/components/messages/Markdown.test.ts — 129 tests passed.
  • tsc --noEmit and ESLint on the touched files: clean.
  • Note (pre-existing, unrelated): the workspace sidebar visual test fails on main too (mocked workspace session rows never render), so it is not caused by this PR.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

  • Problem: observed, not theoretical — each of the four visual issues comes with before/after screenshots in both themes, which is the right kind of evidence for a polish PR.
  • Direction: aligned. This is polish on existing Web Shell surfaces (markdown emphasis weight, sidebar attention pill, manager-page refresh button, code-review stat cards), not new scope, and it stays clear of auth/sandbox/contract areas.
  • Size: not applicable — 4 files, +14/−4, all inside packages/web-shell/client/; no core-infrastructure paths touched.
  • Approach: the four fixes are independent, but they all come from the same visual walkthrough and each maps one-to-one to a stated issue; bundling them here reads as reasonable rather than scope creep.
  • Risk: no elevated risk signals — none of the changed files match the revert-correlated path list.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

  • 问题:已观测到的问题,而非理论性担忧——四个视觉问题均附带明暗双主题的 before/after 截图,这对打磨类 PR 是正确的证据形式。
  • 方向:对齐。这是对现有 Web Shell 界面的打磨(Markdown 加粗字重、侧边栏状态 pill、管理页刷新按钮、code review 统计卡片),不是新增范围,也不涉及 auth/沙箱/对外契约等区域。
  • 规模:不适用——4 个文件,+14/−4,全部位于 packages/web-shell/client/,未触及核心基础设施路径。
  • 方案:四处修复相互独立,但都来自同一次视觉走查,且每处都与所述问题一一对应;合并在一个 PR 里合理,不属于范围蔓延。
  • 风险:无升级风险信号——变更文件均未命中与 revert 相关的高风险路径。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-run on the same head commit — the diff still does exactly what the description says and nothing else; each of the four one-spot fixes re-verified in context:

  • Bold weight.content strong, .content b goes 500 → 600 in Markdown.module.css. Body text renders at 400, so bold is now visibly distinct; 600 also matches the heading weight already in the same file.
  • Sidebar attention pill — the pill in WebShellSidebar.tsx renders a short label ("Approval" / "Input", 待批准 / 需输入) while aria-label keeps the full phrase for assistive tech. The short label is computed from the exact same condition as the long one, so the render guard and the git-icon fallback below it stay correct; the collapsed-group status label intentionally keeps the full text.
  • Refresh casingcommon.refresh becomes "Refresh". Grepped all consumers: exactly the four manager pages (Extensions, Agents, Skills, MCP) — no drive-by effect.
  • Stat cards — grid minimum column 86px → 96px plus white-space: nowrap on the label. The longest labels ("high confidence", "Nice to have") hold one line at the new minimum, and columns still stretch as 1fr on wider panels.

No correctness issues, no convention violations — module CSS and semantic tokens untouched, new i18n keys added in both EN and ZH.

Testing evidence

Unattended CI run — no PR code was built or executed here; the evidence below is the PR's own CI on the reviewed commit, fetched via the checks API. CI has settled since the previous pass: every substantive check is green.

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

Check Conclusion
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Secret scan (TruffleHog) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

macOS/Windows unit jobs remain gated in ci.yml to merge-queue / schedule / dispatch events, and the remaining skips are bot orchestration — repo configuration, not this PR's doing.

Not independently verified: Windows/Linux rendering — the author's captures are macOS-only (attributed as the author's claim, not re-run here). The green Capture web-shell visuals job exercises the surfaces on Linux, but it is a capture harness, not a pixel-diff suite — a green run shows "renders and captures", not "looks better".

The pixel-level claim therefore still rests on the author's before/after screenshots. Sandboxed verification would settle it: /verify — named in the previous round and not yet landed (no verification report on this commit so far); the author has write access, so the lane can be triggered directly.

中文说明

代码审查

在同一 head 提交上的 re-run——diff 仍然与描述完全一致,没有多余改动;四处单点修复均已重新结合上下文核实:

  • 加粗字重——Markdown.module.css.content strong, .content b 由 500 → 600。正文按 400 渲染,加粗现在明显可辨;600 也与同文件已有的标题字重一致。
  • 侧边栏状态 pill——pill 改为显示短文案("Approval" / "Input"、待批准 / 需输入),aria-label 保留完整文案供辅助技术读取。短文案与长文案由完全相同的条件计算,渲染守卫与其下方的 git 图标回退分支保持正确;折叠分组的状态标签按设计保留完整文案。
  • 刷新按钮大小写——common.refresh 改为 "Refresh"。已 grep 全部使用方:恰好是四个管理页(Extensions、Agents、Skills、MCP),无附带影响。
  • 统计卡片——网格最小列宽 86px → 96px,标签加 white-space: nowrap。最长的标签("high confidence"、"Nice to have")在新最小宽度下保持单行,列仍为 1fr,宽面板下继续伸展。

无正确性问题,无规范违规——CSS Module 与语义 token 未动,新增 i18n 键中英双语齐备。

测试证据

无人值守 CI 运行——此处未构建或执行任何 PR 代码;以上是通过 checks API 获取的该提交自身的 CI 结果。上一轮之后 CI 已全部结束:所有实质性检查均为绿色。表格区域由 finalize 工作流维护。

macOS/Windows 单元测试在 ci.yml 中仅限合并队列/定时/手动触发,其余跳过项为机器人编排任务——均属仓库配置,而非本 PR 所致。

未独立验证:Windows/Linux 渲染——作者的截图仅覆盖 macOS(引自 PR 描述,属作者声明,非此处复跑)。绿色的视觉截图任务在 Linux 上执行,但它是截图采集而非像素对比——绿色只代表"能渲染、能截图",不代表"更好看"。

因此像素级效果仍依赖作者的 before/after 截图。沙箱验证可以补齐:/verify——上一轮已点名,目前尚未落地(该提交上还没有验证报告);作者有写权限,可直接触发。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — clean across every stage: observed problem with before/after evidence, a minimal diff that matches what I would have done at each of the four spots, zero review findings, and CI green across the board on the reviewed commit.

Re-run check: nothing has moved since the previous pass — same head commit, same four-spot diff, and every conclusion from the first review still holds after re-verifying the gate, the diff in context, and the CI signal. CI landed green after the previous pass, so the deferred approval was posted, pinned to the reviewed commit; this re-run has nothing further to add and does not stack a second approval.

The one standing caveat is unchanged: the pixel-level effect rests on the author's before/after captures (the CI visuals job is a capture harness, not a pixel diff) — standard for a visual PR, and the sandboxed-verification lane named in Stage 2 remains available if a maintainer wants that extra step.

中文说明

置信度:5/5——各阶段均干净:问题有 before/after 截图佐证,diff 极小、与我的独立方案一致,审查零发现,审查提交上的 CI 全线绿色。

Re-run 核对:自上一轮以来没有任何变化——同一 head 提交、同样的四处修复;重新核验门禁、上下文中的 diff 与 CI 信号后,首轮审查的全部结论依然成立。上一轮之后 CI 转绿,推迟的批准已按审查提交钉住发出;本次 re-run 没有新增内容,也不会叠加第二次批准。

唯一保留不变:像素级效果依赖作者的 before/after 截图(CI 视觉任务是截图采集而非像素对比)——对视觉类 PR 属常态;如需更进一步,Stage 2 中点名的沙箱验证通道仍然可用。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

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

Screenshots · before / after

⚠️ One or more scenarios failed to render on this head, so this preview may be missing views — see the workflow run. The composites below are the scenarios that did render.

code-review-artifact-dark before/after

code-review-artifact-light before/after

extensions-manager-dark before/after

extensions-manager-light before/after

session-transcript-dark before/after

session-transcript-light before/after

sidebar-attention-dark before/after

sidebar-attention-light before/after

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

Qwen Code · web-shell visuals

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

@wenshao

wenshao commented Aug 26, 2026

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

Flakiness gate: not applicable — no runnable changed test files (0 out-of-scope file(s) noted in the log)

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

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

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

抖动门:不适用 — no runnable changed test files (0 out-of-scope file(s) noted in the log)

Verification report

PR #10157 verification — fix(web-shell): Polish transcript, sidebar, and manager page visuals

Verdict: merge-ready — 27/27 scripted assertions passed (0 unexpected failures), verified head 3a8b1701fa2dcca88436375313edfd4bb1a72889 (base 5e9c24cf561252f718c31473d3dcfebff3c082e2). Two Suggestion-level findings (no test pins the new behaviors; the a11y rationale for the shortened pill is not guaranteed by aria-label on a role-less span) and one pre-existing visual-test failure attributed to base, none blocking.

中文摘要
  • 结论merge-ready。27/27 条脚本化断言通过,0 条非预期失败;验证的 PR head 为 3a8b1701fa
  • A/B 结论:四处视觉改动全部被证明真实生效。DOM 层(vitest + jsdom,同一 harness 在 head/base 两树各跑一遍):head 的 attention pill 显示短文案 Approval/Inputaria-label 保留全文,base 显示全文;common.refresh 在 head 为 Refresh、base 为 refresh。编译产物层(head 的 CI dist 对比重建的 base dist):strong/b 字重 500→600、.metric span 新增 white-space:nowrap、网格 minmax(86px→96px),另有一条未改动规则作对照完全一致。浏览器层(Playwright 视觉套件,head/base 各 35 通过):四组命名界面截图的 base/head 裁剪对比(0306 图)直接可见差异——base 侧会话名被宽 pill 挤成 "De"/"Refa",head 侧名字基本完整。
  • Findings:(1) Suggestion——仓库现有测试对四处改动零覆盖(还原 pill hunk 后 190/190 仍绿、还原全部 CSS hunk 后 287/287 仍绿),正向对照证明测试与 harness 本身是活的;(2) Suggestion——"完整文案仍对辅助技术可用"依赖无 role 的 <span> 上的 aria-label,按 ARIA/HTML-AAM 该命名源对 generic role 不生效,base 里全文是可见文本、AT 本来能读到,head 里大概率读不到了;(3) 既有问题(非本 PR 引入):workspace sidebar 视觉测试在 base 与 head 以字节级相同的 strict-mode 报错失败。
  • 未覆盖范围:像素级 before/after 断言(视觉套件只截图不比对)、真实读屏器验证、Windows/Linux 字体度量、workspace sidebar 既有失败的根因。

Central claim and A/B

Central claim: the four visual fixes change what the shipped Web Shell renders — bold emphasis, compact attention pills with full text preserved for AT, capitalized Refresh, one-line stat-card labels.

A/B cells (identical harness per arm; base = scratch worktree at HEAD^1 reusing the root node_modules, whose @qwen-code/* links point into the head tree but the PR touches none of those packages — git diff --stat HEAD^1..HEAD shows only the four web-shell files; changed files load from each tree via relative imports, pinned by source grep: base renders {attentionLabel} at :4090, head {attentionShortLabel} at :4095):

cell oracle head base (control)
approval pill visible text vitest DOM harness, span[aria-label="Waiting for approval"] textContent Approval (4/4 arm green) Waiting for approval (4/4 arm green)
input pill visible text same, aria-label="User input needed" Input User input needed
pill aria-label same full text both arms full text
no-attention control same no pill both arms no pill
common.refresh (EN) getTranslator('en') Refresh refresh
markdown strong,b weight compiled rule in dist/assets/*.css font-weight:600 font-weight:500
.metric span wrap same white-space:nowrap present absent
metrics grid min same minmax(96px ×1, 86px ×0 minmax(86px ×1, 96px ×0
unchanged-rule control same identical modulo hash/line suffix identical
visuals e2e suite (real browser) playwright, 37 tests 35 passed / 2 failed (pre-existing, see Findings) 35 passed / 2 failed, byte-identical

Witnesses: evidence/01-ab-pill-dom-base-vs-head.png (both harness arms as printed), evidence/02-ab-css-rules-base-vs-head.png (CSS oracle), evidence/03-sidebar-pill-base-vs-head.png06-metrics-base-vs-head.png (base-left/head-right crops of the visuals-suite captures). The sidebar crop is the sharpest: base truncates names to "De"/"Refa" behind the wide pills; head shows "Deploy to sta"/"Refactor auth m" with compact pills — exactly the regression the PR describes.

Reviewer Test Plan walk-through: step 1 (visuals suite) runs in this container after installing the chromium headless shell — 35/37 pass at both arms, and all four named surfaces (session-transcript, sidebar-attention, extensions-manager, code-review-artifact) capture and show the claimed differences; the 2 workspace sidebar failures are pre-existing (Findings). Step 2 (scoped unit command) is green but collects 287 tests in 15 files, not the 129 the PR states (Corrections). Step 3 expected results: each confirmed by the corresponding cell above.

Corrections

  • Stale test count in the description. The Reviewer Test Plan's scoped vitest command collects 287 tests (15 files) at the verified head, all green — the "129 tests green" figure predates test growth on main (e.g. the channels work merged at the base tip). Not a code defect; the plan's command remains valid.
  • "All screenshot tests pass" holds only in the author's environment. In this container the suite fails workspace sidebar (dark+light) at both arms with a byte-identical strict-mode error (Corrections-by-measurement: same two elements, same class hash, 6/6 occurrences per arm). The PR's captures and claims about the four named surfaces are unaffected.

Findings

F1 — Suggestion: none of the four changes is pinned by any test. The PR ships no test changes. Mutation matrix (evidence/07-mutation-matrix.png): reverting the pill hunk leaves the repo sidebar suite 190/190 green, and reverting all three CSS hunks leaves the scoped suite 287/287 green — both survivors are coverage gaps (the visuals suite captures the CSS surfaces but never asserts on them). Positive controls prove the instruments are live: the same pill revert turns my harness 2/4 red, and mutating EN sidebar.waitingForApproval turns exactly one existing test red (the collapsed-trigger aria-label pin in WebShellSidebar.collapse-persist.test.tsx). Per house rules a missing test for changed behavior is a Suggestion; the risk is that a future refactor silently reverts any of the four. A cheap pin would extend the existing sidebar tests with the pill text/aria-label pair (my harness in the artifact dir is a ready-made template).

F2 — Suggestion: the a11y rationale ("full text remains available to assistive technology") is not guaranteed. The pill is a <span> with no role; aria-label on a generic-role element is not a supported naming source per ARIA/HTML-AAM, and most screen readers ignore it. At base the full text was visible text, so AT received it; at head AT receives only the short label. The visible behavior is correct and the short label is announced, so this is minor — but the stated preservation does not hold as written. Minimal fix (not applied here; needs an a11y-tree check to measure, which this container's jsdom/headless-shell setup cannot do): render the full label in a visually hidden span inside the pill instead of relying on aria-label.

F3 — Pre-existing, not this PR: workspace sidebar visual test fails at base and head alike. Strict-mode violation: getByRole('complementary').getByText('Run auth migration') resolves to two _sessionTextInner_ rows (one with the hover "More" affordance, one exact) in the two-workspace scenario, at both arms, on all retries. Attributed per protocol by byte-identical failure at the base tip; root cause not pursued (out of scope). Note for whoever owns it: the duplicate appears tied to the workspace-grouping render path, and the dev server logs proxy ECONNREFUSED 127.0.0.1:4170 noise for /stat?... during the run.

Not covered

  • Pixel-diff assertions. The visuals suite is capture-only (no toMatchSnapshot); my before/after crops are visual evidence, not scripted pixel comparisons. A 0.02%-threshold diff harness exists in comments in harness.ts but is not wired as an assertion.
  • Real screen-reader verification of F2 (needs an a11y tree dump; headless-shell + jsdom cannot settle it).
  • Windows/Linux font metrics (author's own caveat; layout is fluid and nowrap makes wrapping metric-independent, so risk is low).
  • Root cause of the pre-existing workspace sidebar failure (attribution done, diagnosis not).
  • Per-commit attribution: N/A — the PR is a single commit and the snapshot's commits array matches the locally reachable HEAD^1..HEAD^2.
  • npm run lint/format:check/typecheck for web-shell were not re-run; the CI build at HEAD (which includes the package's tsc lib build) already covers compilation, and the diff is CSS strings plus two i18n entries and one JSX child.

Methodology

Environment: CI verify container (node:22-bookworm), merge-ref checkout (HEAD merge, HEAD^1 base, HEAD^2 head, depth 2), npm ci + npm run build pre-run at HEAD. DOM A/B: one harness file (pill-ab-harness.test.tsx, copied verbatim into each tree's sidebar dir, arm selected by VERIFY_ARM) driven through vitest/jsdom with the repo's own mock pattern copied from WebShellSidebar.collapse-persist.test.tsx; base arm reuses root node_modules (realpaths asserted; internal links point at head-tree packages the PR does not touch). CSS A/B: head's CI-built dist/ vs a base vite build in a scratch worktree (needed one symlink of the package's nested node_modules — tailwindcss v4 is not hoisted — deps untouched by the PR), rules extracted by selector and compared with an unchanged-rule control. Browser layer: playwright install chromium --only-shell succeeded (network available), then playwright.visuals.config.ts at both arms with WEB_SHELL_VISUALS_OUTPUT_DIR split per arm; before/after crops composed with sharp (crop-pairs.mjs). Mutations applied as scratch edits in the head tree and restored (final git status clean). Raw logs: 01-ab-dom.log, 02-css-oracle.log, 03-full-suite-head.log, 04-visuals-head.log, 05-visuals-base.log, base-vite-build.log in this directory. Assertion tally: DOM harness 7/arm ×2 = 14, CSS oracle 9, mutation matrix 4 (each row counted once, expected-red counted as pass) = 27/27.

Flakiness gate log


verdict: n/a
summary: no runnable changed test files (0 out-of-scope file(s) noted in the log)

Evidence images

01-ab-pill-dom-base-vs-head

02-ab-css-rules-base-vs-head

03-sidebar-pill-base-vs-head

04-bold-base-vs-head

05-refresh-base-vs-head

06-metrics-base-vs-head

07-mutation-matrix

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

Test Plan (not a blocker): client/components/artifacts/CodeReviewArtifactDetail.test.tsxno such file or directory; client/components/messages/Markdown.test.tsno such file or directory.

中文说明

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

Test Plan(非阻断):client/components/artifacts/CodeReviewArtifactDetail.test.tsxno such file or directory; client/components/messages/Markdown.test.tsno such file or directory

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

Comment on lines +3980 to +3984
const attentionShortLabel = session.isWaitingForPermission
? t('sidebar.waitingForApprovalShort')
: needsUserInput
? t('sidebar.userInputNeededShort')
: null;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The new attentionShortLabel ternary duplicates the exact branching condition of the adjacent attentionLabel ternary, and the pill render pairs the two only by convention: it guards on attentionLabel while displaying attentionShortLabel and exposing aria-label={attentionLabel}. Nothing ties the copies together — TypeScript sees two independent string | null values, and a mutation check confirmed one-sided edits ship green (swapping the render-site values passes all 13 sidebar test files / 190 tests). A future change that adds a third attention state — or adjusts the needsUserInput derivation — in only one ternary silently misrenders the sidebar: guard non-null with null visible text renders an empty pill box, and the reverse drift yields a stale accessible name or a pill that never appears. Branch once and carry both strings:

const attention = session.isWaitingForPermission
  ? { full: t('sidebar.waitingForApproval'), short: t('sidebar.waitingForApprovalShort') }
  : needsUserInput
    ? { full: t('sidebar.userInputNeeded'), short: t('sidebar.userInputNeededShort') }
    : null;

then guard on attention and render aria-label={attention?.full} with {attention?.short}.

中文说明

新增的 attentionShortLabel 三元表达式完整复制了相邻 attentionLabel 三元表达式的分支条件,而 pill 的渲染仅靠约定把两者配对:以 attentionLabel 作为渲染守卫,却显示 attentionShortLabel、暴露 aria-label={attentionLabel}。两份拷贝之间没有任何约束——TypeScript 视其为两个独立的 string | null 值,且变异测试证实单边修改可以全绿通过(交换渲染处的取值后,全部 13 个侧边栏测试文件 / 190 个测试依然通过)。未来若只在其中一个三元表达式里新增第三种注意力状态、或调整 needsUserInput 的推导,侧边栏会静默错渲染:守卫非空但可见文本为 null 时会渲染出一个空的 pill 色块;反向漂移则导致无障碍名称过时,或 pill 根本不出现。只分支一次、同时携带两个字符串即可消除分歧(代码见上方英文部分),然后以 attention 作为守卫,渲染 aria-label={attention?.full}{attention?.short}

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

aria-label={attentionLabel}
>
{attentionLabel}
{attentionShortLabel}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] No test pins this new pairing of short visible text with the full aria-label. The only nearby assertion (WebShellSidebar.collapse-persist.test.tsx:515) targets the collapsed trigger's aria-label, a different untouched element, and App.test.tsx mocks the whole sidebar. Measured in a scratch tree: swapping the two render-site values — regressing the pill to the long overflowing label while assistive tech announces the short form, the exact inverse of this PR's intent — still passes all 13 sidebar test files / 190 tests, as does dropping the aria-label line, which unpins the full accessible name (it then falls back to the short visible text). Add a case rendering an expanded session with isWaitingForPermission: true (and the isWaitingForUserQuestion variant) that asserts the .sessionAttention pill shows 'Approval' / 'Input' visibly while its aria-label carries 'Waiting for approval' / 'User input needed'.

中文说明

目前没有任何测试固定「短可见文本 + 完整 aria-label」这一新配对。唯一相近的断言(WebShellSidebar.collapse-persist.test.tsx:515)针对的是折叠态触发器的 aria-label——一个未被本 PR 改动的元素;而 App.test.tsx 对整个侧边栏做了 mock。在临时工作树中实测:交换渲染处的两个取值(让 pill 回退到会溢出的长标签、辅助技术却朗读短标签——恰好与本 PR 的意图相反)后,全部 13 个侧边栏测试文件 / 190 个测试依然通过;直接删掉 aria-label 一行同样全绿——完整无障碍名称因此不再被任何测试固定(只能回退到短可见文本)。建议新增用例:渲染一个 isWaitingForPermission: true 的展开会话(以及 isWaitingForUserQuestion 变体),断言 .sessionAttention pill 的可见文本为 'Approval' / 'Input',同时其 aria-label 为 'Waiting for approval' / 'User input needed'。

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

@wenshao

wenshao commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 26, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. This is a fork PR, so the first round comes from the next scheduled scan (usually within minutes). Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。本 PR 来自 fork,首轮处理将由下一次定时扫描执行(通常几分钟内)。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

AutoFix round 3 finishedview run. See this round's report below.

中文说明

AutoFix 第 3 轮已完成 —— 查看运行。本轮报告见下方。

…pairing (QwenLM#10157)

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

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Address-review summary — PR #10157 (round 2)

Commit: 7dd6656683 on fix/web-shell-visual-polish. No base merge was needed (--conflict false).

Feedback points and dispositions

[rc:3863242916] Duplicated branching in attentionLabel / attentionShortLabel — Implemented

The finding is correct: the two ternaries duplicated the exact same branch condition, and the pill render only paired them by convention (guarding on one, displaying the other, exposing the first as aria-label). Replaced the two consts with a single attention branch that carries both strings:

const attention = session.isWaitingForPermission
  ? { full: t('sidebar.waitingForApproval'), short: t('sidebar.waitingForApprovalShort') }
  : needsUserInput
    ? { full: t('sidebar.userInputNeeded'), short: t('sidebar.userInputNeededShort') }
    : null;

The pill now guards on attention, renders aria-label={attention.full} with {attention.short}, and the git-icon fallback uses !attention — the two strings can no longer drift apart. Behavior is unchanged; this removes duplicated logic rather than adding defense.

[rc:3863242923] No test pins the short-label / full-aria-label pairing — Implemented

Added shows the expanded attention pill short label with the full accessible name to WebShellSidebar.collapse-persist.test.tsx (reusing its existing sidebar harness, which already hosts the collapsed-trigger attention tests). It renders an expanded session with isWaitingForPermission: true and asserts the .sessionAttention pill shows Approval visibly while its aria-label is Waiting for approval; then re-renders the isWaitingForUserQuestion variant and asserts Input / User input needed, plus the sessionAttentionUserInput class.

Mutation probes (witness verification) on the new test, then restored:

  • Swapping the render-site values (visible text ← full label, aria-label ← short form) → the new test FAILS (1 failed | 32 passed).
  • Dropping the aria-label line entirely → the new test FAILS (1 failed | 32 passed).
  • Restored state → all 13 sidebar files / 191 tests pass.

Both regressions the finding described are now caught.

[rv:5031022740] Review body: "Test Plan ... CodeReviewArtifactDetail.test.tsx / Markdown.test.ts — no such file or directory" — Declined with evidence

The claim is refuted by the tree: both files exist at packages/web-shell/client/components/artifacts/CodeReviewArtifactDetail.test.tsx and packages/web-shell/client/components/messages/Markdown.test.ts (verified with a directory listing). The "no such file or directory" result is consistent with running the vitest command from the repository root instead of packages/web-shell, where the relative paths resolve. No code change needed.

Conflict notes

None — no base merge performed.

Verification

  • npm run build — passed (also fixed the initial vitest import-resolution failures for @qwen-code/webui/daemon-react-sdk / @qwen-code/sdk/daemon, which needed the workspace dist/ outputs).
  • npm run typecheck — passed.
  • npm run lint — passed.
  • npx vitest run client/components/sidebar (from packages/web-shell, touched package) — 13 files, 191 tests passed.
  • Mutation probes on the new test: value swap → FAIL as expected; aria-label removal → FAIL as expected; restored → 191 tests passed (see above).
  • Prettier on the two touched files — no changes needed.
中文说明

处理评审总结 — PR #10157(第 2 轮)

提交:fix/web-shell-visual-polish 分支上的 7dd6656683。无需合并 base(--conflict false)。

反馈点及处理结果

[rc:3863242916] attentionLabel / attentionShortLabel 分支条件重复 — 已实现

该发现正确:两个三元表达式完整复制了同一分支条件,而 pill 渲染仅靠约定把二者配对(以其中一个作为渲染守卫、显示另一个、并把第一个作为 aria-label 暴露)。已将两个常量替换为单个 attention 分支,同时携带两个字符串:

const attention = session.isWaitingForPermission
  ? { full: t('sidebar.waitingForApproval'), short: t('sidebar.waitingForApprovalShort') }
  : needsUserInput
    ? { full: t('sidebar.userInputNeeded'), short: t('sidebar.userInputNeededShort') }
    : null;

pill 现在以 attention 作为守卫,渲染 aria-label={attention.full}{attention.short},git 图标回退分支使用 !attention —— 两个字符串不再可能各自漂移。行为不变;这是删除重复逻辑,而不是增加防御代码。

[rc:3863242923] 没有测试固定「短标签 + 完整 aria-label」配对 — 已实现

WebShellSidebar.collapse-persist.test.tsx 中新增 shows the expanded attention pill short label with the full accessible name(复用该文件已有的侧边栏测试脚手架,折叠态触发器的 attention 测试也在其中)。该用例渲染 isWaitingForPermission: true 的展开会话,断言 .sessionAttention pill 可见文本为 Approvalaria-labelWaiting for approval;随后重渲染 isWaitingForUserQuestion 变体,断言 Input / User input needed,以及 sessionAttentionUserInput 类名。

针对新测试的变异探测(见证验证),之后均已还原:

  • 交换渲染处的取值(可见文本 ← 长标签、aria-label ← 短标签)→ 新测试失败(1 failed | 32 passed)。
  • 整行删除 aria-label → 新测试失败(1 failed | 32 passed)。
  • 还原后 → 全部 13 个侧边栏文件 / 191 个测试通过。

该发现所描述的两种回归现在都会被捕获。

[rv:5031022740] 评审正文:「Test Plan ... CodeReviewArtifactDetail.test.tsx / Markdown.test.ts — no such file or directory」— 已拒绝(附证据)

该说法被代码树否定:两个文件分别存在于 packages/web-shell/client/components/artifacts/CodeReviewArtifactDetail.test.tsxpackages/web-shell/client/components/messages/Markdown.test.ts(已用目录列表核实)。出现 "no such file or directory" 的原因与在仓库根目录(而非 packages/web-shell,相对路径只有在后者才能解析)运行 vitest 命令的情形一致。无需代码改动。

冲突说明

无 — 未执行 base 合并。

验证

  • npm run build — 通过(同时修复了最初 vitest 无法解析 @qwen-code/webui/daemon-react-sdk / @qwen-code/sdk/daemon 的导入错误,这些导入需要各 workspace 的 dist/ 产物)。
  • npm run typecheck — 通过。
  • npm run lint — 通过。
  • npx vitest run client/components/sidebar(在 packages/web-shell 下,被触碰的包)— 13 个文件、191 个测试通过。
  • 新测试的变异探测:交换取值 → 按预期失败;删除 aria-label → 按预期失败;还原后 → 191 个测试通过(见上文)。
  • 对两个被触碰文件运行 Prettier — 无需任何改动。

🦷 Gate advisory — this round's changed tests all pass on the pre-round tree (machine-measured, not agent-authored). Expected for a refactor or coverage addition; if this round was meant to FIX a defect, that defect did not reproduce. · 本轮改动的测试在轮前树上全部通过(门自动测量,非 agent 文本)。对重构或补充覆盖属正常;若本轮意在修复缺陷,则该缺陷未能复现。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

Not explored to full depth (tool budget reached): "agent 6b": none — I did not run the test suite itself (read-only verification against HEAD), but every assertion in the new test was traced against the verified source str….

Test Plan (not a blocker): client/components/artifacts/CodeReviewArtifactDetail.test.tsxno such file or directory; client/components/messages/Markdown.test.tsno such file or directory.

中文说明

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

未探索到全部深度(达到工具调用预算):"agent 6b"none — I did not run the test suite itself (read-only verification against HEAD), but every assertion in the new test was traced against the verified source str…

Test Plan(非阻断):client/components/artifacts/CodeReviewArtifactDetail.test.tsxno such file or directory; client/components/messages/Markdown.test.tsno such file or directory

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

Comment on lines +565 to +566
expect(pill?.textContent).toBe('Approval');
expect(pill?.getAttribute('aria-label')).toBe('Waiting for approval');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The new test pins the short/full label pairing but not the pill's style variant: it asserts sessionAttentionUserInput is present on the Input pill yet never asserts it is absent on the Approval pill, so the needsUserInput && guard in the pill's className (WebShellSidebar.tsx:4088) has no witness. The class is not inert — WebShellSidebar.module.css:987 recolors the pill from the green success variant to blue. Making the class unconditional is a one-line mutation under which every attention pill, including approval pills, renders the blue user-input variant while both halves of this test still pass, so the regression would ship green — measured in a scratch tree: the mutation survives (1 passed | 32 skipped), and adding the assertion below turns it red. Note the negative assertion catches the needsUserInput && guard but not the !session.isWaitingForPermission && exclusion inside needsUserInput — pinning that as well needs a session carrying both flags (isWaitingForPermission: true, isWaitingForUserQuestion: true) asserted to render the Approval pill without the user-input class. If you apply the fix, remove the needsUserInput && guard from the cx(...) call in WebShellSidebar.tsx and confirm this test goes red.

Suggested change
expect(pill?.textContent).toBe('Approval');
expect(pill?.getAttribute('aria-label')).toBe('Waiting for approval');
expect(pill?.textContent).toBe('Approval');
expect(pill?.getAttribute('aria-label')).toBe('Waiting for approval');
expect(
pill?.classList.contains(sidebarStyles.sessionAttentionUserInput),
).toBe(false);
中文说明

[Suggestion] 新测试固定了「短标签 + 完整 aria-label」的配对,但没有固定 pill 的样式变体:它断言了 Input pill 上 sessionAttentionUserInput 类存在,却从未断言 Approval pill 上该类不存在,因此 pill className 中的 needsUserInput && 守卫(WebShellSidebar.tsx:4088)没有任何测试见证。这个类并非无效——WebShellSidebar.module.css:987 会把 pill 从绿色 success 变体改为蓝色。把该类变成无条件添加只需一行改动,届时包括 approval 在内的每个 attention pill 都会渲染成蓝色 user-input 变体,而本测试的两部分依然全部通过,回归会带着绿灯上线——已在临时工作树实测:该变异存活(1 passed | 32 skipped),加入下方断言后变红。注意:该负向断言能捕获 needsUserInput && 守卫,但捕获不到 needsUserInput 内部的 !session.isWaitingForPermission && 排除条件——要固定后者,还需要一个同时携带两个标志(isWaitingForPermission: true, isWaitingForUserQuestion: true)的会话,断言其渲染出 Approval pill 且不带 user-input 类。如果应用此修复,请删除 WebShellSidebar.tsxcx(...) 调用里的 needsUserInput && 守卫并确认本测试变红。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下:

Address-review summary — PR #10157, round 2

Feedback points and decisions

[rc:3864213027] WebShellSidebar.collapse-persist.test.tsx:566[Suggestion] attention pill style variant not pinned → Fixed

The claim was verified against HEAD before implementing: the new test asserted sessionAttentionUserInput is present on the Input pill but never absent on the Approval pill, so the needsUserInput && guard in the pill's className (WebShellSidebar.tsx) had no witness, and the class is not inert (WebShellSidebar.module.css recolors the pill from the green success variant to blue).

Changes (test-only, +23 lines, inside the test this PR added):

  1. Added the suggested negative assertion to the Approval state: the Approval pill must NOT carry sessionAttentionUserInput.
  2. Added the both-flags state (isWaitingForPermission: true, isWaitingForUserQuestion: true) exactly as the finding described: it asserts the Approval pill renders (short label + full aria-label) without the user-input class, pinning the !session.isWaitingForPermission && exclusion inside needsUserInput, which the negative assertion alone cannot catch.

Mutation probes (both on the focused test):

  • Removed the needsUserInput && guard from the cx(...) call → test FAILED (1 failed | 32 skipped); restored → green.
  • Removed !session.isWaitingForPermission && from needsUserInput → test FAILED (1 failed | 32 skipped); restored → green.

[rv:5032190332] review body — COMMENTED, "suggestions are inline" → addressed via the inline finding above

The review body's "Test Plan (not a blocker)" note (CodeReviewArtifactDetail.test.tsx / Markdown.test.ts — "no such file or directory") was checked: both files exist under packages/web-shell/client/components/...; the note came from resolving the paths without the packages/web-shell/ prefix. No action needed; it was explicitly non-blocking.

Failed checks: "Signal the reviewed fork PR: CANCELLED"

Workflow signal, not an actionable code finding — no action.

Conflict notes

None (--conflict false; no merge performed).

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx vitest run (packages/web-shell, full suite) — 198 files passed, 4251 tests passed
  • Focused: WebShellSidebar.collapse-persist.test.tsx — 33 passed
  • Mutation probe A (drop needsUserInput && guard) — test failed as expected, then restored and green
  • Mutation probe B (drop !session.isWaitingForPermission && exclusion) — test failed as expected, then restored and green
  • prettier --check on the changed file — passed
  • Integration tests / npm run bundle — not applicable (test-only change in web-shell, not exercised through the bundled CLI)
  • npm run generate:settings-schema — not applicable (no settings source changed)

Commit: 273d2eec1dfix(web-shell): Pin sidebar attention pill style variant in test (#10157)

中文说明

处理审查反馈总结 — PR #10157,第 2 轮

反馈点及处理决定

[rc:3864213027] WebShellSidebar.collapse-persist.test.tsx:566[建议] 未固定 attention pill 的样式变体 → 已修复

在实施前已对照 HEAD 验证该说法:新测试断言了 Input pill 上存在 sessionAttentionUserInput,却从未断言 Approval pill 上不存在该类,因此 pill className 中的 needsUserInput && 守卫(WebShellSidebar.tsx)没有任何测试见证;而且该类并非无效——WebShellSidebar.module.css 会把 pill 从绿色 success 变体改为蓝色。

改动(仅测试,+23 行,全部位于本 PR 新增的测试内):

  1. 按建议为 Approval 状态添加了负向断言:Approval pill 不得携带 sessionAttentionUserInput
  2. 按反馈描述添加了双标志状态(isWaitingForPermission: true, isWaitingForUserQuestion: true):断言渲染出 Approval pill(短标签 + 完整 aria-label)且不带 user-input 类,从而固定 needsUserInput 内部的 !session.isWaitingForPermission && 排除条件——仅靠负向断言无法捕获这一点。

变异探针(均针对聚焦测试):

  • 删除 cx(...) 调用中的 needsUserInput && 守卫 → 测试失败(1 failed | 32 skipped);恢复后变绿。
  • 删除 needsUserInput 中的 !session.isWaitingForPermission && → 测试失败(1 failed | 32 skipped);恢复后变绿。

[rv:5032190332] 审查正文 — COMMENTED,「建议见行内」→ 已通过上述行内反馈处理

审查正文中的「Test Plan(非阻断)」备注(CodeReviewArtifactDetail.test.tsx / Markdown.test.ts — "no such file or directory")已核实:两个文件均存在于 packages/web-shell/client/components/... 下;该备注是因为解析路径时缺少 packages/web-shell/ 前缀。无需处理,且明确标注为非阻断。

失败检查:「Signal the reviewed fork PR: CANCELLED」

属于工作流信号,并非可处理的代码问题——无需操作。

冲突说明

无(--conflict false;未执行合并)。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • npx vitest run(packages/web-shell 全量)— 198 个文件通过,4251 个测试通过
  • 聚焦:WebShellSidebar.collapse-persist.test.tsx — 33 个通过
  • 变异探针 A(删除 needsUserInput && 守卫)— 测试按预期失败,恢复后变绿
  • 变异探针 B(删除 !session.isWaitingForPermission && 排除条件)— 测试按预期失败,恢复后变绿
  • prettier --check(改动文件)— 通过
  • 集成测试 / npm run bundle — 不适用(仅 web-shell 测试改动,不经过打包后的 CLI 执行)
  • npm run generate:settings-schema — 不适用(未改动 settings 源)

提交:273d2eec1dfix(web-shell): Pin sidebar attention pill style variant in test (#10157)

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 26, 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.

No issues found. LGTM! ✅

Test Plan (not a blocker): client/components/artifacts/CodeReviewArtifactDetail.test.tsxno such file or directory; client/components/messages/Markdown.test.tsno such file or directory.

中文说明

未发现问题。LGTM!✅

Test Plan(非阻断):client/components/artifacts/CodeReviewArtifactDetail.test.tsxno such file or directory; client/components/messages/Markdown.test.tsno such file or directory

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

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

独立复审(head 273d2eec,3 个提交,5 个文件,+81/−10)。在 scratch clone 中检出该 head 做了静态交叉验证。结论:💬 无阻塞项——四处视觉修复均如实实现,未发现新问题。

已独立验证

  • 加粗可见性Markdown.module.css.content strong, .content b 从 500 提到 600;正文未显式设重(继承常规字重),而各级标题同为 600 但字号更大,层级不受影响——加粗从此与正文可区分。
  • 注意力胶囊短标签.sessionAttention 本身是 white-space: nowrap 的胶囊,原文案"Waiting for approval / User input needed"必然侵占会话名宽度;改为 "Approval / Input"(中文"待批准 / 需输入")是正解。完整文案保留在 aria-label 中,可访问性不受损;折叠态轨道用的 collapsedSessionStatusLabel 仍使用完整文案(该处为无障碍文本、无宽度约束),取舍正确。优先级语义未变(isWaitingForPermission 优先,needsUserInput 仅在无审批等待时成立),!attentionLabel!attention 的对象真值判断与原先字符串判断等价。
  • Refresh 大小写common.refresh 仅被四个管理页(Agents / MCP / Extensions / Skills)的刷新按钮消费,EN 改为 "Refresh" 后全部一致;ZH"刷新"无大小写概念,不受影响。仓库只有 EN / ZH 两个语言字典,无遗漏语言。
  • 统计卡片防折行:指标标签集合是封闭的(Total / Critical / Suggestion / Nice to have / high confidence / low confidence / Held 及对应中文),最长英文标签约 15 字符,11px 字号下约 80–85px,小于新的 96px 最小列宽,white-space: nowrap 不会造成溢出;auto-fit 网格继续保证任意面板宽度下均匀布局。
  • 测试:新增用例同时钉住三态(仅审批、审批+输入、仅输入)的短文案、完整 aria-label 以及 sessionAttentionUserInput 变体的出现与缺席,与实现的分支完全一致。
  • 前轮行内意见全部落实:早先三条建议(短/全标签两个三元条件重复且配对仅靠约定、缺钉住短文案与 aria-label 配对的测试、用例只断言变体出现未断言缺席)在当前 head 分别由"单一 attention 对象承载 full/short"、新增配对测试、显式 .toBe(false) 断言解决。
  • CI:实质性通道在 273d2eec 全绿(ubuntu 单测、web-shell E2E Smoke、Web-shell Visuals、Desktop Shell ×2、安全扫描、CVE 审计;其余为条件跳过)。

一点状态说明:reviewDecision 目前仍是 REVIEW_REQUIRED(自动化批准不满足 ruleset 的评审要求),合并前需要人类维护者的批准。


Independent re-review at head 273d2eec (3 commits, 5 files, +81/−10), cross-verified statically against the checked-out head tree. Verdict: 💬 no blockers — all four visual fixes are genuinely implemented and no new issues were found.

Independently verified

  • Bold visibility: .content strong, .content b moves from 500 to 600 in Markdown.module.css; the body carries no explicit weight (inherits the regular weight) while headings share 600 at larger sizes, so hierarchy is unaffected — bold is now distinguishable from prose.
  • Attention pill short labels: .sessionAttention is a white-space: nowrap pill, so the old "Waiting for approval / User input needed" text inevitably squeezed the session name; switching to "Approval / Input" (Chinese "待批准 / 需输入") is the right fix. The full text survives in aria-label, so accessibility is intact; the collapsed-rail collapsedSessionStatusLabel correctly keeps the full wording (it is assistive text with no width constraint). Precedence semantics are unchanged (isWaitingForPermission first; needsUserInput only without a pending approval), and the !attentionLabel!attention object truthiness check is equivalent to the old string check.
  • Refresh casing: common.refresh is consumed only by the refresh buttons on the four manager pages (Agents / MCP / Extensions / Skills); capitalizing EN to "Refresh" makes them consistent, and ZH "刷新" has no case and is untouched. The repo has only EN / ZH dictionaries — no language missed.
  • Stat card wrapping: the metric label set is closed (Total / Critical / Suggestion / Nice to have / high confidence / low confidence / Held and their Chinese counterparts); the longest English label is about 15 characters, roughly 80–85px at the 11px font size — below the new 96px minimum column width, so white-space: nowrap cannot overflow; the auto-fit grid keeps the cards even at any panel width.
  • Tests: the new case pins all three states (approval only, approval + input, input only) — short text, full aria-label, and both the presence and absence of the sessionAttentionUserInput variant — fully consistent with the implementation's branching.
  • All earlier inline suggestions addressed: the three prior comments (duplicated short/full ternaries paired only by convention, no test pinning the short-text/aria-label pairing, and variant assertions covering presence only) are resolved at the current head by a single attention object carrying full/short, the new pairing test, and explicit .toBe(false) assertions respectively.
  • CI: substantive lanes are green at 273d2eec (ubuntu unit suite, web-shell E2E Smoke, Web-shell Visuals, both Desktop Shell lanes, secret scan, CVE audit; the rest skip by condition).

One status note: reviewDecision is still REVIEW_REQUIRED (the automated approval does not satisfy the ruleset's review requirement), so a human maintainer approval is needed before merging.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

AutoFix round summary — no action needed

No new actionable feedback arrived since the last evaluation (2026-08-26T15:36:21Z), so this round changed nothing and pushed no commits.

What was triaged

  • One new review (rv:5036078473, @ytahdn, 2026-08-27): an independent re-review at head 273d2eec with the verdict no blockers — all four visual fixes (bold weight, attention-pill short labels, Refresh casing, stat-card wrap protection) verified as genuinely implemented, all three earlier inline suggestions confirmed resolved, and no new issues found. This is a verification, not a change request — there is nothing to implement.
  • Inline comments: none new. The three earlier [Suggestion] findings (2026-08-26 13:33–15:17Z) predate the last evaluation and were already resolved in prior rounds by the single attention object carrying full/short, the short-text/aria-label pairing test, and explicit .toBe(false) variant-absence assertions — which this new re-review independently confirmed.
  • Issue-level comments: nothing new from maintainers; the newest entries are bot round summaries.
  • Checks: all substantive CI lanes are green at 273d2eec (ubuntu unit suite, web-shell E2E Smoke, Web-shell Visuals, both Desktop Shell lanes, secret scan, CVE audit); remaining lanes skip by condition. No failed or persisting-red checks.

Read-only sanity checks run this round

  • git rev-parse HEAD / git status — head is 273d2eec (the exact commit the new review evaluated), working tree clean, branch fix/web-shell-visual-polish.
  • git diff origin/main...HEAD --stat — 5 files, +81/−10, matching the reviewed state.
  • Raw feedback payloads (rv.json, rc.json, ic.json, checks.json) cross-checked against the triaged feedback.md — no actionable item was filtered out.

Remaining step (not bot work)

The re-review notes reviewDecision is still REVIEW_REQUIRED: the ruleset requires a human maintainer approval, which the automated reviewer cannot satisfy. The code itself needs no further changes from this loop.

No files changed. No commits pushed.

中文说明

AutoFix 轮次总结 — 无需操作

自上次评估(2026-08-26T15:36:21Z)以来没有新的可处理反馈,因此本轮未做任何修改,也未推送任何提交。

本次分类处理的内容

  • 一条新评审(rv:5036078473,@ytahdn,2026-08-27):针对 head 273d2eec 的独立复审,结论为无阻塞项 —— 四处视觉修复(加粗字重、注意力胶囊短标签、Refresh 大小写、统计卡片防折行)均经核实确已如实实现,早先三条行内建议均确认已解决,未发现新问题。这是一次核实性评审,不是修改请求 —— 没有需要实现的内容。
  • 行内评论:没有新的。三条早先的 [Suggestion] 意见(2026-08-26 13:33–15:17Z)早于上次评估,且已在之前的轮次中通过承载 full/short 的单一 attention 对象、短文案/aria-label 配对测试以及显式的 .toBe(false) 变体缺席断言解决 —— 本次新复审已独立确认了这一点。
  • 议题级评论:维护者没有新的反馈;最新的条目均为机器人的轮次总结。
  • 检查273d2eec 上所有实质性 CI 通道均为绿色(ubuntu 单测、web-shell E2E Smoke、Web-shell Visuals、两条 Desktop Shell 通道、密钥扫描、CVE 审计);其余通道按条件跳过。没有失败或持续红色的检查。

本轮执行的只读核查

  • git rev-parse HEAD / git status —— head 为 273d2eec(正是新评审所评估的提交),工作树干净,分支为 fix/web-shell-visual-polish
  • git diff origin/main...HEAD --stat —— 5 个文件,+81/−10,与受评审的状态一致。
  • 将原始反馈数据(rv.jsonrc.jsonic.jsonchecks.json)与分类后的 feedback.md 交叉核对 —— 没有任何可处理条目被过滤遗漏。

剩余步骤(非机器人工作)

复审指出 reviewDecision 仍为 REVIEW_REQUIRED:规则集要求人类维护者批准,这是自动化评审无法满足的。代码本身不需要本循环再做任何修改。

未修改任何文件。未推送任何提交。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@wenshao
wenshao enabled auto-merge August 27, 2026 01:29

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

独立复审(head 273d2eec,3 个提交,5 个文件,+81/−10)。在 scratch clone 中检出该 head 做了静态交叉验证。本批准继此前在同一 head 上的零发现全文评审之后提交。结论:✅ 批准——四处视觉修复均如实实现,未发现新问题。

已独立验证

  • 加粗可见性Markdown.module.css.content strong, .content b 从 500 提到 600;正文未显式设重(继承常规字重),而各级标题同为 600 但字号更大,层级不受影响——加粗从此与正文可区分。
  • 注意力胶囊短标签.sessionAttention 本身是 white-space: nowrap 的胶囊,原文案"Waiting for approval / User input needed"必然侵占会话名宽度;改为 "Approval / Input"(中文"待批准 / 需输入")是正解。完整文案保留在 aria-label 中,可访问性不受损;折叠态轨道用的 collapsedSessionStatusLabel 仍使用完整文案(该处为无障碍文本、无宽度约束),取舍正确。优先级语义未变(isWaitingForPermission 优先,needsUserInput 仅在无审批等待时成立),!attentionLabel!attention 的对象真值判断与原先字符串判断等价。
  • Refresh 大小写common.refresh 仅被四个管理页(Agents / MCP / Extensions / Skills)的刷新按钮消费,EN 改为 "Refresh" 后全部一致;ZH"刷新"无大小写概念,不受影响。仓库只有 EN / ZH 两个语言字典,无遗漏语言。
  • 统计卡片防折行:指标标签集合是封闭的(Total / Critical / Suggestion / Nice to have / high confidence / low confidence / Held 及对应中文),最长英文标签约 15 字符,11px 字号下约 80–85px,小于新的 96px 最小列宽,white-space: nowrap 不会造成溢出;auto-fit 网格继续保证任意面板宽度下均匀布局。
  • 测试:新增用例同时钉住三态(仅审批、审批+输入、仅输入)的短文案、完整 aria-label 以及 sessionAttentionUserInput 变体的出现与缺席,与实现的分支完全一致。
  • 前轮行内意见全部落实:早先三条建议(短/全标签两个三元条件重复且配对仅靠约定、缺钉住短文案与 aria-label 配对的测试、用例只断言变体出现未断言缺席)在当前 head 分别由"单一 attention 对象承载 full/short"、新增配对测试、显式 .toBe(false) 断言解决。
  • CI:实质性通道在 273d2eec 全绿(ubuntu 单测、web-shell E2E Smoke、Web-shell Visuals、Desktop Shell ×2、安全扫描、CVE 审计;其余为条件跳过)。

一点状态说明:reviewDecision 目前仍是 REVIEW_REQUIRED(自动化批准不满足 ruleset 的评审要求),本批准即为所需的人类维护者批准。


Independent re-review at head 273d2eec (3 commits, 5 files, +81/−10), cross-verified statically against the checked-out head tree. This approval follows the earlier zero-finding full review at the same head. Verdict: ✅ approving — all four visual fixes are genuinely implemented and no new issues were found.

Independently verified

  • Bold visibility: .content strong, .content b moves from 500 to 600 in Markdown.module.css; the body carries no explicit weight (inherits the regular weight) while headings share 600 at larger sizes, so hierarchy is unaffected — bold is now distinguishable from prose.
  • Attention pill short labels: .sessionAttention is a white-space: nowrap pill, so the old "Waiting for approval / User input needed" text inevitably squeezed the session name; switching to "Approval / Input" (Chinese "待批准 / 需输入") is the right fix. The full text survives in aria-label, so accessibility is intact; the collapsed-rail collapsedSessionStatusLabel correctly keeps the full wording (it is assistive text with no width constraint). Precedence semantics are unchanged (isWaitingForPermission first; needsUserInput only without a pending approval), and the !attentionLabel!attention object truthiness check is equivalent to the old string check.
  • Refresh casing: common.refresh is consumed only by the refresh buttons on the four manager pages (Agents / MCP / Extensions / Skills); capitalizing EN to "Refresh" makes them consistent, and ZH "刷新" has no case and is untouched. The repo has only EN / ZH dictionaries — no language missed.
  • Stat card wrapping: the metric label set is closed (Total / Critical / Suggestion / Nice to have / high confidence / low confidence / Held and their Chinese counterparts); the longest English label is about 15 characters, roughly 80–85px at the 11px font size — below the new 96px minimum column width, so white-space: nowrap cannot overflow; the auto-fit grid keeps the cards even at any panel width.
  • Tests: the new case pins all three states (approval only, approval + input, input only) — short text, full aria-label, and both the presence and absence of the sessionAttentionUserInput variant — fully consistent with the implementation's branching.
  • All earlier inline suggestions addressed: the three prior comments (duplicated short/full ternaries paired only by convention, no test pinning the short-text/aria-label pairing, and variant assertions covering presence only) are resolved at the current head by a single attention object carrying full/short, the new pairing test, and explicit .toBe(false) assertions respectively.
  • CI: substantive lanes are green at 273d2eec (ubuntu unit suite, web-shell E2E Smoke, Web-shell Visuals, both Desktop Shell lanes, secret scan, CVE audit; the rest skip by condition).

One status note: reviewDecision is still REVIEW_REQUIRED (the automated approval does not satisfy the ruleset's review requirement); this approval serves as the required human maintainer approval.

@wenshao
wenshao added this pull request to the merge queue Aug 27, 2026
Merged via the queue into QwenLM:main with commit 1ca8cc5 Aug 27, 2026
76 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants