Repository navigation
fix(goals): preserve outcome positions during refinement - #7792
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
结论:本次完整审查支持 APPROVE,目标为 #7792ca57662。独立复现了旧实现对首项/中间项的重排,并在 File、SQLite 与真实 PostgreSQL 上验证修复;未发现本次 diff 引入的阻塞问题。CI 未查询、未等待。下面将修复范围与未验证部分分开记录。
Reviewer: model_agent | model=gpt-6.1-sol | provider=OpenAI | runtime_reported | effort=max
动机
反复补充或复查 Goal 成果要求的用户与 Agent,会在 CLI、既有 Goal 页面及后续工作上下文中读取同一份成果集合。
已有成果 A、B、C 时,只复查 A,旧实现却把集合改成 B、C、A;修复后仍是 A、B、C,只有 A 的复查内容和版本变化,新增 D 才追加到末尾。
本次验证表明,更新任一既有成果后,其他成果的位置、要求和来源保持;后续完整或差量上下文仍能重建全部内容,并保留未满足结论。
本 PR 只修复既有成果更新时的集合顺序,不增加成果排序设置,不迁移历史记录,也不把 Agent 自查变成独立验收或宣称已验证模型采用收益。
这里的差量上下文指只传递相对已保留完整基线发生变化的内容。旧实现并没有删除成果要求,但把目标移动到末尾,使位置变化牵连其他原本没有变化的内容。一个只有单项成果的测试看不出这个问题,所以本次以多项成果的真实 canonical commit 和独立读回作为判断依据,没有把通过测试的数量或 PR 大小当作价值证明。
先读取了变更前已接受的 docs/architecture/rfcs/goal-outcome-refinement-v0.md,spec_revision:da4510af61277c0d0786fa5aa040ccb01538b1cb;相关完整读取和恢复边界还包括同 revision 的 docs/reference/required-work-context.md 以及 docs/architecture/rfcs/controller-executor-unified-contract-v0.md。RFC 没有规定一个新优先级排序;本次稳定旧记录位置来自已复现的维护问题,不能倒过来把补丁当规范。
改动思路
顺序应由现有 TypeScript 成果状态 owner 在单次更新中保持;在展示层排序或新增顺序字段会制造第二份真相,无法修复 canonical snapshot 和差量上下文。
当前 PR 的完整边界是既有成果原位替换、新 ID 末尾追加及真实读回回归;不引入新协议、配置、权限或迁移,也不要求无关的成果系统重构。
当前路径是既有 CLI/HTTP refinement,经 Python IO adapter 进入 refineGoalAcceptanceOutcome,从当前 canonical snapshot 调用唯一的 refineGoalOutcome,再由同一 CAS/receipt owner 提交。后续 inspect、quota 的 work_context 和既有 Goal 页面读取同一投影。改动没有把数组位置升级为权限或优先级,没有另建排序缓存;原有状态约束、预算错误、Goal lifetime 和重试仍由原 owner 处理。
对不发布的最强理由是:不能为了减少几段重复文本增加新的排序状态,也不能据此宣称模型长程效果提升。实际 diff 只在现有 mutation 中完成原位替换,足以修复 canonical 数据和下游传输。展示层排序与“保持现状”均不能满足这个目标;进一步抽 helper 或历史排序迁移只会扩大此次边界。因此 bounded refactoring 结论为 unnecessary:已检查邻近 mutation/receipt/consumer,没有需要随修复再抽出的独立不变量。
| 同一输入 | actual base | reviewed head |
|---|---|---|
| 复查首项 A | B、C、A | A、B、C |
| 复查中间项 B | A、C、B | A、B、C |
| 复查末项 C | A、B、C | A、B、C |
| 新增 D | 既有行为追加 | 仍然追加,原三项内容保持 |
表格是基于真实读回的摘要;完整/差量恢复另行比较,未把顺序差异从 oracle 中消掉。
具体改动
关键代码讲解
完整 base-to-head diff 为三文件 +40/-2。生产改动位于 refineGoalOutcome:第 186–187 行遍历既有成果,只替换匹配 ID,找不到旧记录才追加。此前已校验唯一 ID、旧 owner/objective、累计 requirements、来源和完整 review;最终仍经过同一容量与状态校验。它返回新 state,不直接写盘,也不修改传入 snapshot。
refineGoalAcceptanceOutcome 是未改动但实际执行的 effect boundary:原 operation ID 的 replay 先由 receipt 恢复;新写入仍比较 provider revision,再原子提交 next projection。实际 PostgreSQL 测试重新打开 store 后 replay,只出现一次效果;stale CAS、foreign actor、改写原要求和无来源新增均保持拒绝。原来的 unmet/uncertain 自查也不会因此成为独立通过证据。
test_cumulative_review_evidence_reuses_real_quota_sources_without_hiding_new_judgment 通过真实 CLI/quota 加入长内容的旁支成果,检查只变化的 review 被传输、其他要求不被重发,恢复后的 context 与当前完整 context 完全相同。TS 用例补齐首/中/末更新、输入不变及新 ID append;测试 oracle 来自原有累计意图与本次明确的稳定性目标。
Accepted spec 对照(编号沿用该文件的 Decisive acceptance,按此次维护边界判断):Decisive acceptance 1、Decisive acceptance 2、Decisive acceptance 3 的原始要求、目标、来源和恢复由实际 CLI/native 读回覆盖;Decisive acceptance 4、Decisive acceptance 5 的未满足、非法修改、CAS 和一次 replay 保持。Decisive acceptance 6 的 root continuation/runnable admission、Decisive acceptance 8 的 replan/continuity、Decisive acceptance 9 的 native retry、Decisive acceptance 10 的 legacy binding/recreated lifetime 由此次执行的既有对应套件保持。Decisive acceptance 7 为整项成果 UI 的 packaged 桌面/窄屏资格,本次未修改组件或交互,也未重新宣称交付整份 RFC;它在本次 bounded repair 中 out_of_scope。
对主干的风险
主要风险是“看起来只改列表,却在持久化和传输中丢掉旁支内容”,或为了缩小 delta 把原始要求/来源裁掉。本次没有压缩这些语义;对实际 base 与 head 使用相同合成输入和独立顺序 oracle,所有非目标记录、原始要求、来源、Todo/root 状态,以及 missing-baseline full recovery 均保持。File 首/中项 delta 从 11054/9911 降为 7625 字节,SQLite 从 11090/9947 降为 7661 字节;这是这组固定输入的传输数据,不代表整个 Turn 成本或模型效果。
| 独立验证 | 结果与限制 |
|---|---|
| 七个 owning Python 模块 | 162 passed,0 skip;含 refinement、capacity、retry、diagnostics、replan、continuity、context delivery |
| 五个 TypeScript 模块,qualified SQLite 与真实 PG | 184 passed,0 failed/skip;最初未提供 PG 时的 25 skips 已由完整重跑覆盖,未把跳过当通过 |
| PostgreSQL authority-store integration | 临时隔离 PostgreSQL 16.15,382 passed,0 failed/skip |
| 同 fixture 的实际 CLI base/head | File/SQLite 各三种位置,head 6/6;base 首/中项故障被 oracle 抓到,末项对照通过 |
| 实际 PostgreSQL native base/head | head 3/3;base 首/中项重排;dry-run、reopen、CAS/replay、来源/owner 拒绝及追加保持 |
| 编译与边界 | control-plane typecheck、mypy 17 sources、changed Python Ruff、diff semantic advisory 后 full smoke、三文件 public/private scan、diff check 均通过 |
| standard premerge | 5 direct and 10 selected checks executed; 0 blocking failures/warnings, 1 retained optional maintainability advisory, no manual holds; exact CQR valid. One selected advisory exits 1, so this is not an all-checks-green claim. |
可选 maintainability 检查仍是 failed:唯一发现为未改动的 host_process_transport.run_host_process 体积债务。审查者在不可变 base/head 各自运行同一命令,均 exit 1,完整诊断 SHA-256 均为 9d88719f4a1548b47726f28ad226ff76e2ef1844c616d83f2ce46170a14838fe;validator/config/失败源码及环境摘要相同,changed paths 的必需验证独立通过。它作为 exact-scope CQR 的 optional baseline advisory 保留,没有改阈值、掩盖失败或依靠“未提到 changed path”的文本启发式来定性。
语义与 CI 对齐
没有新增 schema/version/CLI option 或默认开关。无成果时 inspect 不创建成果;关闭独立 checks 仍保留原有累计规划;现有 actor/GoalRef、预算和重试拒绝保持。源代码 real-path 验证不代表 installed App、真实模型保留上下文或跨接收者采用。codec 的 retained-complete 输入是明示的脚本化 fixture,未被冒充为模型实际读完。
我的整体评价
这是可独立验证、易回滚的完整维护修复,现有 typed owner 足以承载它,没有未完成的新 capability 或必须等待下一 PR 才生效的序列化前置。当前 exact scope 的 change-quality receipt 为 cqr_5929b44ac806697c545c,已包含独立 baseline attribution;标准 premerge 通过,0 manual holds,但没有赋予 merge 权限。之前没有本 PR 的 review/inline/comment 需要清除;发布后仍执行 exact-head closeout readback。
已检查既有 GoalOutcomeRequirements 与 CLI/HTTP consumer:本 PR 未改 JSX、CSS、交互入口、信息层级或呈现规则,仅修复它们消费的集合稳定性;不需要新增视觉设计验收。
unverified_scope:未重跑已安装 App、桌面/窄屏整页视觉、Lark 或真实模型采用;本结论仅覆盖本次顺序修复及源代码真实 CLI/native backend 路径。
批准以当前完整 diff、实际 caller/三个存储边界和负例为依据。后续若 head、调用方或策略发生变化,应重新核对受影响证据。这里批准的是本次顺序修复,未把长期收益、安装完成、CI 成功或 GitHub formal approval 状态一并宣称。本机与作者共用账号,因此按仓库规则发布 COMMENTED 的 approval conclusion;不执行合并或 dismiss。
English verdict: APPROVE for #7792ca57662. The existing-outcome update preserves canonical positions, cumulative intent, replay and rejection boundaries; the optional unchanged baseline advisory and unverified installed/model adoption remain explicit.
Goal And Delivered Outcome
更新一个既有 outcome 的评审时,原实现先删除该记录再追加到末尾,使其他 outcome 改变位置。普通 Goal CLI 产生的上下文因此重传未变的要求和证据。
本修复在现有 TypeScript owner 内原位更新既有 outcome,新 ID 继续追加。现有持久化顺序和历史回执保持原样。受影响的入口是
goal-acceptance refine、其规范状态投影以及现有 full/delta 上下文消费路径。同一公开合成 fixture 的完整输入字节数相同;更新后的协议 JSON delta 如下:
每次减少 4,713 B,约 39%。恢复后的完整要求、来源、负面评审和未验收状态均通过断言。这只是该 fixture 的协议字节比较,未资格化 tokens、延迟、模型效果或完整成本。
main,基线da4510af61277c0d0786fa5aa040ccb01538b1cb。Author Declaration
docs/reference/required-work-context.md及docs/architecture/rfcs/controller-executor-unified-contract-v0.md的现有 C2 上下文完整性边界,版本为上述基线。refineGoalOutcomeScope And Continuation
三个文件构成完整、可回退的维护修复。公开 schema、validator、预算、权限和 provider 路由沿用原 owner。新增 record 仍追加;既有 record 更新后的数组顺序变化是本修复的有意行为,调用方仍应按 ID/revision 识别记录。
C1 producer/consumer 切换、App 安装采用及长期成果/完整成本验收保持原项目边界。本 PR 不关闭这些累计验收,也不需要额外创建跟进任务。独立评审、CI 和维护者合并继续。
Validation
ca576626e349ebe7777ded97152172ba96485303,测试源码与提交内容一致。npm run test:postgresql-authority-store为 382 passed、零 skip。npm run typecheck:control-plane、改动 Python 测试的 Ruff、配置内 17 个源文件的 mypy、RFC 双语 diff、三文件公共边界扫描及 diff 检查。差分语义 advisory 未发现支持的新词汇载体;其检测局限保留。host_process_transport.run_host_process未登记的体积 finding。不可变 base/head 各自执行相同命令,完整失败签名、fixture/environment digest 相同,零 magnitude growth;保留失败,无修改阈值/例外。5929b44ac806697c545c24094c3b59047927607a3d45704b3d34a8c9b86a099a的 CQRcqr_5929b44ac806697c545c已记录并验证;原维护性失败通过既有可选基线归因合同单独保留。无 review-time safe-fix。精确 head 的标准 premerge:5 个直接检查、10 个选择检查完成,无阻断失败;1 项既有维护性归因提示保留。CQR 为 pass、回读 valid。没有合并或安装操作。
Frontend / Visual Evidence
UI impact: none。修改既有规范状态与上下文传输;沿用现有 Goal/CLI 交互,未增加调用能力或页面。截图不适用。
Type of Change
LoopX Area
Technical Direction
Core control-plane hardening;现有 controller/executor RFC C2 单会话路径的有界维护修复。
Shared-authority RFC fixture impact
N/A:本 PR 不主张 provider promotion、路由迁移或完整共享 authority 验收;真实后端结果见上表。
Boundary Checklist