Files
mnote/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md
T

158 lines
28 KiB
Markdown
Raw Normal View History

2026-05-25 00:51:52 +08:00
# 5-29 Editor Runtime 后续收口 Checklist v1
> 创建时间:2026-05-25
> 状态:`process`
> 来源:承接 `design/05-editor-mainline/done/5-28-leptos-tiptap-editor-runtime-module-extraction-v1.md` 的后续未专项完成项。
## 1. 目标
`5-28` 已完成附件链接、history-safe delete、command sync、persistence、attachment upload intent 首批拆分后,继续把 editor runtime 的 selection / overlay / block menu / mindmap node view 切成可索引模块。Codex 维护本文件作为事实源,Reasonix 只做短批次审计、窄范围实现或浏览器 smoke;当前 goal 下每批最多 2 个 worker。
2026-05-25 00:51:52 +08:00
## 2. 本轮边界
本轮优先处理:
- `editor_runtime/dom_selection.rs` 第一刀。
- overlay / block menu 后续切片的只读审计。
- 仍使用 HTML 整文替换的用户编辑路径风险复核,例如块手柄拖拽重排和复制副本。
- `task488` / `task489` / `task479` 作为回归基线。
本轮不处理:
- shell host resource open / local upload 落盘语义;这些归 `3-20`
- Page AI 流式 apply / review session。
- mindmap 事实源重构;本轮最多审计 node view 拆分边界。
## 3. Batch A 候选任务
- [x] Worker A:实现 `dom_selection.rs` 第一刀。
- 允许修改:`rust/spikes/leptos-tiptap-spike/src/lib.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs`、新增 `rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs`
- 目标函数:`active_editor_text_selection``selection_summary``has_active_text_selection``selection_has_rich_marks`,以及必要的 selection payload helper。
- 禁止:迁出 block menu DOM、overlay state、host bridge、resource open。
- [ ] Worker B:只读审计 overlay / block menu 拆分。
- 目标:列出强依赖 Leptos signal 的函数,判断是否先抽 context struct 或先迁纯 helper。
- 输出:下一刀最小实现范围和 smoke 建议。
- [ ] Worker C:只读审计剩余 HTML 整文替换用户编辑路径。
- 目标:查 `set_content``apply_html_update``apply_document_update` 的用户触发链路,列出可迁 Tiptap command/transaction 的候选。
- 输出:风险表和建议 RED smoke。
- [ ] Worker D:浏览器 smoke 审计 editor runtime 基线。
- 目标:只读运行或复核 `task488``task489``task479`,截图/结果证明附件删除和块菜单删除 undo/redo 仍可用。
- 输出:result.json、截图、console/network;不修改源码。
## 4. 验收命令
```bash
cargo fmt --manifest-path rust/Cargo.toml --all --check
cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml
cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release
wasm-bindgen rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island
node scripts/task488-local-attachment-link-delete-undo-smoke.js
node scripts/task489-block-menu-delete-undo-smoke.js
node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js
```
UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据。
## 5. 采纳规则
- Reasonix 结果必须先查 Hindsight `reasonix` recall,再读 `process-handoff.md/json``result.json`、diff 和验证证据。
- 实现 worker 只能改允许范围;只读和 smoke worker 必须没有源码 diff。
- `lib.rs` 不能新增附件/history/DOM bridge 大块逻辑。
- 本文件只记录真实完成项;未验证项保持未勾选。
## 6. 本轮执行记录
- 2026-05-25Codex 创建本续跑事实源。
- 2026-05-25Worker A 未继续派发;Codex 主控已在主工作区完成 `dom_selection.rs` 第一刀并提交 `c7ab4e56 refactor: extract editor dom selection runtime`
- 已迁函数:`node_is_within_root``active_editor_text_selection``has_active_text_selection``selection_summary``selection_has_rich_marks`
- 未迁:`SelectionPayload``selection_payload``send_selection_state*``selection_event_payload`,原因是仍依赖 bridge event、`HoveredBlockState` 和 runtime block id 边界。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``task488``task489`、CodeGraph pending 0。
2026-05-25 03:05:57 +08:00
- 2026-05-25:执行口径修正:继续遵循当前 goal 的“每批最多 2 个 worker”;Reasonix 后续必须使用独立 worktree 或明确只读任务,完成后由 Codex 读取 handoff 并复核。
2026-05-25 02:09:40 +08:00
- 2026-05-25Batch D 额外 runner 曾自动启动 Worker A / Worker B,未经过本轮主控计划确认;主控已终止相关 runner / ACP 进程,不采纳这些未受控 run。遗留 task 草稿暂不删除,后续如继续使用必须重新生成受控任务书。
2026-05-25 00:57:52 +08:00
- 2026-05-25Reasonix runner 异常:后续实现 run 未写 `result.json``process-handoff.md/json`,部分 transcript 停在工具调用阶段;Codex 不采纳其文字结论,只复核实际 diff。
- 2026-05-25Reasonix overlay / block menu 只读审计尝试未产生 `result.json` / `process-handoff`,且运行期间出现额外 Batch A2 runner,主控已终止进程;该结果不作为正式 handoff 采纳。
- transcript 只显示探索过程,未形成函数归属表;下一次应改为更窄的单问题只读任务,例如只审计 `floating_toolbar_anchor_from_selection` / `sync_text_selection_overlay` 能否迁入 `overlays.rs`
2026-05-25 01:06:37 +08:00
- 2026-05-25Codex 主控直接完成 overlay 第一刀:新增 `editor_runtime/overlays.rs`,迁出 `FloatingToolbarAnchor``floating_toolbar_anchor_from_selection``sync_text_selection_overlay`
- 未迁:`sync_editor_overlay_state` / `try_sync_editor_overlay_state`,原因是仍依赖 `HoveredBlockState`、slash/block menu signal 和 overlay 关闭策略。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``node scripts/task488-local-attachment-link-delete-undo-smoke.js``node scripts/task489-block-menu-delete-undo-smoke.js`
- 运行中再次出现额外 Batch A2 Reasonix runner,主控已终止;这些 runner 未作为本批证据。
2026-05-25 01:22:26 +08:00
- 2026-05-25:采纳并复核 Worker B 候选 patch:新增 `editor_runtime/block_menu_legacy_html.rs`,迁出 `duplicate_top_level_block_html``reorder_top_level_block_html``lib.rs` 仅保留调用点和 `DropPlacement``pub(crate)` 可见性。
- Reasonix run`reasonix-2026-05-24T17-07-59-603Z-bfe72d77`,已读取 Hindsight recall、`process-handoff.md/json`、diff,并由 Codex 独立复核。
- Codex 合入时保持实现逻辑同构,仅收口模块边界和 checklist 事实记录。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``node scripts/task488-local-attachment-link-delete-undo-smoke.js``node scripts/task489-block-menu-delete-undo-smoke.js`
- 未完成:HTML 整文替换仍是 legacy 路径,后续要用 history-safe Tiptap command 替换;`sync_editor_overlay_state`、block menu signal 仍未拆出。
2026-05-25 01:45:03 +08:00
- 2026-05-25:复跑浏览器 smoke 后修正上一条验收口径:`task488` 通过,但 `task489-block-menu-delete-undo-smoke` 连续两次失败,失败点是块菜单删除后 `Control+Z` 未恢复 `Beta block`
- 证据:`tmp/task489-block-menu-delete-undo-smoke/result.json``tmp/task489-block-menu-delete-undo-smoke/failure.png`
- 已登记缺陷:`bugs/05-editor-mainline/done/5-39-block-menu-delete-undo-regression-v1.md`
- Worker E`reasonix-2026-05-24T17-34-41-774Z-85427058`)已在独立 worktree `/mnt/Data1T/mnote-worktrees/0525-b3-block-delete-undo` 派发修复任务,但 runner 仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 `final.md``result.json``process-handoff.md/json`worktree 无 diff,拒绝采纳。
- 当前结论:5-29 仍未完成;下一步应先定位 `delete_top_level_block_with_history``sync_persisted_editor_command`、editor focus / undo keydown 之间的真实断点,再修复。
2026-05-25 02:03:47 +08:00
- 2026-05-25Codex 主控修复 `5-39`:诊断确认 history 未丢,断点是块菜单删除后焦点短暂落到 `BODY`;最终修复为删除菜单项 `mousedown` 阶段阻止默认焦点转移、关闭菜单后异步 `editor.focus()` 兜底,并在 `BODY` 焦点窗口只转发 undo/redo 快捷键到当前 editor;缺陷文档已移到 `bugs/05-editor-mainline/done/5-39-block-menu-delete-undo-regression-v1.md`
2026-05-25 01:45:03 +08:00
- 同批新增 `editor_runtime/block_menu_document.rs`,迁出未走当前运行路径的 legacy 顶层块 JSON helper`duplicate_top_level_block``delete_top_level_block``reorder_top_level_block``replace_top_level_block_kind` 暂不迁,因仍依赖 slash action、mindmap 和 image placeholder 语义。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``node scripts/task489-block-menu-delete-undo-smoke.js``node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 未覆盖:`cargo test --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml block_menu_document -- --test-threads=1` 被既有 `STYLE` 测试编译错误阻断,未进入本次新增 helper 测试。
- 2026-05-25:根据用户纠正,后续 B/C/D 等实现 worker 不再只读或在主工作区直接修改;Batch C 统一采用独立 worktree 候选 patchCodex 读取 Hindsight recall、`process-handoff.md/json``result.json`、diff 与验证证据后再选择性合入。
2026-05-25 02:10:48 +08:00
- 2026-05-25:根据用户再次纠正,后续 B/C/D 等实现 worker 必须统一在独立 worktree 中产出候选 patch,再由 Codex 复核 diff / handoff / 验证证据后选择性合入;不得在主工作区直接推进实现 worker。
- 2026-05-25Batch D Reasonix runner 再次异常:Worker A run `reasonix-2026-05-24T18-07-08-220Z-ccc4102a`、Worker B run `reasonix-2026-05-24T18-07-08-227Z-1358f36b` 仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 `final.md``result.json``process-handoff.md/json`,对应 worktree diff 均为空;该结果拒绝采纳。为保持推进速度,本批改用独立 worktree worker 继续产出候选 patch,Codex 仍按同一采纳规则复核。
2026-05-25 02:03:47 +08:00
- 2026-05-25Batch C Worker B`reasonix-2026-05-24T17-41-07-634Z-a39f8963`)在独立 worktree `/mnt/Data1T/mnote-worktrees/0525-c-worker-b-block-delete-undo` 未产出 `final.md``result.json``process-handoff.md/json`worktree diff 为空,拒绝采纳;Codex 随后在同一 worktree 独立定位根因、产出候选 patch、通过 smoke 后移植到主工作区。
2026-05-25 01:56:39 +08:00
- 2026-05-25Reasonix 只读审计 `sync_editor_overlay_state` / `try_sync_editor_overlay_state` 下一刀,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-d-5-29-overlay-readonly`run id `reasonix-2026-05-24T17-53-20-962Z-d3077308`
- Codex 已读取 Hindsight recall、`process-handoff.md/json``result.json`,并核对 worktree `git status --short` / `git diff --stat` 为空;runner 已产出 completed handoff 但进程未自行退出,主控已终止残留 runner。
- 审计结论:当前不宜直接把 `sync_editor_overlay_state` / `try_sync_editor_overlay_state` 迁入 `overlays.rs`,因为它们仍强依赖 `HoveredBlockState`、slash/block menu signals、`active_editor_stage` 和 8/18 overlay signal 的局部关闭策略;`on_selection_change` 仍有一套内联 signal 同步逻辑,直接迁出会造成两套 overlay reconciler。
- 下一刀建议:先做类型/边界准备或更窄 helper,而不是迁整个 sync 函数;候选是抽出 block/overlay shared types(例如 `HoveredBlockState` 及相关 anchor 类型)或把 `active_editor_stage` 的 DOM 判断收口到 runtime helper,之后再考虑 `close_editor_floating_overlays` 整簇迁移。
2026-05-25 02:19:57 +08:00
- 2026-05-25Codex 主控完成 editor focus helper 第一刀:新增 `editor_runtime/editor_focus.rs`,迁出 `schedule_editor_focus``body_has_focus``active_editor_stage``lib.rs` 仍保留 overlay / block menu signal 编排和调用点。
2026-05-25 02:17:09 +08:00
- 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/editor_focus.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs``rust/spikes/leptos-tiptap-spike/src/lib.rs`、generated island wasm/js。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``node scripts/task489-block-menu-delete-undo-smoke.js``node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 未完成:`sync_editor_overlay_state` / `try_sync_editor_overlay_state``HoveredBlockState` shared type、block menu signal 仍未拆出。
2026-05-25 02:29:49 +08:00
- 2026-05-25Batch E 计划继续采用独立 worktree 候选 patchWorker A 负责把 `HoveredBlockState``BlockMenuLayout``DropPlacement``DropIndicatorState` 迁入 `editor_runtime/block_hover_state.rs`,只做共享类型边界,不迁 DOM 查询、signal 编排或 block menu 行为。
2026-05-25 02:34:01 +08:00
- 2026-05-25Codex 独立复核并移植 Batch E Worker A 候选 diff:新增 `editor_runtime/block_hover_state.rs`,迁出 `HoveredBlockState``BlockMenuLayout``DropPlacement``DropIndicatorState``PendingDragState``lib.rs` 仍保留 DOM 查询、布局计算、signal 编排和 block menu 行为。
- Reasonix 协作证据:runner `reasonix-2026-05-24T18-25-26-836Z-aa546442` / `reasonix-2026-05-24T18-26-04-414Z-9476214d` 均仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 `final.md``result.json``process-handoff.md/json`;因此不作为完整 handoff 采纳。Codex 已查 Hindsight recall、核对 worktree diff,并拒绝移植 worktree 中未跟踪 `reference-code` symlink。
- 候选 worktree`/mnt/Data1T/mnote-worktrees/0525-e-worker-a-5-29-block-hover-state`
- 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_hover_state.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_document.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_legacy_html.rs``rust/spikes/leptos-tiptap-spike/src/lib.rs`
- 已验证:`git diff --check``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``node scripts/task489-block-menu-delete-undo-smoke.js``node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 未完成:`sync_editor_overlay_state` / `try_sync_editor_overlay_state`、block menu signal 编排、HTML 整文替换 legacy 路径仍未拆出。
2026-05-25 02:29:49 +08:00
- 2026-05-25Batch E 派发异常并终止:Worker A 任务被重复启动为两个 runner / ACP 进程(`reasonix-2026-05-24T18-25-26-836Z-aa546442``reasonix-2026-05-24T18-26-04-414Z-9476214d`),同一 worktree `/mnt/Data1T/mnote-worktrees/0525-e-worker-a-5-29-block-hover-state` 出现并发写入风险;Codex 已终止相关 Reasonix 进程,未读取到 `final.md``result.json``process-handoff.md/json`,该 diff 只保留为后续人工审计素材,不采纳。
2026-05-25 02:34:01 +08:00
- 2026-05-25Codex 独立复核并推进 block hover state 类型边界拆分:新增 `editor_runtime/block_hover_state.rs`,迁出 `HoveredBlockState``BlockMenuLayout``DropPlacement``DropIndicatorState``PendingDragState``lib.rs` 仍保留 DOM 查询、signal 编排、block menu 行为和拖拽逻辑。
- 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_hover_state.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_document.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_legacy_html.rs``rust/spikes/leptos-tiptap-spike/src/lib.rs`、generated island wasm。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 未完成:`sync_editor_overlay_state` / `try_sync_editor_overlay_state`、block menu signal 和拖拽重排行为仍在 `lib.rs`,后续应继续按更窄 helper 拆分。
2026-05-25 02:44:34 +08:00
- 2026-05-25Batch F 计划继续采用独立 worktree 候选 patchWorker A 负责把 `hover_anchor_top``hover_anchor_transform``block_menu_layout` 或其几何计算部分迁入 `editor_runtime/block_menu_overlay.rs`,不迁拖拽 hit-test、signal 编排或 block menu 行为。
2026-05-25 02:50:31 +08:00
- 2026-05-25:采纳并复核 Batch F Worker A 候选 patch:新增 `editor_runtime/block_menu_overlay.rs`,迁出 `hover_anchor_top``hover_anchor_transform``block_menu_layout` 的纯几何计算;`lib.rs` 仍保留 `editor_stage_element` DOM 查询、拖拽 hit-test、signal 编排和 block menu 行为。
- Reasonix run`reasonix-2026-05-24T18-39-34-366Z-631ed269`,已读取 Hindsight recall、`process-handoff.md/json``result.json`、diff 与验证摘要;Reasonix 自报 smoke 挂起,Codex 不采信该部分。
- 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_overlay.rs``rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs``rust/spikes/leptos-tiptap-spike/src/lib.rs`、generated island wasm/js/d.ts。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 未完成:`pointer_in_handle_corridor``drop_indicator_from_target` / `drop_indicator_from_point``sync_editor_overlay_state` / `try_sync_editor_overlay_state` 仍在 `lib.rs`
2026-05-25 03:05:57 +08:00
- 2026-05-25Batch G Worker D 先按用户纠正使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-g-worker-d-5-29-block-dnd-helpers`Reasonix run `reasonix-2026-05-24T18-51-00-541Z-17d61f43` 仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 handoff/result/finalworktree 初始 diff 为空,拒绝作为 Reasonix handoff 采纳。Codex 随后在该独立 worktree 产出候选 patch,经复核后选择性移植到主工作区。
- 修改:新增 `rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs`,迁出 `pointer_in_handle_corridor` / `drop_indicator_from_target` 使用的纯几何 helper`lib.rs` 仍保留 DOM 查询、signal 编排、拖拽事件和 HTML reorder 行为。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 未覆盖:`cargo test --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml block_dnd -- --test-threads=1` 仍被既有 `STYLE` 测试编译错误阻断,未进入本次新增 helper 测试。
- 未完成:`drop_indicator_from_point` 的 DOM target lookup、拖拽 listener 编排、`sync_editor_overlay_state` / `try_sync_editor_overlay_state` 仍在 `lib.rs`
- 2026-05-25Batch H 只派发 1 个只读 Reasonix worker 复核 block DnD helper 边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-h-5-29-block-dnd-readonly`run id `reasonix-2026-05-24T18-59-12-393Z-b5d95a7b`,并显式使用 `--no-memory-recall` 降低任务串线风险。
- Codex 已读取 Hindsight recall、`process-handoff.md/json``result.json`,并核对 worktree `git status --short` / `git diff --stat` 为空。
- 审计结论:只迁纯几何 helper 是合理边界;DOM 查询、`document.element_from_point`、event listener、Leptos signal 和拖拽重排行为继续留在 `lib.rs`
- 主控裁决:采纳审计方向,但保留当前 `editor_runtime/block_dnd.rs``HandleCorridorGeometry` 参数结构,避免 Reasonix 建议的长参数列表降低可读性。
- 2026-05-25Batch J 同时启动 Worker B`0525-j-worker-b-5-29-close-overlays`)和 3-20 Worker C/D3 个 worker 超过当前 goal 的“每批最多 2 个 worker”。Reasonix run `reasonix-2026-05-24T19-14-46-705Z-ebcc8980` 仅有 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 `final.md``result.json``process-handoff.md/json`worktree diff 为空;不采纳。
- 2026-05-25Batch J Codex 在独立 worktree `/mnt/Data1T/mnote-worktrees/0525-j-worker-b-5-29-close-overlays` 产出并复核候选 patch:删除无调用方的 `sync_editor_overlay_state`,新增 `try_close_block_menu_overlays` 承接 `try_sync_editor_overlay_state` 中的 slash / turn-into / block menu / hovered block 关闭子集;不迁 `try_sync_editor_overlay_state`,不合并 `on_selection_change` 的内联 overlay 路径。
- 修改:`rust/spikes/leptos-tiptap-spike/src/lib.rs`、generated island `js/d.ts/wasm/wasm.d.ts`
- 已验证:在独立 worktree 中运行 `cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen`;主工作区复跑 `NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js` 均通过,结果分别位于 `/mnt/Data1T/mnote/tmp/task489-block-menu-delete-undo-smoke/result.json``/mnt/Data1T/mnote/tmp/task488-local-attachment-link-delete-undo-smoke/result.json`
- 未完成:`try_sync_editor_overlay_state``on_selection_change` overlay 同步、block menu signal 编排仍未迁出;本轮未扩大迁移边界。
- 2026-05-25:当前 goal 明确为每批最多 2 个 worker;后续 Batch 计划和 Reasonix 派发以 2 个为硬上限,历史记录中超过 2 个 worker 的批次保留为异常记录。
- 2026-05-25Batch K 只派发 1 个只读 Reasonix worker 审计 `close_editor_floating_overlays` 迁出边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-k-5-29-close-overlays-readonly`run id `reasonix-2026-05-24T19-18-51-566Z-90f11977`,并显式使用 `--no-memory-recall` 降低任务串线风险。
- Codex 已读取 Hindsight recall、`process-handoff.md/json``result.json`,并核对 worktree `git status --short` / `git diff --stat` 为空。
- 审计结论:先把 `ImageToolbarAnchor``TableOverlayAnchor``TableSelectionKind``TableSelectionOverlayState` 迁入 `editor_runtime/overlays.rs`,再迁出纯 WriteSignal setter `close_editor_floating_overlays``close_editor_floating_overlays_if_escape``open_slash_menu_overlay``open_image_toolbar_overlay``open_block_menu_overlay``try_sync_editor_overlay_state``on_selection_change` overlay 同步继续留在 `lib.rs`
- Codex 主控在主工作区采纳该边界,并保留 Batch J 候选中已复核过的 `try_close_block_menu_overlays` 小 helper;该 helper 只收窄 `try_sync_editor_overlay_state` 内部的 block menu 关闭子集,不迁出 signal 编排。
- 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/overlays.rs``rust/spikes/leptos-tiptap-spike/src/lib.rs`、generated island `js/d.ts/wasm/wasm.d.ts`
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen`。主工作区 editor smoke 仍需复跑后再提交。
- 未完成:`try_sync_editor_overlay_state``on_selection_change` overlay 同步、block menu signal 编排、Escape 条件判断仍未迁出。
- 2026-05-25Batch L 派发 2 个只读 Reasonix workerWorker A `reasonix-2026-05-24T19-30-30-474Z-c3f28f20` 审计 5-29 overlay syncWorker B `reasonix-2026-05-24T19-30-30-509Z-18f62949` 审计 3-20 sidebar refresh;运行中又出现两个额外自动 runner,主控已终止,不采纳。
- Worker A handoff 出现任务串线迹象,final 同时讨论 3-20 和 5-29;Codex 只采纳其中由本地代码复核确认的 5-29 结论:`on_selection_change``try_sync_editor_overlay_state` 不能直接统一,因为 toolbar lock 语义不同。
- Codex 主控采纳最小机械切片:把 `try_close_block_menu_overlays` 迁入 `editor_runtime/overlays.rs``try_sync_editor_overlay_state``close_editor_floating_overlays_if_escape``on_selection_change` 仍留在 `lib.rs`
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 2026-05-25Batch M 按用户纠正尝试并行派发 3 个 Reasonix 实现 worker,均使用独立 worktreerun `reasonix-2026-05-24T19-40-19-806Z-81099224` 仅有 `prompt.md``memory-recall.json``reasonix-transcript.jsonl`,无 `final.md``result.json``process-handoff.md/json`,不采纳。
- 失败原因:Reasonix ACP 并发串线,transcript 出现读取非本 worker worktree 的行为;不满足 handoff 合同。
- 主控处置:不从 Batch M 合入任何 diff;改用 Batch N 的独立 worktree 子 agent worker 继续推进,仍由 Codex 复核 diff 和验证。
- 2026-05-25Batch N 继续收口 overlay escape 小切片:Codex 主控把 `close_editor_floating_overlays_if_escape` 机械迁入 `editor_runtime/overlays.rs``lib.rs` 仅保留调用和仍需壳层状态的 open / sync overlay 编排。
- 未迁:`try_sync_editor_overlay_state``on_selection_change``open_slash_menu_overlay` / `open_image_toolbar_overlay` / `open_block_menu_overlay`,原因是仍依赖 DOM event、toolbar lock、selection bridge 或 Leptos shell signal 编排。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`
- 2026-05-25Batch O 继续收口 overlay open helperCodex 主控把 `open_slash_menu_overlay``open_image_toolbar_overlay``open_block_menu_overlay` 迁入 `editor_runtime/overlays.rs`。这三者只复用 `close_editor_floating_overlays` 并设置 Leptos signals`open_block_menu_overlay` 仅读取 `block_menu_open` 判定是否重新打开。
- 未迁:`try_sync_editor_overlay_state``on_selection_change` 和各调用点 DOM / selection bridge 逻辑,原因是仍属于 editor shell 编排。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`