Skip to content

fix(quota): preserve scoped task workspace recovery identity - #8010

Merged
huangruiteng merged 1 commit into
mainfrom
codex/scoped-selection-recovery-20261104
Nov 4, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/scoped-selection-recovery-20261104

Conversation

@huangruiteng

@huangruiteng huangruiteng commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

当 Agent 显式选择一个不受当前审批影响的 Todo,而该 Todo 需要先切换到独立 worktree 时,scoped fallback 会把 workspace repair 的 delivery_allowed=false 覆盖为 true。最终 admission 因修复与执行事实矛盾而拒绝选择,丢失可执行的恢复指令。恢复后,fallback 还可能重新指向默认 Todo。

本修复保留选中 Todo 的目录修复指令和禁止编辑的边界;切换 worktree 后,沿同一 Turn 和 receipt 恢复,并按已绑定 Todo 重新验证审批独立性。审批和实际目录检查继续有效。沿现有 candidate owner 提取输入准备,避免扩大单个决策函数。

验证:

  • 真实 CLI 覆盖直接选择、待选择回执、scoped gate、切换 worktree 后恢复,以及重复进入时的身份和回执去重。
  • 31 项选择/恢复 CLI 回归、94 项审批/边界/权限回归、68 项 TypeScript 回归通过;最终候选的 3 项真实恢复测试再次通过。
  • TypeScript typecheck、变更 Python lint、公开边界扫描通过。完整 premerge 的 18 项检查全部通过。

范围:CLI 与共享 interaction contract 的已有恢复路径;没有新增用户设置或自动执行权限。未合并、未宣称全局安装验收。

Signed-off-by: huangruiteng <huangrt01@163.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@huangruiteng
huangruiteng merged commit 0613581 into main Nov 4, 2026
21 of 27 checks passed
@huangruiteng
huangruiteng deleted the codex/scoped-selection-recovery-20261104 branch November 4, 2026 13:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants