Files
ycode/docs/原版实测与像素对齐-2026-10-15.md
T

135 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 原版实测与像素对齐(2026-10-15)
本轮已恢复 WorkBuddy 的 REA 调试采集,实际取得字体、连续截图、折叠过程与编辑器源码,并完成原版 Pierre Diff 的工程接入和运行验证。最新受控截图中,第一正文段落 39,909 像素零差异,气泡只剩圆角边缘 22 像素相差 1 个灰阶;对话区仍未通过完整 1:1 验收。云端服务、子代理调度继续按用户要求暂后。
## 采集边界
- 目标为 WorkBuddy 5.8.2,Electron 37.10.3,Chrome 138.0.7204.251。
- ASAR SHA-256:`035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
- 原版全部通过本地 REA public CLI/provider 观察,未用外部 CDP、evaluate 或手写 ASAR 提取器绕过 REA。
- 用户“继续”授权恢复调试入口;REA 生命周期 provider 重启成功,Evidence `ev_1475f701415d443a2ebdfa1fe1ee009a36de18f0e89e05d0b2798f0ed2f920ef`。已观察既有对话,未发送新的模型请求。
- 原版观察结束已回到此前“你好”对话。恢复点击、滚动与媒体覆盖的记录随各 Evidence 保留;不能撤销的业务动作不用于本轮采集。
- 现有固定 CSS、JS manifest 保留原 Evidence,新增采集另存不可变归档,未以 latest alias 覆盖固定参考资产。
## 已落地的对话变化
### 完成折叠
`CompletedFold.tsx` / `completed-fold.ts` 已接入真实 `MessageBubble`:结束后默认收起过程,最长正文的全部并列项与最后正文保留在外,中间过程进入“过程消息”;前后过程进入“已完成/已取消”。有实际耗时时显示源码格式的耗时。
依据固定 JS Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`,`src-DbE1_mgM.js` SHA-256 `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4`:classifyPart 943121、formatDurationMs 946919、computeBodyAnchors 972808、applyCompletedFold 973182(UTF-16 offsets)。
`turnDurationMs` 从本地回合开始到终态写入消息、IPC 检查点和持久化;旧消息没有耗时则不补造。问答、可视化工具会拆开连续工具分组;分组头使用频次最高工具的原版图标,并列取先出现者。
限制:YCode 的 plan/task/artifact/image 等自有 part 仍保守保留在外,尚未证明等价于原版全部 widget 谓词、presentationGroup 和重排逻辑。完成折叠算法已对接不等于完整消息投影相同。
### 工具图标
阅读、终端、目录、搜索、网页、MCP、浏览器、电脑、技能、位置以及插件使用 REA 源 SVG。插件五种操作、三组别名共 15 个映射已接入;未知工具采用原版 Wrench fallback。
插件 Evidence `ev_2caae424199a38371af743ef9111db835504c2dae54c1f02e1f9e5511032cc6b`,`renderer/assets/plugin-icon-ri_n6wTH.js` SHA-256 `9f45b4709c3f10b181cadd7fb8fc1e082b99a049e4b6eae6c7c8b31e79534139`。SVG path 2176 字符,与原资产逐字一致;path SHA-256 `aba190972a2534646ec03f28a46fd240e67d41e96db5e230928fbad0aee0e55c`。
### 写入/编辑文件专用卡片
已移除旧 `WriteFileDetails` 泛型双正文,接入 `SourceWriteFileView`:创建/编辑状态、成功文件名链接、增删数或 edits 数、流式 500 行截断、完成内嵌行 Diff、120 行/edits 关闭动效规则。来源为同一固定 JS 的 convertWriteFile 1139197、WriteFileView 1140690、computeLineDiff 989785、aE 992254。
保留 YCode 文件工具字段适配和完整 `oldContent/newContent`,文件名回调携带真实完整工件。实际 Electron UI 已验证内嵌 Diff 文本、21px 行高(原版 12px × 1.75,20px 只是虚拟行估值)、无成功态错误告警,以及键盘打开完整 Pierre 预览且不触发折叠。共享 `SourceToolExpandable` 已补原版 expand 状态切换和 sticky auto-scroll(16px 底部阈值、用户向上滚动退出跟随、嵌套 auto-scroll)。本地 Chrome 138 实测支持 `interpolate-size:allow-keywords`;旧 renderer 的 JS 动画库 fallback 尚未恢复。
内嵌 Diff 的手写 ResizeObserver 虚拟化已替换为原包 TanStack `useVirtualizer`:从同一 REA export 的 `src-DPDj7_qD.js`(SHA-256 `747e41d215375e1214c366213aea7e077d85421923029c61cbb6e9562be58de0`)恢复 35 个绑定及必要 Rolldown 初始化,导入仅有 YCode React/ReactDOM,保留 estimateSize 20、overscan 12、initialRect 260 和原 `measureElement`。恢复脚本、源码锚点、输入/输出摘要与边界在 `recovered-virtualizer/manifest.json`。
实际 300 行写文件样本验证:初始与滚动末端各挂载 25 行;spacer 实测 6025px;滚动到底可见最后的 `value299`;大内容折叠过渡为 0s。`npm run test:tool-virtualizer` 另验证来源/输出摘要、导入边界、SSR 与源 Virtualizer 滚动范围。
限制:原版现代 write-file 文案键没有在现有 REA zh-CN 导出中找到精确翻译,保留原源码英文 fallback;错误正文提示为 YCode 的明确适配。原版条件审批 actions 尚未接入这一专用卡片,审批仍由现有消息交互呈现。TanStack 包独立版本未知,没有安装猜测版本;复杂换行、缩放和反向滚动尚未做原版同画面像素验收。
## 字体与像素
真实平台字体采集 Evidence `ev_0c67c7de9c421f01c5651a58450b2505e035093e7a67ae29c57243d7f13a3569`,保存于 `.tmp/rea-visual-ssh-final-fonts`。修复行内代码旧 `font-size:.75em` 导致的约 11.25px:按原版 `.cr-markdown code` 使用 `font-size:1em`、原 mono stack、3px 圆角和 4px inline padding,现约 15px。
| 实测类别 | 原版实际字形字体 | 本轮对比 |
| --- | --- | --- |
| 中文助手名 | Microsoft YaHei Bold | family、size、weight、PostScript 名与 glyph count 匹配 |
| 中文正文(含拉丁字符) | Noto Sans SC + Segoe UI | 上述项目匹配 |
| 用户气泡 | Noto Sans SC + Segoe UI | 上述项目匹配 |
| 行内代码 | Consolas,15.0001px | 修复后上述项目匹配 |
| 独立英文正文、块代码 | 本轮没有合格可见样本 | 未验证,整体报告仍为 incomplete |
真实字体报告 `.tmp/ycode-font-platform-report-ssh-source-fixed.json` 的非零退出表示缺少必需样本,不能当作全部字体验收通过。字形文件身份没有通过二进制摘要另行证明。
早期相同文本的隔离组件截图基于 greeting Evidence `ev_94c5d7b590c2c0654c3efee73c148c782e8b25ad1c51df14840f0f4192255b97`。使用真实 `MessageBubble` 与 `MarkdownContent`,只校准外层容器位置和可用宽度,没有强制目标字高或字号。下表是环境校准前的历史结果,最新结果见下节。
普通窗口 `showInactive()` 后通过 `Page.captureScreenshot(fromSurface:true)` 采集,完成后关闭窗口;仅操作 YCode 自有 fixture。两区域边界、字体计算属性已匹配,零容差仍不同:
| 区域 | 不同像素 / 总像素 | 比例 | 平均通道差 / 最大差 |
| --- | --- | --- | --- |
| “你好”气泡 | 337 / 2475 | 13.616% | 0.6875 / 46 |
| 第一正文段落 | 6504 / 39909 | 16.297% | 0.9761 / 50 |
历史产物:`.tmp/rea-visual-greeting/ycode-message-parity-visible-debugger-{layout,manifest,capture-analysis}.json` 及同前缀 PNG/diff。两图 RGB8、1336×901、Skia iCCP profile 相同;仅改用原版同截图 API 当时没有使差异收敛。不同像素比例只属于这两个区域,不能换算为整项目还原百分比,也不能直接归因为“不可避免的抗锯齿”。
最新 REA 字体质量计算属性 Evidence `ev_fc29c47ef7b284267584efe1fcabe48345e37a0b03cf492b686faec7aa704324`:原版 `text-rendering:auto`、`-webkit-font-smoothing:antialiased`、`font-kerning:auto`、`font-synthesis:weight style small-caps`、`font-optical-sizing:auto`、`font-feature-settings:normal`、`text-shadow:none`、`zoom:1`。Chromium 不支持 `-moz-osx-font-smoothing` 的 DOMSnapshot 查询,已从采集属性列表去除;保留源码声明并不证明该属性生效。
### 最新渲染环境校准结果
中断后的 REA 进程查询 `ev_9962cbd2fef5e7871b066fd79db9c678538cd5ec4beb2163b007263426f7ed5f` 确认原版无存活进程。沿用已有授权,经 REA 重新启动调试实例,记录 `ev_616e35f1c0466daf77b93c7e199e00283eab5dd0f25004e76d691835c94b9a00`,仍观察原“你好”对话。
本地 REA 字体采集增加 browser-level `SystemInfo.getInfo` 的有限硬件元数据,不使用 renderer evaluate,不保留命令行或用户数据。新原版 Evidence `ev_af6ce1805f575a49d9b37b7d391a07a77a90219a12eb2148cb25930a00da963c` 显示活动设备为 ANGLE SwiftShader,`displayType=ANGLE_SWIFTSHADER`、`glImplementationParts=(gl=egl-angle,angle=swiftshader)`、`gpu_compositing=disabled_software`。
YCode 隔离 fixture 的 `visible-swiftshader` 模式采用软件渲染、SwiftShader 开关、普通可见窗口和相同截图 API。窗口显示后用 `app.getGPUInfo('complete')` 复核,活动设备/ANGLE 类型和上述合成状态相符。此前 `basic` 采样的 inactive/None 只是信息不足,不能据此认定没有 GPU process。该模式仅用于受控验收,没有把工程默认渲染强制改为软件模式。
| 最新零容差区域 | 不同像素 / 总像素 | 最大通道差 | 结论 |
| --- | --- | --- | --- |
| 第一正文段落 | **0 / 39909** | **0** | 该声明区域完全一致 |
| “你好”气泡 | **22 / 2475** | **1** | 仅左上、右上、左下圆角轮廓,不包含字形像素 |
22 个像素均为候选 RGB 比原版暗 1、alpha 相同,原因尚未确证,没有调整 CSS 或放宽容差。原图 SHA-256 `58a4b4e5c5bc2e9df7096ab3aef7bc2a2a7a6234e8259824f833791625a1afa3`,候选 `04c8a45eb26c1df390a36c8fb42232b7aa45ea6a410ac055963547581d3f6e3f`。原图、候选、manifest、diff 图与坐标/RGBA 诊断在 `.tmp/rea-visual-render-environment/`;正文完全一致不能外推为整个聊天页面一致。
## 折叠动态证据
原版完成折叠展开 DOM:`ev_5743426dbec2ba8116957f5ba47d9e0305140b3d15e9b3b6f9bb504054e407f7`。
普通动效:`ev_21079d08279768898d6f030814034cc64abbc4739ed52bfda40af9b52e23a58c`,显式 no-preference 后点击,6 帧高度依次约 168.97、215.72、215.75px,最后稳定;恢复折叠、清除 media override 和归位指针均完成。
现场默认媒体设置:`ev_e7d6aa4edb00cbb04d95f194f62ba644f5ec7887d58c134b0186db8d7ac5fb15`,首采样已展开到 215.75px,computed transition 为 none。`environment_media.reduced_motion` 仍为 null,因此不能仅凭此认定系统 reduce 开启。
源码过渡包含 `.28s cubic-bezier(.33,1,.68,1)` 与 reduce 分支,已使用来源 CSS。PNG 顺序采样约 120ms 间隔,尚不足以验收完整 60fps 曲线、反向中断或所有动效。
## Diff 原版实现
已纠正旧文档的 Monaco Diff 假设:原版 Diff 使用 Pierre CodeView。REA Evidence `ev_eff23685a08fc8c5ed6ad542c21b24337ed3d7a7c9a483628762ae17828b5d36`:
- `renderer/assets/codeEditor-D3P9alks.js`,742606 bytes,SHA-256 `5e9a16dca97c102afc3c73cd7dd32ba63daf5e7ddff12707ee1ea63e7a427b19`。
- `renderer/assets/codeEditor-Bxmo_AI3.css`,8663 bytes,SHA-256 `1c8f2210c731a25f9051088df0db78b9de5b087c802b3a9e36828c1b6b54c353`。
已补 REA 精确成员导出能力,使用既有 AsarArtifactReader、root 摘要、成员大小/摘要/UTF-8 校验;不再因不相关的缺失 macOS unpacked 文件阻断选中的 Windows UI 资产。后续闭包依赖 Evidence `ev_70fcd0703f1b25f160b82f291804d9b17b1a0279a3c47ce7477076a6cd33ffde`、`ev_42eb5b81c01f53e03689a0b6ecc0cb65e21dc1714355e8484c503d2361e9eae5`。
原版包含 split/unified 切换、word-alt 行内差异、bars 指示、line-info 分隔、pierre-light/dark、Shiki JS regex engine 和大文件 viewport highlighter。已用恢复的 Pierre 组件替换旧双 `<pre>`,通过 React.lazy 接入 `ArtifactHostPreview`。
恢复器 `scripts/rea/recover-pierre-diff.mjs` 取原 bundle 的 Babel scope 闭包,绑定 YCode React;未引入 WorkBuddy app-shared、Monaco、i18n 初始化副作用。原代码内所有 311 个动态 chunk 路径已分 20 批经 REA 导出,无缺失;生成 319 个资产,约 10.4MB,完整语言和主题注册表保留。每个 Evidence、源/输出摘要与变换记录在 `src/renderer/src/workbuddy/artifacts/recovered-pierre/manifest.json`。
运行集成已修复两项实际故障:Babel 绑定级重命名原 `__vite__mapDeps`,避免 Vite 再注入同名 helper 导致 SyntaxError;YCode CSP 增加 `worker-src 'self' blob:`,允许原版使用的本地 Blob 高亮 worker。
已按 REA runtime CSS `default-dark-CB7rPan2.css`(SHA-256 `6f1a5b770eceb591ca2e922d075335b170b59ae4e85b2828c176d9a1a5b479fe`)接入 `--vscode-diffCodeContent-background` 的 light `#fff` / dark `#070707`。该文件基于固定 CSS runtime Evidence,未额外宣称 ASAR 匹配。另将原产物专用 `.markdown-content` 映射为 `.artifact-markdown-content`,消除与 YCode 聊天 Markdown 同名导致的灰底及 16px padding 污染。
`npm run verify:pierre` 自启隔离本地服务器,已实际验证:split/unified 来回切换、Shiki 多色高亮、word spans、行号、+1/-1 统计、13px 字号/20px 行高、通过设置切换明暗主题、新增与删除、无差异 header-only 源码行为,以及聊天 Markdown 背景透明且 padding 0。控制台错误 0。报告 `.tmp/pierre-diff-ui-report.json`;截图 `.tmp/conversation-pierre-diff-2026-10-15.png` 与 `conversation-pierre-diff-dark-2026-10-15.png`。
限制:这些是 YCode 自有 fixture 的运行验证,尚无相同原版 Diff 画面的像素对照;大文件 viewport highlighter、所有语言的实际词法结果和复杂选择/滚动状态未逐项验证。standalone worker 可选 `shiki-wasm` 分支引用的另一个精确 chunk 未在原包找到,默认 `shiki-js` 路径已运行;不能因此称所有可选分支完整通过。
## 已执行验证
- `npm run build`,包含 typecheck:通过。
- `npm run test:conversation`:专用工具、15 个插件 alias、fallback 图标、完成/取消/过程折叠、最长并列正文、空耗时折叠、可视化分组边界通过。
- `npm run test:chat`、`test:conversation-ipc`、`test:persistence`:通过;回合耗时随终态保留。
- 实际 Electron UI:完成折叠键盘展开、任务键盘折叠、命令结果 DOM 与行高/背景/间距、问答键盘提交、审批继续通过,控制台错误 0。
- `npm run verify:previews`:HTML 子 frame 实际渲染、sandbox、异步 Markdown、过期读取丢弃、错误、图片缩放/旋转/镜像/切换/下载/Escape 通过,控制台错误 0。
- `npm run test:rea-css`:采集 contract、输入预算、恢复、作用域、选择性成员导出、17 模块完整性与全局 REA 文件未改检查通过。
- `npm run test:visual-pixels`:比较器自身回归通过。真实原版局部比较仍为 different。
- `npm run test:pierre`、`npm run verify:pierre`:完整动态资产锁定、源解析/SSR 与实际高亮、视图切换、明暗、新增/删除/无差异检查通过。
- `npm run verify:pierre` 的写文件链路:真实专用卡片内嵌 Diff、成功态无错误告警、键盘文件链接→完整 Pierre 旧新全文预览通过。
- `npm run test:tool-virtualizer` 与 300 行真实 UI 滚动:原源码闭包及摘要、初始/末端虚拟范围、末行可见、大内容无动画通过。
字体祖先定位实验另用最新原版 Evidence `ev_fc29c47ef7b284267584efe1fcabe48345e37a0b03cf492b686faec7aa704324`:隔离容器加上已观察的 virtual-flow 单位 transform 后,YCode PNG 与未加该容器时摘要相同,未使差异收敛。最新原图气泡区域 338/2475 不同,正文仍 6504/39909;只是参考图更换后个别边缘像素变化,不能称取得像素验收进展。
临时文件:自动审批曾以 `blocked by policy` 拒绝删除三处 `ycode-visual-pixel-helper-*` Temp 目录,未绕过该拒绝;目录保留,不影响工程产物。比较器现对本次自己创建的 helper 采用 Windows EBUSY 重试,不重试此前被拒绝的目录。
上述离线、自有 fixture 和选择性原版观察的范围分开记录;全状态像素、所有工具/附件分支、完整消息投影及动效曲线仍未通过。