# 文件所有权租约移除记录(2026-10-20) ## 范围 按用户要求移除子智能体调度器中的文件所有权租约,包括: - 模块级 `leases`:子智能体声明文件的独占归属 - 模块级 `rootIntents`:主智能体写入意图 - 模块级 `rootLeases`、`rootWaiters` 与 10 分钟等待队列 - `acquire` / `release` 租约生命周期 - `rootExecute` 中按路径或工作区根排队、拒绝冲突的逻辑 - 子智能体工具执行时对 `leases.get(path) === entry.view.id` 的归属检查 ## 保留行为 - `spawn_agent` 的 `write` 模式仍要求声明 1 至 32 个明确文件路径。 - 子智能体写文件时仍只能使用 `write_file` / `edit_file`,且路径必须属于自己声明的文件。 - 读工具、子智能体并发上限、取消、超时、结果汇总和权限模式门禁保持不变。 - 文件工具自身的路径边界、写前重读和原子写入逻辑保持不变。 ## 行为变化 - 主智能体同一回合的多个工具调用直接执行,不再按文件足迹先到先得排队。 - 父智能体与子智能体可以同时声明或写入同一文件,不再返回“文件正由子智能体修改”或“文件已分配给另一个子智能体”。 - 多个子智能体可以声明同一文件;最终内容取决于各写入工具的实际执行顺序。 - 同一文件的并发写不再由调度器串行化,也不提供跨工具锁或自动合并。 ## 验证 - `npm run typecheck`:通过。 - `npm run test:subagents`:31 项通过,覆盖同文件声明、父写与子写、并发命令、写入范围拒绝、回退记录、取消和超时。 - `npm run build`:通过。 - `src/main/subagents/scheduler.ts`:未发现 `leases`、`rootIntents`、`rootLeases`、`rootWaiters` 或 `acquireRootLease`。 ## 限制 - 并发写同一文件时可能发生覆盖;需要互斥或合并的场景必须由调用方另行处理。 - 回退记录要求同一文件连续修改时前一次 `newContent` 与后一次 `oldContent` 一致;并发交错写同一文件可能使回退校验失败。 - 历史文档 `子智能体文件租约并发修复-2026-10-18.md` 仅作为旧实现记录保留,不代表当前行为。