Files
ycode/docs/本轮汇报与决策记录.md
T

12 KiB
Raw Blame History

本轮汇报与决策记录

历史报告。2026-10-15 接手后的现行约束及进度见 接手状态-2026-10-15.md 与根目录 AGENTS.md。本文“REA 不支持 file://、改用直接 CDP”已过时并停用;此前不实现条款不能缩减用户确认的 1:1 目标。

时间:2026-10-15 凌晨 执行方式:用户休息期间自主推进 1:1 还原;需决策处按推荐执行并记录 约束:涉及拆解或对比 WorkBuddy 时使用 REA


一、本轮完成

# 任务 状态 产出
1 用 REA 提取 WorkBuddy 完整 design token 表 ✅ docs/视觉对齐实测.md §11
2 YCode CSS 全面 token 化 ✅ 裸 px 从 321 → 0(仅注释保留实测说明)
3 全局字号档位(六档) ✅ src/renderer/src/fontSize.ts
4 右栏拖拽调宽 ✅ App.tsx + .app-shell__resizer
5 REA 对比与工具边界勘察 ✅ docs/视觉对齐实测.md §12
6 统一汇报 ✅ 本文件

详细

1. Token 表(REA 拆解)

  • open_binary 打开 app.asar → format=asar, kind=archive
  • inspect_artifact(record-and-continue)→ 12253 节点 / 14476 文件 / 45 处完整性矛盾
  • 提取到完整体系:间距阶、字号阶、行高阶、字重阶、控件尺寸阶、圆角阶、 体例语义字号、对话流(chatflow)独立一套、六档全局字号机制

2. Token 化(用户的直接诉求)

  • tokens.css 完整镜像对标体系,--yc-N 编号与 --wb-N 一一对应
  • app.css 全量重写:所有间距/字号/行高/尺寸/圆角/颜色改引用 token
  • 剩余 53 处一次性实测值(如 24.5px、21.45px、324px)提升为具名常量区
  • 结果:声明中不再出现任何裸像素

3. 六档字号

  • 按对标机制实现:--yc-font-offset-global + --yc-md-root,clamp(-1, ·, 2)
  • 快捷键 Ctrl+- / Ctrl++ / Ctrl+0,localStorage 持久化
  • 右栏新增档位控件(− / 6 点轨道 / +)
  • 实测验证:档位 2 = 正文 14px/22px(与实测基线完全一致); 1→6 档为 13→14→15→16→16→16 px,+2 封顶,与对标的夹取规则一致

4. 面板拖拽

  • 绝对定位命中区(6px)贴合网格边界,不占网格列
  • 范围 320–900px,默认 647px,双击还原,localStorage 持久化
  • 拖拽中禁用两侧 pointer-events + 文本选中

二、自主决策记录

用户授权「有需要决策的你先推荐,记录下来,最后统一汇报」。

D1 · 字号档位只走快捷键 + 右栏控件,不加菜单项

  • 推荐做法:Ctrl+-/+/0 + 右栏「界面」面板控件
  • 理由:实测对标的四个菜单是 编辑/窗口/帮助/关于,字号档位在那边是纯快捷键行为。 往「窗口」里塞「放大字号」语义不通,新增「视图」菜单则偏离实测结构
  • 被否决:① 新增「视图」菜单(偏离实测);② 塞进「窗口」菜单(语义错误)
  • 影响:字号档位发现性略低,靠右栏控件补足
  • 如需变更:告诉我加在哪,一行配置的事

D2 · Token 化用「具名常量」而非硬写

  • 推荐做法:把 53 处一次性实测值提为 --yc-* 具名常量
  • 理由:对标自身也硬写这些值(padding:5px 12px、line-height:21px), 但它们在本项目应可检索、可统一替换;且能满足「声明里不出现裸像素」的诉求
  • 被否决:① 原样保留(回到裸 px);② 强行套用标准阶(会改变实测渲染值,破坏 1:1)

D3 · 字体族顺序按实测改为 PingFang SC 打头

  • 理由:实测 computed style 就是 "PingFang SC", -apple-system, …; 我原先 -apple-system 打头会让中文走不同回退,是真实渲染差异
  • 被否决:保持原顺序(视觉上会不一致)

D4 · 等宽字体族改为 ui-monospace 打头

  • 理由:对标 --wb-font-code-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace
  • 被否决:保留 'SF Mono', Monaco, 'Cascadia Code', …(Windows 上 SF Mono/Cascadia 非对标首选)

D5 · 面板宽度的「最大值」口径

  • 过程:我先按「窗口 60%」,后对齐文档已记录的 320–900px
  • 最终采用:320–900px(与既有记录一致,且与窗口尺寸解耦)
  • 被否决:窗口比例制(窗口很宽时面板会过宽,偏离对标手感)

D6 · 详情面板默认收起

  • 理由:实测对标默认态宽 1px(收起)
  • 影响:首次打开看不到右栏,需点标题栏图标。若希望默认展开,改 useState(false) → true

D7 · 不实现侧栏顶部导航排 → 已被用户推翻,改为全部实现(mock)

  • 原决策:不实现(功能不存在,不摆空壳)
  • 用户新指令(2026-10-15 凌晨):「先把外围配齐,登录账号先用 mock 写死数据,通知、发现应用、 收起、搜索、分类、设置等等等」
  • 现行做法:导航项全部渲染(新建任务 / 助理 Beta / 专家·技能·连接器 / 定时任务 / 资料库 / 更多), 尺寸按实测;未实现项点击给出 2 秒临时提示,不伪造可用状态
  • 记录原因:决策被推翻,保留过程便于回溯

D8 · 不实现输入区权限选择器 → 仍不实现(图标已备)

  • 原因不变:权限模型未实现,放一个点了没用的开关是误导
  • 实测值已记录(.cr-permission-setting 132×32),需要时可直接接

D11 · mock 数据的标注方式

  • 推荐做法:mock.ts 统一存放 + MOCK_ 前缀 + UI 上显式标注为示例数据
  • 理由:用户要求用 mock 先把外围配齐;但 mock 若不标注,后续极易被误认为已接入真实数据
  • 被否决:不加标注(风险是假数据被当真的用)
  • 落实:通知面板底部、设置→账号页、账号按钮 title 三处均有标注

D12 · 搜索的落点

  • 推荐做法:放在侧栏导航下方,真实过滤任务列表(而非装饰性输入框)
  • 理由:实测当前视图中对标未展示搜索框;但搜索必须是真功能,否则又是空壳。 做成过滤任务列表,既有用又不偏离结构
  • 被否决:① 不做搜索(用户明确要求);② 放全局搜索但无后端(空壳)

D13 · 未实现入口的反馈方式

  • 推荐做法:点击后 2 秒临时提示,文案含「尚未实现」
  • 被否决:① 完全无反馈(像坏了);② 做成可点但什么都不发生的假功能
  • 理由:外围视觉要齐,但不能谎称有能力

D9 · 图标暂用对标资产,已标注必须替换

  • 现状:icons.tsx 中 15 个图标为 CDP 采集的对标 SVG,文件头已写明「临时占位,发布前必须替换」
  • 依据:docs/reference/ygent-ui-pixel-parity-feasibility-2026-10-14.md 同样指出 「逆向取值的 WB 图标照搬涉及资产许可,建议自绘」
  • 建议替换源:VS Code codicon(MIT,可长期使用)或 Lucide
  • 需要你决策:正式发布前是否替换、用哪套

D10 · 字体族跨机器一致性不做处理

  • 理由:PingFang SC 为 macOS/部分 Windows 系统字体,其他机器会回退到系统中文字体; 对标自身也有同样问题(参考文档 §3.B)
  • 可选方案:打包 Noto Sans SC(OFL 允许再分发);但会显著增大安装包
  • 被否决:本轮不引入字体资产(需你确认体积预算)

三、验证结果

项 方法 结果
类型检查 npm run typecheck ✅ 通过
构建 npm run build ✅ 通过
核心闭环 npm run smoke ✅ 18 项断言通过
运行时 token scripts/verify-tokens.mjs(CDP) ✅ 见下
Token 化回归 scripts/pngdiff.mjs 像素对比 ⚠️ 见下
GPU CDP gpuRenderer ✅ ANGLE (AMD Radeon RX 460, D3D11)

运行时 token 实测(档位 2,窗口 1334×901):

titlebar     30px      ✅ 对齐实测
sidebar      280px     ✅
content-max  832px     ✅
content-pad  40px      ✅
input-max    784px     ✅
body         14px/22   ✅
md-root      17.143px  ✅

Token 化回归对比(ycode-empty.png → ycode-tokens.png): 变化像素 2.673%,最大通道差 230。

  • 已定位的预期变化:.chat-head 上内边距 14px → token 的 12px(原 14px 是我自拟、非实测值)
  • 残余变化主要来自该位移引起的文字抗锯齿重绘
  • 已闭环:本轮结束前补测了真实对话区顶栏 .workbuddy-topbar → 高 64px / padding: 0 16px / 两端对齐,.chat-head 已按此改写。 原先「12px 还是 14px」的悬置问题作废——两者都不是实测值,现取实测的 64px 方案

四、遗留与阻塞

阻塞(需要你)

  1. 移动端/跨机器字体:D10
  2. 图标资产替换:D9
  3. 侧栏导航排是否列入路线图:D7
  4. API Key 未配置 —— L3 动态交互对标的硬前置。 没有真实回合就跑不出事件时间序列,无法比对 docs/reference/ygent-chat-interaction-parity.md 的必测序列

未完成(技术可继续,无需你介入)

  • 正文字号驱动 Markdown 渲染的逐处核对(当前为纯文本 pre-wrap,未接 Markdown 渲染器)
  • 工具卡与折叠行的完整状态机(对标有 .cr-collapse 系列)
  • 助手操作栏(复制/赞/踩/朗读/重试)—— 按约定「不伪造消耗与模型元数据」,暂不做

五、REA 使用记录与边界

已执行:归档级拆解(open_binary + inspect_artifact),拿到结构清单与完整性证据。

发现的工具边界(重要):

REA 的 CDP 浏览器 provider 只枚举 HTTP(S) 页面目标。WorkBuddy 渲染器是 file://:

list_browser_targets http://127.0.0.1:9223
→ targets: []   excluded: { unsupported_url: 1 }

→ inspect_web_page / capture_web_screenshot / compare_web_captures 无法观察 WorkBuddy 主窗口。 要采集 WorkBuddy,仍须用本项目的 CDP 脚本(wb-capture.mjs / wb-tree.mjs / wb-icons.mjs)。 YCode 开发态走 http://localhost,REA 浏览器工具对它可用。

同时,REA 的二进制 provider(Ghidra / IDA / Hopper)本机均未配置,且不接归档目标, 因此没有字符串检索能力——token 表由归档内 CSS 直接提取。

副产品发现:45 处完整性矛盾,首条是 cli/bin/native/win32-x64/job-object.node (声明的 sha256 与伴随文件不符)。该模块正是绑定子进程树的 Job Object 原生实现, 与「GPU 沙箱在受限进程树里创建不了子进程」的观察吻合,值得留意。


六、下一步建议(按优先级)

  1. 配 API Key → 跑真实回合 → 录事件时间序列(打通 L3 的前置,价值最高)
  2. 按 D9 替换图标资产
  3. 补 Markdown 渲染器(正文字号才能按实测逐级生效)
  4. 若确认侧栏导航排要做,先定义功能再接视觉

七、产物索引

文件 内容
docs/视觉对齐实测.md 全部实测数据 + token 表 + REA 证据(427 行)
docs/落地方案.md 架构与里程碑
docs/reference/ 24 份参照文档(含采集 SOP 与 L3 对标规范)
docs/screenshots/ 三个阶段的界面截图
src/renderer/src/styles/tokens.css token 层(编号对齐对标)
src/renderer/src/fontSize.ts 六档字号
scripts/wb-*.mjs WorkBuddy 采集(capture / tree / icons)
scripts/pngdiff.mjs 无依赖 PNG 像素对比
scripts/verify-tokens.mjs 运行时 token 校验