Files
mnote/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md
T

116 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.
# 3-20 Browser Runtime 后续收口 Checklist v1
> 创建时间:2026-05-25
> 状态:`process`
> 来源:承接 `design/03-rust-web/done/3-19-rust-web-browser-runtime-module-extraction-v1.md` 的后续未专项完成项。
## 1. 目标
`3-19` 已归档的基础上,继续把仍留在 Rust inline / 主壳大 runtime 中的浏览器行为切成可审计模块。Codex 维护本文件作为事实源,Reasonix 只承接短批次审计、窄范围实现或浏览器 smoke;每批最多 2 个 worker。
## 2. 本轮边界
本轮优先处理:
- 主壳 filetree keyboard / clipboard / DND / context menu DOM 后续切片。
- document pane host adapter / document session / conflict panel runtime 只读审计。
- 本地上传主流程剩余边界审计,包括 `uploadFileToMediaAsset``uploadFilesWithResolvedTarget``insertUploadedAssetIntoEditor`
- WS / SSE tree live 浏览器回归 smoke。
本轮不处理:
- Tiptap 编辑器内部命令、history、selection overlay;这些归 `5-29`
- Rust kernel tree command 语义重写。
- Page AI panel 外置化;需要另起 `07-ai` 设计。
## 3. Batch A 候选任务
- [ ] Worker A:只读审计 document pane host adapter。
- 目标:列出 `web_shell.rs` 中 document pane host / session / conflict panel 可迁模块、风险和 smoke。
- 输出:候选模块表、禁止迁入 editor runtime 的边界、下一刀建议。
- [ ] Worker B:只读审计 local upload 主流程。
- 目标:复核上传主流程剩余函数是否可从 `SIDEBAR_TREE_JS` 拆入 `local-upload-runtime.js`,不得改变资源归属语义。
- 输出:函数归属表、不可迁项、必须保留的 smoke。
- [ ] Worker C:只读审计 filetree keyboard / clipboard / DND。
- 目标:基于已落地 `filetree-runtime.js` / `filetree-selection-runtime.js` / `filetree-context-menu-runtime.js`,给出下一刀最小实现范围。
- 输出:建议只迁纯 helper 还是 DOM listener,列出冲突文件。
- [ ] Worker D:浏览器 smoke 审计 WS / SSE tree live。
- 目标:只读验证主壳 tree live 外置 runtime 在浏览器中仍加载,记录 WS 正常路径和 SSE fallback 的可测性。
- 输出:截图、console/network、result.json;不修改源码。
## 4. 验收命令
按具体切片选择:
```bash
cargo fmt --manifest-path rust/Cargo.toml --all --check
cargo check --manifest-path rust/Cargo.toml -p mnote-web
cargo test --manifest-path rust/Cargo.toml -p mnote-web filetree
cargo test --manifest-path rust/Cargo.toml -p mnote-web runtime
node scripts/task487-local-folder-tree-live-consumer-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 和验证证据。
- 只采纳限定文件范围内的最小 diff;越界重构、回滚用户改动、修改 git 状态的一律拒绝。
- browser smoke worker 必须 `modified_files=[]`
- 本文件只记录真实完成项;未验证项保持未勾选。
## 6. 本轮执行记录
- 2026-05-25Codex 创建本续跑事实源。
- 2026-05-25:修正执行约束:本文件遵循当前 goal 的“每批最多 4 个 worker”;实现 worker 必须在独立 worktree 产出候选 patchCodex 复核后再选择性合入。
- 2026-05-25:下一批只派发 Worker Blocal upload / filetree 下一刀只读审计);Worker A/C/D 暂缓。
- 2026-05-25Reasonix local upload / filetree 只读审计尝试未产生 `result.json` / `process-handoff`,且运行期间出现额外 Batch A2 runner,主控已终止进程;该结果不作为正式 handoff 采纳。
- 可参考的 transcript 结论:`fetchWithTimeout` 是低风险纯工具函数,可先迁入 `local-upload-runtime.js``uploadFileToMediaAsset` / `uploadFilesWithResolvedTarget` / `insertUploadedAssetIntoEditor` 仍与 API、editor 插入和 snapshot refresh 耦合,暂不迁。
- 2026-05-25Codex 主控直接完成低风险切片:`local-upload-runtime.js` 新增并导出 `fetchWithTimeout``layout.rs` 的 inline `fetchWithTimeout` 先委托 runtime,保留原 fallback。
- 修改:`rust/crates/mnote-web/browser/local-upload-runtime.js``rust/crates/mnote-web/src/ssr/pages/layout.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/local-upload-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web mnote_browser_runtime_assets_are_explicitly_mounted -- --test-threads=1``cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1`
- 未完成:`insertUploadedAssetIntoEditor``uploadFileToMediaAsset``uploadFilesWithResolvedTarget` 仍未迁出。
- 2026-05-25Codex 主控继续完成 local upload API 小切片:`local-upload-runtime.js` 新增并导出 `uploadLocalFolderAsset`,承接本地上传 FormData 构造、`/api/local-folder/assets/upload` 请求和响应解析;`layout.rs` 仍负责 editor 插入、sidebar snapshot refresh 和 `wolai:local-assets-changed` 事件。
- 修改:`rust/crates/mnote-web/browser/local-upload-runtime.js``rust/crates/mnote-web/src/ssr/pages/layout.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/local-upload-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1``cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1``node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
- 未完成:`insertUploadedAssetIntoEditor``uploadFileToMediaAsset` 编排壳、`uploadFilesWithResolvedTarget` 仍未迁出。
- 2026-05-25:采纳并复核额外 Reasonix 候选 patch:新增 `document-conflict-panel-runtime.js`,把 document session conflict panel 的纯 DOM 清理 helper `clearSessionConflictSurface` 外置;inline adapter 保留 fallback。
- 修改:`rust/crates/mnote-web/browser/document-conflict-panel-runtime.js``rust/crates/mnote-web/src/routes/web_shell.rs``rust/crates/mnote-web/src/routes/mod.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/document-conflict-panel-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web mnote_browser_runtime_assets_are_explicitly_mounted -- --test-threads=1`
- 未完成:conflict merge / accept / keep 业务逻辑、document session lifecycle、secondary pane conflict smoke 仍未迁出。
- 2026-05-25Worker D`insertUploadedAssetIntoEditor` 外置)两次在独立 worktree `/mnt/Data1T/mnote-worktrees/0525-a2-upload-insert-current` 重新派发,均未产出可采纳 diff。
- `reasonix-2026-05-24T17-07-59-638Z-29274a46` 产生 handoff,但内容串到 Worker B 的 block menu 任务,worktree 无 diff,拒绝采纳。
- `reasonix-2026-05-24T17-12-41-044Z-25b9d5d7` 仅产生 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 `final.md``result.json``process-handoff.md/json`worktree 无 diff,拒绝采纳。
- 该项保持未完成;下一刀应进一步缩窄为只迁 editor 插入 DOM 拼接中的一个纯 helper,或由 Codex 本地实现后再交 Reasonix 做浏览器 smoke。
- 2026-05-25Codex 主控完成 `insertUploadedAssetIntoEditor` 外置切片:`local-upload-runtime.js` 新增并导出 `insertUploadedAssetIntoEditor(asset, targetRoot, deps)``layout.rs` 优先委托 runtime,保留完整 inline fallback。
- 修改:`rust/crates/mnote-web/browser/local-upload-runtime.js``rust/crates/mnote-web/src/ssr/pages/layout.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/local-upload-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1``cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1``node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
- 未完成:`uploadFileToMediaAsset` 编排壳、`uploadFilesWithResolvedTarget`、conflict merge / accept / keep 业务逻辑、secondary pane conflict smoke 仍未迁出。
- 过程说明:Worker D3`reasonix-2026-05-24T17-22-29-925Z-9b7b6dd4`)未产出可采纳 handoff 或 diff;最终由 Codex 独立实现、验证通过后合入。
- 2026-05-25Codex 主控完成 document conflict panel 第二刀:`document-conflict-panel-runtime.js` 新增并导出 `createSessionConflictPanel(session, message, deps)`,只负责冲突面板 DOM 创建和按钮回调 wiring;`web_shell.rs` 仍持有 `acceptDiskVersion``keepCurrentEditorVersion``openConflictDiffPanel` 等业务逻辑,并保留完整 inline fallback。
- 修改:`rust/crates/mnote-web/browser/document-conflict-panel-runtime.js``rust/crates/mnote-web/src/routes/web_shell.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/document-conflict-panel-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web document_conflict_panel_runtime_contains_dom_helpers -- --test-threads=1``cargo test --manifest-path rust/Cargo.toml -p mnote-web mnote_browser_runtime_assets_are_explicitly_mounted -- --test-threads=1`
- 未完成:conflict merge / accept / keep 业务逻辑、document session lifecycle、secondary pane conflict smoke 仍未迁出;本轮未声称真实冲突 UI 全链路完成。
- 2026-05-25:根据用户纠正,后续实现 worker 不能在主工作区直接修改;每批最多 4 个 worker,且必须采用独立 worktree 候选 patch 或明确只读任务。Codex 读取 Hindsight recall、`process-handoff.md/json``result.json`、diff 与验证证据后再选择性合入。
- 2026-05-25Codex 主控完成非本地 media upload API 小切片:`local-upload-runtime.js` 新增并导出 `uploadMediaAsset(file, plan, context)`,承接 `/api/media/upload` 的 FormData 构造、fetch 和响应解析;`layout.rs``uploadFileToMediaAsset` 仍负责 appendUploadedAssetRow、editor 插入和 `wolai:assets-changed` 事件分发,并保留完整 inline fallback。
- 修改:`rust/crates/mnote-web/browser/local-upload-runtime.js``rust/crates/mnote-web/src/ssr/pages/layout.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/local-upload-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1``cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1``node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
- 未完成:`uploadFileToMediaAsset` / `uploadFilesWithResolvedTarget` 编排壳、conflict merge / accept / keep 业务逻辑、secondary pane conflict smoke 仍未迁出;本轮未改资源归属语义。
- 2026-05-25Batch C 按用户要求同时派发 3 个独立 worktree 实现 workerB 修复 5-29 block delete undoC 迁 `uploadFileToMediaAsset`D 收口 conflict action boundary3 个 Reasonix runner 均未产出 `final.md``result.json``process-handoff.md/json`,对应 worktree diff 为空,按采纳规则全部拒绝。Codex 后续只采纳独立复核后的候选 patch。
- 2026-05-25Codex 主控完成 upload files orchestration 小切片:`local-upload-runtime.js` 新增并导出 `uploadFilesWithResolvedTarget(files, detail, options, deps)`,承接文件列表归一化、逐个上传、错误聚合和 alert 提示;`layout.rs` 仍注入 `resolveFileTreeUploadTarget` / `uploadFileToMediaAsset`,保留目标解析、单文件上传和完整 inline fallback。
- 修改:`rust/crates/mnote-web/browser/local-upload-runtime.js``rust/crates/mnote-web/src/ssr/pages/layout.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/local-upload-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1``cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1``node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
- 未完成:`uploadFileToMediaAsset` 编排壳、conflict merge / accept / keep 业务逻辑、secondary pane conflict smoke 仍未迁出;本轮未改资源归属语义。
- 2026-05-25Reasonix 只读审计 `uploadFileToMediaAsset` 剩余边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-e-3-20-uploadfile-readonly`run id `reasonix-2026-05-24T18-04-44-852Z-2c2d5ce9`
- Codex 已读取 Hindsight recall、`process-handoff.md/json``result.json`,并核对 worktree `git status --short` / `git diff --stat` 为空;runner 已产出 completed handoff 但进程未自行退出,主控已终止残留 runner。
- 审计结论:`uploadFileToMediaAsset` 的 API 调用、editor 插入、多文件循环等纯 helper 已外置;剩余主要是 source 判定、sidebar refresh / append、事件分发等 shell 编排职责,不适合继续整体迁入 runtime。
- 下一刀建议:不要盲迁整个 `uploadFileToMediaAsset`;若继续 3-20,应转向 filetree DOM runtime 的 `refreshLocalFolderSidebarSnapshot` / `appendUploadedAssetRow` 依赖拆分,或只做 fallback 精简但需重新评估是否仍要保留 inline fallback 策略。
- 2026-05-25Codex 独立复核并采纳 3-20 候选 patch:`local-upload-runtime.js` 新增并导出 `uploadFileToMediaAsset(file, plan, options, deps)``layout.rs` 的同名 wrapper 优先委托 runtime,仍保留完整 inline fallback`resolveFileTreeUploadTarget` 未迁出,资源归属、上传 API、editor 插入状态和事件名保持不变。
- Reasonix 协作证据:只读审计 run `reasonix-2026-05-24T18-04-44-852Z-2c2d5ce9` 已有 Hindsight recall 与 `process-handoff.md/json`,指出剩余职责主要是 shell 编排;实现 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`,因此不作为完整 Reasonix handoff 采纳。
- 候选 worktree`/mnt/Data1T/mnote-worktrees/0525-d-worker-b-3-20-upload-file-orchestrator`Codex 已核对 `git diff --stat``git diff --check` 和修改范围,并按“runtime 委托 + shell deps 注入 + fallback 保留”的较窄边界采纳。
- 修改:`rust/crates/mnote-web/browser/local-upload-runtime.js``rust/crates/mnote-web/src/ssr/pages/layout.rs`
- 已验证:`node --check rust/crates/mnote-web/browser/local-upload-runtime.js``cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/Cargo.toml -p mnote-web``cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1``cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1``NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
- 过程说明:Worker B 在独立 worktree 中复跑 `task479` 时曾出现 `broken-link-after-real-file-delete` 等待超时且 JSON `ok:false`;Codex 在主工作区移植后复跑同一 smoke,结果 `ok:true`,截图证据位于该 smoke 输出的临时目录。
- 未完成:`resolveFileTreeUploadTarget`、filetree DOM runtime 的 `refreshLocalFolderSidebarSnapshot` / `appendUploadedAssetRow` 更细拆分、conflict merge / accept / keep 业务逻辑、secondary pane conflict smoke 仍未迁出。