fix: reconcile batch b smoke evidence
This commit is contained in:
+60
-16
@@ -47,23 +47,27 @@
|
||||
- 结果:`{"ok": true, "checkedLines": 1, "guard": "local-first-convex"}`
|
||||
- 验收:通过 ✅
|
||||
|
||||
- [ ] 冲突 UI smoke — `task451-local-markdown-conflict-resolution-ui-smoke.js`
|
||||
- [x] 冲突 UI smoke — `task451-local-markdown-conflict-resolution-ui-smoke.js`
|
||||
- 编号已存在脚本目录,需在完整后端环境下运行(依赖 mnote-web + Convex)
|
||||
- 验收:尚未复跑 browser smoke;单测级 `document_buffer_state_transitions` 不能替代 UI smoke。
|
||||
- 验收:已复跑 browser smoke;单测级 `document_buffer_state_transitions` 不能替代 UI smoke。
|
||||
- **执行记录(2026-05-21, Batch B Worker C)**:✅ **PASS** — 4/4 子步骤全部通过(accept-disk, keep-current, merge-save, agent-conflict-source)。结果文件:`tmp/task451-local-markdown-conflict-resolution-ui-smoke/result.json`
|
||||
|
||||
- [ ] 本地搜索索引 smoke — `task452-local-search-index-browser-smoke.js`
|
||||
- [x] 本地搜索索引 smoke — `task452-local-search-index-browser-smoke.js`
|
||||
- 编号已存在脚本目录
|
||||
- 验收:尚未复跑 browser smoke。
|
||||
- 验收:已复跑 browser smoke。
|
||||
- **执行记录(2026-05-21, Batch B Worker C)**:❌ **FAIL** — `/api/search/documents` 返回 200 结果正确,但 page-settings 本地索引 panel(backlinks/tags)30s 超时未渲染。归因:**UI 渲染回归**。结果文件:`tmp/task452-local-search-index-browser-smoke/result.json`
|
||||
- **Codex 复核(2026-05-21)**:✅ **PASS** — 诊断显示 API 和 UI 均已渲染,失败来自 smoke 仍期待 frontmatter 标题 `Search Smoke`;当前索引面板按路径口径展示 `README` / `README.md` 和链接片段。已更新断言并实跑通过。
|
||||
|
||||
- [ ] agent changed files smoke — `task453-local-folder-page-ai-changed-files-smoke.js`
|
||||
- [x] agent changed files smoke — `task453-local-folder-page-ai-changed-files-smoke.js`
|
||||
- 编号已存在脚本目录
|
||||
- 验收:尚未复跑 browser smoke;`local_agent_audit_snapshot_detects_changed_files` 和 `detects_resource_files` 只能覆盖 audit 单元路径。
|
||||
- 验收:已复跑 browser smoke;`local_agent_audit_snapshot_detects_changed_files` 和 `detects_resource_files` 只能覆盖 audit 单元路径。
|
||||
- **执行记录(2026-05-21, Batch B Worker C)**:✅ **PASS** — capturedKinds: session/run/events 全部捕获。结果文件:`tmp/task453-local-folder-page-ai-changed-files-smoke/result.json`
|
||||
|
||||
### 1.2 收尾
|
||||
|
||||
- [x] guard 输出已记录(见上)
|
||||
- [ ] browser smokes 需完整后端环境运行(mnote-web + Convex + Playwright)
|
||||
- [ ] 失败归属:无失败
|
||||
- [x] browser smokes 需完整后端环境运行(mnote-web + Convex + Playwright)
|
||||
- [x] 失败归属:本轮已无 A0 smoke 失败;`task452` 为旧断言假失败
|
||||
|
||||
---
|
||||
|
||||
@@ -177,7 +181,9 @@
|
||||
- `mindmap_delete_restore_keeps_markdown_reference_out_of_lifecycle_command` ✅(验证 mindmap 生命周期不携带 documentId 从而不影响 markdown 页面)
|
||||
- 尚未验证文档正文在 trash/restore 后是否完整
|
||||
- [x] `local_agent_audit_snapshot_detects_resource_files` — 通过 ✅
|
||||
- [ ] browser smokes:`task443`、`task445` 需 Playwright 后端环境
|
||||
- [x] browser smokes:`task443`、`task445` 需 Playwright 后端环境
|
||||
- **执行记录(2026-05-21, Batch B Worker C)**:❌ **FAIL** — 两个 smoke 均因 `waitForURL` 断言 `/mindmap/` 路由超时,实际导航走的是 `/documents/...?resourceTab=...`。归因:**脚本过时**(mindmap 路由改为 resourceTab,smoke 未同步)。结果文件:`tmp/task443-filetree-mindmap-click-active-row-smoke/result.json`、`tmp/task445-filetree-mindmap-switch-no-flicker-smoke/result.json`
|
||||
- **Codex 复核(2026-05-21)**:✅ **PASS** — 已更新为当前 `resourceTab=resource:mindmap:{docId}:{mindmapId}` 断言,两个 smoke 实跑通过。`task445` 仍捕获一次跨文档 mindmap API `400 Bad Request` console error,但 smoke failures 为空,单独保留为后续噪声/边界排查。
|
||||
|
||||
### 4.4 完成标准
|
||||
|
||||
@@ -230,18 +236,56 @@
|
||||
### 6.2 Browser smokes(需完整后端环境)
|
||||
|
||||
- [ ] `task431-vscode-explorer-dnd-readonly-conflict-smoke.js`
|
||||
- [ ] `task451-local-markdown-conflict-resolution-ui-smoke.js`
|
||||
- [ ] `task452-local-search-index-browser-smoke.js`
|
||||
- [ ] `task453-local-folder-page-ai-changed-files-smoke.js`
|
||||
- [ ] `task443-filetree-mindmap-click-active-row-smoke.js`
|
||||
- [ ] `task445-filetree-mindmap-switch-no-flicker-smoke.js`
|
||||
- [x] `task451-local-markdown-conflict-resolution-ui-smoke.js`
|
||||
- [x] `task452-local-search-index-browser-smoke.js`
|
||||
- [x] `task453-local-folder-page-ai-changed-files-smoke.js`
|
||||
- [x] `task443-filetree-mindmap-click-active-row-smoke.js`
|
||||
- [x] `task445-filetree-mindmap-switch-no-flicker-smoke.js`
|
||||
|
||||
### 6.2.1 本次执行结果(Batch B Worker C @ 2026-05-21)
|
||||
|
||||
- `task451-local-markdown-conflict-resolution-ui-smoke.js`
|
||||
- **PASS** ✅ — 4 个子步骤全部通过:accept-disk、keep-current、merge-save、agent-conflict-source
|
||||
- 命令:`PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task451-local-markdown-conflict-resolution-ui-smoke.js`
|
||||
- 结果:`tmp/task451-local-markdown-conflict-resolution-ui-smoke/result.json`
|
||||
- `task452-local-search-index-browser-smoke.js`
|
||||
- **PASS** ✅ — Codex 复核后更新旧断言;本地索引面板已渲染 backlinks/tags,`README.md`、链接片段和 `#alpha` 可见
|
||||
- 命令:`PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task452-local-search-index-browser-smoke.js`
|
||||
- 结果:`tmp/task452-local-search-index-browser-smoke/result.json`
|
||||
- 归因:**脚本断言过时** — 原断言期待 frontmatter 标题,当前索引面板按路径标题展示
|
||||
- `task453-local-folder-page-ai-changed-files-smoke.js`
|
||||
- **PASS** ✅ — capturedKinds: session/run/events 全部捕获
|
||||
- 命令:同上
|
||||
- 结果:`tmp/task453-local-folder-page-ai-changed-files-smoke/result.json`
|
||||
- `task443-filetree-mindmap-click-active-row-smoke.js`
|
||||
- **PASS** ✅ — mindmap 资源行点击后 URL 使用 `/documents/...&resourceTab=resource:mindmap:...`,且对应 asset row 选中
|
||||
- 命令:`PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task443-filetree-mindmap-click-active-row-smoke.js`
|
||||
- 结果:`tmp/task443-filetree-mindmap-click-active-row-smoke/result.json`
|
||||
- 归因:**脚本过时后已更新** — mindmap 已改为 resourceTab 路由
|
||||
- `task445-filetree-mindmap-switch-no-flicker-smoke.js`
|
||||
- **PASS** ✅ — 页面和 mindmap 来回切换时 file tree root 稳定,选中态正确
|
||||
- 命令:`PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task445-filetree-mindmap-switch-no-flicker-smoke.js`
|
||||
- 结果:`tmp/task445-filetree-mindmap-switch-no-flicker-smoke/result.json`
|
||||
- 归因:**脚本过时后已更新** — 仍有一次 400 console noise,后续单独排查
|
||||
|
||||
### 6.2.2 本次执行汇总
|
||||
|
||||
| Smoke | 结果 | 归因 |
|
||||
|-------|------|------|
|
||||
| task451 | ✅ PASS | — |
|
||||
| task452 | ✅ PASS | 脚本断言过时,已按当前路径标题和链接片段语义更新 |
|
||||
| task453 | ✅ PASS | — |
|
||||
| task443 | ✅ PASS | 脚本过时,已改为 resourceTab 路由断言 |
|
||||
| task445 | ✅ PASS | 脚本过时,已改为 resourceTab 路由断言;仍有 400 console noise |
|
||||
|
||||
---
|
||||
|
||||
### 6.3 总完成率
|
||||
|
||||
| Gap | 状态 | 关键产出 | 剩余 |
|
||||
|-----|------|----------|------|
|
||||
| A0 | 🔄 部分 | guard 通过,smoke 脚本已存在 | browser smokes 未复跑 |
|
||||
| A0 | 🔄 部分 | guard、task451、task452、task453 通过 | task431 等剩余 browser smokes 未复跑 |
|
||||
| A2 | 🔄 运行时接入完成,浏览器闭环未完成 | `BufferStore` 实现 + 11 tests;保存请求 200;磁盘和 PageAggregate 写入成功 | 刷新后 editor DOM 未显示正文;conflict UI 未接 buffer state |
|
||||
| A7 | 🔄 基础设施完成 | `CommandContext` + when evaluator + 7 tests | UI/快捷键/菜单接入 |
|
||||
| B2 | 🔄 部分 | 资源生命周期 + agent audit 测试通过 | mindmap body 测试、browser smokes |
|
||||
| B2 | 🔄 部分 | 资源生命周期 + agent audit 测试通过;task443/task445 通过 | mindmap body 测试、跨文档 ResourceTab 400 噪声排查 |
|
||||
| C1 | 🔄 部分 | export/rollback/dry-run 脚本 + smoke 通过 | 额外 smoke 验证 |
|
||||
|
||||
+161
@@ -0,0 +1,161 @@
|
||||
# 1-9 [process] Batch B P1 Identity / BufferStore / Page Aggregate Execution Checklist v1
|
||||
|
||||
> 创建时间:2026-05-21
|
||||
>
|
||||
> 上位入口:`design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
|
||||
>
|
||||
> 阶段:Batch B / P1 工作区身份、BufferStore、Page Aggregate 收口
|
||||
>
|
||||
> 当前状态:`PROCESS`
|
||||
|
||||
## 1. 目标
|
||||
|
||||
按 `1-8` 的 P1 顺序,把当前已经明确的 P1 缺口拆成可并行执行的小阶段:
|
||||
|
||||
1. `5-26` 正文附件 open resolver 与 FileTree open resolver 收敛未执行。
|
||||
2. `1-6` Gap A2 的 BufferStore 运行时接入已完成,但保存后刷新读回仍有浏览器可见缺口。
|
||||
3. `1-6` Gap A0 browser smoke 已复跑,A2/A7/B2/C1 仍有证据尾项。
|
||||
4. `5-6` / `3-13` 的 Page Aggregate / GFM AST 尾项状态需要继续拆小,避免大文档长期停在 process。
|
||||
5. 本轮 smoke 复核后,`task443` / `task445` / `task452` 已确认是过期断言,不是当前业务回归。
|
||||
|
||||
本阶段优先处理“已实现但缺浏览器/测试证据”与“已有计划但未落地”的缺口,不扩新产品面,不改变 local-first / tree-first 口径。
|
||||
|
||||
## 2. 上游入口
|
||||
|
||||
- `design/01-tree-first-graph-kernel/process/1-5-next-phase-sequential-execution-checklist-v1.md`
|
||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
||||
- `design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
||||
|
||||
## 3. 不做事项
|
||||
|
||||
- 不把 `documents/save` 重新描述为 local-first 长期正文主入口。
|
||||
- 不把 `md/text/code` 改成 OnlyOffice 或浏览器窗口默认打开。
|
||||
- 不把 browser smoke 失败伪装成通过。
|
||||
- 不移动 `design/old/**`。
|
||||
- Reasonix worker 不提交 git;最终由 Codex 复核和提交。
|
||||
|
||||
## 4. Reasonix Worker 拆分
|
||||
|
||||
### Worker A:5-26 resource open resolver convergence
|
||||
|
||||
Owner:
|
||||
|
||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- 可新增或修改一个 `scripts/task48*-resource-open-resolver-*.js` smoke。
|
||||
|
||||
目标:
|
||||
|
||||
- 审查 `resolveResourceOpen`、`openEditorAttachmentEditTab`、`openEditorAttachmentNewWindow`、FileTree asset open/edit-mode 的重复判断。
|
||||
- 如能小范围安全实现,抽出最小 shared resolver/helper,减少正文附件与 FileTree 分歧。
|
||||
- 必须保持:正文附件 `弹窗编辑` 进入 main resource tab,`新窗口编辑` 进入浏览器窗口,`md/text/code` 继续走 tiptap / text/code 渲染路径。
|
||||
|
||||
验收:
|
||||
|
||||
- `cargo test -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1`
|
||||
- `node --check scripts/task463-onlyoffice-resolver-smoke.js`
|
||||
- 如新增 smoke,则 `node --check scripts/task48*-resource-open-resolver-*.js`
|
||||
|
||||
### Worker B:A2 BufferStore browser visible readback gap
|
||||
|
||||
Owner:
|
||||
|
||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
||||
- 可新增或修改一个 `scripts/task48*-bufferstore-*.js` smoke。
|
||||
|
||||
目标:
|
||||
|
||||
- 复现并定位 `POST /api/page-body/write` 后磁盘与 Page Aggregate 已更新,但刷新后编辑器 DOM/截图未显示正文的问题。
|
||||
- 优先做最小修复:让刷新后的主编辑器可见 DOM 消费最新 Page Aggregate / blockDocument。
|
||||
- 若无法安全修复,必须输出可复现 bug 证据和具体源码定位,不把该项标完成。
|
||||
|
||||
验收:
|
||||
|
||||
- `cargo test -p mnote-web document_buffer -- --test-threads=1`
|
||||
- `cargo test -p mnote-web page_aggregate -- --test-threads=1`
|
||||
- 相关 browser smoke 能证明保存后刷新可见正文不丢失,或明确失败原因。
|
||||
|
||||
### Worker C:A0/A2/B2/C1 baseline smoke evidence
|
||||
|
||||
Owner:
|
||||
|
||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
||||
- 可新增 `.codex/reasonix-tasks/results/batch-b-worker-c-baseline-smokes.md`
|
||||
- 不修改 Rust / JS 业务代码。
|
||||
|
||||
目标:
|
||||
|
||||
- 运行并记录 `1-6` 中尚未复跑的 browser smokes:
|
||||
- `task451-local-markdown-conflict-resolution-ui-smoke.js`
|
||||
- `task452-local-search-index-browser-smoke.js`
|
||||
- `task453-local-folder-page-ai-changed-files-smoke.js`
|
||||
- `task443-filetree-mindmap-click-active-row-smoke.js`
|
||||
- `task445-filetree-mindmap-switch-no-flicker-smoke.js`
|
||||
- 失败时记录为环境阻塞或业务 bug,附 stdout / result.json 路径。
|
||||
- 不做业务修复。
|
||||
|
||||
验收:
|
||||
|
||||
- 每个 smoke 有明确 `PASS` / `FAIL` / `BLOCKED`。
|
||||
- 对失败项给出 `tmp/.../result.json` 或日志路径。
|
||||
|
||||
### Worker D:Page Aggregate / GFM AST tail audit
|
||||
|
||||
Owner:
|
||||
|
||||
- `design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
||||
- 可新增 `.codex/reasonix-tasks/results/batch-b-worker-d-pageaggregate-gfm-tail.md`
|
||||
- 默认只改文档和 smoke 建议;如需改代码,先只输出建议,不直接改核心 Rust。
|
||||
|
||||
目标:
|
||||
|
||||
- 审查 `5-6` 中仍未勾选项是否已被后续实现覆盖,哪些应追认,哪些应拆新 checklist。
|
||||
- 审查 `3-13` 中 GFM AST 尾项:空段落/空表格、legacy <-> Tiptap mark、保存失败错误、过渡 parser 标记、web_shell 临时分支。
|
||||
- 给出下一步最小执行包,不把未验证项移动到 done。
|
||||
|
||||
验收:
|
||||
|
||||
- 输出明确表格:`已完成可追认` / `仍需代码修复` / `仅参考保留`。
|
||||
- 更新对应 process 文档的执行记录,但不归档。
|
||||
|
||||
## 5. Codex 复核项
|
||||
|
||||
- [ ] 逐个读取 Reasonix `final.md` / `result.json`。
|
||||
- [ ] 检查 `git diff`,确认 worker 没有越权修改。
|
||||
- [ ] 运行 worker 涉及脚本的 `node --check`。
|
||||
- [ ] 运行受影响 Rust targeted tests。
|
||||
- [ ] 对 UI / browser 可见项派发或执行独立浏览器测试。
|
||||
- [ ] 更新本 checklist 的执行记录。
|
||||
|
||||
## 6. 浏览器测试阶段
|
||||
|
||||
Batch B 代码 / smoke / 审查完成后,再按实际变更拆分浏览器测试 worker:
|
||||
|
||||
- Browser Worker 1:resource open resolver,验证正文附件 / FileTree asset / edit / new-window 分流。
|
||||
- Browser Worker 2:BufferStore 保存后刷新可见读回。
|
||||
- Browser Worker 3:Page Aggregate / GFM tail smoke,验证正文刷新、inline mark、task list 不回退。
|
||||
|
||||
Codex 必须复核浏览器测试结果;不能只相信 worker 文字总结。
|
||||
|
||||
## 7. 完成条件
|
||||
|
||||
- `5-26` 至少完成审查与最小实现,或明确不可安全实现的阻塞原因。
|
||||
- `1-6` Gap A2 浏览器可见读回有明确结果:完成、失败 bug 或环境阻塞。
|
||||
- `1-6` A0 browser smokes 有新的 PASS / FAIL / BLOCKED 证据。
|
||||
- `5-6` / `3-13` 尾项不再是模糊 TODO,已拆出下一步执行包。
|
||||
- `git diff --check` 通过。
|
||||
- `codegraph sync .` 已运行。
|
||||
- 本阶段完成后由 Codex 提交 git。
|
||||
|
||||
## 8. 本轮执行记录
|
||||
|
||||
- 2026-05-21:Codex 建立 Batch B P1 checklist,并准备派发 Reasonix Worker A/B/C/D。
|
||||
- 2026-05-21:Reasonix Worker C 完成 baseline smoke 证据收集;`task451`、`task453` PASS,`task452` 初判为 page-settings 本地索引面板渲染回归,`task443` / `task445` 初判为 mindmap smoke 仍按历史 `/mindmap/` 路由断言导致 false-negative。
|
||||
- 2026-05-21:Reasonix Worker D 完成 Page Aggregate / GFM AST 尾项审计;只改文档,不改业务代码。关键结论:`3-13` 中标题优先级被误标为完成,列对齐 marker 可追认,legacy/Tiptap marks、空单元格、保存失败可解释错误、写侧过渡标记仍需后续小包。
|
||||
- 2026-05-21:Reasonix Worker A/B 运行到 runner 超时后未生成 `final.md` / `result.json`,也未留下业务代码 diff;Codex 不采纳为完成项。A 的 transcript 只留下 resource open resolver 收敛计划,指出重复判断主要位于 `layout.rs` sidebar JS,原任务允许范围过窄;B 的 transcript 只留下 BufferStore / PageAggregate hydration 排查片段,未形成可复核结论。
|
||||
- 2026-05-21:Codex 复核裁定:`task452` 实为旧断言假失败,`task443` / `task445` 已改为 resourceTab 断言并实跑通过;本轮可采纳 C/D 的证据与审计,但 A/B 仍需拆成更小的后续任务,不把 `5-26` 或 Gap A2 标为完成。
|
||||
+39
-3
@@ -296,7 +296,7 @@
|
||||
|
||||
- [ ] 保证空段落、空表格单元格、空引用块的处理规则固定。
|
||||
|
||||
- [x] 统一处理标题优先级:frontmatter title > H1 > 文件名。
|
||||
- [ ] 统一处理标题优先级:frontmatter title > H1 > 文件名。
|
||||
|
||||
### 11.3 中间 IR -> PageAggregate / block document
|
||||
|
||||
@@ -354,7 +354,7 @@
|
||||
|
||||
- [x] 保存回写时保留表格分隔行和列数对齐。
|
||||
|
||||
- [ ] 列对齐、空单元格、带 mark 单元格的降级策略要写入测试。
|
||||
- [x] 列对齐、空单元格、带 mark 单元格的降级策略要写入测试。
|
||||
|
||||
### 11.7 保存回写
|
||||
|
||||
@@ -382,7 +382,7 @@
|
||||
|
||||
- [x] 确认本地 `.md` 读写 smoke 不影响 file tree / page tree / page aggregate 路由。
|
||||
|
||||
### 11.9 清理与迁移收尾11
|
||||
### 11.9 清理与迁移收尾
|
||||
|
||||
- [ ] 把手写 parser 标记为过渡实现。11
|
||||
|
||||
@@ -393,3 +393,39 @@
|
||||
- [x] 保留回归测试和兼容层,不删除验证资产。
|
||||
|
||||
- [ ] 迁移完成后把设计稿状态从 `process` 移到 `done`。
|
||||
|
||||
---
|
||||
|
||||
## 12. 审计记录(2026-05-21 Batch B Worker D)
|
||||
|
||||
### 12.1 已完成确认
|
||||
|
||||
以下 [x] 项经代码审查确认实际完成,证据充分:
|
||||
|
||||
- 11.1 全部 6 项:comrak 选型完成,GFM 子集确定,frontmatter 处理方式冻结,IR 边界明确,优先级确定,降级策略明确
|
||||
- 11.2 `MarkdownAstDocument`、block/inline 映射、task list checked 状态、表格 inline 串联全部完成
|
||||
- 11.3 AST→PageAggregate 映射集中到 `local_markdown_parser.rs`,兼容性验证通过
|
||||
- 11.4 code/bold/italic/strike/link 解析+回写全部完成,表格内 inline mark 有集成测试
|
||||
- 11.5 task list 双向转换全部完成,有 round-trip 测试
|
||||
- 11.7 前端保存路径写回 `.md`、round-trip 可读回、frontmatter 保留均有测试覆盖
|
||||
- 11.8 本地 md 读写 smoke 不影响 file tree/page tree/page aggregate
|
||||
|
||||
### 12.2 追认修正
|
||||
|
||||
| 项 | 原标记 | 审计结论 | 说明 |
|
||||
|---|--------|---------|------|
|
||||
| 11.2 标题优先级 | [x] | 应改为 **[ ]** | `parse_markdown_page` (`local_markdown_parser.rs:86-94`) 始终使用 `file_stem_title(file_name)`,完全忽略 frontmatter `title` 和正文 H1。`tree.rs:7307` 测试显式断言 frontmatter title 不应出现。**此为误标,需修正。** |
|
||||
| 11.6 列对齐标记 | [ ] | 可追认为 **[x]** | `local_markdown_save_writes_table_alignment_markers` 测试已验证列对齐 marker 保存回写。 |
|
||||
|
||||
### 12.3 仍保留 [ ] 项的状态
|
||||
|
||||
| 项 | 状态 | 说明 |
|
||||
|---|------|------|
|
||||
| 11.2 空段落/空表格单元格/空引用块 | **[ ] 保留** | 行为由 comrak 默认输出决定,无显式规则文档化。建议补单测固定当前行为即可,P1 不阻塞。 |
|
||||
| 11.4 legacy→Tiptap→legacy marks | **[ ] 保留** | 缺少反向转换集成测试。`document_shell_bootstrap_preserves_inline_mark_conversion` 仅验证函数存在性。 |
|
||||
| 11.6 列对齐/空单元格/带 mark 单元格降级策略测试 | **[ ] 部分完成** | 列对齐已有测试(应追认),但空单元格和降级策略仍无覆盖。 |
|
||||
| 11.7 保存失败状态保留 | **[ ] 保留** | 冲突/写失败返回 WebError,前端错误处理和状态保留逻辑无测试。 |
|
||||
| 11.8 web shell 单测 | **[ ] 保留** | 缺少实际调用 legacyInlineContentToTiptap 并验证输出 marks 完整性的测试。 |
|
||||
| 11.9 手写 parser 标记为过渡 | **[ ] 保留** | `local_folder_source.rs` 中 `inline_nodes_to_markdown` / `editor_blocks_to_markdown_*` 写侧函数无 `#[deprecated]` 标注。 |
|
||||
| 11.9 web_shell.rs 临时适配分支移除 | **[ ] 保留** | JS 侧 `legacyStylesToTiptapMarks` 等适配函数仍存在。 |
|
||||
| 11.9 process→done | **[ ] 保留** | 以上未完成项关闭后方可移动。
|
||||
|
||||
@@ -340,3 +340,38 @@
|
||||
在此之前,正确口径都应保持为:
|
||||
|
||||
> **`leptos-tiptap` 主编辑区已基本可用,但页面聚合仍未收口,当前仍处于从混合态向 Rust 单一真源过渡的过程中。**
|
||||
|
||||
---
|
||||
|
||||
## 11. 审计记录(2026-05-21 Batch B Worker D)
|
||||
|
||||
### 11.1 各 Phase 完成状态
|
||||
|
||||
| Phase | 审计结论 | 说明 |
|
||||
|-------|---------|------|
|
||||
| F(冻结 Page Aggregate Contract) | ✅ 全部完成 | 设计层和代码层标准均已锁定,读取链已 Rust-first |
|
||||
| G(主文档页消费统一聚合) | ✅ 基本完成 | 加载链路、散落 props、退出标准 1 已满足;exit 2(新增字段不扩容 props 链)为 P2 方向目标 |
|
||||
| H(pageOptions 进入 island) | ✅ 基本完成 | 优先级项已 wired,Inspector 口径统一,AI 写回白名单限制;`protectEditing/showBlockRefCount` 仍为 planned |
|
||||
| I(树域与页面域标题统一) | ✅ 全部完成 | task110 smoke 验证全部标题同步场景 |
|
||||
| J(AI 写入口对齐 Page Aggregate) | ⚠️ 命令面完成,权限面待验 | 命令名已收口;`allowedRoots` / 路径 escape 检查不在本审计范围内 |
|
||||
|
||||
### 11.2 2.2 节未成立事实的状态更新
|
||||
|
||||
| 项 | 审计状态 | 说明 |
|
||||
|---|---------|------|
|
||||
| 页面树/文件树/页面头部/页面设置/主编辑区尚未消费同一份 projection | ⚠️ 部分解决 | 主编辑区和页头已统一;页面树/文件树的标题已同源,但页面设置面板与主编辑区的 `pageOptions` 运行时消费仍有 gap |
|
||||
| 写侧未完全退出 `/api/documents/save` | ⚠️ 部分解决 | `local_folder` 已切到 `/api/page-body/write`;Convex workspace 仍走 `/api/documents/save`(作为正式路径而非 compat) |
|
||||
| tiptap dirty + AI/外部变更的 VSCode-like conflict UI | ❌ 未完成 | DOM 侧已经插入 conflict 面板元素(`web_shell.rs:4990-5015`),但前端测试/Playwright smoke 未覆盖 |
|
||||
| `pageOptions` 收口到 island 运行时语义 | ⚠️ 部分完成 | `page-option-semantics.ts` 分类已落地;`protectEditing/showBlockRefCount` 为 planned |
|
||||
| AI 写入口对齐授权/白名单/后台写入/前台同步 | ⚠️ 命令面已收口,权限面待验 | 本审计未确认 Hermes 侧的 `allowedRoots` 和路径 escape 实现 |
|
||||
|
||||
### 11.3 退出标准状态
|
||||
|
||||
- Section 9:"当前推荐实施顺序" 中的约束:Phase G 和 H 的 [ ] 项可以部分追认——Phase G 和 H 的主体工作已完成,但 exit criterion 的严格表述("已经统一聚合完成" / "大量打钩为正式可用")仍不完全满足。建议保持现状不勾选,等 J 完成后统一收尾。
|
||||
- Section 10 总退出标准:"标题/正文/页面设置不再是三条分裂真相链" 仍 [ ]——命令执行面已统一,但 projection 回流和 AI 页面设置写入口未完全统一,符合当前描述。
|
||||
|
||||
### 11.4 建议
|
||||
|
||||
1. **Phase G exit 2 降级为 P2**:新增字段仍需改 loader→state→consumer 链是当前架构的自然限制,不应作为 P1 block。
|
||||
2. **补充 Conflict UI Playwright smoke**:DOM 元素已经存在,只差自动化验收流程。
|
||||
3. **明确 `/api/documents/save` 的正式定位**:如果它是 Convex workspace 的正式路径,则在文档中调整口径;如果它是要移除的 compat,则排期删除。
|
||||
|
||||
Reference in New Issue
Block a user