diff --git a/docs/协作/B02-交付-01.md b/docs/协作/B02-交付-01.md new file mode 100644 index 0000000..796b231 --- /dev/null +++ b/docs/协作/B02-交付-01.md @@ -0,0 +1,60 @@ +# B02 交付 01:推荐技能安装状态与重复入口 + +日期:2026-10-21(Asia/Shanghai)。状态:**源码已实现,离线自测通过,Windows UI 待验收**。 + +- 接单基线:`9f1e583e233d176868a54b66a4a14ff3d19efb60`。 +- **受测代码 SHA:`14a1354c95a2081fb32e36917a1b05873b2a662b`**。 +- 需求:[B02-需求](B02-需求.md),YC-005 / YC-006;不改变 B01 的范围或验收结论。 +- 修改 RecommendedSkills、SkillsPage、推荐局部 CSS 和测试;不改恢复源码、身份模型、下载/安装后端、权限或真实用户技能。 + +## 逐项实现与边界 + +| AC | 实现与验证 | +| --- | --- | +| AC5.1 | current 卡片传入 installed,使用原动作槽 `.sm-use-btn` / `UseSkillIcon`;不渲染 Plus 或添加按钮,不再保留卡片下方重复使用动作。DOM 已验证 | +| AC5.2 | 复用已有 REA 恢复卡片/图标与 24×24 槽、16×16 SVG;局部适配浅深 hover/focus/disabled。实际浏览器计算样式/截图未通过执行,不能宣称像素一致 | +| AC5.3 | 保留进度与宿主更新通知;安装后切 current,重开、外部安装/卸载更新已有 state。新 React DOM 夹具验证 | +| AC5.4 | 身份比对保持原逻辑,仍区分禁用、仅模型调用、损坏、同名本地、版本/来源不同、本地修改、workspace。不同来源且损坏仍是同名冲突/替换,不伪装成已安装推荐 | +| AC5.5 | 卡片与详情改为更新/替换/修复明确动作,保留已有来源和覆盖确认;补 current 防护,外部安装完成后旧确认也不发重复安装。后端确认、覆盖与工作区保护未放宽 | +| AC5.6 | 使用保持既有 draft callback,不自动发送;禁用先启用,失败不进入草稿;不可调用 current 禁用使用按钮且不恢复安装按钮。成功 toast 的使用动作保留(已有证据),卡片下方重复动作移除 | +| AC6.1 | 删除 footer DOM、专用 CSS 与 `onViewInstalled` prop,不是 CSS 隐藏 | +| AC6.2 | 保留顶部已安装导航及计数,进入/返回/重开 DOM 验证;原已安装搜索逻辑未修改,不声称新增推荐搜索功能 | +| AC6.3 | 推荐错误/空目录移除重复入口,新增重试加载;SkillHub/套件不可用分支改为提示使用顶部入口,不留重复按钮 | +| AC6.4 | 旧 UI 脚本改用顶部导航,断言 footer 不存在及 current 使用槽;保留安装确认/进度/取消/外部事件/旧帧等回归 | + +现有 source manifest 的 WorkBuddy 5.8.2 与 REA Evidence 范围沿用需求文档;本轮未新取原版证据,不将当前未确认版本或不完整 REA 提取当作新样式结论。 + +## 实测结果 + +[完整离线证据](evidence/B02-delivery-01/verification.txt)、[45 项 DOM 报告](evidence/B02-delivery-01/dom-report.json)、[原生环境失败](evidence/B02-delivery-01/native-ui-blocked.txt)。Linux x64,Node 24.19.0、npm 11.9.0、jsdom 30.1.3;复用已安装依赖,无新增依赖或锁文件变化。 + +- `npm run build`:退出 0,包含类型检查与三端构建。 +- `YCODE_TEST_DOM_MODULE=<已安装jsdom路径> npm run test:recommended-skills:dom`:退出 0,45 项真实 React DOM/受控宿主断言通过。 +- `npm run test:recommended-skills`:退出 0,受控后端检查通过;真实发布包夹具不存在,相关 real-package 项明确跳过,不能因脚本随后通用 PASS 行误报真实包验证通过。 +- `npm run test:composer-capabilities`、设置 DOM 环境后的 `npm run test:alignment`:均退出 0;SDK 部分为受控/mock,不启动真实 CLI/模型。 +- `node scripts/test-recommended-skills-dom.mjs --build-only`:退出 0,仅编译夹具,不验证浏览器。 +- `npm run test:recommended-skills:ui`:**退出 1**,DBus socket 权限与无 X server/DISPLAY 导致 Electron 初始化失败,未进入 renderer;没有绕过限制。脚本去掉原有禁 sandbox 参数,并新增 current 默认/hover/focus、浅深色计算样式及截图采集,须在可用环境重新执行。 +- `check:tokens`:退出 1,仍为相同 6 个既存失败文件;recommended-flow 裸 px 22→21、skills-host 46→45,无新增漂移,不刷新 baseline。 +- 独立复审完成:14 项身份矩阵、45 项 DOM、语法/diff 检查通过,无生产代码阻塞发现。 + +本轮没有调用模型、网络下载技能、访问用户真实技能或原版应用。Windows、窄窗、实际 computed style、像素和完整真实应用安装/使用端到端结果仍未验证;离线 45 项不等于这些验证通过。 + +## 验收入口 + +在固定代码 SHA 的独立检出按协作流程安装并构建;任何完整应用启动必须使用全新隔离 `YCODE_USER_DATA_DIR`,不要复用正式数据。受控 UI 脚本自建临时 userData 和 mock IPC,不下载真实技能。 + +```powershell +npm ci --legacy-peer-deps +npm run build +npm install --prefix .tmp/b02-dom --ignore-scripts --no-audit --no-fund jsdom@30.1.3 +$env:YCODE_TEST_DOM_MODULE = Join-Path $PWD '.tmp/b02-dom/node_modules/jsdom' +npm run test:recommended-skills:dom +npm run test:recommended-skills +npm run test:composer-capabilities +npm run test:alignment +npm run test:recommended-skills:ui +``` + +重点复核安装前后动作槽、已安装卡壳、浅深/hover/focus/窄窗、禁用启用失败、版本/来源/本地修改区分、确认取消/重复点击、外部卸载/重装、目录错误重试,以及顶部导航计数和底部重复入口不存在。完整宿主草稿不自动发送须继续保持。 + +本交付记录可能在源码之后单独提交。只有远端 SHA 核对成功后才算 Git 交接完成;交付完成后推送窗口交回验收端,不预填验收通过。 diff --git a/docs/协作/evidence/B02-delivery-01/dom-report.json b/docs/协作/evidence/B02-delivery-01/dom-report.json new file mode 100644 index 0000000..18e8775 --- /dev/null +++ b/docs/协作/evidence/B02-delivery-01/dom-report.json @@ -0,0 +1,70 @@ +{ + "result": "PASS", + "checks": [ + "uninstalled uses add slot", + "normal footer removed from DOM", + "current uses installed CardFrame", + "current removes Plus/add DOM", + "current use occupies status slot exactly once", + "use invokes one draft callback without installation", + "use does not open install detail", + "top nav count reflects installed list", + "reopen retains current state", + "enable failure prevents draft invocation", + "disabled skill enabled before callback", + "non-invocable current cannot use or reinstall", + "outdated installed identity distinction", + "outdated not represented as first add", + "outdated requires explicit confirmation", + "modified installed identity distinction", + "modified not represented as first add", + "modified requires explicit confirmation", + "broken installed identity distinction", + "broken not represented as first add", + "broken requires explicit confirmation", + "same-name local installed identity distinction", + "same-name local not represented as first add", + "same-name local requires explicit confirmation", + "broken same-name local installed identity distinction", + "broken same-name local not represented as first add", + "broken same-name local requires explicit confirmation", + "different source installed identity distinction", + "different source not represented as first add", + "different source requires explicit confirmation", + "workspace is not treated as managed current", + "external current while confirming prevents duplicate installation", + "first install confirms provenance and scripts", + "duplicate confirmation issues only one request", + "real host progress rendered", + "install success automatically switches action DOM", + "external uninstall restores add", + "external install blocks new add", + "external terminal progress clears block", + "unavailable has no duplicate installed entry", + "catalog retry recovers in place", + "empty catalog has no footer", + "SkillHub has only top installed navigation", + "套件 has only top installed navigation", + "no uncaught renderer errors" + ], + "calls": [ + [ + "enable", + "user:rec" + ], + [ + "enable", + "user:rec" + ], + [ + "install", + "archify", + { + "operationId": "ea0ad528-74c3-4dfe-83a3-e3b848527616", + "overwrite": false + } + ] + ], + "errors": [], + "limits": "Real React in offline jsdom; callback boundary tested, not production composer dispatch. No native Chromium, computed layout, screenshot, theme/hover/focus pixels, model SDK, actual install or network." +} \ No newline at end of file diff --git a/docs/协作/evidence/B02-delivery-01/native-ui-blocked.txt b/docs/协作/evidence/B02-delivery-01/native-ui-blocked.txt new file mode 100644 index 0000000..4912c8b --- /dev/null +++ b/docs/协作/evidence/B02-delivery-01/native-ui-blocked.txt @@ -0,0 +1,19 @@ +Transcribed tool output (not a fresh run; no retry). +Tool exec chunk_id: 19846a +Command: npm run test:recommended-skills:ui +Working directory: /workspace/scratch/0aaa9774aecc/single-package-staging/ycode +Observed exit code: 1 +The launcher sandbox-disabling flags had been removed before this invocation. + +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. + +> ycode@0.0.7 test:recommended-skills:ui +> node scripts/test-recommended-skills-ui.mjs + +[28:1021/135441.068080:ERROR:dbus/bus.cc:408] Failed to connect to the bus: Failed to open socket: Operation not permitted +(node:28) [UNDICI-EHPA] Warning: EnvHttpProxyAgent is experimental, expect them to change at any time. +(Use `electron --trace-warnings ...` to show where the warning was created) +[28:1021/135441.222925:ERROR:ui/ozone/platform/x11/ozone_platform_x11.cc:250] Missing X server or $DISPLAY +[28:1021/135441.222954:ERROR:ui/aura/env.cc:257] The platform failed to initialize. Exiting. + +Boundary: Electron failed before renderer assertions. No native UI pass, screenshots, computed-style verification, Windows theme/narrow/focus parity, or original-app 1:1 result is established by this command. No sandbox bypass or alternate native launch was attempted. Later native-script assertions were syntax-checked only. diff --git a/docs/协作/evidence/B02-delivery-01/verification.txt b/docs/协作/evidence/B02-delivery-01/verification.txt new file mode 100644 index 0000000..e59d8f2 --- /dev/null +++ b/docs/协作/evidence/B02-delivery-01/verification.txt @@ -0,0 +1,244 @@ +B02 offline delivery evidence +Code: 14a1354c95a2081fb32e36917a1b05873b2a662b +Base: 9f1e583e233d176868a54b66a4a14ff3d19efb60 +Linux x64; Node24.19.0/npm11.9.0/jsdom30.1.3. No real model/SDK, original app, or real skill download. +Native UI did not start; do not interpret DOM/build-only as layout evidence. +Backend real-package fixture was SKIPPED despite its following generic PASS phase label. +Independent review: 14 identity cases and 45 DOM checks passed; no blocking finding. + +===== skills-dom-final.txt: exit 0 ===== +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. + +> ycode@0.0.7 test:recommended-skills:dom +> node scripts/test-recommended-skills-dom.mjs + +{"result":"PASS","checks":45,"output":"/workspace/scratch/0aaa9774aecc/single-package-staging/ycode/.tmp/recommended-skills-dom-H0MqNz"} + +===== backend.txt: exit 0 ===== +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. + +> ycode@0.0.7 test:recommended-skills +> esbuild scripts/recommended-skills-backend-regression.ts --bundle --platform=node --format=esm --external:esbuild --outfile=.tmp/recommended-skills-backend-regression.mjs --log-level=warning && node .tmp/recommended-skills-backend-regression.mjs + +{"result":"PASS","checks":50,"phase":"archive"} +{"result":"SKIP","phase":"real-package","reason":"published package not present in .tmp"} +{"result":"PASS","checks":60,"phase":"real-package"} + +===== composer.txt: exit 0 ===== +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. + +> ycode@0.0.7 test:composer-capabilities +> node scripts/run-composer-capabilities-regression.mjs + +prompt-queue-regression: cap, payload, order, isolation, delivery, stop, recovery and unknown checks passed +{ + "result": "PASS", + "checks": [ + { + "name": "parallel same-instance enqueues preserve exactly 19 items", + "pass": true + }, + { + "name": "duplicate take is serialized to one winner", + "pass": true + }, + { + "name": "delivering item is immutable and notify does not duplicate delivery", + "pass": true + }, + { + "name": "clear removes a non-delivering session queue and is idempotent", + "pass": true + }, + { + "name": "first enqueue after an empty queue was paused resumes a new run without unpausing existing work", + "pass": true + }, + { + "name": "incoming payload is validated before host side effects and persistence", + "pass": true + }, + { + "name": "host-rebuilt capability labels are validated before persistence", + "pass": true + }, + { + "name": "two queue instances cannot overwrite one another", + "pass": true + }, + { + "name": "corrupt queue cannot redirect or duplicate item identity", + "pass": true + }, + { + "name": "invalid revision, status and payload permission are rejected", + "pass": true + }, + { + "name": "post-delivery removal failure becomes paused unknown instead of stuck delivering", + "pass": true + }, + { + "name": "stale owner nonce is recovered without trusting a reused PID", + "pass": true + }, + { + "name": "stale and expired lock files are reclaimed", + "pass": true + }, + { + "name": "live foreign lock times out with an explicit error", + "pass": true + }, + { + "name": "blocked notify does not create a state revision", + "pass": true + }, + { + "name": "host resolver applies dispatch-time permission downgrade without mutating stored payload", + "pass": true + } + ] +} +input-composition-regression: precedence, takeover, queue preservation, task placement, toolbar and escape rules passed +{"result":"PASS","checks":30} +{ + "result": "PASS", + "tests": [ + "serial model writes + frozen active turn", + "send failure retry", + "late result/event session isolation", + "draft settings during first session creation", + "nextRequestSettings whitelist" + ] +} +context-usage-regression: latest, previous, active-run, summary identity and failure cases passed +{"result":"PASS","checks":36,"directory":"/workspace/scratch/0aaa9774aecc/single-package-staging/ycode/.tmp/claude-capabilities-CFQh8h"} +npm notice +npm notice New major version of npm available! 11.9.0 -> 12.2.0 +npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.2.0 +npm notice To update run: npm install -g npm@12.2.0 +npm notice + +===== alignment.txt: exit 0 ===== +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. + +> ycode@0.0.7 test:alignment +> node scripts/run-alignment-regression.mjs + +PASS model alignment: fresh/legacy migration, new/edit/default/delete/reload, valid selection (offline host fixtures) +PASS model settings: deferred owner switch, rename mapping, addition selection, empty deletion, immutable history +PASS session factory: first-send preference, mode preservation, invalid permission rejection (isolated ports) +{"historyMessages":10000,"bytes":747781,"parseMs":3.0333960000000104,"storeHydrationMs":0.13541899999999885,"note":"Node parsing/store benchmark only, not browser rendering or Windows IPC performance"} +session-composer-alignment: loading/cache/retry/races/model/permissions/modes/SSR passed +alignment-conversation: local groups, original expanded order, question projection and truthful status passed +A01 native MessageBubble identity aliases, immutable inputs and ordinary raw output passed +A01 imported native card, linked dedup and unknown-position compatibility passed +question-answer-shell: structural and recovered CSS contracts passed +question-answer-shell: DOM hierarchy, controls linkage, click, Enter, Space and inert contracts passed +Runtime progress, session-grant scope and approval lifecycle regressions passed +Permission intercept static rendering passed; interactive keyboard/focus remains UI acceptance +Claude host approval policy unit checks passed (no SDK process/application/matching verification) +Mock SDK replay lifecycle passed: fail closed, retry, session isolation, independent mode guard +task popconfirm DOM regression: 34 checks passed (jsdom, not pixel validation) +question-interaction: 24 DOM behavioral checks passed +question-identity: 30 A01 DOM checks passed (not Electron/pixel/SDK acceptance) +completed-fold-nested: real question/tool/thinking/local-summary remount, event, keyboard and identity contracts passed +completed-fold-native-identity: real reducer done correction, native IDs, insertion/reorder, repeated outer toggles, message isolation and legacy fallback passed +Permission intercept DOM: 14 checks passed (not pixel/SDK verification) +{"checks":37,"passed":true,"scope":"Isolated React DOM and CSS contracts; no native keyboard/layout/pixel acceptance"} +npm notice +npm notice New major version of npm available! 11.9.0 -> 12.2.0 +npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.2.0 +npm notice To update run: npm install -g npm@12.2.0 +npm notice + +===== build.txt: exit 0 ===== +Successful full build tail (command includes typecheck): +out/renderer/assets/chunk-DU6HZSFF-BPbiNeHj.js 271.07 kB +out/renderer/assets/architectureDiagram-5GKGNRK7-o5LZFHEn.js 318.23 kB +out/renderer/assets/katex-Y9ra-ykP.js 497.35 kB +out/renderer/assets/texmath-Bkeg3ZLn.js 594.25 kB +out/renderer/assets/wasm-CVjZL0jK-2Bi6p3c3.js 622.62 kB +out/renderer/assets/cpp-9jHBA231-CtHklR8a.js 626.73 kB +out/renderer/assets/app-BYh1ERuc.js 675.57 kB +out/renderer/assets/emacs-lisp-DjtOxg4j-CUUa7aOE.js 780.06 kB +out/renderer/assets/cytoscape.esm-bVGYt-iW.js 869.69 kB +out/renderer/assets/ArtifactPierreDiff-D5xhRc5y.js 1,119.58 kB +out/renderer/assets/chunk-FOHPRMQF-BCllzKJD.js 1,154.18 kB +out/renderer/assets/index-K0c2JUwW.js 3,761.37 kB +out/renderer/assets/editor.api2-dPwET-7w-BYIQ9bT3.js 4,889.23 kB + +✓ built in 1.94s +npm notice +npm notice New major version of npm available! 11.9.0 -> 12.2.0 +npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.2.0 +npm notice To update run: npm install -g npm@12.2.0 +npm notice +===== fixture-build.txt: exit 0 ===== +{"result":"BUILD_ONLY","output":"/workspace/scratch/0aaa9774aecc/single-package-staging/ycode/.tmp/recommended-skills-dom-Ka7Yeh","limits":"Compiled real React/CSS only; no UI execution or visual verification."} + +===== tokens-before.txt: exit 1 ===== +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. + +> ycode@0.0.7 check:tokens +> node scripts/check-design-tokens.mjs + +设计 token 漂移检查(静态) + 扫描:src/renderer/src 共 367 个文件(用时 46 ms) + baseline:scripts/design-token-baseline.json(334 个文件) + 门禁分类:adapter 8 | core 6 | local 279(合计 293 个文件) + 合计:裸 hex=611 裸 px=2682 !important=6 --wb-* 定义=525 var(--yc-*) 使用=1642 var(--wb-*) 使用=1201 + 非门禁分类:vendor 2 | recovered 22 | source 47 | tokenSource 3(合计 74 个文件,仅记录不阻塞) + 合计:裸 hex=10642 裸 px=13642 !important=920 --wb-* 定义=17966 var(--yc-*) 使用=77 var(--wb-*) 使用=19638 + 非门禁相对 baseline:文件 +0;裸 hex +78 裸 px +64 !important +0 --wb-* 定义 +0 var(--yc-*) 使用 +22 var(--wb-*) 使用 -120 + +结果:失败,共 6 项: + [新增门禁文件] src/renderer/src/capabilities/recommended-flow.css(local):裸 px=22 + [新增门禁文件] src/renderer/src/capabilities/skill-detail-shell.css(local):裸 px=21 + [回归] src/renderer/src/capabilities/skills-host.css(local):裸 px 25 → 46(+21) + [新增门禁文件] src/renderer/src/workbuddy/composer/capability-picker.css(local):裸 hex=26,裸 px=48 + [回归] src/renderer/src/workbuddy/composer/composer.css(local):裸 hex 23 → 38(+15);裸 px 83 → 139(+56) + [新增门禁文件] src/renderer/src/workbuddy/composer/prompt-queue.css(local):裸 hex=8,裸 px=35 + +提示:确认变更符合预期后运行 `node scripts/check-design-tokens.mjs --update-baseline` 刷新 baseline; + 否则请改用 --yc-* token、复用现有值,或去掉重复的 --wb-* 定义。 +提示(不失败,仅记录):3 个门禁文件 token 使用数上升: + src/renderer/src/capabilities/skills-host.css(local):var(--wb-*) 使用 12 → 19(+7) + src/renderer/src/workbuddy/composer/composer.css(local):var(--yc-*) 使用 35 → 47(+12);var(--wb-*) 使用 0 → 1(+1) + src/renderer/src/workbuddy/conversation/conversation.css(local):var(--yc-*) 使用 0 → 4(+4) +提示(不失败):baseline 中 8 个文件已不存在:src/renderer/src/components/ReportedRunUsage.tsx;src/renderer/src/workbuddy/subagents/SourceMemberIcon.tsx;src/renderer/src/workbuddy/subagents/SubagentCollaboration.tsx;src/renderer/src/workbuddy/subagents/SubagentDetailPanel.tsx;src/renderer/src/workbuddy/subagents/adapters.css;src/renderer/src/workbuddy/subagents/member-view.ts;src/renderer/src/workbuddy/subagents/source.css;src/renderer/src/workbuddy/subagents/theme.css +提示:新增门禁文件 36 个且无受控计数(允许):src/renderer/src/capabilities/CapabilityMaintenance.tsx(local);src/renderer/src/capabilities/RecommendedSkills.tsx(local);src/renderer/src/capabilities/SkillAvatar.tsx(local);src/renderer/src/capabilities/SkillDetailShell.tsx(local);src/renderer/src/capabilities/SkillModalPortal.tsx(local);src/renderer/src/capabilities/skill-modal-focus.ts(local);src/renderer/src/components/SessionLoading.tsx(local);src/renderer/src/components/TaskPopconfirm.tsx(local);src/renderer/src/components/session-loading.css(local);src/renderer/src/components/task-popconfirm.css(local);src/renderer/src/components/updates/UpdateSidebarCard.tsx(local);src/renderer/src/components/updates/update-ui-model.ts(local);src/renderer/src/components/updates/update-ui-store.ts(local);src/renderer/src/components/updates/updates-ui.css(local);src/renderer/src/ui/Button.tsx(local);src/renderer/src/ui/IconButton.tsx(local);src/renderer/src/ui/Input.tsx(local);src/renderer/src/ui/Popover.tsx(local);src/renderer/src/ui/Select.tsx(local);src/renderer/src/ui/Switch.tsx(local);…(还有 16 项,详见 --json) + +===== tokens-after.txt: exit 1 ===== +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. + +> ycode@0.0.7 check:tokens +> node scripts/check-design-tokens.mjs + +设计 token 漂移检查(静态) + 扫描:src/renderer/src 共 367 个文件(用时 46 ms) + baseline:scripts/design-token-baseline.json(334 个文件) + 门禁分类:adapter 8 | core 6 | local 279(合计 293 个文件) + 合计:裸 hex=611 裸 px=2680 !important=6 --wb-* 定义=525 var(--yc-*) 使用=1650 var(--wb-*) 使用=1209 + 非门禁分类:vendor 2 | recovered 22 | source 47 | tokenSource 3(合计 74 个文件,仅记录不阻塞) + 合计:裸 hex=10642 裸 px=13642 !important=920 --wb-* 定义=17966 var(--yc-*) 使用=77 var(--wb-*) 使用=19638 + 非门禁相对 baseline:文件 +0;裸 hex +78 裸 px +64 !important +0 --wb-* 定义 +0 var(--yc-*) 使用 +22 var(--wb-*) 使用 -120 + +结果:失败,共 6 项: + [新增门禁文件] src/renderer/src/capabilities/recommended-flow.css(local):裸 px=21 + [新增门禁文件] src/renderer/src/capabilities/skill-detail-shell.css(local):裸 px=21 + [回归] src/renderer/src/capabilities/skills-host.css(local):裸 px 25 → 45(+20) + [新增门禁文件] src/renderer/src/workbuddy/composer/capability-picker.css(local):裸 hex=26,裸 px=48 + [回归] src/renderer/src/workbuddy/composer/composer.css(local):裸 hex 23 → 38(+15);裸 px 83 → 139(+56) + [新增门禁文件] src/renderer/src/workbuddy/composer/prompt-queue.css(local):裸 hex=8,裸 px=35 + +提示:确认变更符合预期后运行 `node scripts/check-design-tokens.mjs --update-baseline` 刷新 baseline; + 否则请改用 --yc-* token、复用现有值,或去掉重复的 --wb-* 定义。 +提示(不失败,仅记录):3 个门禁文件 token 使用数上升: + src/renderer/src/capabilities/skills-host.css(local):var(--wb-*) 使用 12 → 19(+7) + src/renderer/src/workbuddy/composer/composer.css(local):var(--yc-*) 使用 35 → 47(+12);var(--wb-*) 使用 0 → 1(+1) + src/renderer/src/workbuddy/conversation/conversation.css(local):var(--yc-*) 使用 0 → 4(+4) +提示(不失败):baseline 中 8 个文件已不存在:src/renderer/src/components/ReportedRunUsage.tsx;src/renderer/src/workbuddy/subagents/SourceMemberIcon.tsx;src/renderer/src/workbuddy/subagents/SubagentCollaboration.tsx;src/renderer/src/workbuddy/subagents/SubagentDetailPanel.tsx;src/renderer/src/workbuddy/subagents/adapters.css;src/renderer/src/workbuddy/subagents/member-view.ts;src/renderer/src/workbuddy/subagents/source.css;src/renderer/src/workbuddy/subagents/theme.css +提示:新增门禁文件 36 个且无受控计数(允许):src/renderer/src/capabilities/CapabilityMaintenance.tsx(local);src/renderer/src/capabilities/RecommendedSkills.tsx(local);src/renderer/src/capabilities/SkillAvatar.tsx(local);src/renderer/src/capabilities/SkillDetailShell.tsx(local);src/renderer/src/capabilities/SkillModalPortal.tsx(local);src/renderer/src/capabilities/skill-modal-focus.ts(local);src/renderer/src/components/SessionLoading.tsx(local);src/renderer/src/components/TaskPopconfirm.tsx(local);src/renderer/src/components/session-loading.css(local);src/renderer/src/components/task-popconfirm.css(local);src/renderer/src/components/updates/UpdateSidebarCard.tsx(local);src/renderer/src/components/updates/update-ui-model.ts(local);src/renderer/src/components/updates/update-ui-store.ts(local);src/renderer/src/components/updates/updates-ui.css(local);src/renderer/src/ui/Button.tsx(local);src/renderer/src/ui/IconButton.tsx(local);src/renderer/src/ui/Input.tsx(local);src/renderer/src/ui/Popover.tsx(local);src/renderer/src/ui/Select.tsx(local);src/renderer/src/ui/Switch.tsx(local);…(还有 16 项,详见 --json) +