Skip to content

Spec: 持续选择性同步 upstream/main(第二阶段) #291

Description

@xunyoyo

背景

#62 已完成第一阶段 upstream 审计,并在 2026-07-12 按当时快照关闭。此后 upstream/main 继续快速前进,本 issue 作为第二阶段的持续同步 spec 和执行台账。

本轮目标不是让 Git 历史看起来与 upstream 一致,而是选择性吸收对本 fork 有价值的修复,同时保护已经上线的计费、支付、积分、公益 key、调度、运维和部署语义。

本轮基线

取证时间:2026-07-14

  • fork 基线:origin/main@40e8d246c
  • upstream 截止点:upstream/main@da85cc7e4
  • merge-base:945b9b208b32dac443cf25e1e96f4ac587c93223
  • git rev-list --left-right --count origin/main...upstream/main:fork 独有 348 个提交,upstream 独有 723 个提交
  • git diff --shortstat origin/main...upstream/main:1097 files changed, 197426 insertions, 61907 deletions

该体量禁止整段 merge/rebase 后再修冲突。本轮 Done 只覆盖上述 upstream 截止点;截止点之后的新提交进入下一次快照,不静默扩大当前验收范围。

核心原则

  1. 每次判断必须以刚 fetch 的 origin/mainupstream/main 为准,不能以本地落后或脏的 main 为准。
  2. 不直接 merge upstream/main,不按提交数量追进度,也不因为 commit 能 cherry-pick 就默认应该合入。
  3. 每个候选先检查:是否已按相同 patch 吸收、是否已有等价实现、是否符合本 fork 产品语义、是否依赖未引入的上游基础设施。
  4. 同主题、低耦合的 1-5 个 commit 可以合并成一张 PR;跨计费/支付/迁移/调度边界的改动必须拆开。
  5. 低重叠主题可以并行 PR;同文件热点或存在依赖关系的主题按顺序执行。
  6. PR 通过完整 CI/CD 只是“可合并”标准,不自动合并,由人工完成最终 merge。

候选分类

A:直接吸收

  • 安全修复、确定性 bugfix、协议兼容修复。
  • 小范围 OpenAI/Codex/GPT-5.6/compact/cache/write 修复。
  • 不改变业务口径的 WebSocket、streaming、HTTP 生命周期和可观测性修复。
  • 已有完整依赖且与 fork 语义一致的小型前端修复。

处理方式:优先 cherry-pick -x;如上下文有漂移,只做最小适配并保留 upstream commit/PR 引用。

B:改写后吸收

  • OAuth/account scheduler、quota、模型能力、Grok/Antigravity 调度。
  • usage、ops、system logs、settings/admin 大文件调整。
  • 会触碰本 fork 错误归因、缓存、计费资格或故障切换路径的修复。

处理方式:先开子 issue 写清 fork 现状、目标行为、冲突点和测试门槛,再按本 fork 结构实现;禁止整文件覆盖。

C:暂缓

  • Batch Image、Grok media、server timing 等大功能或产品方向尚未确认的功能。
  • 依赖大量 upstream 基础设施、迁移或 Ent 生成代码的改动。
  • 暂时没有线上需求或无法独立验证的重构。

处理方式:记录原因、依赖和重新评估条件,不创建占位 PR。

D:跳过

  • sponsors、品牌资产、README 推广、纯 VERSION/release 同步。
  • 与 fork 已有实现等价但冲突更大的重构。
  • 会弱化现有 CI、安全扫描或 coverage 门槛的配置。
  • 会回滚 fork 已确认产品策略的 upstream 默认值。

例如:上游长上下文计费默认开关的往返提交 a0ac5e024 / f63d168ae / e9fb5983c 不直接吸收;当前 fork 以已合入的 #284 为准。

优先级

  1. 当日安全修复和会造成请求失败、重复计费、重试风暴、连接泄漏的生产 bug。
  2. GPT-5.6、compact、OpenAI OAuth/Codex、Responses、cache write/read 的兼容修复。
  3. scheduler、WebSocket、streaming、HTTP keepalive、错误分类与故障切换。
  4. Grok/Antigravity、usage/ops 和管理端体验。
  5. 大功能、结构性重构和产品方向改动。

执行流程

1. 刷新与去重

每轮开始先记录 refs、merge-base 和 left/right count,然后对 upstream-only 候选做以下核对:

  • git cherry / patch-id 是否已吸收。
  • origin/main 是否已有行为等价实现和更完整测试。
  • commit 的真实依赖链,而不是只看单个 diff。
  • 是否会覆盖 fork-only 字段、迁移、计费或调度语义。

2. 建立子任务

需要代码的候选建立子 issue,并在正文中包含:

  • upstream commit/PR 链接。
  • 分类 A/B/C/D 与理由。
  • touched paths 和依赖。
  • fork 当前行为、目标行为和明确非目标。
  • 冲突处理策略。
  • 必跑测试和 Done 标准。

确认无需吸收的候选可以直接记录到本 issue 的进度评论,不为凑数量创建重复 issue。

3. 实现与 PR

  • 从最新 origin/main 创建隔离 worktree/branch。
  • 优先移植行为和测试;冲突时先理解双方语义,再手工适配。
  • PR 描述列出吸收的 upstream commits、刻意跳过的相邻 commits 及原因。
  • 同主题可以批量提交,但一张 PR 必须可独立 review、独立回滚。
  • PR 通过全部检查后更新子 issue 和本 issue;不自动 merge。

4. 进度台账

每个批次在本 issue 评论中记录:

  • 当前 origin/main / upstream/main 快照。
  • 已审计候选及 A/B/C/D 结论。
  • 子 issue / PR / upstream commit 对应关系。
  • CI 结果、冲突情况和刻意未合入内容。
  • 下一批优先候选。

验证门槛

每张 PR 至少满足:

  • git diff --check 通过,工作树干净。
  • GitHub Actions backend test、integration、golangci-lint、frontend、frontend coverage、security 和 codecov/patch 全绿。
  • 协议、错误分类、调度或 streaming 改动包含针对性回归测试。
  • 涉及 DB/Redis/迁移/计费/支付/订阅时,必须由 CI 的真实依赖集成测试验证;历史迁移文件不可修改。
  • 不降低现有 CI/CD 门槛,不通过跳过测试或扩大 coverage ignore 解决红灯。

当前本地机器不运行完整 Go/Docker/前端构建,以避免资源占满;重型验证统一交给 GitHub Actions。允许本地执行 git、静态 diff、格式检查和低资源审计。

本轮首个批次

  • upstream 5aeb03018:Codex plan-gated model 按账号-模型组合冷却并故障切换。
  • 实现 PR:fix(scheduler): cool down Codex plan-gated models per account #290
  • 当前结果:完整 CI/CD 与 codecov/patch 已通过,PR CLEAN,等待人工 merge。
  • 相邻长上下文计费默认值提交按 D 类跳过,原因见上文。

Done 标准

  • 截止 upstream/main@da85cc7e4 的 upstream-only commits 已完成首轮分类,不存在未记录的高优先级候选。
  • A 类候选已通过 PR 合入,或明确记录了不吸收的证据。
  • B 类候选已有子 spec 和明确决策,不以“大、以后再说”代替审计。
  • C/D 类候选均记录原因和重新评估条件(如适用)。
  • 所有实现 PR 的 upstream 来源、fork 适配和 CI 证据可追溯。
  • 未修改历史迁移,未回滚 fork 的计费、支付、积分、公益 key、错误归因、调度和部署语义。

历史第一阶段 spec:#62

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions