Repository navigation
fix(quota): preserve scoped task workspace recovery identity - #8010
Conversation
Signed-off-by: huangruiteng <huangrt01@163.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max; runtime_reported; observation_id=538b775caf684feb0505d4f4aa3a6cec7dba5f5e6596e7c8a4e473752000e880
Exact head b10677a14cf486d5c31dc6ea2f8ad245340ad820;review base/merge base 5f1a9d78ba7aca48ae2203425b252b6882ba3c15。没有发现本 PR 的阻断问题。
动机 / Motivation
需要在独立工作区继续已选任务的 Agent,以及依赖恢复状态判断下一步的操作者。 同一 Goal 有尚未批准的发布任务,也有获准独立推进的任务;在错误工作区选择后者时,旧 scoped fallback 把工作区修复误写成可交付,导致选择被拒绝,迁移后还可能借用另一个默认任务的独立性。 当前选择先保留工作区修复及禁止交付,切换到独立 worktree 后沿原任务、原 Turn 重新检查当前 gate,重复 guard 保留同一身份且不重复写收据。 本 PR 只完成恢复身份与权限投影的修复,不授予发布、merge、安装、额外 quota 或其他任务的权限。
改动思路 / Approach
工作区准入、gate 独立性和交互投影各保留原 owner;新增局部候选传递 helper 只携带原始事实,不创建第二个授权或状态机。 当前边界覆盖 quota CLI 的选择、工作区修复、迁移后的原身份续接和重放;不改变 gate 的批准范围或执行 effect。 No change preserves reproduced control-repair deferral. Only changing the TS mode leaves Python delivery authority inconsistent; only the early return leaves receipt-bound candidate selection incomplete. Existing owners plus one local extraction cover both phases without new state. 正向路径与拒绝分支沿用已有公开入口,author 的测试声明没有替代本轮执行。没有新增人工准备、复制或确认轮次;原本需要明确授权的动作仍由既有 owner 决定。
具体改动 / Changes
全部6个文件 +121/-29:Python 准备阶段抽取原有候选传递逻辑并以 receipt-bound Todo 为先,fallback 投影在 workspace repair 上早返,TypeScript 同步保留该 mode,其余为原位置回归。没有引入新持久字段、设置或 capability。
规范 docs/status-data-contract.md,spec_revision 5f1a9d78ba7aca48ae2203425b252b6882ba3c15,并参考同版本 docs/reference/protocols/quota-planning-horizon-v0.md 的原身份约束。Agent Workspace Guard:错误工作区仅能修复,最终选中 Todo 决定 guard,迁移后重跑,已实现。Agent Decision Authority:原 unsettled Turn 的任务身份保持,当前 scope/capability 仍重验,已实现。这些验收来自改动前已接受契约。
关键代码讲解
_prepare_gate_selection_candidates:按原请求或已提交 receipt 取得同一个候选,再复用已有 eligibility owner;当前 receipt 身份优先,只有仍合格的 source Todo 才进入 scope 检查。
apply_scoped_user_gate_fallback_projection:附加独立性证据后,遇到 workspace repair 就保留原 action、minimum 和 delivery=false;普通 fallback 路径保持原行为。
projectInteractionExecution:在通用 fallback mode 之前识别 workspace repair;canonical false 不会被 should_run 或 fallback hint 放大为编辑许可。
对主干的风险 / Risks
独立 File/SQLite CLI 探针复用同一冻结脚本和同一合成状态:base 4 PASS/2 FAIL,head 6 PASS。两个 base failure 都在 scoped gate 下产生 quota_action_selection_deferred/control_repair;head 沿 repair → 真实 git worktree → 同 Turn、原 Todo 重验 → replay 完整通过。迁移后的命令故意省略 --todo-id,重复错误工作区 guard 仍禁止交付,所有分支 spend 为0、重放不增加 event。另有40项 selection/workspace CLI、84项 gate/边界和41项 scope lifecycle 检查 PASS;21项 TS projection/admission、typecheck PASS。标准 premerge 6 direct +18 selected PASS,0 failure/hold。
最危险的反向错误是把 fallback 独立性当成工作区或覆盖任务的授权。当前保留当前 gate 的通知、normal_delivery=false 和明确的 repair minimum;只有原独立任务在合法 worktree 上恢复。新增 covering gate、capability 缺失、非法 scope 更新/清空、完成和 superseded gate 均由原 owner 检查,没有删除条件、提高 budget 或把 should_run 当成权限。第一次 reviewer 探针把 canonical mode 拼错并误把已有绑定的 scoped fallback 当作 pending;两项测试假设纠正后才冻结 base/head 脚本,原失败记录保留,不算产品回归或 PASS。
语义与 CI 对齐
复用现有 EffectiveAction 与 receipt/Todo vocabulary;不新增状态名,不以 prose/substring 分类。改变的是原错误路径的权限投影与候选绑定,而不是 gate 覆盖规则或默认执行范围。原工作区修复指令的 actor、先迁移再编辑顺序、同 Turn 重试及验证后 spend 条件均保留。CI 按 wait_for_ci=false 未查询、轮询或等待。
我的整体评价 / Verdict
交付判断 goal_achieved,long_horizon 与 user_experience 在本次可验证边界内 improved:解除已重现的错误拒绝,保留合法恢复与失败保护。工作区准入、gate 独立性和交互投影各保留原 owner;新增局部候选传递 helper 只携带原始事实,不创建第二个授权或状态机。 当前边界覆盖 quota CLI 的选择、工作区修复、迁移后的原身份续接和重放;不改变 gate 的批准范围或执行 effect。 scope fit 与改动成本相称,未发现需要在本 PR 扩大重构的相邻 owner。本 PR 没有 renderer、页面布局或可视化变更;检查的调用路径是 quota CLI 与其 Agent/Host 交互投影,visual review 不适用。 未安装 App、调用模型或证明长期科学收益;本审查资格化源码 CLI 与 File/SQLite 恢复边界,不覆盖无关的 hard-lease 新任务准备问题。 现有 review/required validation、平台 readiness 与 merge 授权仍分别判断,本轮不 merge。
English verdict: APPROVE. At b10677a14cf486d5c31dc6ea2f8ad245340ad820, the same public-entry baseline/head differential demonstrates the bounded fix while negative authority/integrity and retry controls remain intact. Installed-host/model adoption is unverified; local required checks pass.
当 Agent 显式选择一个不受当前审批影响的 Todo,而该 Todo 需要先切换到独立 worktree 时,scoped fallback 会把 workspace repair 的
delivery_allowed=false覆盖为true。最终 admission 因修复与执行事实矛盾而拒绝选择,丢失可执行的恢复指令。恢复后,fallback 还可能重新指向默认 Todo。本修复保留选中 Todo 的目录修复指令和禁止编辑的边界;切换 worktree 后,沿同一 Turn 和 receipt 恢复,并按已绑定 Todo 重新验证审批独立性。审批和实际目录检查继续有效。沿现有 candidate owner 提取输入准备,避免扩大单个决策函数。
验证:
范围:CLI 与共享 interaction contract 的已有恢复路径;没有新增用户设置或自动执行权限。未合并、未宣称全局安装验收。