Repository navigation
fix(replan): adapt review cadence from settled stride feedback - #7874
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
动机
[P2] 请避免 neutral 历史行借旧 Turn id 越过更新的 ACK。 阻塞位置:loopx/control_plane/work_items/replan_history.ts:219–221。本结论绑定 af77049a328f3a6aef1e4bf805ec6e462c2a24e9,base e9eda527afd5fcb262ee7c199e1822b1a936cc24。
启用 Stride、依赖周期复盘安排后续工作的 Agent 与维护者。过去启用策略后仍按配置周期复盘;本 PR 让已结算的复盘决策调整下一周期,同时保留同包的问题与最小示例。预期结果是让下一次复盘节奏反映已有决策,而不是不断增加规划开销或把收益声明当成独立认证。当前 neutral 历史行可复活较旧反馈;真实模型采用、长期效果和完整成本收益仍未资格验证。本 PR 不授权实验、安装、合并或冻结 worker 升级,也不改变 stall、quota 与逐 Turn 结算。
改动思路
派生周期放在现有 TS history/settlement owner 内是合适的;无需新增 timer、持久化倍率或 Python 决策副本。当前 PR 应保留这个可选反馈切片,并在同一 owner 修好 neutral/ACK 时序;不应扩大成调度器重构或新策略框架。我比较了保持现状、只压缩文字和新增调度/状态层;现有 owner 内派生是适当的小切片,但“来源确为已结算”还不足以证明它在当前 ACK 窗口内。
先读的规范是 docs/reference/protocols/goal-vision-replan-contract-v0.md 的 Replan ACK freshness、Structured stride control,以及 docs/architecture/rfcs/hierarchical-agent-stride-control-v0.md 的 7.6;采用修改前的不可变版本 e9eda527afd5fcb262ee7c199e1822b1a936cc24。ACK 覆盖/neutral 不制造新工作及默认关闭边界是独立判据,没有用本 PR 新改的规范自证正确。
具体改动
projectSettledReplanHistory 从实际 should-run/writeback/spend 来源选择 fresh v2 决策,避免仅使用携带的旧 Vision;effective_turn_cadence_context 仅传递配置。periodicThreshold 按配置基准计算,switch 优先、不连乘与 ceil 都有正向证据。strideReviewMismatch 保留后续引用和 declared-work 核验,goal_gain=improved 仍只是有来源的 Agent 声明。
问题发生在 periodicThreshold 的历史行与 canonical map 结合处:先按任一行的 [agent, turn] 取决定并返回,之后才检查 ACK;它没有像 historyWindow 那样排除 neutral 行。
可复现顺序:已结算 verify A → 较新 switch ACK B → 一条复用 A Turn id 的 replan_noop 或 repair_noop。在真实 File/SQLite 已结算来源之上,经生产 Python codec→TypeScript settlement projection 作受控历史反例,配置周期2正常为2,加入不含 ACK、也不含 Vision 的旧 Turn neutral行后,head变1,base仍2;off与peer对照均2。两种 neutral 在两个 provider 均复现。这里没有改活跃 Goal/收据,也没有声称当前 CLI replay 必然追加这类行;既有 replay 的 no-append 正向测试仍保留。
先排除不承载新决策的 neutral 行,并把反馈的时序绑定到真实已接受 writeback/ACK;保留 ACK-inclusive,不能仅凭任一行的旧 Turn id 提前返回。请把这个顺序加入 source-backed 回归,并保留正常 ACK-inclusive、v1/unsettled/peer/off 与 stall 对照。
对主干的风险
当前改变局限于 enabled receipt-backed cadence,但较新的路线决定可能被旧反馈覆盖,导致提前或推迟复盘、增加控制成本并重新采用已被覆盖的信息。默认 off 的 native 对照保持2;未发现新增执行权限、额外扣槽或冻结 worker 变更。共享 historyLane 是有用收敛,下一步应收敛两条读取路径的 neutral/ACK 语义。
本次203项TS通过;Python完整运行50通过、2项 manual-measurement 默认页断言失败;due-stride的8个真实File/SQLite用例在通过集合中。标准premerge14项和5个direct checks、typecheck、Ruff通过。另有独立native历史反例失败,不能被这些绿色检查覆盖。
扩展comparison的旧断言也完整保留:原base actor继承context reader时得到KeyError;同源actor和fixture显式off后,base为1通过/1个SQLite同断言失败,head为2通过,原head完整跑次的File/SQLite两红仍不改判。排序/时序的完整因果未查清,不能把最新绿当稳定性证明。没有改断言、预算或冻结标准。
我的整体评价
本次 REQUEST_CHANGES 来自已复现的 neutral/ACK 回归,不是 CI 证据未知。远端CI未查询、轮询或等待;未知原因保持未知。修好当前owner内这个边界后,再按新head复核,不能继承旧结论。
压缩部分按 actor、触发条件、顺序、语气、来源、范围、continuation/stop 逐条审读:同包仍有问题、完整minimal_example以及实际存在的 explore_basis.rule 页坐标/source replay说明;没有把字段不变当作文字等价的证据。作者9324→7377B属于其合成组件对照,本次未把该数字升级为全包/模型/完整成本收益。当前无渲染改动,不需新增截图;模型是否采用指导及长期净益仍未验证。建议保持现有架构,只做上述有反例约束的局部修复。
English verdict: REQUEST_CHANGES — a late neutral observation can revive an older settled stride decision across a newer ACK and change the current cadence.
| for (const run of request.runs) { | ||
| if (run.agent && run.agent !== lane) continue; | ||
| const decision = run.agent === lane && run.turn | ||
| ? decisions.get(JSON.stringify([lane, run.turn])) : undefined; |
There was a problem hiding this comment.
[P2] neutral 行不能借旧 Turn id 复活较早的 stride feedback
这里先按任一历史行的 [agent, turn] 查 canonical 决定,再在后面检查 ACK;neutral 行并未像 historyWindow 那样被排除。受控顺序为已结算 verify A → 新 switch ACK B → 复用 A Turn id、无 ACK/无 Vision 的 replan_noop 或 repair_noop。经生产 Python codec/TS settlement projection 读取同一真实 File/SQLite 结算来源,base 的配置周期2保持2,head却变1;off与peer仍2。两provider×两neutral都复现。该反例不声称当前CLI replay会追加行,也没有修改活跃状态/收据。请排除非新决定的neutral观察,并按实际writeback/ACK时序选择反馈,保留ACK-inclusive;增加这个顺序的source-backed回归。
There was a problem hiding this comment.
已在 f8fc621022a285cb8ee152647932161c3ff90e56 修复:先定位当前 lane 的最新 ACK,再仅对该 ACK 选择已结算反馈;较晚的 non-ACK/neutral 观察不能借旧 Turn 越过它。canonical neutral 集合由 lane/window/feedback 共用,neutral ACK 仍截断窗口而不提供反馈。新增纯 TS 反例在修复前失败,真实 File CLI 同序列也先复现阈值1错误;修复后 focused TS129、真实 File/SQLite8、typecheck/Ruff、premerge14及6项直接检查通过。既有 comparison 分页断言缺口保留,未算作通过;未查询 CI。请按新 exact head 复审,当前仍不主张合并资格。
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
动机 / Motivation
启用 Stride、需要决定何时复盘后续工作的 Agent 和维护者。
例如已结算 verify 后更早检查不确定性,或在有后续收益证据的 grow 后延长下一段工作;过去始终使用配置周期。
当前实现从已结算 fresh decision 派生下一周期,且旧 Turn 的普通或 neutral 行无法越过最新 ACK 复活旧反馈。
本切片不认证 Agent 的收益声明,不改变权限、逐 Turn 结算、冻结 worker,也不宣称模型采用或长期净收益。
真实模型是否采用指导及完整成本收益仍未验证;既有分页断言和合并资格另列。
本结论绑定 f8fc621022a285cb8ee152647932161c3ff90e56,不可变 base e9eda527afd5fcb262ee7c199e1822b1a936cc24。没有发现当前阻塞问题;上轮 neutral/ACK 问题已经用同一真实来源反例复核,不能把旧 head 的拒绝结论直接沿用。
改动思路 / Approach
现有 history/settlement owner 已掌握配置、原始回执和 ACK,可在此派生下一周期;无需第二个 timer、策略数据库或 Python 决策副本。 当前 PR 保留可选的反馈派生与同包指导压缩,修复最新 ACK 窗口内的选择;更大的调度重构和模型收益资格不属于本切片。
先定位当前 Agent 的最新 ACK,再仅从这个 ACK 的已结算 fresh v2 写回取反馈。较晚 non-ACK 行即使复用旧 Turn,也不能成为新决定;neutral ACK 截断窗口但不提供反馈。这个修复使窗口与反馈选择共享同一 lane 和 canonical neutral 集合,是适当的同域收敛。
配置仍是基准,读取不连乘。switch 优先保留基准;verify 或明确不确定/差距/失败依据取一半并向上取整;有来源的 supported grow 与 improved 声明取1.5倍。来源校验不认证 Agent 的判断,更不证明这些倍率最优。保持现状会丢失已有反馈;另建 timer 或策略数据库则增加重复 owner,均不优于此边界。
具体改动 / Changes
完整审查11个路径、+268/-61:4个生产路径、4个测试/fixture和3份文档;其中生产+91/-48。另核对 af77→本 head 的修复,不只看旧 finding。双语说明同步披露可选 cadence 行为,配置基准未被重写。
关键代码讲解
periodicThreshold(replan_history.ts:212)在最新 lane ACK 才查 canonical map,ACK-inclusive、neutral cutoff 和 switch 优先均有反例覆盖。projectSettledReplanHistory(replan_history_settlement.ts:16)复用实际 should-run/writeback/spend 资格,只接受已结算且带 accepted fresh Vision ACK 的 v2;ordinary work 携带的旧 Vision、peer、unsettled 和 v1 不提供新反馈。strideControlContract(stride_policy.ts:364)仍同包交付三轴问题、完整 minimal_example、previous_review 和 Explore 来源规则;只压缩重复说明。逐条比较 actor、trigger、顺序、必须/建议、来源、范围和 continuation/stop,未从字段相同推断语义等价。遗漏结果仍通过实际存在的explore_basis.rule找到 global 页坐标、保留 basis revision 并做 source replay。effective_turn_cadence_context(replan_history_codec.py:31)只运输已解析策略和原配置数量;Python 没有再实现倍率规则。已有 Goal/device 编辑入口继续复用,不新增开关或同步步骤。
先读的规范为 docs/reference/protocols/goal-vision-replan-contract-v0.md,spec_revision e9eda527afd5fcb262ee7c199e1822b1a936cc24;并读同版 docs/architecture/rfcs/hierarchical-agent-stride-control-v0.md 的 7.6。Replan ACK freshness:lane/neutral/最新 ACK 边界 implemented;Structured stride control:fresh source、其他出口不可绕过和 off/v1 边界 implemented;7.6:决定、执行、信息和收益分离及原权限/完整成本边界保留。新倍率是本 PR 明确披露的可选扩展,未用修改后的文档自证旧行为。
对主干的风险 / Risks
复跑原独立生产-codec反例,读取同一组真实 File/SQLite 已结算来源:verify A→更新的 switch ACK B→复用 A Turn 的无 ACK/无 Vision neutral 行。历史 af77 错误为1;当前 f8 保持2,off和peer也为2。当前实际 CLI 用例进一步覆盖 B 后只有一个工作 Turn 时不提前到期。这里只改变受控投影请求,没有修改活动 Goal 或其收据,也未宣称生产 replay 会追加这种行。
| 本地验证 | 实际结果 |
|---|---|
| 两份完整 Python 模块,含8个真实 provider/action/context-change旅程 | 42 passed |
| 四份完整 TS suite / TypeScript typecheck | 84 passed / PASS |
| Standard premerge | 4 direct、Python compile、14 selected全部通过 |
| 完整 comparison module,同源actor显式full decision | head 5 passed / 1 failed;base 3 passed / 3 failed |
语义与 CI 对齐
comparison 当前失败是 [writeback-result-file] 的“旧 best 必须在默认页外”断言;同参用例在不可变 base 也失败,均因 wide-result-0 已在三条默认结果内。两边所有相关 captured guard 都尚无 previous decision,新反馈因此保持配置基准1;comparison/paging owner与断言未改。只归一化临时路径和生成的 retained-fixture id,不抹掉选择或失败。这个当前红项可归为 pre-existing unrelated;其完整排序成因未称已修,历史 manual 失败与本次所有跑次均保留。其他当前通过用例独立覆盖 source/citation拒绝、回放及显式展开,不能把失败计作通过。
启用策略后的 next-count 是有意行为变化;默认 off、legacy计数、stall、权限、逐 Turn 结算和冻结 worker 保持原边界。没有从“无新状态”推断隔离,实际检查了 disabled/peer/source及新 ACK 选择。未查询、轮询、调度或等待 CI;未知 CI 及其原因均未被冒充已归因的本地失败。作者129项及此前203项TS不算本次重跑,9324→7377B也只是作者组件测量,不能升级为完整成本或模型收益。
我的整体评价 / Verdict
APPROVE 当前 exact head。long_horizon 的原工作/恢复/结算边界保留;局部反馈闭环和用户无需手工改周期的结果已有真实 CLI 证据,但净效率和模型决策质量仍未知。现有 history/settlement owner 已掌握配置、原始回执和 ACK,可在此派生下一周期;无需第二个 timer、策略数据库或 Python 决策副本。 当前 PR 保留可选的反馈派生与同包指导压缩,修复最新 ACK 窗口内的选择;更大的调度重构和模型收益资格不属于本切片。
检查现有 CLI/配置后端和策略包;完整 diff 未改变渲染页面、布局或编辑器交互,不需要新增截图。浏览器设置交互未重跑;真实模型采用、冻结实验接续和完整长期成本收益未验证。现有 v1/持久历史兼容应保留;本次小重构已共享 lane/neutral,较大框架重构没有必要。原分页失败保留为独立限制;批准不表示合并资格、安装或实验完成。旧 review/讨论保留,未 dismiss/resolve 或合并。
English verdict: APPROVE f8fc621 — the latest-ACK selection fixes stale neutral feedback; current decisive local evidence covers cadence, source and off-path invariants. Existing unrelated pagination assertions remain disclosed, and CI was not required.
启用 Stride 时,复盘提示包含重复说明,而已结算的策略反馈没有调整后续周期。本 PR 保留 inline 问题、完整 minimal_example 和现有证据校验,并把已结算决定接到现有 periodic review owner。
grow + supported_progress + evidence-linked previous goal_gain=improved使用配置基准的 1.5 倍;verify或 uncertainty/gap/failure 使用 0.5 倍;switch优先保留基准。向上取整、至少 1 Turn、读取不连乘。配置基准、off、旧计数方式、stall、权限及每 Turn 结算保持既有行为。strideReviewMismatch的后续证据、声明工作和 Explore 来源校验保持原样。收益仍是来源经过校验的 Agent 声明,不能据此认证实际收益。strideControlContract,pretty JSON 从 9,324B 降至 7,377B(约 20.9%)。这是提示组件输出量;未测得完整成本或模型行为收益。为保留验收和恢复语义,没有把近似字符目标当作删减约束的硬预算。验证:当前 head
f8fc62102的 focused TS 129 项通过,真实 File/SQLite CLI verify/switch、来源改变及后续工作路径 8 项通过。新增回归先在修复前复现“已结算 verify A → 新 switch ACK B → 无 ACK/无 Vision 的旧 Turn neutral 别名 → 提前触发周期1”,随后在两种 provider 的真实结算来源上通过;仅构造投影请求,未修改其权威历史或收据。TypeScript typecheck、Ruff、RFC 双语 staged 检查、语义增量 advisory 及 standard premerge(14 项及6项直接检查)通过。此前 history/provider/transport/observation 76 项通过、全 TS 5,862 passed / 77 skipped 是前一 head 的验证,不声称本次重跑。没有查询或等待 CI。保留的验证缺口:扩展 comparison CLI suite 最初在 base
e9eda527a和 head 都有 6 个KeyError: should_run;受控 actor 现显式请求 full decision,避免继承 reader 输出默认值。该 suite 随后为 5 passed / 1 failed:File/manual-measurement 的“旧 best 必须位于默认页之外”断言不成立。没有改写该断言或把它算作通过,排序原因仍待确认,合并资格未建立。现有 Capability Center 的 Goal review and stride 设置继续使用同一配置和后端;没有新增开关、版本或 UI。真实 CLI 设置与复盘 readback 已验证,浏览器设置交互未重跑。冻结 worker、运行中的实验、安装版本均未改动。相关小重构复用共享 lane 选择和 canonical neutral 集合;窗口、stall 与 off 行为保持既有边界。其余重构不在此切片。