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

248 lines
12 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 接手后的现行约束及进度见 `接手状态-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 校验 |