Repository navigation
refactor(turn): qualify receipts and continuation in the typed owner - #7523
Conversation
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
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
REQUEST_CHANGES — 两类原始值跨 runtime 回归仍需修复。 精确 head a98ea5e5b73e7ee7c754faef7cb5bc3ff9ba66eb。
动机 / Motivation
需要在失败后继续原任务的 Turn 调用方,以及依赖 Python 回执 API 的现有消费者。原路径在 Python 重建 journal 回执并判断下一步;提案把完整事实交给既有 TypeScript runtime,减少两侧重复规则,但新资格检查会接受空身份,历史数字签名也出现拒绝差异。真实对照确认普通继续与恢复路径可达,同时复现六个空容器身份被错误接纳和两个历史 scalar 路由回归,当前不能认为行为保持。本次评审限于 C4.1 源码迁移,不把它当作 C1 切换、已安装采用、真实模型运行或长程净收益验收。修复下述两类兼容与资格回归后,原 C4.1 owner 继续复验此切片;C1、C4.2 和 C4.3 仍由原有工作承接。
改动思路 / Approach
receipt 资格、有序 continuation 和 journal recovery 在同一个 typed Turn 域组合,Python 保留公开值对象和必要传输,方向符合既有 owner;journal 解释与下一步决策仍保持不同职责。当前 PR 边界是实际 driver 与 managed-step 的单会话迁移及替换删除;不要求额外会话框架,但必须修复资格和历史 scalar 传输,才满足本切片的行为保持承诺。Doing nothing preserves duplicate policy; another Python helper retains a second decision owner. Existing typed owner is the smaller accepted migration, with lossless adapter fixes. 实际合法路径仍保留原 Turn 和一次 settlement;不需要把独立 journal recovery 强行并成同一状态。
具体改动 / Changes
22 个文件包含实际 controller/managed/driver 删除与 TS evaluator、新 host-failure 共用模块、注册契约/生成绑定和语义 witness,配套测试及双语 C4.1 ledger。Python 公开类、原 journal recovery 与 native 失败 producer 保留;没有新增数据库、scheduler、配置页或新的用户审批。43→45 对维护模块的预算调整有同 inventory 依据,两个新增配对分别保留真实 Python API 和失败 producer;这不是代码行数或配对数带来的效率收益。
关键代码讲解
- qualifyExecution:从完整 execution 资格化控制器回执。Python 资格检查移到 TS;raw JSON truthiness 未保持 Python 空容器规则。先判身份再输出 validated receipt;本 head 对 []/{} 违反此不变量。
- typedTurnRoute:统一已有 driver 路由分类。driver 改经 JSON bridge;1.0 / 1e-7 的 Python scalar 文本丢失。坏签名必须拒绝,但已支持的历史转换不可无声收窄。
- decideManagedStep:一次组合 journal 解释和有序 continuation。删除 Python 重建 execution;既有 journal 检查仍先执行。原 Turn、causal predecessor、retry ceiling、早返回和单次结算。
规范依据:docs/architecture/rfcs/ledger/controller-executor-unified-contract-v0/2026-10-27-refactor-handoff.md,修改前不可变 revision f63647e2e867a30dd8761baaa1df69cba9c9860b。本 PR 修改 ledger,不用新写的“通过”说明证明自己。
- Target and deletion — implemented:Actual managed-step CLI, source caller trace, 656 Python and 86 TS tests
- Decisive acceptance — not_met:Empty list/dict lineage reaches a validated receipt despite baseline refusal; required selected-work identity is empty. Restore Python-compatible qualification for all three lineage fields and add real-bridge negative cases.
- Dependency / rollback — not_met:The public planner changes two already-supported Python numeric scalar/signature inputs from ready_for_host to contract_error. Retain original scalar text at the Python/JSON transport boundary and exercise the full public plan on base/head.
对主干的风险 / Risks
[P2] 在输出 validated receipt 前按原规则校验空容器身份
loopx/control_plane/turn_driver/loop_controller.ts:138
qualifyExecution 对 raw JSON 身份使用 JavaScript truthiness,[] 和 {} 会通过此 requireThat;随后 lineage()/pythonFieldText 又把它们归为 ""。用 otherwise valid material execution,逐个把 receipt.lineage.goal_id、agent_id、todo_id 设为 [] 或 {},经真正 ValidatedTurnReceipt.from_execution 与 Effect bridge,base 均抛缺少 lineage 的 ValueError,head 六项均返回 loop_validated_turn_receipt_v0 且对应身份为空。请在 qualification 阶段保持原 Python 空值语义,覆盖三个字段及 None/False/0/空字符串/正常值。此处证明的是资格检查变弱,未声称后续实际调度或扣额已被绕过。
[P2] route 迁移时保留已支持的 Python scalar 文本
loopx/control_plane/turn_driver/loop_controller.ts:33
driver._typed_route 现在把原始 envelope 经 JSON 送入此函数,移除了原历史 scalar 编码。公开 build_loopx_turn_plan 在 source_hash=1.0、envelope_hash="1.0"(或 1e-7 与 "1e-07")、matches=true 及其他合法事实下,base 是 ready_for_host,head 变 contract_error。JSON/JS 数字表示无法保留原 Python 的 1.0 / 1e-07 文本。请在原 Python transport 边界保留这些已支持的转换事实,再交同一个 typed route owner;不要靠放松签名检查修补。本 finding 限定既有历史 Mapping API,不声称 canonical producer 会生成数字 hash。
PASS:656 项 Python、86 项 TS、typecheck 和标准 premerge;161 个完整决策/异常 cells 相等。29 个公共 plan 对照中 27 个逐值相等,两个历史 scalar 输入回归;21 个 receipt 输入中六个空容器负例回归。真实 File/SQLite CLI 保留原 journal、等待与错误 attempt 拒绝;run-once/保存结果/丢扣额响应由真实原生执行夹具和独立 validator 覆盖。完整 CLI 输出因隔离路径、provider incarnation、派生签名与观察时钟不同,没有宣称未经核验的全响应 parity。
作者还披露每完整 native scenario 新增四次 Effect RPC 和约 59KiB bridge 传输,配对维护数量从43到45;本次未独立资格化完整延迟/资源成本,没有据删除行数宣称提速。 未查询、轮询或等待 CI。
语义与 CI 对齐
复用既有 result/route/disposition 词表和注册有序契约,生成绑定、双语差分、语义 witness 与大小检查通过;仍须修复上述两个当前义务。请将 receipt 空容器及历史 numeric scalar 的独立反例加入公开 API/真实 bridge 回归,复跑 controller、managed-step 和 journal/native 恢复套件。机器资格、指导与操作权限保持分开;失败不能因称为 refactor 而忽略。
我的整体评价 / Verdict
REQUEST_CHANGES;架构收敛具有 justified increment 的价值,但 long_horizon 和历史调用体验存在已复现 regression,不能用绿测试代替原输入/身份契约。当前 PR 边界是实际 driver 与 managed-step 的单会话迁移及替换删除;不要求额外会话框架,但必须修复资格和历史 scalar 传输,才满足本切片的行为保持承诺。 删除重复 Python evaluator 和 reconstruction 是有效的有界简化;修复应留在既有资格/transport owner,不再复制一套策略,也不应为通过而放松签名。
检查了 Turn CLI、公开 Python API 和生成契约;本 PR 没有改变渲染页面,视觉检查不适用。正式安装、实际模型采用与完整成本收益未验证。 六个 receipt 回归不等于已经绕过实际执行/扣额;两个数字 hash 反例限定历史 Mapping API,不声称正常 canonical producer 产生这种 hash。本结论不授予 merge、安装或其它受保护行为权限。
English verdict: REQUEST_CHANGES a98ea5e; six empty-lineage acceptances and two historical numeric-route regressions remain despite passing positive suites.
|
This pull request has merge conflicts with Choose the remote for the base repository, not an out-of-date fork. git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEADFor a same-repository clone whose Keep the DCO |
a98ea5e to
b813680
Compare
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent — gpt-6.1-sol / OpenAI; runtime_reported; effort=max
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
动机 / Motivation
需要在失败后恢复原任务的 Turn 调用方,以及消费 Python 回执 API 的现有代码,原先要在 Python 重建回执、判断继续规则,再与 TypeScript 的 journal 恢复结果组合。重复规则让一次行为修改分散到两侧。本 PR 删除这部分重复,把完整事实交给同一 typed Turn owner,方向和独立交付边界合理。
旧评审的空容器身份和数字签名问题在当前 head 已修复;普通继续、拒绝、重试与重放也得到验证。不过,完整工作上下文较大时,新传输路径会拒绝旧版可以处理的合法输入,阻止继续执行。这里审的是 C4.1 单会话源码迁移;C1 切换、C4.2 外层 worker、C4.3 结算适配器、正式安装和长程净收益仍由既有工作承接。
改动思路 / Approach
保留 journal 恢复与下一步决定的不同职责,再由既有 Effect runtime 组合,符合已接受的职责划分。Python 公开回执与预算值对象仍是实际调用入口,整数与历史 scalar 文本只做无损编码;scheduler、Host dispatch 和 durable settlement 继续由原 owner 执行。没有必要增加新的会话框架或持久化状态。
完整事实迁移仍须复用现有的大输入传输能力。当前 _controller_result 将完整 envelope 再发往 turn.controller,却没有沿用旧 envelope transport 的有界本地 snapshot 回退。做更少 RPC 不能以缩小合法输入范围为代价;最小修复应在共享 transport/注册方法边界完成,保留已有大小硬限制及完整原文。整个 PR 的 owner 收敛可以保留,当前需要补齐的是这条传输兼容路径。
下表来自当前源码与同输入实测;不是性能收益证明:
| 输入 | 不可变 base | 当前 head |
|---|---|---|
| 161 个普通决策/拒绝 cells | 完整输出及错误 | 逐值相同 |
| 小工作上下文,Mapping / producer-qualified 输入 | run_now |
run_now |
| 完整大工作上下文,同两种输入 | run_now |
request_too_large |
具体改动 / Changes
评审 head 为 b8136808c3432e29e994b826c1b36a70b39cc725,实际 merge base 为 6f8f476388645fcea2269329d32974b559d490e6。完整 20 路径、+936/-1106 均已审阅:生产 controller/managed-step 替换、共用 host failure 校验、Effect 方法注册、生成契约及语义 witness、独立测试和双语 ledger。没有只追旧 finding 或以作者验证代替本次执行。
关键代码讲解
_controller_result是公开 Python API 的真实传输边界;第 43 行直接发送完整事实,下面的大小回归就在此发生。qualifyExecution先验证原回执、lineage 和 material settlement,再产生控制器视图。当前空值检查保持 Python 的空容器拒绝,历史签名文本也由现有 codec 保留;新 head 的 25 项相关公开 API 用例通过。decideLoopDisposition按原注册顺序惰性执行条件,早返回不强制读取后来才需要的预算或 retry policy;真实 TS mutation 与完整决策对照都覆盖这个性质。decideManagedStep直接核对持久 journal、attempt、原 transaction/receipt、请求身份和独立恢复结果;不再制造 execution 形状的替代回执,也不自行启动 Host 或扣额。
规范依据为 docs/architecture/rfcs/ledger/controller-executor-unified-contract-v0/2026-10-27-refactor-handoff.md,不可变 revision 6f8f476388645fcea2269329d32974b559d490e6 的 C4.1:
- Target and deletion — implemented:真实 controller/managed-step 调用已替换,Python reconstruction 与 ordered evaluator 删除;journal 恢复仍独立。
- Decisive acceptance — not_met:普通 causal/selected-work/budget/retry/replay 通过,但完整合法上下文在新公共入口被额外传输限制拒绝,行为保持尚未成立。
- Dependency / rollback — deferred:原回执、版本和结算格式保留;完整 C1 与外层 worker/结算采用仍归既有后继,不作为本切片的额外批准门。
大上下文预期同时依据同 revision 的 TurnEnvelope 合同:有效 envelope 的大小警告不应自行阻断正常继续;本地 snapshot transport 仍有原来的有界校验,不要求提高 wire 上限。
对主干的风险 / Risks
[P2] 为 controller 保留完整大输入的现有 snapshot 传输
从现有 _full_decision() 夹具生成真实 build_turn_controller_input,在 work_context.sources 放入 2,420,000 字符的完整 Goal 原文。得到的 envelope 为 2,535,762 UTF-8 bytes,签名匹配,build_loopx_turn_plan 仍是 ready_for_host。同一输入分别以 Mapping 和 producer-qualified 对象交给 decide_loop_disposition:不可变 base 两条都返回 run_now;本 head 两条都抛 EffectRuntimeRejected(request_too_large)。小输入两条在两版都通过。
原因是旧 _turn_envelope_result 在预发送大小拒绝时复用既有 bounded local snapshot,producer-qualified 入口还能复用已算出的 route;新调用直接走 effect_runtime_result("turn.controller", ...),没有对应回退,方法也不在现有 snapshot allowlist。于是仍受支持的完整工作上下文无法进入新的决策 owner。它尚未启动 Host、修改任务或扣额;本 finding 不声称已经发生重复副作用。
最小修复:让这个纯 controller 操作复用现有受支持的大输入传输,保留完整事实、原 wire/snapshot 限制及错误恢复语义,不裁剪要求或单纯提高上限。加入上述两种输入和小输入控制、签名拒绝及超出真正 snapshot 上限的负例,再复跑 controller/managed-step/native 恢复套件。独立新增的四项真实入口对照为 base 4 PASS;head 2 PASS / 2 FAIL,失败都落在预发送大小检查;不是 import、fixture 或 Node 启动失败。
其它本次验证:696 Python PASS、149 TypeScript PASS,零跳过;包括 File/SQLite 真 CLI、确定性 native subprocess、独立产物 validator、原 Turn 重试、错误 observed-attempt 拒绝、保存结果重放和丢 spend 响应后一次 debit。161 个完整输出/错误 cells 的相等来自不可变 Python controller overlay 对照;上述四项大输入验证另在真正完整 base checkout 重跑,未把 overlay 说成整版 CLI 资格。Typecheck、改动 Python Ruff、标准 premerge 均通过,仍不能覆盖掉这个新增反例。两个早期私有诊断脚本的转义断言/API 调用错误已修正,原失败保留,没有改产品或 oracle 来消除回归。远端 CI 未查询、轮询或等待。
语义与 CI 对齐
复用原 route/result/disposition 词表与有序契约;真实语义 witness、生成绑定、双语检查和预算负例仍成立。43→45 的 Python/TS pair 预算明确记录维护成本,删除的 Python 决策才是收敛证据。新增大小拒绝是 unintended drift,应恢复当前合同与真实公共入口的兼容,而不是把“refactor”或绿检查当作豁免。
我的整体评价 / Verdict
REQUEST_CHANGES。原两个阻塞已修复,整体共享 owner 和有界删除也合理,但 long_horizon 与调用体验存在新的完整上下文拒绝:原本可以继续的合法工作现在需要额外修复传输才能进入决定。先完成上述窄修复,再对新 head 复评;无需重开 C1 之外的架构项目。
视觉检查不适用:检查的是 Python/CLI、typed controller 和协议,没有渲染页面变化。正式安装、真实模型采用及完整成本净益未验证;既有小样本 RPC/时延记录没有在本次重新资格化为提速。当前既不授予 merge,也不执行安装、付费模型或 benchmark 工作。
English verdict: REQUEST_CHANGES at b813680; the repaired ordinary paths pass, but valid large work contexts regress at the new controller transport boundary.
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>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
b813680 to
cae8e95
Compare
…ntroller-large-context-20261028 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>
…e-context-20261028 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> # Conflicts: # loopx/control_plane/turn_driver/loop_controller.py
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
|
This pull request has merge conflicts with Choose the remote for the base repository, not an out-of-date fork. git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEADFor a same-repository clone whose Keep the DCO |
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)
APPROVE — 精确 head bf10d7ed55c5dc2f270c57a15769909d04efa5d8 的完整 C4.1 提案未发现阻塞问题。原三类 finding 均有当前 owner 与真实入口证据;这里批准源码迁移,不把旧头结果、作者安装记录或行数删除当作完整净收益。
Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max; declaration_source=runtime_reported.
动机
需要从失败或已保存结果继续原事务的 Turn 调用方,以及使用现有 Python 回执与继续 API 的消费者。
原 managed-step 在 Python 重建 journal 回执并执行一套继续规则,再组合 TS recovery 判断;这让同一行为修改分散到两侧。本 head 把完整事实交给既有 typed Turn owner,删除被替代的 Python 决策与重建。
实际 run-once/managed-step 经 File/SQLite 保留原 Turn、真实回执、错误 attempt 拒绝、saved-result 不再派发和丢 spend 响应后的一次结算;大 Goal 完整原文也能进入同一决策 owner。
本 PR 只交付 C4.1 源码迁移,不交付完整 C1/C2、C4.2/C4.3、正式 App/solver 采用、活跃安装或长程净收益。
两侧维护模块从 43 对到 45 对,公共 Python 判断也会跨既有 Effect RPC;完整 IO、延迟、模型采用与净成本尚未资格化,不能据删除行数宣称提速。
用户的任务是继续原工作并保住原结果,不是重新配置 controller。当前公开入口没有增加导航、重新输入或确认步骤;新运行时故障仍会明确暴露。这个增量的价值是把下一次策略修改集中在同一个实际 owner,同时保持回滚与已保存事务可读;它并不自动让每轮执行更便宜。
改动思路
receipt 资格与有序 continuation 在同一 typed Turn 域组合;journal recovery 仍保留独立职责。Python 只保留公开 value API、精确 scalar 编码与既有 transport,Host、scheduler 和 durable settlement 仍由原 owner 执行。
本 PR 边界是实际 driver/managed-step 的单会话迁移及对应 Python 删除;C1 全面采用和外层 worker/结算适配继续由既有后继承担。
最强的不发理由是没有新用户能力、却增加已有 Python 判断的 RPC 依赖和两对维护模块。原 accepted C4.1 要求的是实际消费者收敛并删除重复策略;另抽一个 Python helper 仍保留第二 owner,按字段新增一组 RPC/framework 也更贵。当前一次完整请求复用既有 route、journal、identity decoder 和 transport,边界合理。这里的“pure”限定无 Host/Goal/settlement 业务效果,不表示没有进程或文件 IO。
| 触发 | 旧调用 | 当前边界与结果 |
|---|---|---|
| journal 后决定继续 | Python 重建回执并判断,再组合 TS recovery | 同一 typed Turn 域组合完整事实;recovery 与下一步仍是不同职责 |
| 合法大 Goal | 既有 envelope transport 可读 | controller 仅在发送前超 wire 时复用同一 bounded snapshot |
| 已保存结果或丢 spend 响应 | 原事务读回 | 同一 Turn,不重复 Host 或扣额 |
表为源码导读,执行依据另列,未把它当作测试证据。
具体改动
完整 27 文件、+1203/-1120 已审阅。最初 a99e248f 的 934 项源码、147 项 TS 与 premerge 结果保留为历史。发布前作者合入主干 #7600/#7601,head 变为本 bf10d7ed55c5dc2f270c57a15769909d04efa5d8;相对新 base 的完整 author diff 与之前逐字相同,27 个修改文件的 head blob 也全部相同。新 base 的共享 context/recovery 可能影响真实调用,因此扩展重跑,没有沿用旧批准。
qualifyExecution从完整 execution 资格化真实 material receipts,保留精确请求身份、ordered validation/writeback/spend 和 completed scheduler 检查;不会以 phase 字符串或空身份代替事实。decideLoopDisposition执行原注册顺序,lazy 检查让合法 early return 不被后来才需要的 budget/retry 事实阻断;causal predecessor 与 actor/work 身份仍先证实。decideManagedStep组合完整 journal、observed attempt 和原 recovery,不再制造 execution-shaped receipt。真实失败的下一次尝试仍属于原 Turn。_controller_result保留公开 Python value API、历史 scalar 拼写和大整数事实;只对发送前request_too_large复用既有 bounded snapshot。客户端/服务端方法 allowlist 同步,2 MiB wire/64 MiB snapshot、私有路径/hash/长度和签名检查保留;ambiguous/其他错误不在这里重试。
规范依据:docs/architecture/rfcs/ledger/controller-executor-unified-contract-v0/2026-10-27-refactor-handoff.md,修改前不可变 revision 55c88e626f0b191d42387a9d4ebb81a30498af0d 的 C4.1 — Typed receipt-to-continuation boundary。该三项接受条款在旧89a与55c之间未改动,判断没有引用 PR 新写的“通过”说明来证明自己:
- Target and deletion — implemented:现有 typed Turn/effect 域接受一次完整事实,Python reconstruction、admission partitions 与 ordered policy 删除;没有 workflow DSL 或每字段 runtime operation。
- Decisive acceptance — implemented:独立 causal/work/budget/retry/early-return 预期与真实 File/SQLite run-once/managed-step 保持原回执、saved-result 不派发与一次结算。
- Dependency / rollback — implemented:吸收稳定的恢复/原始请求身份合同,真实消费者一起替换;历史 scalar、公开 API 和原 effect readback 保留。完整 C1/C2/C4.2/C4.3 的收益和采用仍由既有后继承担,不提升为当前额外义务。
对主干的风险
已读全部五份历史 review、六条 inline comment 和两个 PR comment,并逐项对照当前实现与验证:
a98ea5e5的空[]/{}lineage:当前 qualification 先用原 Python-value codec 拒绝空身份,再产生 validated receipt;三个字段的空值及正常 Unicode 通过实际 bridge 验证,没有靠后续拒绝掩盖资格变弱。- 同头历史
1.0/1e-07路由:Python 只传既有 scalar 文本,原turnEnvelopeRoute决定路由;合法数值历史输入与错误签名分别覆盖,没有放松签名。此兼容限定历史 Mapping API,不声称 canonical producer 生成数字 hash。 b8136808的完整大上下文:当前真实 Mapping/producer 输入保留 2,420,000 字符 Goal;escaped Unicode、错误签名、超过实际 snapshot 上限的发送前拒绝和 ambiguous 不重试也执行。没有裁剪事实或提高硬限。
新 head 1067 Python 通过、0 跳过,179 TypeScript 通过,strict typecheck 和标准 premerge 6 direct/19 selected 全过、0 hold。 当前 source 矩阵包含16模块:controller/managed/driver、projection/runtime/journal、生成/digest、context-delivery、progressive native view、独立 capture recovery 和 decision capture。TS 当前包含8个共享 owner 模块。真实确定性 native Host 配合独立产物 validator,覆盖 wrong attempt/max、原 Turn retry、saved-result replay 和丢 spend 响应后一笔 debit;断言不是只检查一个 controller 返回值。
TS 的 live rule-order/terminal/unregistered/disconnected mutation 检查验证 oracle 能发现真实 owner 错误,普通绿测试没有替代这个反向依据。两处维护 pair 增长保留理由:真实 Python value API/失败 producer 与 typed decision 不同;同时删除 journal 内重复 TS failure normalization。snapshot 是既有 transport 的窄复用,不是 Python fallback evaluator。所有11commit有 DCO。
旧 cae8 的 25,500 预算失败、旧 CQR FAIL 和旧 Ubuntu 研究焦点/delegation-search 失败仍归其版本;目标主干已有独立预算校准,本 PR 没有提高生产硬限。当前新组合 premerge 全绿不改写旧失败,也没有对精确 Ubuntu 自然根因作新推断。research-results.mjs 的小改动只等待已有焦点交接再对刷新按钮 Enter,保留错误 Goal 拒绝、清空旧正文和调用次数,无 timeout 增长/重试/skip;作者 packaged 场景记录没有冒充本次独立浏览器结果。未查询、轮询或等待 CI。
我的整体评价
APPROVE。receipt 资格与有序 continuation 在同一 typed Turn 域组合;journal recovery 仍保留独立职责。Python 只保留公开 value API、精确 scalar 编码与既有 transport,Host、scheduler 和 durable settlement 仍由原 owner 执行。 本 PR 边界是实际 driver/managed-step 的单会话迁移及对应 Python 删除;C1 全面采用和外层 worker/结算适配继续由既有后继承担。 本提案把真实消费者、完整输入兼容、独立恢复和旧策略删除作为同一可回滚切片,符合 accepted C4.1。没有证据要求新增框架、状态或更多强制用户工作;净性能/完整成本仍不能从局部 RPC 或代码量推导。
视觉检查不适用:检查了 Turn CLI/Python/TS 与 research-results 测试脚本;产品渲染页面没有变化,脚本改的是已有刷新键盘目标和焦点时序。 本次独立验证限定源码及隔离真实 File/SQLite/确定性 Host;未独立复跑作者 wheel、远端 Ubuntu CI、真实模型或 PostgreSQL 全面资格,未执行活跃安装。 没有 authority-store transaction 变更,因此没有把未跑的 PostgreSQL suite 说成 provider 资格。完整成本与正式采用由原有接受工作继续验证。这个公开 COMMENTED 是 author-owned approval conclusion;raw GitHub reviewDecision、closeout、readiness 和 maintainer merge 权限仍分别核对。
English verdict: APPROVE bf10d7ed55c5dc2f270c57a15769909d04efa5d8 for the bounded C4.1 source migration. Prior lineage, scalar-route and complete-input regressions are resolved with actual caller coverage; original-Turn recovery and one settlement remain. Active installation, model adoption and complete-cost gains remain unqualified.
Two turn_route fixtures in tests/architecture/test_semantic_production.py still named sites that no longer exist. The parametrized return-producer case named 'return LoopXTurnRoute.CONTRACT_ERROR' in driver.py. The driver now assigns the route to a local and returns a call, so the Python producer has no literal left to mutate and the test failed on its own precondition. The route vocabulary's owner is the TypeScript producer, so the case now mutates turn_envelope.ts::turnEnvelopeRoute, whose resolved returns are the route values themselves. The mutation still replaces one returned value with an unregistered one and still expects the scan to reject it, so the invariant the test proves is unchanged; only the fixture that had gone stale moves. The one-hop re-export case named loop_controller.py::_envelope_route. PR loopx-project#7523 moved that decision into loop_controller.ts and dropped the site from the turn_route producers, so the assertion collected nothing. driver.py still re-exports LoopXTurnRoute from the generated owner and _typed_route is still a registered return producer, so the case now resolves through that hop. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_production.py 42 passed on origin/main 0a9a3a3. The remaining failures in tests/architecture are pre-existing on that base: the lark import boundary (PR loopx-project#7631) and two package/vocabulary ratchets this change does not touch. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
tests/architecture/test_semantic_vocabulary_drift.py::test_explicit_output_evidence_cannot_be_removed_or_redirected listed the vocabularies whose explicit output evidence must not be removed or redirected. PR loopx-project#7523 retired the Python output builder behind loop_disposition and dropped that vocabulary's call_producers entry from both the registry and the drift smoke's anchor, but the case here kept naming loop_disposition. With the anchor and the registry both empty for that vocabulary, the mutation the case performs was a no-op, so the coverage floor raised no drift and the case failed on its own precondition: ``` Failed: DID NOT RAISE Drift ``` The case now reads the anchored vocabularies from the registry instead of writing them out, and proves the invariant for every vocabulary that currently carries that metadata. Two things follow. The retired vocabulary can no longer leave the case vacuous, and effective_action - which carries return_paths and was not in the written-out list - is now covered as well. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_vocabulary_drift.py 124 passed on origin/main 0a9a3a3; ruff clean. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
The C4.3 settlement obligation comparison listed a candidate slice: vocabulary unification. It was conditional on a question that had not been answered: do guard, lifecycle_completion and validation describe one obligation? Guessing it would have produced either a wrong merge or a wrong refusal to merge. The answer is no, so the candidate is withdrawn. - validation is not an executable effect in either runtime. TurnProviderStepKind excludes it, require_turn_provider_step_kind raises "validation is not a provider effect step", the reducer throws "unsupported base settlement step validation" if asked to run it, and the registry's own value note records that it is the one step the dispatcher never executes and carries no command template. - guard and lifecycle_completion are executed steps: the adapter runs them through run_cli with a continue_when that decides whether the rest of the plan runs. - The two value sets differ exactly where the question is asked. guard and lifecycle_completion occur only in A, validation only in B, and the repository advisory does not list them as a merge candidate. - lifecycle_completion has no counterpart in B. - One shipped caller already uses both vocabularies for one admission decision: governed_capability_execution.py classifies the admission snapshot with A's classify_host_guard_snapshot and then hands B a completed_phases that already contains validation. guard and validation name one obligation seen from two positions, so renaming them would hide that asymmetry and break B's "a phase is never executed" invariant. The entry also records what the confirmation leaves open: the vocabulary that does exist has no typed owner, its literal is written twice (an unexported STEP_KINDS and a private _STEP_KINDS), and the repository's inventory sees neither carrier, so the registry's drift smoke cannot cover it. That is a separate slice and must first reconcile loopx-project#3412, loopx-project#5677, loopx-project#7580 and loopx-project#7523. The derived RFC status index is regenerated, because it counts ledger entries per RFC and the new entry makes the checked-in index stale. No code, schema, wire, registry or default change. Validation: mkdocs build --strict for the docs site and both developer books; RFC bilingual check passed; docs-governance smoke passed; loopx canary premerge --from-git-diff green. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
Two turn_route fixtures in tests/architecture/test_semantic_production.py still named sites that no longer exist. The parametrized return-producer case named 'return LoopXTurnRoute.CONTRACT_ERROR' in driver.py. The driver now assigns the route to a local and returns a call, so the Python producer has no literal left to mutate and the test failed on its own precondition. The route vocabulary's owner is the TypeScript producer, so the case now mutates turn_envelope.ts::turnEnvelopeRoute, whose resolved returns are the route values themselves. The mutation still replaces one returned value with an unregistered one and still expects the scan to reject it, so the invariant the test proves is unchanged; only the fixture that had gone stale moves. The one-hop re-export case named loop_controller.py::_envelope_route. PR loopx-project#7523 moved that decision into loop_controller.ts and dropped the site from the turn_route producers, so the assertion collected nothing. driver.py still re-exports LoopXTurnRoute from the generated owner and _typed_route is still a registered return producer, so the case now resolves through that hop. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_production.py 42 passed on origin/main 0a9a3a3. The remaining failures in tests/architecture are pre-existing on that base: the lark import boundary (PR loopx-project#7631) and two package/vocabulary ratchets this change does not touch. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
tests/architecture/test_semantic_vocabulary_drift.py::test_explicit_output_evidence_cannot_be_removed_or_redirected listed the vocabularies whose explicit output evidence must not be removed or redirected. PR loopx-project#7523 retired the Python output builder behind loop_disposition and dropped that vocabulary's call_producers entry from both the registry and the drift smoke's anchor, but the case here kept naming loop_disposition. With the anchor and the registry both empty for that vocabulary, the mutation the case performs was a no-op, so the coverage floor raised no drift and the case failed on its own precondition: ``` Failed: DID NOT RAISE Drift ``` The case now reads the anchored vocabularies from the registry instead of writing them out, and proves the invariant for every vocabulary that currently carries that metadata. Two things follow. The retired vocabulary can no longer leave the case vacuous, and effective_action - which carries return_paths and was not in the written-out list - is now covered as well. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_vocabulary_drift.py 124 passed on origin/main 0a9a3a3; ruff clean. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
The C4.3 settlement obligation comparison listed a candidate slice: vocabulary unification. It was conditional on a question that had not been answered: do guard, lifecycle_completion and validation describe one obligation? Guessing it would have produced either a wrong merge or a wrong refusal to merge. The answer is no, so the candidate is withdrawn. - validation is not an executable effect in either runtime. TurnProviderStepKind excludes it, require_turn_provider_step_kind raises "validation is not a provider effect step", the reducer throws "unsupported base settlement step validation" if asked to run it, and the registry's own value note records that it is the one step the dispatcher never executes and carries no command template. - guard and lifecycle_completion are executed steps: the adapter runs them through run_cli with a continue_when that decides whether the rest of the plan runs. - The two value sets differ exactly where the question is asked. guard and lifecycle_completion occur only in A, validation only in B, and the repository advisory does not list them as a merge candidate. - lifecycle_completion has no counterpart in B. - One shipped caller already uses both vocabularies for one admission decision: governed_capability_execution.py classifies the admission snapshot with A's classify_host_guard_snapshot and then hands B a completed_phases that already contains validation. guard and validation name one obligation seen from two positions, so renaming them would hide that asymmetry and break B's "a phase is never executed" invariant. The entry also records what the confirmation leaves open: the vocabulary that does exist has no typed owner, its literal is written twice (an unexported STEP_KINDS and a private _STEP_KINDS), and the repository's inventory sees neither carrier, so the registry's drift smoke cannot cover it. That is a separate slice and must first reconcile loopx-project#3412, loopx-project#5677, loopx-project#7580 and loopx-project#7523. The derived RFC status index is regenerated, because it counts ledger entries per RFC and the new entry makes the checked-in index stale. No code, schema, wire, registry or default change. Validation: mkdocs build --strict for the docs site and both developer books; RFC bilingual check passed; docs-governance smoke passed; loopx canary premerge --from-git-diff green. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
Two turn_route fixtures in tests/architecture/test_semantic_production.py still named sites that no longer exist. The parametrized return-producer case named 'return LoopXTurnRoute.CONTRACT_ERROR' in driver.py. The driver now assigns the route to a local and returns a call, so the Python producer has no literal left to mutate and the test failed on its own precondition. The route vocabulary's owner is the TypeScript producer, so the case now mutates turn_envelope.ts::turnEnvelopeRoute, whose resolved returns are the route values themselves. The mutation still replaces one returned value with an unregistered one and still expects the scan to reject it, so the invariant the test proves is unchanged; only the fixture that had gone stale moves. The one-hop re-export case named loop_controller.py::_envelope_route. PR loopx-project#7523 moved that decision into loop_controller.ts and dropped the site from the turn_route producers, so the assertion collected nothing. driver.py still re-exports LoopXTurnRoute from the generated owner and _typed_route is still a registered return producer, so the case now resolves through that hop. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_production.py 42 passed on origin/main 0a9a3a3. The remaining failures in tests/architecture are pre-existing on that base: the lark import boundary (PR loopx-project#7631) and two package/vocabulary ratchets this change does not touch. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
tests/architecture/test_semantic_vocabulary_drift.py::test_explicit_output_evidence_cannot_be_removed_or_redirected listed the vocabularies whose explicit output evidence must not be removed or redirected. PR loopx-project#7523 retired the Python output builder behind loop_disposition and dropped that vocabulary's call_producers entry from both the registry and the drift smoke's anchor, but the case here kept naming loop_disposition. With the anchor and the registry both empty for that vocabulary, the mutation the case performs was a no-op, so the coverage floor raised no drift and the case failed on its own precondition: ``` Failed: DID NOT RAISE Drift ``` The case now reads the anchored vocabularies from the registry instead of writing them out, and proves the invariant for every vocabulary that currently carries that metadata. Two things follow. The retired vocabulary can no longer leave the case vacuous, and effective_action - which carries return_paths and was not in the written-out list - is now covered as well. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_vocabulary_drift.py 124 passed on origin/main 0a9a3a3; ruff clean. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
The C4.3 settlement obligation comparison listed a candidate slice: vocabulary unification. It was conditional on a question that had not been answered: do guard, lifecycle_completion and validation describe one obligation? Guessing it would have produced either a wrong merge or a wrong refusal to merge. The answer is no, so the candidate is withdrawn. - validation is not an executable effect in either runtime. TurnProviderStepKind excludes it, require_turn_provider_step_kind raises "validation is not a provider effect step", the reducer throws "unsupported base settlement step validation" if asked to run it, and the registry's own value note records that it is the one step the dispatcher never executes and carries no command template. - guard and lifecycle_completion are executed steps: the adapter runs them through run_cli with a continue_when that decides whether the rest of the plan runs. - The two value sets differ exactly where the question is asked. guard and lifecycle_completion occur only in A, validation only in B, and the repository advisory does not list them as a merge candidate. - lifecycle_completion has no counterpart in B. - One shipped caller already uses both vocabularies for one admission decision: governed_capability_execution.py classifies the admission snapshot with A's classify_host_guard_snapshot and then hands B a completed_phases that already contains validation. guard and validation name one obligation seen from two positions, so renaming them would hide that asymmetry and break B's "a phase is never executed" invariant. The entry also records what the confirmation leaves open: the vocabulary that does exist has no typed owner, its literal is written twice (an unexported STEP_KINDS and a private _STEP_KINDS), and the repository's inventory sees neither carrier, so the registry's drift smoke cannot cover it. That is a separate slice and must first reconcile loopx-project#3412, loopx-project#5677, loopx-project#7580 and loopx-project#7523. The derived RFC status index is regenerated, because it counts ledger entries per RFC and the new entry makes the checked-in index stale. No code, schema, wire, registry or default change. Validation: mkdocs build --strict for the docs site and both developer books; RFC bilingual check passed; docs-governance smoke passed; loopx canary premerge --from-git-diff green. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
The C4.3 settlement obligation comparison listed a candidate slice: vocabulary unification. It was conditional on a question that had not been answered: do guard, lifecycle_completion and validation describe one obligation? Guessing it would have produced either a wrong merge or a wrong refusal to merge. The answer is no, so the candidate is withdrawn. - validation is not an executable effect in either runtime. TurnProviderStepKind excludes it, require_turn_provider_step_kind raises "validation is not a provider effect step", the reducer throws "unsupported base settlement step validation" if asked to run it, and the registry's own value note records that it is the one step the dispatcher never executes and carries no command template. - guard and lifecycle_completion are executed steps: the adapter runs them through run_cli with a continue_when that decides whether the rest of the plan runs. - The two value sets differ exactly where the question is asked. guard and lifecycle_completion occur only in A, validation only in B, and the repository advisory does not list them as a merge candidate. - lifecycle_completion has no counterpart in B. - One shipped caller already uses both vocabularies for one admission decision: governed_capability_execution.py classifies the admission snapshot with A's classify_host_guard_snapshot and then hands B a completed_phases that already contains validation. guard and validation name one obligation seen from two positions, so renaming them would hide that asymmetry and break B's "a phase is never executed" invariant. The entry also records what the confirmation leaves open: the vocabulary that does exist has no typed owner, its literal is written twice (an unexported STEP_KINDS and a private _STEP_KINDS), and the repository's inventory sees neither carrier, so the registry's drift smoke cannot cover it. That is a separate slice and must first reconcile loopx-project#3412, loopx-project#5677, loopx-project#7580 and loopx-project#7523. The derived RFC status index is regenerated, because it counts ledger entries per RFC and the new entry makes the checked-in index stale. No code, schema, wire, registry or default change. Validation: mkdocs build --strict for the docs site and both developer books; RFC bilingual check passed; docs-governance smoke passed; loopx canary premerge --from-git-diff green. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
Two turn_route fixtures in tests/architecture/test_semantic_production.py still named sites that no longer exist. The parametrized return-producer case named 'return LoopXTurnRoute.CONTRACT_ERROR' in driver.py. The driver now assigns the route to a local and returns a call, so the Python producer has no literal left to mutate and the test failed on its own precondition. The route vocabulary's owner is the TypeScript producer, so the case now mutates turn_envelope.ts::turnEnvelopeRoute, whose resolved returns are the route values themselves. The mutation still replaces one returned value with an unregistered one and still expects the scan to reject it, so the invariant the test proves is unchanged; only the fixture that had gone stale moves. The one-hop re-export case named loop_controller.py::_envelope_route. PR loopx-project#7523 moved that decision into loop_controller.ts and dropped the site from the turn_route producers, so the assertion collected nothing. driver.py still re-exports LoopXTurnRoute from the generated owner and _typed_route is still a registered return producer, so the case now resolves through that hop. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_production.py 42 passed on origin/main 0a9a3a3. The remaining failures in tests/architecture are pre-existing on that base: the lark import boundary (PR loopx-project#7631) and two package/vocabulary ratchets this change does not touch. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
tests/architecture/test_semantic_vocabulary_drift.py::test_explicit_output_evidence_cannot_be_removed_or_redirected listed the vocabularies whose explicit output evidence must not be removed or redirected. PR loopx-project#7523 retired the Python output builder behind loop_disposition and dropped that vocabulary's call_producers entry from both the registry and the drift smoke's anchor, but the case here kept naming loop_disposition. With the anchor and the registry both empty for that vocabulary, the mutation the case performs was a no-op, so the coverage floor raised no drift and the case failed on its own precondition: ``` Failed: DID NOT RAISE Drift ``` The case now reads the anchored vocabularies from the registry instead of writing them out, and proves the invariant for every vocabulary that currently carries that metadata. Two things follow. The retired vocabulary can no longer leave the case vacuous, and effective_action - which carries return_paths and was not in the written-out list - is now covered as well. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_vocabulary_drift.py 124 passed on origin/main 0a9a3a3; ruff clean. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
tests/architecture/test_semantic_vocabulary_drift.py::test_explicit_output_evidence_cannot_be_removed_or_redirected listed the vocabularies whose explicit output evidence must not be removed or redirected. PR loopx-project#7523 retired the Python output builder behind loop_disposition and dropped that vocabulary's call_producers entry from both the registry and the drift smoke's anchor, but the case here kept naming loop_disposition. With the anchor and the registry both empty for that vocabulary, the mutation the case performs was a no-op, so the coverage floor raised no drift and the case failed on its own precondition: ``` Failed: DID NOT RAISE Drift ``` The case now reads the anchored vocabularies from the registry instead of writing them out, and proves the invariant for every vocabulary that currently carries that metadata. Two things follow. The retired vocabulary can no longer leave the case vacuous, and effective_action - which carries return_paths and was not in the written-out list - is now covered as well. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_vocabulary_drift.py 124 passed on origin/main 0a9a3a3; ruff clean. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
The C4.3 settlement obligation comparison listed a candidate slice: vocabulary unification. It was conditional on a question that had not been answered: do guard, lifecycle_completion and validation describe one obligation? Guessing it would have produced either a wrong merge or a wrong refusal to merge. The answer is no, so the candidate is withdrawn. - validation is not an executable effect in either runtime. TurnProviderStepKind excludes it, require_turn_provider_step_kind raises "validation is not a provider effect step", the reducer throws "unsupported base settlement step validation" if asked to run it, and the registry's own value note records that it is the one step the dispatcher never executes and carries no command template. - guard and lifecycle_completion are executed steps: the adapter runs them through run_cli with a continue_when that decides whether the rest of the plan runs. - The two value sets differ exactly where the question is asked. guard and lifecycle_completion occur only in A, validation only in B, and the repository advisory does not list them as a merge candidate. - lifecycle_completion has no counterpart in B. - One shipped caller already uses both vocabularies for one admission decision: governed_capability_execution.py classifies the admission snapshot with A's classify_host_guard_snapshot and then hands B a completed_phases that already contains validation. guard and validation name one obligation seen from two positions, so renaming them would hide that asymmetry and break B's "a phase is never executed" invariant. The entry also records what the confirmation leaves open: the vocabulary that does exist has no typed owner, its literal is written twice (an unexported STEP_KINDS and a private _STEP_KINDS), and the repository's inventory sees neither carrier, so the registry's drift smoke cannot cover it. That is a separate slice and must first reconcile loopx-project#3412, loopx-project#5677, loopx-project#7580 and loopx-project#7523. The derived RFC status index is regenerated, because it counts ledger entries per RFC and the new entry makes the checked-in index stale. No code, schema, wire, registry or default change. Validation: mkdocs build --strict for the docs site and both developer books; RFC bilingual check passed; docs-governance smoke passed; loopx canary premerge --from-git-diff green. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
tests/architecture/test_semantic_vocabulary_drift.py::test_explicit_output_evidence_cannot_be_removed_or_redirected listed the vocabularies whose explicit output evidence must not be removed or redirected. PR loopx-project#7523 retired the Python output builder behind loop_disposition and dropped that vocabulary's call_producers entry from both the registry and the drift smoke's anchor, but the case here kept naming loop_disposition. With the anchor and the registry both empty for that vocabulary, the mutation the case performs was a no-op, so the coverage floor raised no drift and the case failed on its own precondition: ``` Failed: DID NOT RAISE Drift ``` The case now reads the anchored vocabularies from the registry instead of writing them out, and proves the invariant for every vocabulary that currently carries that metadata. Two things follow. The retired vocabulary can no longer leave the case vacuous, and effective_action - which carries return_paths and was not in the written-out list - is now covered as well. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_vocabulary_drift.py 124 passed on origin/main 0a9a3a3; ruff clean. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
…7640) tests/architecture/test_semantic_vocabulary_drift.py::test_explicit_output_evidence_cannot_be_removed_or_redirected listed the vocabularies whose explicit output evidence must not be removed or redirected. PR #7523 retired the Python output builder behind loop_disposition and dropped that vocabulary's call_producers entry from both the registry and the drift smoke's anchor, but the case here kept naming loop_disposition. With the anchor and the registry both empty for that vocabulary, the mutation the case performs was a no-op, so the coverage floor raised no drift and the case failed on its own precondition: ``` Failed: DID NOT RAISE Drift ``` The case now reads the anchored vocabularies from the registry instead of writing them out, and proves the invariant for every vocabulary that currently carries that metadata. Two things follow. The retired vocabulary can no longer leave the case vacuous, and effective_action - which carries return_paths and was not in the written-out list - is now covered as well. No production code, schema, wire or default change. Validation: tests/architecture/test_semantic_vocabulary_drift.py 124 passed on origin/main 0a9a3a3; ruff clean. Signed-off-by: xiaoan17 <anbc1224@gmail.com> Co-authored-by: xiaoan17 <anbc1224@gmail.com>
The C4.3 settlement obligation comparison listed a candidate slice: vocabulary unification. It was conditional on a question that had not been answered: do guard, lifecycle_completion and validation describe one obligation? Guessing it would have produced either a wrong merge or a wrong refusal to merge. The answer is no, so the candidate is withdrawn. - validation is not an executable effect in either runtime. TurnProviderStepKind excludes it, require_turn_provider_step_kind raises "validation is not a provider effect step", the reducer throws "unsupported base settlement step validation" if asked to run it, and the registry's own value note records that it is the one step the dispatcher never executes and carries no command template. - guard and lifecycle_completion are executed steps: the adapter runs them through run_cli with a continue_when that decides whether the rest of the plan runs. - The two value sets differ exactly where the question is asked. guard and lifecycle_completion occur only in A, validation only in B, and the repository advisory does not list them as a merge candidate. - lifecycle_completion has no counterpart in B. - One shipped caller already uses both vocabularies for one admission decision: governed_capability_execution.py classifies the admission snapshot with A's classify_host_guard_snapshot and then hands B a completed_phases that already contains validation. guard and validation name one obligation seen from two positions, so renaming them would hide that asymmetry and break B's "a phase is never executed" invariant. The entry also records what the confirmation leaves open: the vocabulary that does exist has no typed owner, its literal is written twice (an unexported STEP_KINDS and a private _STEP_KINDS), and the repository's inventory sees neither carrier, so the registry's drift smoke cannot cover it. That is a separate slice and must first reconcile #3412, #5677, #7580 and #7523. The derived RFC status index is regenerated, because it counts ledger entries per RFC and the new entry makes the checked-in index stale. No code, schema, wire, registry or default change. Validation: mkdocs build --strict for the docs site and both developer books; RFC bilingual check passed; docs-governance smoke passed; loopx canary premerge --from-git-diff green. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
managed-step原先在 Python 重建 execution-shaped receipt,并与 TS journal recovery 分别判断 continuation。本提案将完整事实交给既有 Effect runtime,由 typed Turn owner 直接资格化回执和执行原有有序继续契约,删除对应 Python 决策重复。保留大上下文评审意见要求的完整输入:2,420,000 字符 Goal 的 Mapping 与 producer-qualified 输入均沿既有 bounded local snapshot 通过。只对发送前的
request_too_large使用该通道,原 2 MiB wire / 64 MiB snapshot、私有文件、hash/长度、签名和方法白名单保持;不确定响应及其他错误不重试。本次整合还保留主干新增普通原始请求的
request_identityAPI:Python 传递原SettlementIdentity,TS 复用既有 decoder 检查精确请求主体和 effect,不伪造 Todo。另修复实际 CI 暴露的研究阅读测试焦点竞争:等待阅读器完成已有的焦点交接,再向刷新按钮发送 Enter;原错误 Goal 拒绝、清空旧正文和调用次数断言保留,无 timeout 增长、重试或 skip。Author Declaration
Written by: OpenAI GPT-6 family model agent, submitted as LoopX Agent.
Owning acceptance: controller RFC §11 与本 PR 的双语 C4.1 checkpoint。当前固定验证 target
main为55c88e626f0b191d42387a9d4ebb81a30498af0d,最终 head 为bf10d7ed55c5dc2f270c57a15769909d04efa5d8,27 paths、11 个 DCO commits。已无冲突整合主干 #7600 的渐进验收上下文和 #7601 的独立 capture 恢复。相对固定 target 的 27 路径作者 diff 与此前提案逐字相同;以下结果重新验证当前组合。复用两项既有 context/reader owner,保持完整要求、同 capture 恢复和原 Turn 身份,C1/C2 的自然采用与完整成本资格继续开放。
managed_step.py一次完整请求,TS 直接资格化 journal 并执行注册的有序契约;公共 Python value API、精确整数和历史 scalar codec 保留。1.0/1e-07经既有 codec 和turnEnvelopeRoute路由。请求身份必须精确匹配,签名与有序 material settlement 检查不变。纯判断不启动 Host、写 Goal 或扣额。有界重构保留 Python receipt reconstruction/ordered decisions 的删除,复用共享 host-failure/journal owner;没有第二份配置、identity decoder 或 controller framework。独立维护 Python/TS pairs 的 43→45 成本继续披露;回滚先核原回执,journal/settlement schema 不变。双语 checkpoint 同步原始请求接入的实际源码边界。
Validation
均使用公开合成夹具、隔离真实后端和确定性协议 Host,未调用 live model。
55c88e62相等;故意丢 request identity 改变 13 项,包括正例及 foreign Todo 拒绝。research-results通过,4,180 ms;实际 ChatHTTPServer 与脚本化研究 API,保留双语/390px、键盘、错误 Goal 拒绝及旧正文清除。原不可变 base/旧 head 的受控焦点失败与修复证据继续按其版本保留,未重新宣称精确 Ubuntu 自然根因。cqr_33e0f406ec07270b3075PASS、verify valid;标准 tier 6 个直接检查 + 19 个选中检查全过,0 failure / warning / hold。仅为本地作者资格,不授予 self-merge 权限。失败与归因保持分版本。
18c6d7a的扩大检查为 902 pass / 1 fail:旧测试仍要求合法但无绑定工作报contract_error,同命令在不可变 main 同样失败。当前规则返回blocked;本 PR 修正测试并加强无 Host、无 session、无 transaction/effects,原固定组合的整个 driver 148 项及完整 903 项通过,不改变生产准入;当前组合检查见上表。旧 84c 的实际 CI 在
research-results.mjs:140超时。受控焦点竞争已复现并修复,未修改的 macOS 标准场景原本也通过;精确 Ubuntu 自然失败的完整根因及新 head 的全部远端 CI 仍未资格。旧delegation-search:115失败仍按其版本保留;来源 fixture 修复已由既有 owner 的其他 PR 承接,未借相同 source 宣告旧 CI 通过。cae8e956的 Linux / Windows 预算 25,828 / 25,975 > 25,500、cqr_6234f1c1ded8dbd8d4fbFAIL/invalid 及原 premerge 18/19 保持历史失败。主干已采用同完整夹具的 26,500 展示预算,本 PR 未提高生产硬限。旧84c的额外非 CIruff check .109 项基线诊断保留原独立归因,不当作当前全仓通过;早期 fixture/hook/inventory/package 来源失败、25 项兼容修复、12 项大输入反例和 6 项完整基线控制分别保留原版本。本轮首次 wheel 构建因 stale frontend bundle 被拒,标准
build:chat后 fresh wheel 构建通过。隔离 QA 首次 collection 缺公开 benchmark helper,补入同一冻结源码后完整 452 项通过;产品导入来源检查保持。两项生成 bundle metadata 与 tracked 产品分别核对,未放宽产品来源或必需验证。早期 RPC 2→1、params 4069→4147 B / result 790→628 B 是窄边界诊断。本次未补真实模型、整轮 IO/延迟/账单或持续长程效果,不宣称通用提速。没有 authority-store transaction 改动;未跑 PostgreSQL integration,不宣称该 provider 全面资格。当前精确 head 已有源码评审的 COMMENTED / APPROVE 结论,其范围是 C4.1 源码迁移。远端 CI 存在下述失败,merge readiness 未资格;没有执行 merge、release、正式安装或 benchmark/model job。
Current-head CI attribution
Build 与 chat shard 2 都在
team-evidence-return:133失败;chat shard 1 在delegation-search:115失败。四项失败日志都绑定 CI merge27c6fcfde35288e6a8a2f102d946bfd70b30210b,其 Git tree 与本 PR 的bf10d7ed完全相同。固定 main
55c88e62与本 head 各用自己的源码环境、新建 packaged bundle、相同依赖和顺序执行的原场景,成对复现上述两条相同断言:来源测试的恒成功路由拦住真实 409;团队测试在 request-only 检查后沿用todo_id=null,随后读回原 Todo 证据时被现有主体一致性规则正确撤回。本 PR 没有修改这些 UI、场景或对应的夹具。复用 #7604 的既有修复,在隔离副本只将其
f4fe19bc相对0d4bf99a的四文件夹具补丁叠到bf10d7ed:完整来源搜索/拒绝恢复、团队证据/采用失效恢复、反馈丢回执/暂停拒绝等四个旅程通过,三条脚本分别用时 8.17 / 6.93 / 6.36 秒。生产 guard、原断言、超时与 frozen 性能限不变。此为组合验证,#7604 仍是独立提案;它没有被复制进本 PR,也不能据此把当前失败 CI 改报通过。Dashboard shard 2 的 200 项工作区切换为
706.56 / 679.40 / 1187.94 / 807.77 / 670.78 ms,第三次超过 frozen 1 秒。主干与 head 的相关 UI/完整场景/runner 均同字;本机顺序交替三次完整 A/B 场景都通过,分别 15 次切换的最大值为 124.69 / 129.65 ms。平台为 macOS arm64、Node 24.21、Python 3.14.8,与 CI Ubuntu 的 Node 22.22.3 不同。该 CI 性能失败和自然 runner 根因继续保留为未解决;局部通过不证明持续性能、CI 通过或 C4 的净成本收益。Frontend / Visual Evidence
产品 UI 无变化;只调整已有 packaged 场景的键盘目标与焦点时序。真实后端/恢复和场景夹具边界分别列明,无新增 capability、配置或视觉页面。
Boundary Checklist