# AI fast-loop 跟 auto-merger 抢资源，round N+1 push 变孤儿

**日期**：2026-05-17
**触发场景**：PR #404 round 4 push → 远端报 `* [new branch]` → 改动没进 develop

## 现象

PR #404 多轮 ai-review 跟进流程中：

```
T0   AI push round 3 (500dfd56) → feature/agent-pr11-electron-shell
T+90 AIBot review on 500dfd56 → verdict=pass
T+150 auto-merge.yml cron 5min 扫描命中 → squash merge → develop ← d273e199
T+150 + ε  Gitea auto-delete-on-merge 删 feature/agent-pr11-electron-shell
T+180 AI 写完 round 4 改动（在 ai-review verdict 出来后才写）
T+200 AI git push → 远端没找到该分支 ref → 当 new branch 创建 → 2c2ad744 是个孤儿 commit
       parent=500dfd56（不在 develop 的 squash 历史里）→ round 4 改动**不可见于 develop**
```

git push 输出里有 `* [new branch]` 一行就是关键信号，但容易当成"分支命名变了"忽略过去。

## 怎么定位

```bash
# 检查 PR 实际合的是哪个 SHA
curl -sS -H "Authorization: token $GITEA_API_TOKEN" \
  "http://43.130.59.228/api/v1/repos/FFAIWorkspace/workspace/pulls/<N>" \
  | python3 -c "import json,sys; p=json.load(sys.stdin); \
    print('merged_at:',p.get('merged_at'),'\nmerge_commit_sha:',p.get('merge_commit_sha'),'\nhead_sha:',p.get('head',{}).get('sha'))"

# 对比 round N（被合的） vs round N+1（孤儿） vs develop merge commit
git diff <roundN-sha> <merge-commit-sha>      # 应为空（squash 就是 roundN）
git diff <roundN+1-sha> <merge-commit-sha>    # 列出"丢失"的改动
```

## 预防

1. **看到 `git push` 输出有 `* [new branch]` 立刻停下**——除了 push 全新分支，**没有合理理由**远端突然多一个新分支 ref；多半是远端已 auto-delete + 你又 push 了孤儿 commit。
2. **多轮 review 跟进的 AI 节奏**：每次 push 前先 `git ls-remote origin <branch>` 确认远端还存在；如果 ref 已不在（且 PR 已合），不要 push，改走 follow-up 分支。
3. **更稳的做法**：高速循环里 round N+1 push 之前先 `git fetch && git status -sb`，看本地 `[ahead N, behind M]`；若 `behind ≠ 0` 且 develop 已含本地改动，就走 follow-up。
4. **修复操作**：
   - 删孤儿远端分支：`git push origin --delete <branch>`
   - 基于 `origin/develop` 开 follow-up 分支
   - `git cherry-pick <orphan-sha>` 把 round N+1 commit 摘出来
   - 推新分支 + 建 follow-up PR + 在原 PR 留交叉引用

## 项目侧 root cause

- `feature/* → develop` auto-merge 走 squash（CLAUDE.md `develop 历史线干净`）
- Gitea 仓库开 auto-delete-on-merge（CLAUDE.md `PR merge 后立即删`）
- `.gitea/workflows/auto-merge.yml` 每 5 分钟扫，verdict=pass 即合
- ai-review 也是异步：commit → AIBot review → comment → next loop（自然不会同步等 AI）

四者叠加导致 AI 节奏（commit-to-commit 几分钟）跟 auto-merge 节奏（5 min cron）落在同一时间窗里，**race 是大概率事件**。

## 给同类场景的硬规则

> **AI 拿到 `verdict=pass` 的 ai-review 评论后，不要立即往同一分支 push 新 commit。**
> 要么停（让 auto-merger 合掉），要么直接走 follow-up 分支。
> 即便 round N+1 改动看起来"接着上一轮做完",
> auto-merger 也可能在你 push 之前把分支删掉。

跟 [[no_self_merge_policy]]、[[verdict_pass_means_done]] 相关。
