Repository navigation
fix(quota): retain settlement after ordinary Todo completion - #6947
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>
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: model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
APPROVE — 6abdae6a7e15fbb3a8d5e7d3f79b81dd2e8c280c。当前完整五文件评审,未发现阻塞代码问题;这是代码结论,合并资格与执行权限仍分别核验。
动机
执行 LoopX 连续任务的 Agent 会在完成一个 Todo 后遇到这个问题。原 Turn 尚未写回和结算时,Todo 已完成并归档;旧 guard 丢失原结算计划,并返回普通执行建议。当前版本保留同一个 Turn 的写回及扣额命令,同时禁止重复工作或改绑后继。真实 File/SQLite CLI 已验证:原身份不变,重复写回只产生一份结果,两次扣额调用只计一次,完成后原 Turn 返回 settled-skip。这不证明已安装 App、实际模型采用、真实 PostgreSQL 服务或完整长程收益;M7.4 的剩余宿主与成本验收继续保留。
Todo 是工作项,Turn 是保留本轮身份和结算义务的执行轮次。工作项从界面消失不等于本轮已经写回和计额。不改动会让调用者依赖旧终端输出手工找回命令,甚至拿独立后继工作代替原结算。这里只恢复已有结果的合法收尾,无需用户重新描述任务、打开新配置或补一次确认。
改动思路
资格判断留在既有 TypeScript owner,Python 只读取缺失的原始 Todo 并传输原结算计划。本 PR 只修复已完成原 Todo 的结算恢复,不选择新工作或建立第二套执行器。完成事实来自原生 Todo 完成及结算读回,不新增人工维护的完成标记。完整当前列表缺少原 ID 时才调用已有精确读取入口;源不可用就停止依赖它的决定,不把显示列表中的缺席推断成任务已不存在。
下表说明当前源码边界,执行证据列于风险部分:
| 原状态 | 原版本 | 当前版本 |
|---|---|---|
| 已完成,尚未写回 | 原计划丢失,可能仍称普通执行 | 原身份的写回与扣额计划;禁止新工作 |
| 原项已归档 | 活动展示不能提供原项 | 复用精确 ID 的既有归档读取 |
| 已写回、尚未计额 | 归档仍可能留下普通执行建议 | 仅收尾原计额,writer 再验权限与凭据 |
| 已经结算 | 原 Turn 跳过 | 保留跳过,新轮次遵守原重规划规则 |
只保留旧命令是调用者绕过缺失投影的临时办法;另写 Python 完成分类器或命令工厂会复制权威。当前做法复用 TypeScript 判断与原计划 builder,Python 的新增分支只运输其 verdict。读取、资格、投影和实际效果分工明确;不会从一个恢复说明制造执行或扣额授权。
具体改动
依据为 Agent Loop Effect Interpreter 的既有恢复契约,评审版本为 6e8688d8d90f1c5a99fadf81def8e4ca2e79c925。下列标识对应其中未编号的原文要求:partial-execution-recovery 已实现原效果 ID、显式权限及幂等恢复;original-execution-facts 已保留 Goal/Agent/Todo/Turn、完整来源和已验证阶段;settlement-scheduler-owner 已复用完整 typed plan 并保留宿主调度责任;compatible-public-contracts 通过原有普通状态与反例对照;remaining-convergence-acceptance 仍由既有三个 M7.4 验收流承担,不能用本 PR 关闭。
完整范围为生产代码增加 69 行、删除 7 行,另增加 182 行聚焦测试。没有新模块、公开 CLI 参数、持久化字段、独立服务、词法分类器或 UI 操作。两个测试面分别覆盖原生 CLI/真实 provider 和 typed 决策,不以题名中的恢复词、作者声明或 CI 状态代替实际调用。
关键代码讲解
projectReceiptBoundWait先检查唯一原 ID、Agent 角色及 claim,再把 advancement/done 与 verified pending phase、正确 progress schema/state/step 联合判断。只在这组条件成立时恢复 writeback;归档只影响展示,不能隐藏已经验证的原扣额义务。done 单独出现、未知 phase 或其他 Agent 的行都不能借用此分支。apply_receipt_bound_wait_recovery保留完整列表中的依赖事实,缺少原项时复用_bound_todo_item。typed verdict 形成后清除不相干 action 投影;durable_writeback 使用既有 builder 和原 Goal/Agent/Todo/Turn 生成命令。next_cli_actions仅指向写回和计额,不要求重做已完成工作。原 writer 仍决定是否允许效果。build_live_quota_should_run_decision只补传结算 owner 已经核验的 replay phase,不在 Python 重新推测完成或准入。既有 settled 检查仍先截断本轮;同一计划通过既有 TurnEnvelope.writeback 投影,来源与效果 owner 均未替换。
对主干的风险
最强反例是原 Todo 已归档、同一 Goal 还有独立候选:短小的纯函数通过不代表原结算仍可执行。我用相同公开 fixture 和每种 provider 固定的实际路径调用真实 CLI,对照不可变基线与当前 head。基线 File/SQLite 都丢失 plan 且返回 normal_run;当前两者都保留原身份、禁止普通 delivery,重复写回只留一份结果,两次扣额调用只计一次,并回读原 Turn 的 settled-skip。外来 Todo 改绑原 Turn 明确拒绝,归档源独立读回。旧失败和原输出保留,没有把基线失效记成通过。
探针故意关闭阶段 vision 后,直接选择下一 Todo 由原 autonomous-replan 门拒绝;按其返回的普通 guard 继续,得到新的重规划义务及独立候选,原 recovery 不再占用下一轮。这个观察证明阶段门被保留,不证明模型已经完成下一项工作。额外 peer fixture 的初始健康/范围门也未绕过:canonical checkout 写回仍被拒,真正独立 worktree 可读回;不健康来源的计额仍被原 owner 拒绝,未把它当作健康实施闭环。
20 组完整 typed 输入逐项比较:16 组完整输出相同,只有四组已验证完成/归档恢复发生预期变化,全部保留 delivery_allowed=false;未修改输入。独立六个完整 Python 模块为 257 passed、零 skip;完整 TypeScript 为 5139 passed、73 配置 skip、零失败。声明的 Ruff 根、TypeScript typecheck、mypy 的 17 文件范围,以及标准 premerge 的 6 项直接检查和 16 项选中检查全部通过,无 manual hold、无 tracked side effect。
语义与 CI 对齐
复用既有 replay/SettlementStepKind 词表及 local recovery variant,没有增加第二份持久化事实或新权限。普通模式改变的是原本错误的结算建议,不是一个 default-off 功能;未受影响状态已做完整对照。新文字明确“只记原结果、核对既有效果、不可重做/改绑”,没有用缩短正文或调整预算换取通过,也不声称模型理解已验收。
我额外对两个 Python 文件展开完整依赖 mypy 检查,基线和当前均失败:5056 条错误分布于 585 文件。比较完整诊断多重集而非总数,只有输出顺序和三个已有诊断的源码行位移需归一化,所有消息、note、重复数量及对应未改语句都相同;声明的 17 文件范围独立通过。该额外失败仍保留,不能称为全树类型检查通过。首次 GitHub patch 读取发生 EOF,随后只读重取成功,与固定 Git diff/远端文件清单交叉核对。
较新 main 的 quota 改动只把完全相同的 fallback 镜像替换成同包根引用;已读其全文及 RFC 补充,原 settlement、exact reader、envelope、依赖声明和实际写入 owner 的 blob 未变。本轮验证对应当前 PR head,不冒称已执行完整合并组合。73 个配置跳过包含真实 PostgreSQL 集成;本次没有修改该 store/service owner,也没有把这些 skip 当作真实 PostgreSQL 证据。
我的整体评价
在原 Todo 结算恢复这一已界定的问题上,判断为 goal_achieved。long_horizon 为 improved:完成与归档不会再让旧 Turn 丢失结算计划,重复执行保持一次效果;user_experience 为 improved:原入口提供可用的原命令,不增加人工交互轮次。两项判断限于这个可重复的调用路径,不推断长程模型效果或完整成本收益。
资格判断留在既有 TypeScript owner,Python 只读取缺失的原始 Todo 并传输原结算计划。本 PR 只修复已完成原 Todo 的结算恢复,不选择新工作或建立第二套执行器。新增机制与原问题相称,复用已有精确读取、typed recovery 和计划生成器就是本次有价值的局部整理;无需增加新框架或迁移任务。实际安装宿主、后续模型工作、真实 PostgreSQL、完整 M7.4 接受结果与总成本仍未资格化。当前代码结论可以批准,原生 closeout/readiness 和受保护合并授权继续独立办理。
English verdict: APPROVE — 6abdae6. Full five-file review: real File/SQLite completion and archival preserve the original settlement identity, idempotent writeback, one debit and settled replay; the next native frontier retains its existing replan gate. 257 Python and 5139 TypeScript tests passed, with73 configured skips; declared static checks and6direct/16selected premerge passed. Expanded dependency typing retains the identical baseline failure. No installed-host, model-utility, real-PostgreSQL or merge-authority claim.
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: model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
APPROVE — 5b62146b78fd22c9a2ad366eda9973afbf4b7f9f。最终已合并版本的完整五文件独立审计,未发现阻塞代码问题。维护者已于2026-10-20T15:15:31Z合并该head为3a2991a;本审计不改写先前合并资格,不表示评审者执行了合并。
动机
执行 LoopX 连续任务的 Agent 会在完成一个 Todo 后遇到这个问题。原 Turn 尚未写回和结算时,Todo 已完成并归档;旧 guard 丢失原结算计划,并返回普通执行建议。当前版本保留同一个 Turn 的写回及扣额命令,同时禁止重复工作或改绑后继。真实 File/SQLite CLI 已验证:原身份不变,重复写回只产生一份结果,两次扣额调用只计一次,完成后原 Turn 返回 settled-skip。这不证明已安装 App、实际模型采用、真实 PostgreSQL 服务或完整长程收益;M7.4 的剩余宿主与成本验收继续保留。
Todo 是工作项,Turn 是保留本轮身份和结算义务的执行轮次。工作项从界面消失不等于本轮已经写回和计额。不改动会让调用者依赖旧终端输出手工找回命令,甚至拿独立后继工作代替原结算。这里只恢复已有结果的合法收尾,无需用户重新描述任务、打开新配置或补一次确认。
改动思路
资格判断留在既有 TypeScript owner,Python 只读取缺失的原始 Todo 并传输原结算计划。本 PR 只修复已完成原 Todo 的结算恢复,不选择新工作或建立第二套执行器。完成事实来自原生 Todo 完成及结算读回,不新增人工维护的完成标记。完整当前列表缺少原 ID 时才调用已有精确读取入口;源不可用就停止依赖它的决定,不把显示列表中的缺席推断成任务已不存在。
下表说明当前源码边界,执行证据列于风险部分:
| 原状态 | 原版本 | 当前版本 |
|---|---|---|
| 已完成,尚未写回 | 原计划丢失,可能仍称普通执行 | 原身份的写回与扣额计划;禁止新工作 |
| 原项已归档 | 活动展示不能提供原项 | 复用精确 ID 的既有归档读取 |
| 已写回、尚未计额 | 归档仍可能留下普通执行建议 | 仅收尾原计额,writer 再验权限与凭据 |
| 已经结算 | 原 Turn 跳过 | 保留跳过,新轮次遵守原重规划规则 |
只保留旧命令是调用者绕过缺失投影的临时办法;另写 Python 完成分类器或命令工厂会复制权威。当前做法复用 TypeScript 判断与原计划 builder,Python 的新增分支只运输其 verdict。读取、资格、投影和实际效果分工明确;不会从一个恢复说明制造执行或扣额授权。
具体改动
依据为 Agent Loop Effect Interpreter 的既有恢复契约,评审版本为 dd2ca7cc28b16ed021b89b89c3dcb09bc9e36905。下列标识对应其中未编号的原文要求:partial-execution-recovery 已实现原效果 ID、显式权限及幂等恢复;original-execution-facts 已保留 Goal/Agent/Todo/Turn、完整来源和已验证阶段;settlement-scheduler-owner 已复用完整 typed plan 并保留宿主调度责任;compatible-public-contracts 通过原有普通状态与反例对照;remaining-convergence-acceptance 仍由既有三个 M7.4 验收流承担,不能用本 PR 关闭。
完整范围为生产代码增加 69 行、删除 7 行,另增加 182 行聚焦测试。没有新模块、公开 CLI 参数、持久化字段、独立服务、词法分类器或 UI 操作。两个测试面分别覆盖原生 CLI/真实 provider 和 typed 决策,不以题名中的恢复词、作者声明或 CI 状态代替实际调用。
关键代码讲解
projectReceiptBoundWait先检查唯一原 ID、Agent 角色及 claim,再把 advancement/done 与 verified pending phase、正确 progress schema/state/step 联合判断。只在这组条件成立时恢复 writeback;归档只影响展示,不能隐藏已经验证的原扣额义务。done 单独出现、未知 phase 或其他 Agent 的行都不能借用此分支。apply_receipt_bound_wait_recovery保留完整列表中的依赖事实,缺少原项时复用_bound_todo_item。typed verdict 形成后清除不相干 action 投影;durable_writeback 使用既有 builder 和原 Goal/Agent/Todo/Turn 生成命令。next_cli_actions仅指向写回和计额,不要求重做已完成工作。原 writer 仍决定是否允许效果。build_live_quota_should_run_decision只补传结算 owner 已经核验的 replay phase,不在 Python 重新推测完成或准入。既有 settled 检查仍先截断本轮;同一计划通过既有 TurnEnvelope.writeback 投影,来源与效果 owner 均未替换。
对主干的风险
最强反例是原 Todo 已归档、同一 Goal 还有独立候选。当前实际基线 dd2ca7cc28b16ed021b89b89c3dcb09bc9e36905 与最终 head 使用同一公开 fixture、每种 provider 相同物理路径,执行真实 File/SQLite CLI。基线两者都丢失 plan 并仍允许 normal delivery;到达这个缺陷后停止,未把基线结算流程记为通过。当前两者都保留原 Goal/Agent/Todo/Turn 及 Envelope.writeback 计划,写回重试只记一份结果,两次计额调用只扣一次,然后原 Turn 为 settled-skip。改绑其他 Todo 的同一 Turn 在效果前明确拒绝,归档原项独立读回。
阶段 vision 故意关闭后,直接选择下一项由原门拒绝;按返回的普通 guard 继续,读到新的 autonomous replan 义务和独立候选,旧 recovery 不再占用新轮次。这里证明原有阶段/权限门被保留,不声称模型已完成后续工作。
20 组相同 typed 完整输入在实际基线/head 导出函数执行:16 组完整输出相同,4 组完成/归档恢复发生预期变化,全部保持 delivery_allowed=false;输入未改写。foreign、user、monitor、未知阶段/进度、重复/缺失绑定和新 subject 选择仍受原规则约束。当前八个完整 Python 模块独立运行 296 passed、零 skip,覆盖原六个结算/捕获/Envelope/故障族以及新主干的 CLI 投影和 completed-history 邻接边界。声明 Ruff、mypy17、TypeScript typecheck,以及精确五路径 premerge 的6直接/16选中检查均通过,无 manual hold。
复用与失败边界
本次五个改动文件及其基线版本都与前次独立审查的对应 blob 全同,但不继承旧 APPROVE。当前 base/head 的真实 CLI、typed 对照、八模块和标准门均重新运行。前次 6abdae6a7e15fbb3a8d5e7d3f79b81dd2e8c280c 的完整 TypeScript 5139 passed、73 配置 skip 采用有边界复用:695 个相关 TS 源码/测试/manifest/loader 输入及路径全集在最终 head 完全相同;这不是本轮重新执行完整 TS 套件。73 个配置 skip 仍包含真实 PostgreSQL 集成,不能视为实际 PostgreSQL 服务资格。
较新 main 的 quota 生产增量只有两个 Python 投影文件:将内容与 JSON 类型完全相同的 fallback 镜像改成同包根引用;实际新 diff 和调用次序已核读,结算 recovery 清除无关 action 的规则保留。新主干 completed-history 整理的完整 Python 模块也已运行。这里资格化当前合并源码的有界恢复路径,不推断完整宿主采用、模型表现或长程总成本。
前次扩展依赖 mypy 的5056错误/585文件、探索性夹具的作用域/健康拒绝及其原始失败仍保留在原版本。它们未重新标注为当前 head 的相同诊断或通过;本轮只对实际执行并通过的声明17文件范围作当前类型检查结论。作者 PR 描述的旧 CI 失败没有被本评审查询、豁免或冒充独立 Windows 资格。当前本地检查与原先观察各保留自己的版本及效力。
默认改变是纠正错误的原结算建议,未增加 default-off 功能、自动执行器、持久化状态或命令权限。所有效果继续由原 writer 验身份、工作区和健康,并负责幂等。代码用完整原始来源恢复收尾,不把显示缺席、旧批准或已合并状态当作完成/授权证明。
我的整体评价
在原 Todo 结算恢复这一已界定的问题上,判断为 goal_achieved。long_horizon 为 improved:完成与归档不会再让旧 Turn 丢失结算计划,重复执行保持一次效果;user_experience 为 improved:原入口提供可用的原命令,不增加人工交互轮次。两项判断限于这个可重复的调用路径,不推断长程模型效果或完整成本收益。
资格判断留在既有 TypeScript owner,Python 只读取缺失的原始 Todo 并传输原结算计划。本 PR 只修复已完成原 Todo 的结算恢复,不选择新工作或建立第二套执行器。新增机制与原问题相称,复用已有精确读取、typed recovery 和计划生成器就是本次有价值的局部整理;无需增加新框架或迁移任务。实际安装宿主、后续模型工作、真实 PostgreSQL、完整 M7.4 接受结果与总成本仍未资格化。当前代码结论可以批准,原生 closeout/readiness 和受保护合并授权继续独立办理。
English verdict: APPROVE — 5b62146. Fresh post-merge full five-file audit against dd2ca7c: real File/SQLite completion/archival preserves original settlement identity, one writeback, one debit and settled replay; the next frontier retains its native replan gate. 296 complete Python tests and current static/premerge passed. Prior full TypeScript5139/73configured skips is reused only after695 identical source/test/manifest inputs; it was not rerun in full. Historical failures remain on their original revisions. No inherited approval, installed-host/model/real-PostgreSQL or retrospective merge-authority claim.
Goal And Delivered Outcome
Ordinary Todo completion could remove the selected Todo from a fresh guard while its original Turn still owed writeback and quota settlement. The guard then lost the exact settlement commands and exposed unrelated continuation advice.
Reuse the verified completion/replay phase to project settlement-only recovery for the original identity. Read archived rows through the existing exact-ID provider reader, preserve the canonical plan in TurnEnvelope, and keep missing/foreign sources closed. The completed Todo grants no new delivery work.
main.Author Declaration
loopx/control_plane/quota/settlement_plan.tsand the existing heartbeat/Turn convergence contract, revision4ac980eb6f4f206dddf263e11e4177f8050bc512.blocked_wait.ts; real CLI regressionunsettled_host_turn.py; File/SQLite replay and refusal casesSelf-check: inspected the changed consumers and baseline behavior, reused the existing typed owner and plan builder, and kept the repair within quota plus focused tests.
Scope And Continuation
Complete within this recovery scope. Existing wait, replan, scheduler, work ownership and provider writers retain their owners. This adds no executor, CLI flag, configuration or authority. Broader convergence remains open; no new successor is needed for this standalone fix.
Validation
c60c22d6a26423ff67a102b71cf9f733bc9e4f5e.5da2b9d50; final head reruns all 8 completion/archive/unknown-source/read-only recovery cases plus 17 completed-history tests. Real CLI uses isolated canonical File v0 and SQLite v0 (SQLite 3.53.1).ae2a44087: 5139 passed, 73 configured skips, zero failures. Final control-plane production tree, TypeScript tests and manifests are byte-identical. Later mainline Python fixture/history changes are separately tested.cqr_1295810a72f8d76dd9efverified this head against base4ac980eb; optional failed checks retain exact base/head attribution.Current qualification: integrated target
mainat4ac980eb6f4f206dddf263e11e4177f8050bc512with a signed merge commit. The PR remains five files (+251/−7); every changed source/test blob is unchanged from the original repair. Earliermainadvances invalidated prior CQR attempts; the final exact base/head receipt supersedes them. This does not grant merge authority or qualify full remote CI.CI failures retained: the earlier head's build and Python workflow contain concrete failures outside this five-file recovery change:
personal-workspace-contract.test.mjs:378. Independent immutable current-base/head runs reproduce the same full failure output after only path/timing normalization.0.10000000000002274 <= 0.1. Both current-base/head mocked probes with a fixed monotonic clock reproduce the identical rounding result. The tests and cleanup implementation have identical blobs across CI base/merge, original source head and current base/head. Ordinary macOS runs of those two tests pass; this is not Windows qualification.These observations neither waive required CI nor turn historical failures into passes. Keep full CI and maintainer review as merge requirements; unrelated UI/process-runtime fixes stay with their existing owners.
Coverage: real completion, fresh readback, archival, envelope transport, exact command execution, writeback replay and one debit; typed negatives cover missing/foreign identities and unknown/incompatible progress. PostgreSQL-specific configured skips remain skipped; no PostgreSQL store/service owner changed. No installed App promotion or live model run was performed. Remote CI and maintainer review remain separate merge requirements.
Frontend / Visual Evidence
UI impact: none. This repairs existing CLI/heartbeat settlement guidance; no frontend operation or presentation changed. Screenshots and viewport review: N/A.
Type of Change
LoopX Area
Shared-authority RFC fixture impact
N/A: no provider promotion, writer cutover or shared-authority migration claim. The existing File/SQLite providers are exercised through the real CLI.
Boundary Checklist