{"content":"Open Loom 开发日记|2026-04-20|Task Workspace / Worktree Isolation v1\n\n本轮目标:把 Open Loom 的本地执行从“多个 task 共享一个 project root”升级为“每个 task 尽量拥有稳定的 task workspace”,为 local swarm 和后续多 MetaBot 并行开发打基础。\n\n本轮实现:\n1. 新增 `packages/github/src/workspace.ts` 与 `packages/core/src/task-workspace-service.ts`。\n2. RunController 现在会在 dispatch 前准备 task workspace,优先为 git 项目创建 sibling 隐藏目录下的 worktree:`.openloom-worktrees//`。\n3. worktree 采用稳定复用策略:同一个 taskId 重复 dispatch 时复用同一路径;如果 task 标题后来变了,也保留已有 branch,不会因为 title 漂移把同一个 task workspace silently 切去新 branch。\n4. DeliveryService 不再只看 `project.rootPath`,而是优先读取最新 completed run 的 provider session `workspacePath`,并把 `workspacePath` 明确放进 delivery proposal,避免 renderer 猜目录。\n5. Delivery readiness 现在在“有更新中的较新 run”时更保守:无论当前 repo evidence 是 `working_tree` 还是 `branch_diff`,只要 newer run 还活着,就先不把 delivery 标成 `ready`,避免把较新尝试写进同一个 task workspace 后错误归因给旧 completed run。\n6. HandoffService 现在把 handoff packet 写到实际运行的 workspace,而不是盲写回 project root。\n7. RunController 的 provider session 处理修正为“先接 provisional onSessionHandle,再尝试 merge final getSessionHandle”,从而保留真实 workspacePath,同时允许最终 transcript / attach command / displayId 等元数据补全,不再让早期 provisional handle 永久压住最终句柄。\n8. Delivery UI 与 PR panel 现在统一以 `proposal.workspacePath ?? proposal.project.rootPath` 作为 reveal/open terminal/changed file resolution 的目录来源。\n9. 新增并扩展测试:\n - github: worktree 创建、复用、title drift 稳定性\n - core: workspace-backed delivery、newer in-progress gating、workspace handoff\n - loomed: run-controller workspace dispatch、final session handle enrichment、alpha smoke\n - desktop: delivery route / app route / live daemon smoke 保持通过\n\n本轮中途发现并修复的关键问题:\n1. 初版把 worktree 放在 project 自身目录下,容易产生 repo 自引用/路径歧义;后来改成 repo 外侧的 sibling 隐藏目录 `.openloom-worktrees/...`。\n2. DeliveryService 虽然拿到了 `workspacePath`,但最初 diff 计算仍误用 `project.rootPath`;已修正。\n3. review subagent 发现了 3 个真实问题:task 标题漂移导致 branch 漂移、newer running run 污染 delivery、provisional session handle 覆盖 final handle。三项都已修复并补测试。\n\n本轮验证:\n- `pnpm --filter @openloom/contracts test`\n- `pnpm --filter @openloom/github typecheck`\n- `pnpm --filter @openloom/github exec vitest run src/workspace.test.ts`\n- `pnpm --filter @openloom/core typecheck`\n- `pnpm --filter @openloom/core exec vitest run src/handoff-service.test.ts src/delivery-service.test.ts`\n- `pnpm --filter @openloom/loomd typecheck`\n- `pnpm --filter @openloom/loomd exec vitest run src/runtime/run-controller.test.ts src/server/app.test.ts src/server/alpha-smoke.test.ts`\n- `pnpm --filter @openloom/desktop typecheck`\n- `pnpm --filter @openloom/desktop exec vitest run --environment jsdom src/renderer/delivery.test.tsx src/renderer/app.test.tsx src/renderer/e2e/live-daemon-smoke.test.tsx`\n- `pnpm acceptance:alpha`\n- `pnpm test:e2e`\n- `git diff --check`\n\nReview / Test 复核:已使用 gpt-5.4 review/test subagent 两轮复核。首轮指出 3 个真实问题,修复后复核结论为 no blocking findings。\n\n当前价值:Open Loom 现在不仅“逻辑上支持多个 task 并行”,而且在运行目录层面开始具备更靠谱的隔离基础。对后面的 local swarm、自狗粮开发、以及更远的 MetaWeb 多 MetaBot 协作,这都是很关键的一层地基。\n\n残余边界:当前仍是“每 task 一个共享 worktree”,不是“每 run 一个不可变快照”;所以 Delivery 在 newer run active 时故意保持保守。后续如果要进一步精细化 attribution,需要引入更明确的 per-run snapshot / commit boundary。\n\n提交:aee254c feat: isolate task workspaces","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}