fix: make launch and restart lifecycle deterministic - #2313
Conversation
|
审查了。改动方向认可(启动/重启生命周期确实需要确定性),但 rebase 到当前 冲突点
其中
你的分支里已经有一次 为什么请你 rebase 而不是我代解这 9 处里有多个是「保留哪一边的返回语义」的设计选择,而不是取并集就对的文本冲突。我对你的设计意图只能反推,代解很可能静默丢掉一边的行为 —— 这个仓库里已经发生过一次「基于旧基线静默回退修复」(#2202 回退了 AUMID 读取),不希望再添一例。 建议rebase 到当前
改完请跑 边界确认你在正文里写明了与 #2311、#2335 的边界(浏览器状态与 CUA 适配不在本 PR 内),这个划分是对的,两者我也已按各自范围处理,不冲突。 |
a2bc72b to
1236496
Compare
|
感谢指出这些语义冲突,已按这个方向处理并 rebase 到当前 逐项确认如下:
新增/强化的回归测试覆盖陈旧回执校验、 rebase 后本地验证:
core 的忽略项保留其私有运行时、真实浏览器或 E2E 环境要求,未计为通过;这轮没有关闭/重启实际应用、替换安装文件或做 macOS 本地验收。PR 正文已同步上述语义、范围和验证结果,请再审查。 |
|
这个 PR 可以合并——方向正确、方案质量高。当前冲突是陈旧基线,不是方案缺陷。请 rebase 后即可合入。 我在临时 worktree 里按最保守方式解了冲突( 冲突只有 1 处,且不涉及取舍// main (HEAD)
let (_, original, _) = recovery_material(paths, &key)?;
// 本 PR
let (_, original, _) = recovery_material(paths, &key, contract)?;根因是 main 的 -fn recovery_material(paths, key, contract: &RuntimeContract) -> ...
+fn recovery_material(paths: &BrowserPaths, key: &str) -> ...新实现的校验比旧版更强( 取 main 侧即可,不丢任何语义。 必须删掉的幽灵参数rebase 时请一并处理: PR 描述里「保留 如果目标是保留「用契约做只读校验」的能力,那是另一件事,需要先论证 方案质量:确实消除了竞态值得肯定,四处都是结构性修复而非加延时:
一处提醒: 次要建议(不阻断)
测试有效性有效部分是关键的: 另外 PR 描述里的验证数字已过期(写 275,实测 331),合并前值得重跑一次。 请 rebase 到当前 main( |
审计当时的处置建议有两处被实测推翻、一处性质被更正,记下来: - **推翻 #2303 的「并发验证阻断项」**:默认并发 5 次全过(未复现 PR 描述的失败); 32 线程加压下 main 与 PR 分支会挂**同一个**用例 (upstream_request_returns_when_provider_accepts_but_never_sends_headers, 墙钟断言 assert!(started.elapsed() < 1s))。是既有 flake,不是 PR 引入。 真正阻断项是分支落后 34 提交。 另更正「保留 compaction: bool 单一标记路线」这条约束——加入原生透传后 compaction 语义已分裂,多字段反而更清晰。 - **推翻 #2313 的「范围过大需拆分」**:冲突只有 1 处且是陈旧基线 (main 的 04ab629 把 recovery_material 改成 2 参),解完整树全绿 1395/75/331。 不该因冲突要求改设计。 - **补充 #2333 的真实回归**(审计未发现):实测 model_catalog 测试红, 默认模型被静默换成 modelList 第一条。附教训:审查贡献者 PR 时必须单独验 「PR 自带测试是否覆盖整个 workspace」,只信 PR 描述的测试命令会漏跨 target 回归。 - 补记 #2309 两个阻断项的实测证据(版本号撞车、Err(_) 抵消退避修复)。 执行结果:#2366 已合入(ea82bc74);#2337 / #2371 由已落地提交覆盖后关闭; #2333 / #2309 回复要求修改;#2313 / #2303 回复可合但需先 rebase。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1236496 to
540b862
Compare
|
已 rebase 到 按评论处理:
补充一点:我核对当前分支后, 重跑测试发现上游计数自检还会误把新增控制文件路径里的压缩标识符子串当作源码变化,例如本机 D 盘 本地结果:core 1413 + manager 74 + Windows subsystem 25,共 1512 passed/0 failed/6 ignored;前端 332 passed,TypeScript、Vite 和 diff 检查通过。忽略项未计为通过;未执行真实应用重启、安装替换或 macOS 本地验收。PR 正文已更新。 |
当晚新提的 PR(@Yuimi-chaya,+1370/-16,11 文件),与已合入的 04ab629 改同一块 native_browser.rs。处置:要求修改。 三条经独立核实的阻断项: 1. FileCheck::Structural 降级通道被整体旁路——for_manifest 改收哈希字符串, 未知版本必然 Err,main 的结构降级分支在未知版本上不可达。 2. ENTRY_SHA 重新引入哈希白名单(无条件准入 cua-repl.mjs 入口), 复现 issue #2294 的病根;PROTOCOL_SHAPES 同理。 3. 运行时版本下限检查被静默弱化。 确属增量应保留:组件事务守卫、schema-2 可重算恢复、绑定级 AST 校验。 依赖合规(@babel 零膨胀,188→188),但构建 --check 未接 CI、esbuild 未显式声明。 实测 1383 passed / 315 pass,但最有价值的负例全在被 skip 的 fixture 测试里, detect 路径在 CI 上零覆盖。 安全:子进程隔离与写盘原子性落实,未触碰身份认证(已独立确认)。 合并顺序:与 #2309/#2313 三者都不含 04ab629,必须先 rebase。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
概要
修复管理器的直接启动/重启生命周期与并发竞态。基于
main的ab203409,与 #2309 的注入健康检测保持独立。生命周期
NativeBrowserShutdown:清理仍在进行或回执无效时中止;已完成但恢复失败时保留RestoreFailed、诊断与前端告警,按上游既有语义继续后续启动。恢复校验
采用上游
recovery_material(paths, key),删除已失效的恢复校验契约参数与_with_contract等中转接口。不回退04ab629的未知运行时适配或已合入的浏览器诊断。取得 monitor 锁后,使用上游恢复材料验证、控制状态与实际服务字节作只读核验。不创建新清理锁,不覆盖外部修改,不用旧版固定指纹阻止新运行时恢复。
有意放宽的范围:monitor 已释放锁、回执为合法已知状态,即使回执仍为
active或blocked,只要控制状态和磁盘内容证明恢复完成,就可以返回Ready。这解决已恢复磁盘上的陈旧回执阻断启动的问题。未放宽的范围:
active或restored回执但磁盘内容不匹配仍报错;无效/未知回执、仍持锁的 monitor 均不放行。blocked且磁盘未恢复仍返回上游的RestoreFailed,不冒充Ready。回归测试直接核对服务和控制文件未被改写。另外修复上游绑定自检的一处路径误判:新增 JSON 控制路径中的
nf/ze/cD子串不是源码标识符漂移。保留原计数检查,只补偿新增路径字面量的出现次数,并用C:/conflict/nf-ze-cD/control.json作确定性回归。不改变协议、组件检查或恢复校验。验证
cargo test --locked --offline -j 2 -p codex-plus-core -p codex-plus-manager --no-fail-fast:1512 passed,0 failed,6 ignored;其中 core 1413、manager 74、Windows subsystem 25。以上是本次 rebase 后的 Windows 本地验证。忽略项未计为通过;未运行真实应用重启、安装或替换,未做 macOS 本地验收,未生成新的 setup/ZIP。保留上游既有警告;之前的真人测试不代表当前 rebased 提交已重新通过真人验收。