Repository navigation
ChatGPT Switch v0.3.0
Canonical 会话存储
- 新增统一
SessionReferenceGraph与语义 JSONL provenance,覆盖 OpenAI 主目录、Account、Relay、Shared、legacy/relocated 与备份库存;无法判断的历史一律 fail closed。 - Account / Relay / Shared 改为数据库视图与请求路由,canonical 就绪后延续同一逻辑 threadId,不再按 provider 永久物化完整正文。
- 旧“完全同步”改为“会话合并与修复”;真实分叉默认不覆盖,显式覆盖后的旧主版本进入 7 天冲突回收。
- 生产版移除会话 hard-delete command 与 UI 永久删除入口。
迁移、备份、GC 与降级
- 一次性前台迁移状态机:只读 Preflight → 完整备份 → 真实 Codex 隔离恢复验证 → 原子计划 → Apply/Validate/Commit,全程由持久操作账本驱动。
- fail-closed 安全窗口离线 GC:在线阶段固定只扫描,候选须同时满足有效 marker、确定 canonical peer、Equal/Prefix、连续两次未变化与全运行时零引用。
- 新增 v0.2.0–v0.2.7 显式隔离降级导出与再次升级导入;旧版只使用自描述隔离存储,canonical 保持不动。
- 顶部新增“存储”页,集中展示存储状态、canonical 会话、安全副本、冲突、已回收字节与安全窗口状态。
完整条目见 CHANGELOG.md。
发布工程修复
本版本发布前,v0.2.7 降级门禁在 CI 上连续 15 次失败且从未通过。根因与修复:
- 门禁通过
WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS注入 CDP 调试开关。托管 runner 完整收到该变量却不据此启动浏览器,本地开发机则会,因此门禁在 CI 上永远拿不到调试端口。改为同时通过--edge-webview-switches宿主命令行通道注入,并固定 WebView2 用户数据目录。 - 门禁此前以
stdio: "ignore"启动被测产品,失败时只有一句fetch failed。现在全部启动均记录 stdout/stderr、退出码与 spawn 失败,就绪等待在子进程退出时立即中止,并附带端口监听者、WebView2 进程命令行与运行时版本。 - 门禁此前硬性拒绝在 GitHub Actions 之外运行,每个假设都必须花费一次提交与一轮完整 CI。现支持显式隔离本机运行。
- 应用后断言要求
sqlite_home缺席,而 v0.2.7 本就拥有并重写该键,旧运行时无法满足。改为断言该键不得逃逸隔离包;导出槽不得携带sqlite_home、不得重新引入源 canonical 根、数据库引用包含性三项检查保持不变。 - CI 拆分为质量门禁、降级门禁与 release 构建三个 job,失败时同样上传证据,并支持手动触发。
验证
- 前端 166 tests passed(8 test files);TypeScript typecheck 与 production build 通过。
- Rust 789 tests passed、11 ignored;
cargo fmt --check与cargo clippy -D warnings通过。 - 发布 harness 安全契约 20 tests passed。
v0.2.7隔离降级 saved-slot apply 门禁在托管 runner 上通过。- main CI run 31856956413 与 tag CI run 31858620663 均为三个 job 全部成功,同指提交
7f5e759。 - 唯一资产
codex-switch.exe为2,872,832bytes,SHA-256BBA8CE095ECEB6F005A5A3708CD6DBBBABF4EA56AA46E701A8A9EDAFFEBDCD62,取自 tag CI artifact,未在本地重新构建;公开回下载与该 artifact 逐字节一致。 - 出处更正:发布后约 4 小时内曾短暂提供同一提交 main CI 构建的资产(
2,872,320bytes,SHA-256FE89B0E7…,其 run 内 release contract/UPX/PE 校验同样全部通过),后按发布流程替换为 tag CI artifact。两份文件均为同一源码的已验证构建,仅 UPX/PE 时间戳不同。 - 真实 updater 首跳与回滚已闭环(发布后补跑,隔离环境、无信任绕过、无故障注入接缝):
- success:
0.2.7 → 0.3.0,同路径替换、PID 变更、启动回执updated,安装后 SHA-256 与公开资产一致,受保护状态字节不变,残留 0。 - replacement-lock-rollback:对目标文件施加外部独占读句柄后,产品回滚至
0.2.7,启动回执rolledBack,安装后 SHA-256 回到 v0.2.7 资产,受保护状态字节不变,残留 0。 - 证据
updater-e2e.jsonSHA-2567DAAFDF4C2BFA0F6EB7703E9A801012AD6AC0A8FF9B02B5323F2A7A848C92859。
- success: