Skip to content

ChatGPT Switch v0.3.0

Choose a tag to compare

@mingisrookie mingisrookie released this 15 Aug 02:14
· 17 commits to main since this release

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,832 bytes,SHA-256 BBA8CE095ECEB6F005A5A3708CD6DBBBABF4EA56AA46E701A8A9EDAFFEBDCD62,取自 tag CI artifact,未在本地重新构建;公开回下载与该 artifact 逐字节一致。
  • 出处更正:发布后约 4 小时内曾短暂提供同一提交 main CI 构建的资产(2,872,320 bytes,SHA-256 FE89B0E7…,其 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.json SHA-256 7DAAFDF4C2BFA0F6EB7703E9A801012AD6AC0A8FF9B02B5323F2A7A848C92859。