Files
mnote/design/05-editor-mainline/process/5-9-wolai-aline-continuous-checklist-v1.md
T

38 KiB
Raw Blame History

5-9 [process] Wolai-aline 连续执行 checklist v1

更新时间:2026-04-30

本清单拆自 5-7-wolai-page-tree-main-editor-experience-restoration-v1.md。它不是新的测试方案;执行口径统一服从 /home/lix/.codex/skills/wolai-aline/mnt/Data1T/mnote/design/08-wolai-aline-test-flow/process/wolai-aline-test-flow-v1.md

1. 使用方式

每次只领取一个最小可对标任务,按下面固定闭环推进:

  1. 用一句话定义行为,例如“侧栏搜索入口打开全局搜索 modal 且 URL 不变”。
  2. 派 subagent 对 Wolai Hermes 取基线,必要时进入 Hermes editable-test mode。
  3. 主线程查看 Wolai 截图,填写差异矩阵,不接受只有文字的结论。
  4. 写或更新本地 scripts/task*-smoke.js,先让当前 3000 暴露差异。
  5. 小范围实现,不新增第二套页面树、标题、正文或排序真相。
  6. 运行本地 smoke 和改动范围内单测。
  7. 再派 subagent 同链路复测 Wolai 与 3000
  8. 主线程复核最终截图;若肉眼仍有差异,先补 smoke 或 checklist 断言,再继续修。
  9. 更新本清单状态和截图路径。

状态标记:TODO 未开始,BASELINE 已取 Wolai 基线,RED 已有本地失败 smokeGREEN 本地实现和 smoke 通过,PARITY subagent 复测与主线程截图复核通过,BLOCKED 有阻塞。

2. 当前基线证据

2026-04-30 已由 subagent 使用 Playwright 同时操作 Wolai Hermes 与本地 3000,主线程已复核关键截图。后续任务可沿用这些基线,但每个具体小任务仍需重新截同动作链证据。

Wolai 证据 本地证据 当前结论
首屏 /mnt/Data1T/mnote/tmp/wolai-editor-parity/doc-baseline-mini/wolai-initial.png /mnt/Data1T/mnote/tmp/wolai-editor-parity/doc-baseline-mini/local-initial.png 本地首屏仍是聚合/预览壳,需点击 打开当前页面 才进入正文,和 Wolai 直接正文页不一致
搜索 modal /mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/wolai-03-search-modal-controls-filled.png /mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/local-03-search-modal-controls-filled.png 容器接近;结果态、数据、入口矩阵仍需拆开验;switch 状态必须截图 + aria-checked 双证据
块 hover /mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/wolai-08-block-hover-insert-entry.png /mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/local-14-block-hover-insert-entry.png 本地已有 + 与手柄入口,但位置、密度、页面状态不同,不可判定已对齐
编辑清理 /mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/wolai-14-title-suffix-after.png /mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/local-16-editor-after-undo-cleanup.png Wolai 标题和正文都可编辑,editable-test 前必须先确认焦点 block 类型

当前必须优先拆解的差异:

  1. 普通文档首屏入口语义:Wolai 直接显示正文页,本地仍需点击 打开当前页面
  2. 搜索入口矩阵:Wolai 左侧搜索可打开,Ctrl+K 本轮未稳定;本地顶栏搜索可打开,侧栏入口和快捷键要继续按 smoke 验证。
  3. 搜索结果数据:Wolai 对 Hermes 有真实结果,本地依赖当前工作区示例数据;后续需要固定 fixture 或种子。
  4. 编辑器测试焦点:写入前必须确认当前焦点在正文测试块,不在标题或 breadcrumb 渲染副本。

2.1 task129 Phase A 执行记录

2026-04-30 已新增并执行 scripts/task129-wolai-aline-baseline-smoke.js,用于固化 Phase A 的只读基线取证入口。该脚本不编辑 Wolai,只做双端首屏取证、DOM 摘要和差异矩阵输出。

主线程验证:

  • 命令:WOLAI_ALINE_RUN_ID=main-20260430-122309 node scripts/task129-wolai-aline-baseline-smoke.js
  • 结果:通过,ok: true,确认 simultaneous: true
  • 矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/main-20260430-122309/comparison-matrix.md
  • Wolai 截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/main-20260430-122309/wolai-1392x1213-first-screen.png
  • 本地截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/main-20260430-122309/local-1392x1213-first-screen.png

主线程多视口验证:

  • 命令:WOLAI_ALINE_RUN_ID=main-viewports-20260430-122418 WOLAI_ALINE_VIEWPORTS=1392x1213,1440x900,390x844 node scripts/task129-wolai-aline-baseline-smoke.js
  • 结果:通过,生成 1392x12131440x900390x844 三组 Wolai / 本地截图
  • 矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/main-viewports-20260430-122418/comparison-matrix.md

subagent 复测:

  • 命令:WOLAI_ALINE_RUN_ID=subagent-20260430-122359 node scripts/task129-wolai-aline-baseline-smoke.js
  • 结果:通过,ok: true,确认 simultaneous: true,本次不需要 xvfb-run
  • 矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/subagent-20260430-122359/comparison-matrix.md
  • Wolai 截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/subagent-20260430-122359/wolai-1392x1213-first-screen.png
  • 本地截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/subagent-20260430-122359/local-1392x1213-first-screen.png

主线程截图复核结论:

  • Wolai Hermes 为 owner 登录态,直接显示正文页和 全网公开 状态。
  • 本地 3000 工作区可见,但首屏仍停留在聚合 / 预览入口,需要点击 打开当前页面 才进入正文。
  • task129 只证明取证工具链可用,不证明 UI 已对齐;后续首个实现任务应优先处理 D9 普通文档首屏入口语义

2.2 task130 D9 执行记录

2026-04-30 已新增并执行 scripts/task130-wolai-aline-root-document-entry-smoke.js,用于固化 D9 普通文档首屏入口语义。该脚本启动临时 mnote-web 端口验证新代码路径,不修改现有 3000 进程。

RED

  • 初次运行失败:AssertionError: 根页不应停在需要点击“打开当前页面”的聚合入口
  • 失败原因:Rust Web root route 在有 active page 时只渲染 workspace entry 和 打开当前页面 链接,没有内嵌 Page Aggregate、editor bootstrap 和 leptos-tiptap island。

GREEN

  • 命令:node scripts/task130-wolai-aline-root-document-entry-smoke.js
  • 结果:通过
  • 本地截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task130-root-document-entry/local-root-document-entry.png
  • smoke 断言:根页不再出现 打开当前页面;存在 document-shell[data-editor-host="leptos_tiptap_island"];存在 __MNOTE_PAGE_AGGREGATE____MNOTE_EDITOR_BOOTSTRAP__;存在 .ProseMirror[contenteditable="true"]

实现摘要:

  • root route 在 active page 可加载 Page Aggregate 时,直接复用 DocumentPage、Page Aggregate snapshot、editor bootstrap、title controller 和 island adapter。
  • 若 active page 不能加载 Page Aggregate,回退旧 workspace entry,避免 recent cookie 指向失效页面时 root 直接 400。
  • 现有 3000 进程仍是旧实例;需要重启 mnote-web 后,3000 才会体现该改动。

验证:

  • cargo fmt -p mnote-web --check
  • cargo check -p mnote-web
  • cargo test -p mnote-web root_entry -- --nocapture
  • node scripts/task130-wolai-aline-root-document-entry-smoke.js

最终对标复核:

  • subagent 命令:node scripts/task130-wolai-aline-root-document-entry-smoke.js
  • 结果:通过
  • Wolai 基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task129-baseline/main-20260430-122309/wolai-1392x1213-first-screen.png
  • 本地截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task130-root-document-entry/local-root-document-entry.png
  • 结论:D9 目标行为一致;剩余侧栏数据、图标细节、具体字号属于后续 Sidebar / visual token checklist。

3. 通用证据矩阵

每个 checklist 项都必须保留以下字段:

字段 要求
Wolai 截图 绝对路径,保存在 /mnt/Data1T/mnote/tmp/wolai-editor-parity/<task>/
本地截图 同视口、同动作链截图
入口 按钮、快捷键、菜单或 hover 区域
关闭路径 Esc、再次快捷键、遮罩、关闭按钮、入口 toggle
URL 操作前后是否变化
控件类型 switch、button、dropdown、menu、input、panel、modal
控件状态 checked、selected、disabled、focused、hover、active
视觉形态 尺寸、位置、间距、阴影、颜色、图标、遮罩
DOM/ARIA role、aria、data-testid、可聚焦性
smoke 对应 scripts/task*-smoke.js 或测试文件
剩余差异 不允许空泛写“基本一致”

4. Phase A:基线和全局 token

ID 状态 任务 验收要点
A1 GREEN 固定基线视口与截图目录 task129 已支持 WOLAI_ALINE_VIEWPORTS;主线程已生成 1392x12131440x900390x844 三组截图;subagent 已复测默认视口
A2 PARITY Wolai owner 首屏基线 task129 主线程与 subagent 均确认 Wolai owner 登录态,截图见 2.1 执行记录
A3 PARITY 本地 3000 首屏基线 task129 主线程与 subagent 均确认本地 3000 可打开,截图见 2.1 执行记录
A4 TODO 字体栈与基础 token smoke 或 DOM 断言全局字体、标题字号、正文行高、sidebar 行高;截图确认中文字宽接近 Wolai
A5 PARITY 截图差异表模板落地 task129 自动输出 comparison-matrix.md,主线程已复核截图,subagent 已独立复测
A6 PARITY 同时操作工具链固化 task129 固定 Playwright + Chrome persistent profile;主线程与 subagent 均确认可同时操作两个目标,本次 subagent 不需要 xvfb-run

5. Phase BSidebar / 页面树

ID 状态 任务 验收要点
B1 PARITY 侧栏宽度与背景 task131 覆盖宽 248px、背景 rgb(245,245,245)、无右侧 inset、topbar.x=sidebar.rightsubagent post-fix2 复核通过
B2 PARITY workspace header task132 覆盖 header 40px、avatar 24x24、字号 16px;Wolai DOM 锚点弱,主线程与 subagent 以截图复核通过
B3 PARITY 快捷入口行 task132 覆盖 6 个快捷入口、30px 容器、约 10.4px 间距;截图复核通过
B4 PARITY 页面树行密度 task132 覆盖行高 32px、字号 16px、无额外行 margin;截图复核通过
B5 PARITY 当前页选中态 task132 覆盖淡红底 rgba(255,71,71,.1)、红字、aria-current=page / aria-selected=true;截图复核通过
B6 PARITY 层级缩进 task132 使用父子页面 fixture 覆盖行 x 不变、一级子行内部缩进 20px;服务端和运行时均补齐 depth 语义
B7 PARITY 页面树 hover action task132 覆盖 hover 仅出现“更多操作 / 新建子页面”两个 24px actionsubagent post-fix2 复核通过
B8 PARITY 页面树上下文菜单 task132 覆盖宽约 220px、9 项命令、分组间距和 Alt+ / Del 提示;高风险删除仍经确认
B9 PARITY 底部垃圾桶/模板中心 task132 覆盖 footer 44px、无顶部分隔线、垃圾箱/模板中心固定底部;截图复核通过
B10 PARITY 文件树创新入口 保留 Explorer tabtask132 复核主路径仍是“我的页面”,footer 与行高体系不被破坏;与 Wolai 无 Explorer 的差异按本地创新入口保留
B11 PARITY 页面树图标与展开箭头 task133 覆盖 Wolai 每行不同私有 glyph、本地无真实 icon 数据时不得用统一房子图标,也不保留空 icon slot;展开箭头使用 20x20 SVG chevron

5.1 task131 / task132 / task133 Phase B 执行记录

2026-04-30 已完成 Phase BSidebar / 页面树。执行口径按 wolai-aline skill:先由 subagent 取 Wolai 基线,主线程查看截图并写 RED smoke,再最小实现,最后本地与 subagent 复测。用户复核指出 task132 漏掉页面树图标/箭头差异后,补充 task133 将该类肉眼差异固化为 smoke。

RED / GREEN

  • scripts/task131-wolai-aline-sidebar-b1-smoke.js:固化 B1,初始失败于本地侧栏 240pxGREEN 后覆盖 248pxrgb(245,245,245)、无 right inset、topbar 贴合。
  • scripts/task132-wolai-aline-sidebar-phase-b-smoke.js:固化 B2-B10,使用父子页面 fixture 覆盖 header、快捷入口、行密度、选中态、层级缩进、hover action、上下文菜单、footer。
  • scripts/task133-wolai-aline-sidebar-tree-icons-arrows-smoke.js:固化 B11,RED 失败于页面树统一房子 glyph;二次 GREEN 后断言 page 模式不渲染通用房子/伪 icon、不保留空 icon 槽,标题贴近箭头/占位,toggle 使用 20x20 SVG chevron。

实现摘要:

  • rust/crates/mnote-web/src/ssr/styles.rs:侧栏宽度/背景、header、quick actions、tree row、选中态、context menu、footer 的 Wolai 对齐样式;page 模式无真实 icon 数据时不显示统一房子 glyph,也不保留空 icon 槽。
  • rust/crates/mnote-web/src/ssr/pages/layout.rs:页面树运行时渲染补 aria-current / aria-selectedhover action 收敛为“更多/新建”,上下文菜单命令与 Wolai 对齐,运行时递归 depthpage tree 展开箭头改为 20x20 SVG chevronpage 行不渲染空 icon 节点。
  • rust/crates/mnote-web/src/tree_shell/page_renderer.rs / routes/tree.rs:SSR 页面树补父子层级 depth / aria-level 语义,兼容 parentIdparentNodeIdSSR page tree 展开箭头同样使用 20x20 SVG chevronpage 行不渲染空 icon 节点。

验证命令:

  • cargo fmt -p mnote-web --check
  • cargo check -p mnote-web
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task131-wolai-aline-sidebar-b1-smoke.js
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task132-wolai-aline-sidebar-phase-b-smoke.js
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task133-wolai-aline-sidebar-tree-icons-arrows-smoke.js
  • node scripts/task119-rust-web-wolai-visual-regression-smoke.js

证据路径:

  • B1 Wolai 基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task131-sidebar-b1-baseline/wolai-sidebar-b1-open-1392x1213.png
  • B1 本地最终:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task131-sidebar-b1-postfix/local-sidebar-b1-postfix-1392x1213.png
  • Phase B Wolai 基线矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b-baseline/comparison-matrix.md
  • Phase B 本地主线程最终:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b/local-sidebar-phase-b-1392x1213.png
  • Phase B 本地菜单最终:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b/local-sidebar-phase-b-menu-1392x1213.png
  • Phase B subagent post-fix2 JSON/mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b-postfix2/sidebar-phase-b-postfix2-measurements.json
  • Phase B subagent Wolai 菜单:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b-postfix2/wolai-sidebar-context-menu-1392x1213.png
  • Phase B subagent 本地菜单:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b-postfix2/local-sidebar-context-menu-1392x1213.png
  • B11 用户指出差异截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b-baseline/wolai-03-page-tree.png / /mnt/Data1T/mnote/tmp/wolai-editor-parity/task132-sidebar-phase-b-baseline/local-03-page-tree.png
  • B11 subagent 基线矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task133-sidebar-tree-icons-arrows-baseline/comparison-matrix.md
  • B11 subagent Wolai / 本地复核截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task133-sidebar-tree-icons-arrows-baseline/wolai-sidebar-tree-icons-arrows.png / /mnt/Data1T/mnote/tmp/wolai-editor-parity/task133-sidebar-tree-icons-arrows-baseline/local-sidebar-tree-icons-arrows.png
  • B11 本地主线程最终截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task133-sidebar-tree-icons-arrows/local-sidebar-tree-icons-arrows-1392x1213.png
  • B11 二次复核矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task134-sidebar-arrow-no-empty-slot-baseline/comparison-matrix.md
  • B11 二次复核截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task134-sidebar-arrow-no-empty-slot-baseline/wolai-sidebar-tree.png / /mnt/Data1T/mnote/tmp/wolai-editor-parity/task134-sidebar-arrow-no-empty-slot-baseline/local-sidebar-tree.png

主线程复核结论:

  • B1-B11 可量测项已对齐或按 checklist 明确保留本地差异。
  • Wolai header/avatar DOM 选择器不稳定,最终以截图 + 本地稳定锚点复核。
  • Explorer 是 mnote 本地创新入口,按 B10 保留;视觉不抢“我的页面”主路径。
  • 菜单位置因页面树数据不同而不同;尺寸、项目、分组高度已对齐。
  • Wolai 页面树图标是每行不同的私有 glyph;当前本地 projection 没有真实 per-page icon 数据,因此不硬编码类似图标,也不保留空白 icon 列。二次复核确认:保留空列会让标题 x 更接近 Wolai,但视觉上是明显缺失;当前按用户确认的产品判断去空列,残留差异是标题比 Wolai 真实图标+标题组合更靠左。后续若树投影提供真实 icon 字段,再按行渲染。

6. Phase C:顶栏、breadcrumb、搜索

ID 状态 任务 验收要点
C1 PARITY 顶栏高度与按钮密度 task135 覆盖顶栏约 40px、右侧按钮组无搜索入口、icon 不再渲染成黑色方块;task119 复核 topbarHeight=40
C2 PARITY breadcrumb task135 覆盖 breadcrumb 当前标题绑定、弱色分隔符改为 Wolai chevron;真实父路径数据仍依赖后续 Page Aggregate / tree projection
C3 PARITY owner/published 按钮分型 task135 覆盖 owner 顶栏绿色 全网公开,右侧按钮组从本地 AI/搜索收敛为 Wolai owner 态常见按钮序列
C4 PARITY 顶栏搜索入口基线纠偏 2026-04-30 Wolai owner 当前 viewport 顶栏无搜索入口;本地已移除顶栏搜索按钮,搜索统一走侧栏入口 / Ctrl+P
C5 PARITY 侧栏搜索入口 task135 覆盖侧栏左上搜索打开同一个全局搜索 modal,URL 不变;modal 打开时再次点击侧栏搜索会关闭
C6 PARITY 搜索 modal 默认状态 task135 按最新 Wolai 实测修正:空 query 先显示最近浏览,不直接显示筛选;输入后 switch 出现,仅匹配标题 / 页面内搜索 为 switch 且默认关闭
C7 PARITY 搜索 modal 关闭路径 task135 覆盖 Esc、主区域遮罩、再次 Ctrl+P、侧栏入口 toggle;URL 均不变
C8 PARITY 搜索结果行 task135 覆盖后台 API 结果、匹配数量、红色命中高亮、快捷键提示、结果 icon、结果 owner 标记
C9 PARITY 搜索空态/加载态 task135 覆盖空 query 最近浏览、输入后 loading、无结果 没有搜索结果DOM 可断言 data-search-loading / data-search-empty
C10 PARITY 搜索入口/快捷键矩阵 task135 和 subagent baseline 确认:侧栏搜索 / Ctrl+P 是搜索入口;Ctrl+K 按当前 Wolai 实测不打开搜索
C11 PARITY 搜索结果 fixture task135 固定本地 Rust / Hermes fallback fixture,并断言 modal 调用 /api/search/documents 而不是 DOM 前端过滤

6.1 task135 Phase C 执行记录

2026-04-30 已完成 Phase C:顶栏、breadcrumb、owner/published、搜索入口与搜索 modal。执行口径按 wolai-aline skillsubagent 先取 Wolai / 本地基线,主线程复核截图后补 RED smoke;实现后本地 smoke 通过,并已派 subagent 做 post-fix 复测。

RED

  • 新增 scripts/task135-wolai-aline-phase-c-smoke.js,初始失败于顶栏高度 44px、公开态文案 Public、顶栏多搜索入口、搜索 modal 未调用 /api/search/documents
  • subagent 基线纠偏:当前 Wolai Ctrl+K 不打开搜索;空 query 不直接显示筛选控件;输入后 仅匹配标题 / 页面内搜索 switch 本次实测为关闭态。

GREEN

  • rust/crates/mnote-web/src/ssr/pages/layout.rs:顶栏公开态改为 全网公开,移除顶栏搜索入口,右侧按钮组对齐 owner 态;侧栏搜索入口改为 toggle;搜索 modal 输入改为 type=search,空 query 显示最近浏览,输入后调用 /api/search/documents,结果区标记 data-search-results-owner="rust-kernel"
  • rust/crates/mnote-web/src/ssr/styles.rs:顶栏高度收敛到 40px;搜索遮罩支持侧栏入口穿透 toggle,同时保留主区域遮罩关闭;补齐右侧按钮与结果图标 mask,避免黑色方块;搜索高亮统一红色弱底。
  • rust/crates/mnote-web/src/routes/search.rsfallback 搜索数据补 Hermes / 技能知识图谱开发 fixture,避免本地结果态依赖随机工作区数据。
  • scripts/task128-rust-web-wolai-search-modal-smoke.js:同步当前 Wolai 基线,改为侧栏 / Ctrl+P 入口和 switch 默认关闭。

验证命令:

  • cargo fmt -p mnote-web --check
  • cargo check -p mnote-web
  • cargo build -p mnote-web --bin mnote-web
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task135-wolai-aline-phase-c-smoke.js
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task128-rust-web-wolai-search-modal-smoke.js
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task125-rust-web-search-server-first-smoke.js
  • node scripts/task119-rust-web-wolai-visual-regression-smoke.js

证据路径:

  • Phase C subagent 基线矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task135-phase-c-baseline/comparison-matrix.md
  • Wolai Hermes 搜索基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task135-phase-c-baseline/wolai-search-hermes.png
  • 本地 Phase C 最终截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task135-phase-c/local-phase-c-search.pngpost-fix subagent 本地复核:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task135-phase-c-postfix/local-10-query-hermes.png
  • 本地搜索 modal smoke 截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/local-search-modal/local-3000-search-modal.png

主线程复核结论:

  • 搜索不再只是 UI 壳:modal 输入会调用 /api/search/documents,请求体包含 query 和 switch filter,结果区有 data-search-results-owner="rust-kernel"
  • 当前 Wolai 基线推翻了旧 checklist 的两个假设:Ctrl+K 不是搜索入口;仅匹配标题 / 页面内搜索 在本次输入态实测为关闭态。
  • 本地 Hermes fixture 只能证明结果态结构、后台链路和高亮;不代表本地已经有 Wolai 真实空间数据。
  • 顶栏/breadcrumb 的父路径层级仍受本地 Page Aggregate / tree projection 数据限制;本阶段只完成控件、入口、状态和同步锚点的对标。
  • post-fix subagent 复测矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task135-phase-c-postfix/comparison-matrix.md;复核确认本地右上角不再有黑色方块,侧栏搜索 toggle、Ctrl+P toggle、Ctrl+K 不打开、空 query 最近浏览、后台搜索 API、结果 icon/高亮均通过。

7. Phase D:文档画布与阅读态

ID 状态 任务 验收要点
D1 PARITY 主内容列宽 task136 覆盖普通文档主列 760px,大屏居中不贴左;移动端沿既有 media query 保持不溢出
D2 PARITY 标题位置与样式 task136 按 Wolai 基线收敛到 y≈108、34px / 44px / 600、颜色接近 Wolai
D3 PARITY 默认隐藏 meta/debug 行 task136 断言普通文档默认不显示 workspace/已同步 meta、大号页面 icon、debug 文案和横线
D4 PARITY 正文段落 task136 覆盖正文 16px / 24px,标题到正文间距按 Wolai 基线加大
D5 PARITY 任务块 task136 固定 Tiptap fixture 并断言渲染后存在 input[type=checkbox],尺寸 16px;补齐 kernel todo 类型到 Tiptap taskList 的转换
D6 PARITY 引用/列表/标题块 task136 覆盖 heading、blockquote、bulletList;补齐 bullet_list_item / numbered_list_item 映射避免降级段落
D7 PARITY 右下角浮动入口 task136 覆盖 AI / 帮助入口 40px、AI 在上、间距约 16px、底部留白约 44px,不遮挡正文
D8 PARITY 阅读态和编辑态切换 task136 覆盖标题 focus、编辑器 focus 后标题 y/x 不跳动;subagent baseline 同样确认点击后布局稳定
D9 PARITY 普通文档首屏入口语义 task130 已覆盖 RED/GREENsubagent 最终对标复核通过:根页不再停在“打开当前页面”入口,直接出现 document shell + editor island

7.1 task136 Phase D 执行记录

2026-04-30 已完成 Phase D:文档画布与阅读态。执行口径按 wolai-aline skillsubagent 先取 Wolai / 本地只读基线,主线程复核截图后补 RED smoke;实现后本地 smoke 与相关回归通过,并已派 subagent 做 post-fix 复测。

RED

  • 新增 scripts/task136-wolai-aline-phase-d-smoke.js,初始失败于本地文档主列 880px,后续增强断言捕获标题 y 偏低、标题到正文间距偏小、右下浮动入口间距/底部位置旧基线。
  • 基线截图确认 Wolai 标题为 y≈108、34px / 44px / 600;普通文档无 workspace/已同步 meta 行和大号页面 icon;右下入口为 40px,AI 在帮助上方,按钮间距约 16px,底部留白约 44px。
  • smoke 还暴露后台链路差异:保存 Tiptap fixture 后,/api/documents/content 返回 todo / bullet_list_item 等 kernel 规范化类型,但浏览器 bootstrap 只识别旧类型,导致任务块和列表降级为普通段落。

GREEN

  • rust/crates/mnote-web/src/ssr/styles.rs:文档主列收敛到 760px;标题改为 34px / 44px / 600 且 y≈108;普通文档隐藏页面大 icon 与 meta/debug 行;正文行高 24px;补 task checkbox、blockquote、list 样式;右下浮动入口减重为 40px,AI 在上、帮助在下,间距 16px、底部留白 44px。
  • rust/crates/mnote-web/src/routes/web_shell.rslegacyBlockToTiptap 同时识别旧类型和 kernel 规范化类型:todobullet_list_itemnumbered_list_itemblockquote
  • rust/crates/mnote-web/src/routes/editor.rsruntime block 类型映射同步兼容 kernel 规范化类型,避免编辑器链路继续把任务/列表块当成 media 或段落。
  • scripts/task119-rust-web-wolai-visual-regression-smoke.js:按本次 Wolai 基线更新右下浮动入口顺序、间距和底部留白断言,避免旧 Stitch 目标覆盖当前实测。

验证命令:

  • cargo fmt -p mnote-web --check
  • cargo check -p mnote-web
  • cargo build -p mnote-web --bin mnote-web
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task136-wolai-aline-phase-d-smoke.js
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task121-rust-web-editor-island-hydration-smoke.js
  • node scripts/task119-rust-web-wolai-visual-regression-smoke.js
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task128-rust-web-wolai-search-modal-smoke.js
  • MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task135-wolai-aline-phase-c-smoke.js

证据路径:

  • Phase D subagent 基线矩阵:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task136-phase-d-baseline2/comparison-matrix.md
  • Wolai Phase D 基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task136-phase-d-baseline2/wolai-01-first.png
  • 本地 Phase D 最终截图:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task136-phase-d/local-phase-d-document.png
  • Phase D subagent post-fix/mnt/Data1T/mnote/tmp/wolai-editor-parity/task136-phase-d-postfix/comparison-matrix.md

主线程复核结论:

  • 本地文档画布主列、标题字号/行高/字重、标题 y、meta/icon/debug 隐藏、正文行高、任务/引用/列表渲染、右下浮动入口尺寸/顺序/间距已被 smoke 固化。
  • subagent post-fix 在根文档截图中复核标题 y=108、列宽 760、字号 34/字重 600、meta/icon/debug 不可见、浮动入口 40px/16px/44px、点击后不跳动。
  • 当前本地 fixture smoke 能证明后台内容链路不再把任务块和列表降级为普通段落;post-fix 根文档缺少任务/引用/列表内容,因此这三类块的真实视觉细节仍以后续 Phase E editable-test 或专门 fixture 页面继续细化。
  • 剩余差异:本地页面标题来自临时 fixture,文案与 Wolai Hermes 不同;Wolai 真实 per-page icon 数据仍未进入本地 projection,按 Phase B 结论不伪造。

8. Phase E:主编辑器块交互

ID 状态 任务 验收要点
E0 DONE editable-test 焦点护栏 Wolai Hermes editable-test 与本地 smoke 均断言写入前焦点在正文测试块,不在标题、breadcrumb 或隐藏输入
E1 DONE editable-test 基础输入 Wolai 已取输入/回车/撤销基线;本地 task137 覆盖三行输入、保存、刷新后保持
E2 DONE 块 hover 手柄 Wolai follow-up 基线确认默认 hover 只显示 2x2 四点手柄;本地 smoke 断言四点、可见性、与正文间距和从正文移向手柄不消失
E3 DONE 上方插入加号 本地仅在 hover 四点上方热区时显示上方 +,点击可在目标块前插入并聚焦;tooltip/title 包含 在上方插入块 / Esc, a
E4 DONE 下方插入加号 本地仅在 hover 四点下方热区时显示下方 +,点击可在目标块后插入并聚焦;tooltip/title 包含 在下方插入块 / Esc, b
E5 DONE Esc, a / Esc, b 本地块选中态快捷键可插入 before/after,并把输入焦点放入新块
E6 PARTIAL 块菜单 本地点击四点后手柄切换为三横线;主菜单约 240px、浮在侧栏之上、位于三横线左侧且不遮挡正文/手柄;转换为 二级菜单已补齐 Wolai 当前基线项目,H4 小标题与页面转换已有真实命令;复制链接/颜色/文字翻译子菜单、折叠标题/折叠待办三级菜单仍需继续补齐
E7 DONE slash 菜单 本地 / 跟随编辑器打开;含 AI 助理 / 用 AI 写作 / 基础块列表 / 文本 / 待办列表 / /h1,方向键/Enter 选择仍由 smoke 覆盖
E8 DONE selection toolbar 本地选中文本出现工具条;粗体、斜体、链接、颜色、转换块入口可见,入口文案已中文化
E9 PARTIAL Ctrl+A 双阶段选择 本地 smoke 覆盖第一次/第二次选择范围扩展;Wolai 的多块粉色选区视觉与块级全选细节后续单列视觉对标
E10 DONE 拖拽预览 本地 smoke 覆盖拖动手柄时 .block-drop-indicator 横向 drop line 可见;分栏竖线预览与落点持久化后续单列

Phase E 执行记录(2026-04-30

  • Wolai 基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-phase-e-baseline/comparison-matrix.md,截图目录 /mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-phase-e-baseline/screenshots/
  • Wolai 说明页摘要:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-phase-e-baseline/doc-summary.md
  • 本地 post-fix smokeMNOTE_PHASE_E_SCREENSHOT_DIR=/mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-phase-e-local-smoke node scripts/task137-wolai-phase-e-smoke.js,通过。
  • Subagent post-fix 复核:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-phase-e-postfix-subagent-final3/,通过。
  • 手柄 follow-up Wolai 基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-handle-followup-wolai-baseline/,确认默认四点、上/下热区分别出 +、点击后变三横线、菜单在正文左侧不挡正文。
  • 手柄 follow-up 本地 smoke/mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-handle-followup-local-postfix10/,通过并覆盖四点、上下加号、可达性、菜单不挡正文/手柄。
  • 手柄 follow-up subagent 本地复核:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task137-handle-followup-local-subagent-postfix/,通过;复核默认四点、上下加号、正文到手柄不消失、点击后三横线、菜单不遮挡正文/手柄。
  • 关键截图:02-hover-handle-default.png02a-hover-handle-before-plus.png02b-hover-handle-after-plus.png04-drag-preview.png05-block-menu.png07-slash-menu.png08-toolbar.png05-block-menu.png 已断言菜单不遮挡正文且不盖住三横线手柄;更多 Wolai 菜单项后续补齐。
  • 块菜单 refresh Wolai 基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task138-phase-e-wolai-refresh/,确认二级/三级菜单、Esc/外部点击关闭、鼠标移出保持打开。
  • 块菜单 refresh 本地 smokeMNOTE_PHASE_E_SCREENSHOT_DIR=/mnt/Data1T/mnote/tmp/wolai-editor-parity/task138-phase-e-local-smoke-10 node scripts/task137-wolai-phase-e-smoke.js,通过;覆盖第二行手柄不跳行、240px 菜单、底部编辑信息、转换子菜单缺失项、鼠标移出保持、Esc 关闭、H4 真实转换。
  • 块菜单 refresh subagent 本地复核:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task138-phase-e-local-subagent-postfix/,通过;复核第 1-4 行手柄不跳行、菜单未被侧栏裁剪、鼠标移出保持、Esc/外部点击关闭、H4 真实转换。
  • 转换为 -> 页面 Wolai 基线:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task139-transform-page-wolai-baseline/;确认 Wolai 点击页面后 URL 不变、不新开标签、不立即创建/选中 sidebar 新页面,当前块原地从 text 变 page block,标题沿用原文本,重新打开转换菜单时 页面 为勾选态。
  • 转换为 -> 页面 本地 smokeMNOTE_PHASE_E_SCREENSHOT_DIR=/mnt/Data1T/mnote/tmp/wolai-editor-parity/task139-transform-page-local-smoke-5 node scripts/task137-wolai-phase-e-smoke.js,通过;覆盖页面项可点击、URL 不变、无 /api/tree/commands create、页面块非蓝色普通链接、独立页面图标、整行弱红底、重新打开菜单页面勾选态。
  • 转换为 -> 页面 subagent 本地复核:/mnt/Data1T/mnote/tmp/wolai-editor-parity/task139-transform-page-local-subagent-postfix/,通过;关键截图 06-transform-page.png10-transform-page-current-menu.png
  • 代码改动:rust/spikes/leptos-tiptap-spike/src/lib.rs 与生成的 rust/spikes/leptos-tiptap-spike/generated/island/*
  • 验证命令:cargo fmt --checkcargo checknode wolai-frontend/scripts/build-leptos-tiptap-island.jsnode scripts/task137-wolai-phase-e-smoke.jsnode scripts/task121-rust-web-editor-island-hydration-smoke.jsnode scripts/task136-wolai-aline-phase-d-smoke.js

Phase E 说明页扩展 backlog

ID 状态 任务 验收要点
E11 TODO Tab / Shift+Tab 缩进结构 缩进改变父子块结构,不只是视觉 padding;覆盖不允许缩进的块类型
E12 TODO Ctrl/Cmd+Shift+U 块布局 显示/隐藏块布局虚线框,且不影响编辑保存
E13 TODO 块转换三入口 块菜单、快捷键、slash /zh + 拼音首字母 均能转换文本类块
E14 TODO 复制/粘贴与匹配样式粘贴 文本选择、块选择、Ctrl/Cmd+Shift+V 分别有 smoke
E15 TODO 链接创建 选中文字 Ctrl/Cmd+K 与直接粘贴 URL 创建链接
E16 TODO 文本颜色/背景色/行内公式/页面引用 selection toolbar 子菜单真实写入 Tiptap 内容,不只显示入口
E17 TODO 评论入口 块评论、选中文字评论、评论气泡数量和 Ctrl/Cmd+Alt+M 后续对标
E18 TODO 块引用与右侧边栏引用 块引用搜索、引用预览/别名、右侧边栏拖拽引用后续对标
E19 TODO 块历史 块历史查看与恢复版本按 Wolai 说明页单列验证
E20 TODO 拖拽分栏 横线/竖线预览、父子块随父块移动、测试块间安全释放与清理
E21 DONE 块菜单二级转换基础版 转换为 hover 后主菜单保持、二级菜单包含 Wolai 当前项目;文本/待办/高级待办/H1/H2/H3/H4/页面/列表/数字列表/引述/代码 其中 H4 与页面至少有真实 smoke
E22 TODO 折叠标题三级菜单 hover 折叠标题 显示 折叠主标题/折叠大标题/折叠中标题/折叠小标题;真实折叠语义需接 editor/core 命令,不用 disabled 文案伪装完成
E23 TODO 折叠待办三级菜单 hover 折叠待办 显示 折叠待办列表/折叠高级待办列表;真实折叠待办语义需接 editor/core 命令
E24 TODO 复制链接/颜色/文字翻译子菜单 复制链接、颜色、文字翻译按 Wolai 展开子菜单;颜色至少覆盖文字色/背景色真实写入,复制链接不只反馈文案
E25 TODO 块菜单关闭状态机 Esc 与外部点击关闭所有层级;鼠标移出菜单保持打开,三级菜单可按 Wolai 收回到二级菜单;smoke 覆盖三条路径
E26 DONE 转换为 -> 页面 Wolai Hermes 实测为原地 page block 转换;本地点击后 URL 不变、不触发 tree create、当前块显示页面图标 + 标题 + 整行弱红底,重新打开转换菜单时 页面 显示勾选态

9. Phase FPage Aggregate 和命令边界

ID 状态 任务 验收要点
F1 TODO 标题单一真源 标题修改后 breadcrumb、sidebar、file tree、document title 同步
F2 TODO 正文保存命令 编辑器保存继续走 page.body.save,不把 Tiptap 临时 id 当持久真相
F3 TODO 页面设置语义 设置项进入 page-option-semantics 和 editor runtime,不做只保存不消费的假功能
F4 TODO 页面树命令 新建、重命名、移动、归档仍沿 tree.*;菜单入口不直接操作本地临时数组
F5 TODO 引用语义 页面引用、块引用、嵌入引用先保留类型边界,不降级成普通 URL

10. 每轮收尾

每完成一个 ID,必须补齐:

  • Wolai 截图路径:TODO
  • 本地截图路径:TODO
  • smoke / 测试命令:TODO
  • 主线程复核结论:TODO
  • 剩余差异:TODO

如果出现新的可复用失败模式,同步更新 /home/lix/.codex/skills/wolai-aline/references/failure-patterns.md