diff --git a/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md b/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md index e390ed39..09cf49ff 100644 --- a/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md +++ b/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md @@ -143,7 +143,7 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据 - 2026-05-25:Batch J 启动 Worker C(`0525-j-worker-c-3-20-filetree-dom`)与 Worker D(`0525-j-worker-d-3-20-conflict-action`),并同时存在 5-29 Worker B,3 个 worker 超过当前 goal 的“每批最多 2 个 worker”。Reasonix run `reasonix-2026-05-24T19-14-46-740Z-b6aed1df`、`reasonix-2026-05-24T19-14-46-748Z-c84c5ef9` 仅有 `prompt.md` / `memory-recall.json`,无 `final.md`、`result.json`、`process-handoff.md/json`,worktree diff 为空;不采纳。 - 2026-05-25:Batch J Codex 复核结论:Worker C / D 对应边界已在当前 HEAD 中具备,未重复合入新 diff。Worker C 已验证 `node --check rust/crates/mnote-web/browser/filetree-runtime.js`、`cargo check --manifest-path rust/Cargo.toml -p mnote-web`、`cargo test --manifest-path rust/Cargo.toml -p mnote-web filetree_runtime_contains_row_accessor_helpers -- --test-threads=1`;Worker D 已验证 `node --check rust/crates/mnote-web/browser/document-conflict-panel-runtime.js`、`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`。 - 主工作区 smoke:`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js` 通过,截图证据 `/tmp/mnote-task479-lifecycle-xlAZrs/screenshots-1779650673787/final-state.png`;`NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task451-local-markdown-conflict-resolution-ui-smoke.js` 通过,结果 `/mnt/Data1T/mnote/tmp/task451-local-markdown-conflict-resolution-ui-smoke/result.json`。 -- 2026-05-25:当前 goal 明确为每批最多 4 个 worker;后续 3-20 派发以 4 个为硬上限,历史记录中超过 4 个 worker 或未使用独立 worktree / 明确只读任务的批次保留为异常记录。 +- 2026-05-25:当前 goal 明确为每批最多 2 个 worker;后续 3-20 派发以 2 个为硬上限,历史记录中超过 2 个 worker 的批次保留为异常记录。 - 2026-05-25:Batch L Worker B `reasonix-2026-05-24T19-30-30-509Z-18f62949` 只读审计 `refreshLocalFolderSidebarSnapshot`;Codex 已读取 Hindsight recall、`process-handoff.md/json`、`result.json`,并核对 worktree diff 为空。 - 审计结论:`refreshLocalFolderSidebarSnapshot` 仍是 shell 编排,包含 workspace/root/document 状态、两条 projection fetch、render 后副作用和 watcher 标记,不应整体迁入 `filetree-runtime.js`。 - 下一刀建议:优先迁投影数据读取器层(如 `readProjection`、`readDatasetProjection`、`projectionItems`、row/id/title/file accessor、`groupRowsByParent`),或更保守地先迁未使用的 `replaceSidebarTreeFromDocument`;Codex 本轮不直接实现 3-20 代码,只记录候选。 @@ -164,9 +164,9 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据 - Worker 验证:`node --check scripts/task487-local-folder-tree-live-consumer-smoke.js`、限定 `git diff --check` 通过;因当时 3000 未启动,未运行真实浏览器 smoke。 - Codex 主控验证:`node --check scripts/task487-local-folder-tree-live-consumer-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3001 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task487-local-folder-tree-live-consumer-smoke.js`。结果仍为 RED,`transport=local-folder-events`、PageTree/FileTree 外部变更阶段 `navigationEvents=0`,但 `treeLiveApplied` 仍为空,说明 live consumer 证据仍未收敛到 snapshot/resync。 - 2026-05-25:Batch P Reasonix 派发失败并拒收:三个输出目录 `reasonix-2026-05-24T20-21-00-338Z-53f263c7` / `reasonix-2026-05-24T20-21-00-457Z-9384a1e5` / `reasonix-2026-05-24T20-21-00-569Z-8a3585e8` 均只有 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,没有 `result.json`、`process-handoff.md/json` 或 `final.md`;记录中的三个 worktree 目录当前不存在,Codex 未采纳任何 diff。后续 B/C/D 等实现 worker 必须在独立 worktree 产出候选 patch,再由 Codex 读取 Hindsight recall、handoff、diff 和验证证据后选择性合入。 -- 2026-05-25:Batch Q 按当前“最多 4 个 worker”口径派发 3 个独立 worktree Reasonix runner:Worker A server fallback、Worker B task487 evidence、Worker C client fallback audit。三个输出目录 `reasonix-2026-05-24T20-27-26-922Z-9f1ffa2f` / `reasonix-2026-05-24T20-27-26-933Z-6ad5f071` / `reasonix-2026-05-24T20-27-26-955Z-ff208388` 均只有 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,没有 `result.json`、`process-handoff.md/json` 或 `final.md`;runner 结束后三个 q worktree 目录也已不存在,Codex 未采纳任何 Reasonix diff。 +- 2026-05-25:Batch Q 未经主控批准再次自动启动 3 个 Reasonix runner(`0525-q-worker-a/b/c-*`),超过当前 goal 的 2 worker 上限。三个输出目录 `reasonix-2026-05-24T20-27-26-922Z-9f1ffa2f` / `reasonix-2026-05-24T20-27-26-933Z-6ad5f071` / `reasonix-2026-05-24T20-27-26-955Z-ff208388` 均只有 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,没有 `result.json`、`process-handoff.md/json` 或 `final.md`;Codex 已终止进程,删除本轮自动生成的 3 份 batch-q 草稿并移除空 worktree,不采纳任何 Reasonix 结果。 - 2026-05-25:Codex 修复本机 Reasonix runner / skill 的协同约束:`reasonix-coding-runner.mjs` 生成 prompt 时新增“Reasonix 是叶子 worker,禁止创建 `.codex/reasonix-tasks`、启动 runner/ACP/Claude/Codex/Hermes、操作其他 worktree”的硬约束;同步更新 `reasonix-coding-worker` 与 `reasonix-parallel-coding-flow` skill,并新增 runner `--dry-run` 用于不启动 Reasonix 的 prompt 合同 smoke。 - 已验证:`node --check reasonix-coding-runner.mjs`、`node --check reasonix-process-extractor.mjs`、`node --test reasonix-process-extractor.test.mjs`、runner `--dry-run --no-memory-recall` 输出的 `prompt.md` 含叶子 worker 禁止项,且 `ps` 未出现 `reasonix` / `reasonix-coding-runner` 进程。 -- 2026-05-25:Codex 主控在独立 worktree `/mnt/Data1T/mnote-worktrees/0525-r-codex-3-20-local-events-poll-fallback` 产出并复核 server fallback 候选 patch:`local_folder_events.rs` 在 `treeLive=true` 且 watcher subscribe 失败时不再返回 500,而是返回同一 SSE 响应并降级为 revision polling;初始仍发送 `snapshot`,revision 变化后通过既有 `rebuild_tree_resync_payload` 发送 `resync`。客户端 `tree:snapshot` / `tree:resync` consumer 不改,避免叠加 browser double-polling。 +- 2026-05-25:Codex 独立复核并采纳 Batch Q Worker A 遗留候选 patch:`local_folder_events.rs` 在 `treeLive=true` 且 watcher subscribe 失败时不再返回 500,而是返回同一 SSE 响应并降级为 revision polling;初始仍发送 `snapshot`,revision 变化后通过既有 `rebuild_tree_resync_payload` 发送 `resync`。客户端 `tree:snapshot` / `tree:resync` consumer 不改,避免叠加 browser double-polling。该 patch 来自无 handoff 的失控 worker,未按 Reasonix 结果直接采纳,而是由 Codex 本地阅读 diff、跑验证后作为主控修复纳入。 - 修改:`rust/crates/mnote-web/src/routes/local_folder_events.rs`。 - - 已验证:`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 tree_live_polling_resync_payload_tracks_revision_changes -- --test-threads=1`、`cargo test --manifest-path rust/Cargo.toml -p mnote-web local_folder_events -- --test-threads=1`、`git diff --check`、`node --check scripts/task487-local-folder-tree-live-consumer-smoke.js`、临时 `MNOTE_WEB_BIND=127.0.0.1:3018 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3018 cargo run --manifest-path rust/Cargo.toml -p mnote-web` 后运行 `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3018 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task487-local-folder-tree-live-consumer-smoke.js`,结果 `ok:true`,PageTree/FileTree 外部创建/删除均为 `treeLiveApplied=resync`,两个阶段 `navigationEvents=0`。 + - 已验证:`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 tree_live_polling_resync_payload_tracks_revision_changes -- --test-threads=1`、`cargo test --manifest-path rust/Cargo.toml -p mnote-web local_folder_events -- --test-threads=1`、`git diff --check`、`node --check scripts/task487-local-folder-tree-live-consumer-smoke.js`、临时 `MNOTE_WEB_BIND=127.0.0.1:3002 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3002 cargo run --manifest-path rust/Cargo.toml -p mnote-web` 后运行 `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3002 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task487-local-folder-tree-live-consumer-smoke.js`,结果 `ok:true`,PageTree/FileTree 外部创建/删除均为 `treeLiveApplied=resync`,两个阶段 `navigationEvents=0`。