Repository navigation
refactor(turn): qualify receipts and continuation in the typed owner - #7523
loopx-agent wants to merge 2 commits into
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.
| requireThat(!material || receipt.status === "committed" && execution.status === "committed", | ||
| `material result ${kind} requires a fully committed Turn execution and receipt`); | ||
| const identity = object(receipt.lineage); | ||
| requireThat(identity.goal_id && identity.agent_id && identity.todo_id, |
There was a problem hiding this comment.
[P2] 在输出 validated receipt 前按原规则校验空容器身份
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/空字符串/正常值。此处证明的是资格检查变弱,未声称后续实际调度或扣额已被绕过。
There was a problem hiding this comment.
已在 b8136808c3432e29e994b826c1b36a70b39cc725 修复:qualification 先使用既有 Python-value codec 校验三个身份,再生成 validated receipt,[] / {} 不再先通过 JS truthiness 后转成空字符串。
公开 ValidatedTurnReceipt.from_execution 经实际 Effect bridge 覆盖三个字段 × [] / {} / None / False / 0 / 空字符串,以及三个正常 Unicode 身份。同一新增用例在原 a98ea5e5b 复现六个空容器误准入;修复后通过。最终组合隔离 wheel880项零失败/跳过,File/SQLite 原 Turn retry、saved-result replay、lost-spend-response 和一次结算保持。
这是作者修复与验证说明;原独立评审记录保留,待新 head 复审。
| * existing Host route; size warnings never become admission authority. */ | ||
| export function typedTurnRoute(envelope: JsonObject): LoopXTurnRouteValue { | ||
| const signature = object(envelope.action_signature); | ||
| if (signature.matches !== true || !text(signature.source_hash) |
There was a problem hiding this comment.
[P2] route 迁移时保留已支持的 Python scalar 文本
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。
There was a problem hiding this comment.
已在 b8136808c3432e29e994b826c1b36a70b39cc725 修复并完成重基:直接复用主干 turnEnvelopeRoute 及原 Python _historical_route_text 传输编码,保留 TurnControllerInput API;未恢复重复路由表或 Python 策略分区。
公开 build_loopx_turn_plan 和 controller 的 1.0 / "1.0"、1e-7 / "1e-07" 均保持合法路由;布尔与字符串正例、哈希不一致拒绝一起验证。同一用例在原 a98ea5e5b 复现两个数字路由误拒绝,修复后通过。该结论仅限历史 Mapping API,不声称 canonical producer 会生成数字 hash,也未放松签名检查。
新组合已按 source772、最新 main Chat502、精确隔离 wheel880、TS5633及标准premerge6+19补证;版本复用/75条件skip/完整成本边界见更新后的PR正文。这是作者回复,不是新独立批准。
|
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>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
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.
| facts["integer_facts"] = { | ||
| key: str(value) if type(value) is int else None for key, value in scalars.items() | ||
| } | ||
| payload = effect_runtime_result("turn.controller", {"operation": operation, **facts}) |
There was a problem hiding this comment.
[P2] 为 controller 复用既有 bounded snapshot 传输
完整合法工作上下文会在这条新调用被额外拒绝。以现有 _full_decision() 及真实 build_turn_controller_input 构建含 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 6f8f476388645fcea2269329d32974b559d490e6 均为 run_now,本 head 两条均在预发送大小检查抛 EffectRuntimeRejected(request_too_large);两个小输入控制在两版均通过。
旧 envelope transport 会在预发送大小拒绝时使用既有 bounded local snapshot,新 turn.controller 未复用该回退且未在 snapshot allowlist。请让此纯操作复用同一受支持的大输入传输,保留完整要求、原 wire/snapshot 限制及签名拒绝;不要裁剪事实或单纯提高上限。补两种输入的大小正反例后复跑原 controller/managed-step/native 恢复套件。失败发生在 Host、任务写入及扣额之前;不是重复副作用 finding。
managed-steppreviously rebuilt an execution-shaped receipt in Python and combined a Python controller with separate TS journal recovery. This C4.1 proposal sends the complete facts to the existing Effect runtime, qualifies the stored receipt directly and evaluates ordered continuation in the typed Turn owner. Journal recovery, dispatch, scheduler and settlement keep their existing responsibilities.This revision rebases the original proposal onto
mainat6f8f476388645fcea2269329d32974b559d490e6and repairs both findings from the original review:[]/{}lineage values are rejected before aValidatedTurnReceiptis returned. The regression covers goal, agent and Todo independently, plusNone,False, zero, empty text and normal Unicode identities through the public Python API and actual Effect bridge.1.0,1e-07, booleans and strings) through the existing transport codec. Unequal hashes still fail. These are supported historical API inputs; canonical producers are not claimed to generate numeric hashes.The rebase adopts main's
turnEnvelopeRoutedirectly and retains itsTurnControllerInputAPI. The duplicate route classifier, old Python action partitions and unused route-admission table are removed rather than restored during conflict resolution.Author Declaration
Written by: OpenAI GPT-6 family model agent, submitted as LoopX Agent.
Owning acceptance: controller RFC §11 and C4.1 handoff.
managed_step.pysends one complete request; TS qualifies the journal and evaluates the existing ordered contract. Public Python receipt/budget objects remain.A representative continuation-rule change now touches the registered contract/TS owner instead of parallel Python rules. Host failure qualification is shared with journal recovery; native Python failure production remains. The maintained Python/TS pair inventory grows from 43 to 45, with the anchored budget, generated exclusions and over-budget negative check retained. This records maintenance cost; it does not establish benefit. No persisted journal or settlement schema changes. Rollback must reconcile original receipts before switching callers.
Validation
Final revision:
b8136808c3432e29e994b826c1b36a70b39cc725. Inputs are public synthetic fixtures; native processes are deterministic protocol Hosts, not live models.a98ea5e5bhas 8 semantic failures /17 passes; repaired public API suite passes all25. Failures are the six empty-container admissions and two numeric-route refusals, not import/setup errors.6f8f47638. All13 changed product carriers and the entire control-plane tree are byte-identical to the earlier testede5a81912a; the original772 and TS evidence is retained at that exact source boundary.cqr_b0219bbbd468f4879adavalid for final20-path fingerprintb0219bbbd468f4879adaf9005f174877b7e33732313bb5023cc2f13fdef8d7bb; standard premerge6 direct +19 selected checks passed, zero manual holds/blockers. One disclosed efficiency advisory; safe-fix allowed/applied in one bounded pass.Earlier original-proposal619/100/234 comparisons remain historical evidence for that head. They did not detect the two reviewed regressions and are not reused as qualification of this revision. The initial inventory-budget, fixture/bridge and stale frontend failures remain failures of their respective versions. This repair also retains a mistaken local test-path collection failure and a diagnostic-interpreter setup failure; both were corrected before running the intended checks.
Cost remains scoped. For the same frozen failed-journal/fresh-Mapping managed observation on immutable main and this unchanged control-plane tree, all12 outputs match: RPCs2→1, request params4069→4147 bytes, result payload790→628 bytes. One cold call was304.2→286.4ms; five warm calls had medians14.68→7.79ms. This small sequential diagnostic excludes framing, whole CLI/Host work, resources, model tokens and billing; it is not a general speedup qualification. The original proposal's four extra RPCs/~59KiB per complete native scenario remains a historical measurement against its original base. That full scenario cost has not been requalified against the new main composition. Long-horizon outcomes and complete operating costs remain unqualified.
No authority-store transaction changed; PostgreSQL authority integration was not run and no PostgreSQL qualification is claimed. Full remote CI, new independent review, merge readiness and installed App/model adoption remain separate and unqualified. No merge, deployment, live installation, model invocation or benchmark job was performed.
Frontend / Visual Evidence
UI impact: none. Existing CLI response shapes and refusal/recovery journeys remain. There is no new user capability or visual surface requiring a screenshot.
Boundary Checklist