Repository navigation
fix(collaboration): retain queued handoffs across native lane contention - #7531
loopx-agent wants to merge 4 commits into
Conversation
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: 968afd8; base: a85a804.
动机 / Motivation
使用已授权Chat交接的请求方,在保存操作后、worker启动前退出时需要恢复原任务。
旧版本在原操作仍为prepared时跳过预检,已被占用的Turn lane仍会提交worker;新版本保留原操作并返回忙碌原因,释放后同一请求只执行并回传一次。
已验证忙碌时没有worker、新Turn或任务改写,恢复后原请求被处理并向原对话回传一次。
不新增grant、任务、scheduler或自动重试,不代表普通Inbox自动激活或正式App/model采用。
剩余缺口是无预建Todo的普通Inbox自动激活及正式安装Host采用,保留原有独立交付边界。
改动思路 / Approach
恢复与首次提交共用既有native预检;Python只组合当前事实,TypeScript继续拥有准入和状态转换,启动锁负责随后发生的竞争。
本PR只修复已有明确Todo与grant的prepared恢复,不交付普通Inbox自动唤醒或第二套controller。
没有新增准入规则、协议、RPC、配置或持久缓存。submitted=false 表示本次没有提交,原operation仍可恢复;running、turn_returned及终态继续读原记录,避免已完成Todo的新启动拒绝遮住历史结果。fresh source检查在可能较慢的inspect之后再执行,预检不能代替启动时的原生fence。
具体改动 / Changes
独立依据是 docs/reference/local-delegation.md,spec revision a85a804;activate、source-use-and-recheck、disconnect-and-recovery 三项均按上面原合同实现并验证。
关键代码讲解
- execution.dispatch 先验证原Inbox、完整brief、binding及回传Session/Turn,只让仍为prepared的分支进入共用inspect。拒绝时返回原operation_id、Todo与replayed状态,不写出另一个操作。
- Delegations.resume 保留原锁与
prepared_source_request_id,迟到worker发现操作已经推进时只观察。该owner未改,因此本次adapter不复制其启动/状态规则。 - 两个测试文件同时覆盖真实File/SQLite占用lane、释放恢复、原请求处理和一次回传,以及撤权、停用、缺失预检事实和五类已推进状态。对应文档中英文补充预检是观察以及没有自动wake的边界。
对主干的风险 / Risks
PASS:四个完整相关模块共113项测试,6项直接检查加11项选中标准premerge全部通过,零人工hold。没有查询、轮询或等待CI。
FAIL(预期base反例):把同一组新断言应用于不可变base,10项失败、7项通过;其中File/SQLite两条真实忙碌lane均观察到旧代码继续提交。head的完整测试验证busy不动原记录/held lane/Todo,释放后一次Host执行、原请求conclusion一次返回,终态重放不再inspect或spawn。
没有把mock admission当真实Host证明:单位用例覆盖快速故障分支,实际后端、原生CLI、fixture Host和返回transport覆盖端到端恢复。当前没有新增off开关;无binding/context-only与撤权拒绝路径保留,不因可见binding或注册获得权限。preflight之后的竞争仍由原native start fence处理;这不是原子预留或安装态模型资格。
我的整体评价 / Verdict
APPROVE,无阻塞发现。这是可独立使用的恢复增量:长程工作能够保留原承诺并在恢复后处理原请求;调用方收到可行动的拒绝和同一操作的结果,无新增确认轮次。恢复与首次提交共用既有native预检;Python只组合当前事实,TypeScript继续拥有准入和状态转换,启动锁负责随后发生的竞争。 本PR只修复已有明确Todo与grant的prepared恢复,不交付普通Inbox自动唤醒或第二套controller。
4文件+180/-18中,生产adapter净增7行;测试直接保护已发货的恢复边界,未另建状态owner。保留既有持久operation/Turn与回执兼容,相关准入词汇均复用,semantic advisory及公开边界检查通过。
完整4文件diff和原handoff回复消费者未改变任何渲染布局、设置或首屏结构;visual review不适用,实际安装App交互仍未验证。 正式App、真实外部模型、PostgreSQL、Windows、全仓与长期净收益未本轮资格化;本次采用已有Source/Turn/返回owner,不能用一次fixture回传关闭这些轴。合并须由维护者另行决定。
English verdict: APPROVE — 968afd8; prepared recovery now shares native preflight; 113 tests and 6 direct/11 selected checks pass, with real File/SQLite base counterexamples and once-only recovery/return.
968afd8 to
6602022
Compare
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>
6602022 to
98a6e6f
Compare
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
现有获精确binding授权的Chat/CLI/MCP请求方和已确认task-bound callback接收者。
已保存请求或已确认operation遇忙碌/未知lane:旧代码提交worker或拒绝原操作;head先保留原身份与确认,恢复后原会话启动一次,启动后竞争仍由native fence裁决。
当前File/SQLite四完整模块128例、11个原生profile案例及12独立native正反例通过;实际target base上8个原交接/late-race及10个callback反例失败,head保持原identity、confirmation、一次Host/结算/返回。
不新增自动retry/wake pump、普通无Todo Inbox激活、执行grant或正式App/真实模型/安装资格。
普通无预建Todo的Inbox自动激活及正式App和真实模型采用仍由既有collaboration/host工作承接。
已保存但尚未启动的合法交接,以及已确认的 task-bound callback,在接收方忙碌时应保留原承诺。旧代码的 prepared Chat 重放跳过预检;callback 也会直接提交 peer 工作;预检之后的 native lane 竞争还可能把从未启动的操作记为终态拒绝。请求方被迫另建操作会扩大重复执行与重复扣额风险。
本次只评价完整 98a6e6f,actual target base 为 9558f75:11 文件 +625/-52。变更前的 local-delegation 合同已要求确认、启动授权、原生开始、消费、验收和原受众返回各自成立;这些既有要求是判断依据。旧 968/660 的结论不继承到本 head。
改动思路 / Approach
两个consumer复用同一TS preflight决定;状态转换复用原TS owner,持久化复用已有IO/fence;无第二调度/authority。
现有task-bound原请求恢复及确认callback准入;普通无Todo Inbox自然激活和正式App/provider仍未交付。
Chat 与新 task-bound callback → Delegations.inspect → TS delegationPreflight → 原 start/resume → native Turn fence → 既有结果 IO/observation → 原请求返回。dispatch_allowed 由原 TS owner 从完整预检事实派生;两个 Python consumer 只接受严格的 True,删除重复资格判断。
prepared 重放先检查当前来源、workspace、authority、acceptance、runtime 与 lane,再复查 grant。callback 拒绝时只返回 blocked 和原因,保留原 canonical confirmation,零新 peer 请求/worker;已有 delegation 的重放仍只读。独立 original_operation 的原 reservation 路径没有改动。
晚于 preview 的竞争仍由 native fence 处理。只有原 operation 没有匹配 journal,且真实回执的 schema/mode、非 replay、zero spend、host.executable=not_invoked 和全部 effects 明确 false 时,TS observation 才把 running 保留为 prepared。effectful、已有 journal 或不确定结果仍走原对账;没有自动 retry pump。
具体改动 / Changes
依据 docs/reference/local-delegation.md @ 9558f75:activate 核精确 grant 和当前验收;source-use-and-recheck 核原请求/brief/binding/Session;disconnect-and-recovery 核原 operation、unknown 与一次执行;acceptance-and-return 核独立验收、规范完成与原路返回;confirmed-callback-admission 核确认/启动授权独立及原 Session/profile。五项 implemented,均用变更前合同及实际 entrypoint 验证。
关键代码讲解
- manager_context.execution.dispatch:prepared 与首次 dispatch 共用预检;advanced 状态不再按新启动检查已完成 Todo,原 source/binding/brief/Session/Turn 不替换。
- delegationPreflight:原拒绝/未知分支均派生 false;已配置但未 probe 的 runtime 仅可有界尝试,不能呈现为 ready/running。
- dispatch_confirmed_operation_wake:在新 peer 发布前消费同一预检;existing readback 和 original-operation reservation 仍先进入各自原 owner。
- transitionDelegationObservation:严格识别未开始的 native lane refusal;不是按 reason substring 或自由文本猜状态。
- delegation_validation.record_turn_result:原结果 IO 归回已有 owner,只运输必要 receipt facts;publish=False、锁内恢复和原 stop-fenced 写入 seam 保留,四个 caller 没有第二套状态规则。
验证与发现 / Findings
无阻塞发现。对本 head 独立执行:
| 验证 | 实际结果 |
|---|---|
| source replay、Chat execution、callback preflight、Lark operation 四个完整模块 | 128 passed,零 skip |
| 独立真实 native receipt 正反例,File/SQLite | 12 passed;Host/state/quota/scheduler 任一 effect 或 unknown effect 都不回退 |
| 原生 callback/Session/profile 选中案例 | 11 passed,22 deselected |
| 完整 delegation TS 模块及 control-plane typecheck | 28 passed;typecheck 通过 |
| actual target-base 的同一断言 | 8 个交接/late-race、10 个 callback 均复现旧缺陷;只 overlay 测试,product 未改,已还原 |
| 标准风险 premerge | 6 直接 + 11 选中通过;零失败、警告或人工 hold |
真实 disposable File/SQLite、native CLI、journal/lease 与 owned app-server 协议 fixture 验证了:重复忙碌不改原身份/确认,释放后原 Session 的 Host 只启动一次;原交接完成后 journal/debit 与原会话返回各一次。workspace 缺失、foreign/unreadable lane、preview 期间撤 grant、缺失/非 boolean 决定和错原请求都保守拒绝。Lark wire 测试的固定 preflight 仅验证身份与重放;真实准入由独立 backend 模块补齐,未把 mock 当原生开始证明。
旧 660 的五模块 192 passed 仅保留为对应版本历史;本 head 使用上表重新执行的范围。首次误写测试路径的 collection 失败、作者历史 module ceiling/large-result/旧 callback fixture 失败均保留,不改标为通过。按当前策略未查询、轮询或等待 CI。
对主干的风险 / Risks
最强风险是把已有副作用或未知回执误当未启动并重跑。当前严格 native 事实合取、原 journal lookup 和 stop/source/lease fence 保留;prepared 的再次启动仍须当前授权,并不新增自动循环。预检与最终启动之间仍可能发生竞争,其裁决继续归 native fence;不能把本次单路径恢复解释为自动 Inbox、安装、模型或长期净益资格。
语义与 CI 对齐
预检决定是观察;执行授权与最终 native fence 仍独立。缺 grant/context-only/未配置 callback 不激活,注册或确认也不替代当前准入。46 行双语文档明确新顺序、unknown 恢复、原 operation 重试及不新增自动 wake;未压缩旧义务或加入领域专用通用规则。标准语义/公开边界预检通过。
我的整体评价 / Verdict
APPROVE,无阻塞发现;justified increment。 现有 task-bound 承诺在争用中可保留,并有真实后继的一次启动、结算与返回证据;long_horizon 与 user_experience 在这个有界路径上 improved。新增生产成本为 +108/-49,主要复用 TS 预检/observation 和原 IO owner;两 consumer 共用派生决定,callback 仅 7 行接入,不需要新的队列、配置或 scheduler。
完整11文件diff只修task-bound准入和恢复、文档及测试;现有Chat/Lark shared frame布局、设置与首屏未改变,visual review不适用。正式App交互未验证。 普通无 Todo Inbox 自然激活、正式 App/真实外部模型、PostgreSQL、Windows、持续调度与完整长期成本收益未本次资格化;未据此关闭父级路线图。preflight 不是原子预留,真正的启动 fence 继续裁决其后的 race。合并与安装由维护者另行决定。
English verdict: APPROVE — 98a6e6f; shared typed preflight and strictly effect-free late-lane recovery preserve the original task-bound operation. Current-head 128 Python, 12 independent native, 11 profile and 28 TS cases pass; 18 actual-base counterexamples establish regression sensitivity.
Chat 交接落盘后的恢复原先跳过预检;预检后出现 native Turn lane 竞争,也可能把尚未执行的原请求记为失败。人工确认 operation 的回调还会直接提交委派,未使用 Chat 已有的忙闲、权限和验收预检。本改动让 task-bound 的首次提交、prepared 恢复和确认回调消费同一 TypeScript 预检判断;忙碌或未知时保留原请求与确认,不提交 peer 工作或 worker。
启动后竞争仍由原生 fence 处理。只有尚无原 Turn journal、且原生回执明确证明未启动和零副作用,TS observation owner 才把原 operation 保留为 prepared,供后续获授权重试。原 request、完整 brief、回传会话与租约身份保持;已有 journal、effect 或未知结果沿原恢复流程。未探测的 configured runtime 保留原有界尝试规则,独立 original_operation continuation 不变。
本次相关重构已应用:删除 Python 重复 readiness 判断,两处现有调用方直接消费 TS 的 dispatch_allowed;Python 只适配 IO。必要回执事实通过既有 observation owner,大块 evidence/Host 配置留在原结果;持久化仍归既有 validation IO owner。CLI、MCP、Chat 和确认回调共用原生规则,无新配置、scheduler 或自动重试循环。
验证版本:head
98a6e6fb675217e4534e2086fdb37355ec87890b,main 基线9558f75ae52e8a0c9f74ad7df0f47a69e0d413ad。103 项共享入口/恢复测试通过,覆盖真实 File/SQLite、软/硬租约、停止、失回执和原身份一次 Host/扣额/原会话返回。确认回调最终 51 项通过:其中 10 项使用真实 File/SQLite 和 native 协议夹具,41 项为 Lark 回调身份/并发重放单测;另 6 项既有 native Codex 回调/profile 测试通过。
完整 TS 5603 通过、75 条件跳过、零失败;全量 TS typecheck、Ruff、配置内 mypy 17 文件、语义 advisory、双语差分和 11 文件公开边界检查通过。重基未改变受测产品和测试语义,最终改动仅清除测试末尾空行,AST 一致。
反例:不可变 26caf900 在忙碌 lane 仍提交回调;当前阻止提交。原 968afd8 的 6 个迟到竞争失败及先前大结果传输/模块超限失败保留。新增测试初版把未探测 runtime 当已知不可用的两项失败已纠正;Lark wire fixture 明确模拟预检边界,真实准入由上述原生用例覆盖。首轮 premerge 发现末尾空行,已修正,未改变断言或阈值。
精确范围 CQR 有效;标准 premerge 的 6 项直接检查与 11 项选中检查全部通过,零失败、跳过或人工 hold。校验使用已核实的固定 main 提交,避免并行更新远端跟踪引用改变同次验证基线。
隔离打包补验:同一 head 的 CPython 3.14 非 editable wheel 安装后,原公开恢复与回调预检两模块 34 项全部通过,零失败/跳过。覆盖真实 File/SQLite、prepared 忙闲恢复、迟到竞争、硬租约、6 MiB 结果、原身份一次 Host/扣额/返回及确认回调撤权。5 个改动产品文件与 wheel/安装内容逐字一致;已采集的 237 份 Python 导入记录和主进程 1175 个产品模块未从源码目录加载。初建因过期 Chat 资源被拒,按标准重建后打包成功;失败记录保留。这是隔离协议 Host 资格,正式 App 和真实模型采用仍未验。
远端 CI 尚未完整资格:本 head 的 CI Maintenance 因旧 Python Tests 运行未在取消观察窗口内终止而失败;旧 head 6602022 的该运行后来于 23:31:11Z 读回 cancelled。清理任务的失败仍保留,未重跑或豁免;其他远端检查以实际结果为准。
这是可独立验证、可回退的 task-bound 恢复修复。普通无预建 Todo 的 Inbox 自动激活、持续唤醒队列、正式 App/真实模型采用与完整长期成本验收仍未完成;DSH 可选 SDK 用例因依赖缺失跳过,未作该 runtime 新资格。原权限、停止、预算与租约门继续有效。PR 尚未合并;正式运行环境未升级。