fix(web-shell): Polish transcript, sidebar, and manager page visuals - #10157
Conversation
Test report
|
|
Thanks for the PR! Template looks good ✓
Moving on to code review. 🔍 中文说明感谢贡献! 模板完整 ✓
进入代码审查。🔍 — Qwen Code · qwen3.8-max Reviewed at |
Code reviewRe-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:
No correctness issues, no convention violations — module CSS and semantic tokens untouched, new i18n keys added in both EN and ZH. Testing evidenceUnattended 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
One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。 macOS/Windows unit jobs remain gated in 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 The pixel-level claim therefore still rests on the author's before/after screenshots. Sandboxed verification would settle it: 中文说明代码审查在同一 head 提交上的 re-run——diff 仍然与描述完全一致,没有多余改动;四处单点修复均已重新结合上下文核实:
无正确性问题,无规范违规——CSS Module 与语义 token 未动,新增 i18n 键中英双语齐备。 测试证据无人值守 CI 运行——此处未构建或执行任何 PR 代码;以上是通过 checks API 获取的该提交自身的 CI 结果。上一轮之后 CI 已全部结束:所有实质性检查均为绿色。表格区域由 finalize 工作流维护。 macOS/Windows 单元测试在 未独立验证:Windows/Linux 渲染——作者的截图仅覆盖 macOS(引自 PR 描述,属作者声明,非此处复跑)。绿色的视觉截图任务在 Linux 上执行,但它是截图采集而非像素对比——绿色只代表"能渲染、能截图",不代表"更好看"。 因此像素级效果仍依赖作者的 before/after 截图。沙箱验证可以补齐: — Qwen Code · qwen3.8-max Reviewed at |
|
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 |
🖼️ web-shell visual previewRendered against a mock daemon (no real backend): the PR base vs this PR head Screenshots · before / afterFull-resolution recordings (.webm) are attached to the workflow run. — Qwen Code · web-shell visuals |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship — CI landed green after the review. ✅
|
@qwen-code /triage |
|
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 reportPR #10157 verification — fix(web-shell): Polish transcript, sidebar, and manager page visualsVerdict: 中文摘要
Central claim and A/BCentral 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
Witnesses: 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 ( Corrections
FindingsF1 — Suggestion: none of the four changes is pinned by any test. The PR ships no test changes. Mutation matrix ( F2 — Suggestion: the a11y rationale ("full text remains available to assistive technology") is not guaranteed. The pill is a F3 — Pre-existing, not this PR: Not covered
MethodologyEnvironment: CI verify container ( Flakiness gate logEvidence imagesHarness scripts and raw logs are in the workflow run artifacts (7-day retention). — Qwen Code · sandboxed verification |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed — no blockers. Suggestions are inline.
Test Plan (not a blocker): client/components/artifacts/CodeReviewArtifactDetail.test.tsx — no such file or directory; client/components/messages/Markdown.test.ts — no such file or directory.
中文说明
已审查——无阻断问题。 建议见行内评论。
Test Plan(非阻断):client/components/artifacts/CodeReviewArtifactDetail.test.tsx — no such file or directory; client/components/messages/Markdown.test.ts — no such file or directory。
— qwen3.8-max via Qwen Code /review (v0.22.0)
| const attentionShortLabel = session.isWaitingForPermission | ||
| ? t('sidebar.waitingForApprovalShort') | ||
| : needsUserInput | ||
| ? t('sidebar.userInputNeededShort') | ||
| : null; |
There was a problem hiding this comment.
[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} |
There was a problem hiding this comment.
[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)
|
@qwen-code /takeover |
|
🤝 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 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。本 PR 来自 fork,首轮处理将由下一次定时扫描执行(通常几分钟内)。移除 |
…pairing (QwenLM#10157) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
🤖 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: Feedback points and dispositions[rc:3863242916] Duplicated branching in
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
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.tsx — no such file or directory; client/components/messages/Markdown.test.ts — no 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.tsx — no such file or directory; client/components/messages/Markdown.test.ts — no such file or directory。
— qwen3.8-max via Qwen Code /review (v0.22.2)
| expect(pill?.textContent).toBe('Approval'); | ||
| expect(pill?.getAttribute('aria-label')).toBe('Waiting for approval'); |
There was a problem hiding this comment.
[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.
| 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.tsx 中 cx(...) 调用里的 needsUserInput && 守卫并确认本测试变红。
— qwen3.8-max via Qwen Code /review (v0.22.2)
|
🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下: Address-review summary — PR #10157, round 2Feedback points and decisions[rc:3864213027]
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
No issues found. LGTM! ✅
Test Plan (not a blocker): client/components/artifacts/CodeReviewArtifactDetail.test.tsx — no such file or directory; client/components/messages/Markdown.test.ts — no such file or directory.
中文说明
未发现问题。LGTM!✅
Test Plan(非阻断):client/components/artifacts/CodeReviewArtifactDetail.test.tsx — no such file or directory; client/components/messages/Markdown.test.ts — no such file or directory。
— qwen3.8-max via Qwen Code /review (v0.22.2)
ytahdn
left a comment
There was a problem hiding this comment.
独立复审(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 bmoves from 500 to 600 inMarkdown.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:
.sessionAttentionis awhite-space: nowrappill, 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 inaria-label, so accessibility is intact; the collapsed-railcollapsedSessionStatusLabelcorrectly keeps the full wording (it is assistive text with no width constraint). Precedence semantics are unchanged (isWaitingForPermissionfirst;needsUserInputonly without a pending approval), and the!attentionLabel→!attentionobject truthiness check is equivalent to the old string check. - Refresh casing:
common.refreshis 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: nowrapcannot overflow; theauto-fitgrid 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 thesessionAttentionUserInputvariant — 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-labelpairing, and variant assertions covering presence only) are resolved at the current head by a singleattentionobject carryingfull/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.
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: AutoFix round summary — no action neededNo 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
Read-only sanity checks run this round
Remaining step (not bot work)The re-review notes No files changed. No commits pushed. 中文说明AutoFix 轮次总结 — 无需操作自上次评估(2026-08-26T15:36:21Z)以来没有新的可处理反馈,因此本轮未做任何修改,也未推送任何提交。 本次分类处理的内容
本轮执行的只读核查
剩余步骤(非机器人工作)复审指出 未修改任何文件。未推送任何提交。 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
ytahdn
left a comment
There was a problem hiding this comment.
独立复审(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 bmoves from 500 to 600 inMarkdown.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:
.sessionAttentionis awhite-space: nowrappill, 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 inaria-label, so accessibility is intact; the collapsed-railcollapsedSessionStatusLabelcorrectly keeps the full wording (it is assistive text with no width constraint). Precedence semantics are unchanged (isWaitingForPermissionfirst;needsUserInputonly without a pending approval), and the!attentionLabel→!attentionobject truthiness check is equivalent to the old string check. - Refresh casing:
common.refreshis 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: nowrapcannot overflow; theauto-fitgrid 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 thesessionAttentionUserInputvariant — 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-labelpairing, and variant assertions covering presence only) are resolved at the current head by a singleattentionobject carryingfull/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.















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:
**important**passages were indistinguishable from the surrounding prose.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
cd packages/web-shell && npm run test:e2e:visuals— all screenshot tests pass, and thesession-transcript,sidebar-attention,extensions-manager, andcode-review-artifactcaptures show the differences below.npx vitest run client/components/sidebar client/components/artifacts/CodeReviewArtifactDetail.test.tsx client/components/messages/Markdown.test.tsfrompackages/web-shell(129 tests green).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:Sidebar — session names survive the attention pill:
Manager pages — consistent button casing:
Code review stat cards — labels stay on one line:
Full-page captures (dark & light)
Session transcript (dark):
Sidebar attention pill (dark):
Extensions manager (dark):
Code review stat cards (dark):
Session transcript (light):
Sidebar attention pill (light):
Extensions manager (light):
Code review stat cards (light):
Tested on
Environment (optional)
Web Shell visual regression harness (mock daemon), captured in both dark and light themes; unit tests via vitest.
Risk & Scope
Linked Issues
N/A
中文说明
本次 PR 内容
对 Web Shell 界面的四个视觉问题进行打磨,问题来自一次覆盖 16 个界面、明暗双主题的全面截图走查:
**重点**内容与周围文字无法区分。为什么需要
一次对 Web Shell 的视觉走查发现了多处信息层级失效的地方:强调文本没有强调效果、会话名在最需要可读的时刻(会话等待用户处理时)反而不可读、统计卡片标签在词中间折行、按钮大小写跨界面不一致。每处修复都很小,但合在一起能明显减少日常使用中的视觉噪音。
评审测试计划
如何验证
cd packages/web-shell && npm run test:e2e:visuals——全部截图测试通过,session-transcript、sidebar-attention、extensions-manager、code-review-artifact四组截图可看到上述差异。packages/web-shell下运行npx vitest run client/components/sidebar client/components/artifacts/CodeReviewArtifactDetail.test.tsx client/components/messages/Markdown.test.ts(129 个测试全绿)。证据(修复前后)
见上方英文正文的改动区域特写与整页明暗主题对比截图。
测试环境
运行环境(可选)
Web Shell 视觉回归工具(mock daemon),明暗双主题截图;单元测试使用 vitest。
风险与范围
关联 Issue
无