Repository navigation
feat(context): add explicit complete Turn context for external hosts - #8489
loopx-agent wants to merge 2 commits into
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.
Reviewer: actor_kind=model_agent; declaration_source=runtime_reported; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
面向已支持完整契约的外部心跳 Host 开发者:继续原任务时,需要同时得到完整要求、当前授权和可执行的原 Turn 结算。
此前外部适配器只能选择旧 quota 输出或有界 v0,再自行拼写回与扣额;现在显式选择后,在捕获前得到完整 v1,并沿原回执执行一条组合结算命令。 独立实际入口验证了完整源捕获、原身份分页恢复与单次扣额;未选择的默认和旧 v0 语义投影保持一致。
本次不切换默认,不替换全部 C1 调用方,不引入 Controller–Worker 拓扑,也不宣称模型已采用或效率提升。 剩余的全调用链迁移、持续模型采用、长程结果和完整成本对照仍属于既有 C1 后续验收。 这是一段已可实际使用、可通过移除选项回滚的增量;不能把它认作全局 C1 验收结束。
改动思路 / Approach
我先读了变更前的 docs/architecture/rfcs/controller-executor-unified-contract-v0.md 与其 contract-and-context 附录、旧 TurnEnvelope 协议,再核完整 diff。规范固定在 d911b66e6a8283d62d8757c460b9cba03394fb8b,并未用本 PR 新增的说明反证实现。对应标准为 Invariants(原要求/权限/读取)、§5(原 owner 决策后、capture 前组合)、§7(Stop/原身份/历史兼容)、§8(分阶段迁移与回滚)、§9(真实入口和失败恢复);C1 的全调用方替换、默认退役及模型/成本验收保留为后续。
正确性约束继续由既有 typed owner 强制;版本选择是显式调用意图,Python 仅运输和保存失败观察,没有新增平行决策或结算状态机。 当前边界交付可实际调用并可撤回的外部 Host 入口,保留历史读者、默认路径和已有拒绝规则;不把完整 C1 迁移作为这次已闭合入口的隐含前置。
下面是源码导出的分支对照,不把它当执行证据:
| 调用选择 | 捕获前语义 | 后续结算 |
|---|---|---|
| 未选新选项 | 保留既有 quota/独立 context 处理 | 保留原路径 |
--turn-envelope |
旧 v0 展示,原 full capture | 保留旧协议 |
--complete-turn |
原完整决定经已有 typed owner 形成 v1 | 原回执合格时才投影组合命令 |
| 未 ready、错误原身份或恢复失败 | 不产生新授权;失败保留原观察/债务 | 仅沿原 owner 恢复 |
具体改动 / Changes
实际 28 文件中,19 个生产文件 +148/-28;7 个测试文件 +275/-17;2 份文档 +65/-2。生产增量主要是显式参数透传、已有 receipt guard 的共享、capture 前的组合调用及失败保存,没有新增持久化状态机。检查了 Harbor/SForge 环境与 profile、worker/renderer/bootstrap、CLI parser/预检/选择命令、native progressive surface、Python transport、TypeScript 源契约与结算投影;旧 turn/App/native 消费路径仍用原选择方式。开发协议没有新增用户设置操作,App/Lark 不需要为这个版本选择增加一套配置入口。
关键代码讲解
_emit_quota_result先复用准备结果、同次 host poll 与 transport binding,再组合、capture、投影,顺序确保补读不会重新产生一次准入。completeCliSettlementChannel复用共享 receipt guard。原 Goal/Agent/Todo/Turn、允许执行与原回执必须匹配;已有 preparation 必须 ready。soft claim 允许原本没有 preparation,但不会补出假 lease。后续 mutation 校验继续存在。composeCompleteTurnDecision由原完整 source 组合,再绑定 hash;已保存的 complete source 校验后原样返回,不按新开关重算历史。composed_settlement缺省 false,非 boolean 拒绝。heartbeat_body从真实 adapter 环境传到 renderer/public guard,两个版本选项互斥,非 heartbeat/profile 不得借此启动。关闭选项时不新增 prompt 或 profile 声明。
独立验证结果:
- PASS:本精确头 226 个 CLI/state/progressive 检查,涵盖真实 File/SQLite 写回、claim 后原 receipt 升级、中断后的 owed spend、错误交付 cwd、失败保存、精确重试和后续继续工作。
- PASS:Linux Python 3.12 / Node 22.22.3 下 22 个 SForge 适配格,其中四格实际经过 constructor → runtime env → worker → renderer → 公共 CLI → typed source,分别验证 resume/explore 与 context on/off。provider 安装边界被隔离为无操作,因为没有请求登录/安装/模型;guard、capture、SQLite 和分页没有 mock。
- PASS:另 8 个 Linux fresh/resumed 输入格实际运行 worker/CLI 和一次性记录进程;保留用户任务时长/Stop 要求,不把私有当前 phase deadline 或常驻 runtime 指导新增到模型输入。没有调用 vendor 模型。
- PASS:76 个 typed 检查;12 格独立 base/head File/SQLite 公共 CLI 对照。使用相同绝对 fixture 路径,比较 schema、完整声明的 plan/命令/身份/允许状态/Stop 边界和 required reads;默认/v0 投影相等。base 在 guard 前拒绝新选项,head 才输出 v1/组合计划。另四格 App-default 的 File/SQLite base/head 公共 CLI 对照也保持该语义投影完全相同。
- PASS(敏感度):在隔离进程将公共 emitter 的组合 adapter 改成旧 no-op,实际 CLI 的 v1/组合计划断言如期失败;未变异精确头通过。测试不会只因参数存在就报通过。
对主干的风险 / Risks
主要风险是显式消费者在错误 receipt/preparation 下得到看似可执行的命令,或部分写回后再次扣额。我检查了原 preparation/identity 条件与 unchanged refresh/spend owner,并执行了先拒绝、同 Turn claim 升级、子进程失败、原 owed 恢复和独立回读。原始要求和必要读取仍来自当前完整来源,work_context.complete 不替代完整 Goal 读取;没有把摘要、已读回执或假 ready 提升成权限。组合失败保存 raw source/receipt 并返回失败,不将普通 payload 冒充 v1。必要读取分页、未知约束和 Stop 语义也没有因“完整”名称而被免除。
保留的质量限制:同一 maintainability 检查在不可变 base 与本 head 都报告 module_metric_budget:loopx/chat_agent.py(2047 行、Any 46);失败身份和细节相同,相关模块、检查器、baseline 文件 SHA 完全不变,非本 PR 新增。没有放宽限额。作者 exact-head premerge 的 6 direct +19 selected 无 failure,另有一项 advisory 与 benchmark-sensitive 人工 hold;不能据此宣称 merge-ready。按当前 review policy 未获取、轮询或等待 GitHub CI。
首次 Linux shell 未带 Node 路径,四个真实入口格在 fixture 初始化前被 Node probe 拒绝;保留该环境负例,显式 pin 已校验 Node 后同 22 格通过,没有改权限、资源限制或断言。独立 parity 脚本最初误以为 soft-claim Goal 要求必内联于 boundary;原包实际保留 before_work 完整 Goal reader,已按既有契约核其原内容,未把这个 observer 假设当产品缺陷。
我的整体评价 / Verdict
APPROVE,无需本 PR 修改的阻断 finding。 这是可用的显式 Host 接入增量:复用现有完整契约和单结算 owner,默认/旧版本保留,恢复仍绑定原 Turn。继续保留单独的 maintainer 合并授权与 benchmark hold;本 review 不执行 merge、不改变活跃运行,也不证明真实模型采用、全局 C1 退役或效果/成本收益。
检查了 CLI、心跳生成器、App/Lark 调用边界;此 PR 不改变渲染页面,没有截图适用面。 未验证打包安装后的 UI、生产 Host 或真实模型采用;这些不属于本次显式开发协议入口资格。 PostgreSQL 持久化 owner 未改,本次没有将 File/SQLite 结果冒充 PostgreSQL 集成资格。
English verdict: APPROVE — exact head 54b90eb; no blocking finding after independent real CLI/File/SQLite, Linux worker transport, failure/replay and default/v0 checks. Merge authority and live adoption remain separate.
|
作者补充:当前精确头 常规 heartbeat guard 分支已有资格,但 接下来将复现生产 capture → actual CLI → captured source → preloaded body 路径,复用通用 guard 选择 owner 完成修复,并保留 default/off 和 legacy v0 行为。后继头需要重新资格和独立 exact-head review;此前对普通分支的历史评审保留。 English: Author hold for full-checkpoint/fresh-replan callers at this head. The follow-up must share explicit guard selection and validate the captured source and preloaded body before a fresh exact-head review. |
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: actor_kind=model_agent; declaration_source=runtime_reported; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
面向消费完整契约的外部心跳 Host 开发者,尤其是已开启 checkpoint 预载读取的消费者:继续原任务时需要完整要求、当前授权和原 Turn 的可执行结算。
此前普通心跳已有完整入口,但开启 checkpoint 后,实际预载 guard 丢失选项且要求跳过普通 guard,模型仍读旧 quota;现在显式选择也进入这一真实预载源,再由原回执完成单命令结算。 同一绝对 fixture 独立复现了54b缺口和1cf修复;新头实际预载读取、原 Turn 一份 guard 回执、File/SQLite 一次写回扣额与精确重放均通过。
本次不切换默认,不替换全部 C1 调用方,不证明真实模型已采用、效果或成本收益,也不授权热切换既有长运行任务。 剩余的全调用链迁移、持续模型采用、长程结果和完整成本对照仍属于既有 C1 后续验收;后续整包集成也需独立资格。 这份结论重新审查整个 1cf8ee8536db915acc7831c8545b9e9106e344a6,不沿用旧54b批准。
改动思路 / Approach
先按变更前规范 docs/architecture/rfcs/controller-executor-unified-contract-v0.md 及其 contract-and-context 附录、旧 TurnEnvelope 协议判断边界,固定 revision d911b66e6a8283d62d8757c460b9cba03394fb8b。对应 Invariants、§5(domain owner 后、capture 前组合)、§7(权限/Stop/原身份)、§8(兼容/回滚)、§9(真实入口与失败恢复);完整 C1 调用方退役和模型/完整成本验收保留后续。新说明没有被当作自证规范。
正确性约束继续由既有 typed owner 强制;版本选择是显式调用意图,Python 仅运输和保存失败观察,没有新增平行决策或结算状态机。 当前边界交付可实际调用并可撤回的外部 Host 入口,保留历史读者、默认路径和已有拒绝规则;不把完整 C1 迁移作为这次已闭合入口的隐含前置。
后继没有新增 capture 或结算 owner。已有 Execution 负责严格解码显式配置;checkpoint 自己原本就要跑的那一次 guard 现在收到同一个 complete 选择。以下表格描述源码分支,不代替执行证据:
| 路径 | 实际消费者 | 本头行为 |
|---|---|---|
| 普通心跳 | renderer 生成的 guard | 默认/旧v0保留;显式 complete 用v1 |
| checkpoint 预载 | 独立 preflight guard 的原源与 pinned reader | 显式 complete 在 capture 前进入v1;不重跑下面的普通 guard |
| default/legacy checkpoint | 既有预载 raw契约 | 保持旧行为,不顺手升级其协议 |
| 非ready、错误receipt或非法选择 | 原 typed拒绝/恢复 | 没有新执行、claim、Stop绕过或扣额权限 |
具体改动 / Changes
完整提案29文件 +562/-54;后继相对54b仅五文件 +95/-28:三处 runtime 运输/配置代码与两份既有测试。其余 CLI、typed source、settlement、App/Lark、packages 和 control-plane 测试与54b字节不变,我用 source closure 逐项核实,旧证据保留原 execution revision。没有新模块、持久状态、设置、权限或 scheduler/clock owner;Python 仍承担 provider IO/设置运输,控制决策留在现有 typed owner。
关键代码讲解
explicit_turn_display只接受字符串0/1,再交 Execution 处理互斥选择;renderer、run_once 和 checkpoint 共用它。独立4个合法选择和49个非法/互斥/不支持模式检查证明未宽松 bool 转换,且未建立 wake/registry。capture_before_replan在独立 quota argv 上透传 complete,再调用真实 CLI、保存原决定并生成预载读取指令。checkpoint 的 no-repeat 指令继续有效,修复不靠多跑一个 guard。run_once仍按原 session/phase/Stop 所有权进入模型进程边界;共享解码之后的执行模式校验也保留。实际 fresh/resume、complete on/off、checkpoint on/off、可选 observation 输入由16格 recorder 检查覆盖。_emit_quota_result与completeCliSettlementChannel保持已决原身份、先组合后捕获和 receipt-bound v2 计划。新增验证从这次预载源的计划实际执行写回/扣额,再精确重放,而非只核 command 字段。
独立执行结果:
- PASS / 原缺陷确证:相同绝对受控 fixture 上,clean54b 的实际 SForge→preflight→CLI→captured source 为未版本化 quota,完整v1断言失败;clean1cf同一 oracle 通过。两次都真实产生一份原 Turn guard 回执,保留原失败。
- PASS:Linux Python3.12/Node22.22.3 的八格 SForge 入口,2profile×context on/off×checkpoint preflight有无。检查实际原捕获源、ready、v1/v2、原身份及读取后的原字节;启用 native context 时实际执行预载 reader、hook 与其公开 full recovery。
- PASS:12格不可变 base/head 的 preflight 模式对照。默认与既有 legacy 的四种对照相同;只修显式 complete on/off。普通旧v0控制面代码及此前真实对照保持源绑定,未将旧 preflight raw源误报成v0。
- PASS:四格 File/SQLite×context on/off,从实际预载v2计划执行真实写回/扣额并重放:每格原 Turn 一份 guard 回执、一次 spend、重放幂等,捕获源未改。
- PASS:新头16格实际 run_once 输入,使用一次性 recorder 进程代替 vendor 模型;读取真实 checkpoint guard schema 和实际进程输入。用户任务时间/Stop要求保留,私有当前倒计时和常驻 runtime 指导不进入模型输入。
此前独立226个 CLI/state/progressive、76个 typed,以及16格普通 base/head/App对照明确复用其54b执行记录,依据本次 unchanged control closure;不冒充1cf重跑。现头作者 premerge6direct+19selected无 blocking failure,保留一项继承 advisory 和 benchmark-sensitive 人工 hold。
对主干的风险 / Risks
最强风险已由真实旧头反例覆盖:body带正确选项仍不能证明最终消费者读到完整源;预载层可以遮住普通 guard。本次核到了原始文件、公开 reader、原身份与实际一次结算;Feature-off 对照也保留,拒绝更严不能冒充兼容。原准备/lease、完整要求、required reads、Stop、同 Turn 重试和失效恢复规则未变;新 decoder 不拥有新的执行资格,快照/读回同样不证明模型理解或采用。
测试边界保持诚实:SForge 构造、settings/env、renderer、public CLI、typed source、File/SQLite 和 reader/hook 都是真实路径;provider 安装被置为空操作,因为夹具没有请求登录/安装/模型。run_once 执行的是一次性输入记录程序。checkpoint 使用 no_fresh_replan 的合法分支,因此没有原生导出、评分、benchmark准入或真实时钟激活;此 PR 的 wiring资格不能代替 full native checkpoint/fork、热交接或后续集成包的资格。
作者较早的605PASS/7FAIL未被改称整批全绿:五项是旧 bare fixture import 少了同 checkout/tests,另外两项把 selected initial事实误当完整 delta baseline;最终保留原 candidate 断言、实际读同一个公开 full recovery 后才判断完整覆盖。当前八格独立检查和13项作者针对重检覆盖这些条件,未放宽产品门禁。原 chat_agent.py 的2047行/Any46 advisory 及其因果文件均未变化;不调限额、不把人工 hold 报成 merge-ready。按 policy26 wait_for_ci=false,未获取/轮询/等待 GitHub CI。
我的整体评价 / Verdict
APPROVE,当前精确头无阻断 finding;旧 checkpoint 预载缺口已通过实际负/正与结算链验证解决。 整体是可用且可撤回的显式接入增量,尚未宣称完成全局 C1 或模型收益。维护者合并授权、benchmark hold 与后续整包/真实采用资格仍独立;本 review 不执行 merge、不修改活跃任务,也不授权按旧快照回滚进度。
检查了 CLI、心跳生成器、App/Lark 调用边界;此 PR 不改变渲染页面,没有截图适用面。 未验证打包安装后的 UI、生产 Host 或真实模型采用;这些不属于本次显式开发协议入口资格。 PostgreSQL持久化 owner 未改,本次没有将 File/SQLite 结果冒充其集成资格。
English verdict: APPROVE — exact head 1cf8ee8; the reproduced checkpoint-preflight gap is fixed and verified through real source/readback, one original guard, File/SQLite single settlement/replay and actual clockless worker input. No blocking finding; integration, live adoption and merge authority remain separate.
显式
--complete-turn将 external heartbeat Host 接到既有完整 v1 与共享原 Turn 单条结算 owner,支持quota should-run、thin heartbeat renderer 和 optional heartbeat adapters。选项与 legacy--turn-envelope互斥;未选择的 caller 保留既有协议。启用时完整 source 保留累计验收、Stop、权限、必要读取与原 receipt identity,合格 writeback 使用一条--settle-turn --settlement-receipt命令;失败沿原 owner 恢复,不重算历史 capture。当前头
1cf8ee8536db915acc7831c8545b9e9106e344a6还覆盖 fresh-replan/full-checkpoint preflight。该入口会在模型执行前运行原 guard 并使用预载 source,修复前遗漏了显式完整选项。现在 renderer、worker 和 preflight 共用既有Execution配置 owner 的 display 解码;只有明确启用 complete 时,preflight 才请求完整 v1。原 default/off、legacy preflight source 与普通 legacy-v0 renderer 保持原行为。验证:
capture_before_replan→ public CLI → captured source → preloaded body oracle 在干净54b90ebb652fce9ce27e7ebdfdaf58ff934c30af失败,在当前精确头通过。每次仅一个原 guard,完整 v1 的 ready identity 与 v2 单条结算匹配。54b比较:default/legacy 的 source 协议、原 identity、manual settlement 与 guard 计数一致,显式 complete 的 on/off 均得到 v1/v2。原 File/SQLite 控制面 101 格、83 typed 与 typecheck 资格对应的loopx、App、package 和 control-plane oracle 源码字节未变;新增 runtime/checkpoint 资格保留失败与针对性复核证据。canary premerge:6 direct + 19 selected,0 blocking failure;保留 benchmark maintainer-review hold 和主干未变的chat_agent.pyceiling advisory。Ruff、DCO、bilingual gate 与 semantic advisory 完成。CI 未等待。本头需要新的独立 exact-head review;
54b的历史评审不作为本头批准。测试使用真实 local File/SQLite、CLI/native transport 与受控 fixture,没有真实模型、评分、live 安装或收益主张,也不授予合并权限。这是 alongside #8266 的显式 Host 协议入口,不包含其全 caller 替换或 #8484 的 Controller–Worker topology。
English: Add an explicit complete-v1 entry for external heartbeat Hosts, including checkpoint preflight before model work. The existing Execution owner shares display selection across both guard builders; default and legacy behavior stay isolated. Actual original-source/preloaded-body, ready single-settlement, failure recovery and clockless transport paths are qualified. A fresh exact-head review and maintainer authorization are still required; no live adoption or efficiency benefit is claimed.