Repository navigation
fix(todos): bind ordinary code claims to their worktree - #7848
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max; declaration_source=runtime_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
在独立 Git worktree 中领取代码任务的 Agent,会遇到另一任务仅因声明了相同代码目录而占住执行范围。 两个任务分别在同仓库的不同 worktree 修改 src/**:基线普通领取拒绝第二个任务,新 head 验证物理身份后允许领取并保留重叠提示。 真实 CLI 的 File/SQLite 对照、领取后的实际文件写入与再次领取,验证了合法任务能继续工作,原任务的 lease 身份和重放结果保持稳定。
普通领取与显式 lease acquire 原本使用不一致的事实输入,导致已授权的代码工作需要手工绕行。这里的 worktree 是同一 Git 仓库的独立工作目录;允许代码声明范围重叠,仍需证明物理目录不同。本次不授予共享运行目录、其他任务、远端写入或合并权限,不把 worktree 识别当作文件系统隔离,也不宣称长期效率或安装环境已获资格。
改动思路 / Approach
候选路径发现留在 Python 适配器,物理验证与执行权决策继续由现有 TypeScript lease owner 负责,避免第二套权限判断。 本 PR 只打通普通 managed code claim 到既有 worktree 规则,并保留同一执行、重放和失效拒绝;显式 acquire、旧调用者和共享状态互斥仍由原 owner 管理。
普通领取先从当前目录发现候选 Git root,候选本身不赋权;只有新代码执行才进入现有物理路径、仓库和范围验证,然后由原 acquire decision 决定互斥或 advisory。已存在的执行在观察路径前返回,CAS 重试重新读取 canonical head。完整结果先于提交构造,因此原 receipt 也保留重叠提示。代码范围、lease 身份和重放规则均复用既有 owner;没有手工维护的第二份授权状态。
下面是对 45bbc5e85d2373aff100703243226ab17c3fee4c 实际入口对照的文字表,结果来自执行证据,不用示意图代替验证:
| 同一输入 | 基线 | 本 head |
|---|---|---|
| 独立 worktree、两个代码任务声明相同范围 | 第二次普通领取拒绝 | 物理验证后领取,返回重叠提示 |
| 未声明代码域的相同范围任务 | 互斥 | 完整 lease、拒绝回执和读回保持一致 |
| 同一物理目录、范围 symlink、异仓库 | 拒绝 | 仍拒绝 |
具体改动 / Changes
完整审查 7 个文件,+171/-9;生产代码为候选发现和现有 TS owner 的异步连接,其余是两处集成/一致性测试与一行恢复指导。没有新增 CLI 选项、独立 capability、provider 或持久协议。
关键代码讲解
claim_canonical_todo_if_promoted:仅 managed claim 发现 linked worktree;canonical checkout 不通过.git文件条件,缺失候选仍走原互斥规则。local_authority_runtime:验证可选绝对路径输入,闭包使用 canonical repository 与现有 scope matcher 调用物理 observer,错误直接拒绝。prepareClaimExecution:已有执行先返回;只有新代码任务有仓库与非空范围时才观察 workspace,再复用原 acquire/materialize 逻辑。executeCoordinationTodoClaim:在 CAS 循环中等待准备结果,原子提交 claim/lease/receipt;重放读取原结果,不能被新的 cwd 改绑。
规格依据:docs/reference/canonical-lease-renew.md,不可变修订 035f7ac666cef390676c00b6fb0537ede3c9cf44。Repository-relative scope identity — implemented:范围继续来自 canonical Todo,现有完整 lease head/CAS/TTL/proof 保留。Independent worktree code edits — implemented:真实 CLI 验证独立 worktree 可领取,物理别名、symlink 范围、异仓库、同 Todo/checkout 仍拒绝;身份和 advisory 经重放、释放及 PostgreSQL reload 保留。新恢复指导按这一既有规格评估,没有用本 PR 修改后的文字反向证明实现。
对主干的风险 / Risks
主要风险是把 cwd 候选误当授权,或新观察覆盖已有执行。上面的 TS 物理验证和已有执行优先分支分别封住这两条路径。managed caller 增加一次有界 Git root 查询;没有声称零成本或实测性能改善。非代码路径的完整 File/SQLite 结果对照通过,仅归一化时钟和 provider 生成的 namespace/revision/cursor,未抹掉决策、身份或错误差异。修复指导虽对所有读者可见,仍为条件化恢复建议,没有新增启动义务。
PASS:93 项相关 Python 测试;8 个 TS 模块 1252 pass、1 个条件 PostgreSQL skip;随后独立隔离 PostgreSQL 16.15 的 384 项完整存储检查与 1 项 workspace reload 检查均 pass、0 skip。Typecheck、Ruff、premerge 的 6 项直接检查与 18 项选中检查全部 pass,0 个命令失败。
PASS:同一未改 fixture(SHA-256 7092d608f9f52e0ca52ffa80bedb8345baf30dd76c3f5697d0d82a94aa58384a)在规格基线的两种 provider 均于第二次合法领取得到 write_scope_conflict;本 head 均通过。新增任务在 A 已领取后加入,B 仍可领取、实际写入并独立校验文件、再次领取保持原 execution。另有同一非代码 fixture 的完整关闭路径回执对照通过。
历史尝试保留:首个 pytest 命令误指不存在文件、未收集测试;首轮自建 PG 就绪检查过早得到 57P03。已纠正测试入口和 TCP 就绪判断,重新在独立新容器执行完整所需检查;没有放宽断言或改写失败记录。
语义与 CI 对齐
新增 callback/候选字段留在本地边界,复用已有 workspace/advisory 词汇;diff advisory 在 5 个 source 文件未发现受支持的新闭集候选,这不是自动语义完备证明。代码分支按 typed domain 分类,没有靠 prose/substring 推断权限。wait_for_ci=false,CI 为 UNVERIFIED/unknown(诊断项),没有查询、轮询、等待或猜测原因。
合并门禁仍独立保留:本审查工作区标准 premerge 总退出码为 1,原因是 quality_stale_receipt,没有把通过的检查伪装成总门禁通过。未创建或继承 change-quality receipt;合并还需要当前交付范围 receipt、原生 readiness 和所需授权。本 review 不执行合并或 dismiss。
我的整体评价 / Verdict
APPROVE:该局部目标已实现,实际普通 CLI 和后续文件工作证明不再停在领取环节;长期工作机制与用户路径均 improved,但未据此宣称长期净收益。内部源路径从既有调用者进入统一 typed owner,规模与问题相称;有界整理已通过复用 observer/CAS 完成,无需扩展通用框架。既有仓库经验要求区分入口可用与真实收益,这里保留安装与长期资格边界。
检查的是现有 todo claim、lease inspect/release 和内部协调调用,未改变任何渲染页面或产品首屏。 未验证安装后宿主、原生 Windows 行为或长期并发净收益。 审查绑定精确 head 45bbc5e85d2373aff100703243226ab17c3fee4c;发布前仍须重新核对 head/action。无当前阻塞 finding;独立质量及合并门禁继续由原 owner 处理。
English verdict: APPROVE — ordinary managed code claims now reuse the verified worktree lease owner; local invariants and real-provider continuation pass. Separate merge gates remain.
Goal And Delivered Outcome
普通
todo claim没有把调用方的独立 Git worktree 交给现有 lease owner:同一仓库的两个代码任务都声明src/**时,第二个任务会得到write_scope_conflict,而显式 worktree lease 路径可以接受它。现在普通 managed claim 会提供候选 Git root,由既有 TypeScript owner 按当前 canonical scopes 校验物理隔离与仓库身份。不同 worktree 可分别领取执行权并读回集成重叠提示;同一 checkout、重定向路径和其它仓库仍被拒绝。原有 active execution、失回执重放及非代码/shared-state 路径保留原 lease 和排他规则。
035f7ac666cef390676c00b6fb0537ede3c9cf44。main。这是一项独立代码工作准入修复,沿现有 R2/R5 owner,不改变 C1 controller/executor 交付或其验收顺序。Author Declaration
Implemented against
现有 worktree observation 与 lease acquisition decision 契约;修复普通 claim 对该契约的消费。
claim_execution.ts+ existing observer;foreign-repository / symlink 拒绝Self-check: 阅读完整 diff、适用仓库规则、现有 owner 与真实 CLI 失败;增加回归后再实现,保留 baseline 反证。
Scope And Continuation
Python 只发现候选位置;TypeScript 复用物理 worktree 观察、canonical scopes、原 CAS/receipt 和 lease 决策。新增 callback 是本地 IO 接缝;
write_worktree复用已有观察语义,不增加 CLI 开关、能力、权限或第二套生命周期。边界相关整理采用现有 Git-root helper;更大模块搬迁不属于这个修复。每次普通 managed claim 多一次有界 Git-root 查询;完整物理检查仅在新代码执行的 acquisition 发生。没有据此宣称速度或长程净收益。active/replay 保留原执行;非代码、旧 caller 与缺少独立 root 的调用保持保守排他。
本切片完整、可独立审查和回滚;安装版采用、独立评审与长程成本/成果仍分别验收。未合并或安装本提案,无需创建重复后继任务。
Validation
45bbc5e85d2373aff100703243226ab17c3fee4c。运行时代码在8c3cb3e5f7dc351e1cdafdafad3c4379b4b990d9完成验证且与最终 head 相同;最后提交只增加一条经过读取/解析验证的自修复索引。tests/test_task_lease_worktree.py、canonical claim/replay/transfer、native lease CLI、unpromoted claim、argument recovery,共 53 passednpm run test:control-plane:5817 passed, 77 skipped, 0 failed,含 File/SQLite/NoKV 与既有调用方;77 项条件跳过保留为未测npm run test:postgresql-authority-store:独立临时 PostgreSQL 16.15,384 passed, 0 skipped;涵盖持久化、恢复和 tenant 隔离首轮 premerge 的六项 direct checks 和十七项 selected checks 全过;聚合门因旧 diff 的质量回执保持失败。已针对当前准确范围重新审查、记录并回读有效质量回执;最终聚合结果以本表为准。没有降低检查或追认旧失败。
Frontend / Visual Evidence
Type of Change / LoopX Area
Shared-authority RFC fixture impact
N/A for provider promotion, store migration or compatibility projection: none changes. Existing managed-claim conformance was extended and exercised on File/SQLite/NoKV and a real isolated PostgreSQL server.
Boundary Checklist