---
date: 2026-05-10
tags: [workflow, learnings, pr-hygiene, stash]
---

# 延迟沉淀陷阱：先 stash → fix → push → PR 合 → auto-delete → learning 永久悬空

## 完整模式

```
正在 A 分支干活 → 新建了 learning + 改了几个文件
    ↓
突然要切到 B 分支处理别的事
    ↓
git stash -u（把 untracked + modified 打包暂存）  ← 这步把 learning 也打包
    ↓
切到 B 分支干完
    ↓
忘记 git stash pop 回来        ← 陷阱触发点
    ↓
本分支 PR 后来合 develop（不含 stash 内容）
    ↓
远端分支 auto-delete-on-merge
    ↓
stash 里的 learning 内容彻底悬空
    ↓
若 stash drop / clear / release worktree → 物理丢失
```

## 实战样本（2026-05-10 slot-3 worktree audit 发现）

slot-3 worktree 复用至少 4 次，每次都触发一遍：

| Stash | 来自 PR | 漏沉淀内容 | 真实代价 |
|---|---|---|---|
| `stash@{3}` | PR #214 | ERR-20260501-005 citext 部署炸 dev | **5 月 8 日同坑被独立修一遍**（pr-248 本地分支）|
| `stash@{2}` | migration squash | 3 条 ERR-20260502 + AIxC 改名 | 中 |
| `stash@{1}` | dingtalk fix | 5 条 learning（部分后续被等价重写）| 低 |
| `stash@{0}` | PR #286 | ERR-20260510-002 agent-pool testing 依赖 | commit message 引用了编号但漏了文件 |

`ERR-20260501-005` 那条最痛——5 月 1 日已记录解法，因为没沉淀进 develop，5 月 8 日同坑独立修了一遍。**漏沉淀有真实成本**。

## 检测路径（slot 释放前 / PR 合并前必查）

```bash
# 1. stash 里有没有 .learnings/ untracked 文件
for n in $(git stash list --format='%gd'); do
  files=$(git stash show -u --name-only "$n" 2>/dev/null | grep '^\.learnings/')
  [ -n "$files" ] && echo "⚠️ $n: $files"
done

# 2. worktree 里有没有 .learnings/ untracked 文件
git status -uall --porcelain | grep '^?? \.learnings/'

# 3. 当前 branch tip 比 origin 领先的 commit 是不是带 .learnings/ 改动
git log --name-only origin/develop..HEAD | grep '\.learnings/'
```

任何一项有命中 → 不要 release / drop stash / push 别的 PR，先沉淀。

## 防御工作流

CLAUDE.md 188 行铁律：「本次 PR 相关的踩坑沉淀必须在 git commit 之前写入 `.learnings/`，跟代码改动同一个 commit / 同一个 PR push 上去；不允许等 PR merge 后再补」。

机制层面缺约束：

- 没有 hook 在 stash 里检测 .learnings 还允许 push
- `agent-release.sh` 默认 `git clean -fdx` 会清 untracked .learnings（参见同 PR 另一条 learning）
- commit message 写"ERR-XXXXX"但实际没附文件，没 lint 检查

## 救援手法（PR 已合 + 远端已删时）

stash 内容仍在本地。从 stash 里抠 untracked 文件不需要 pop：

```bash
# stash 第三 parent (^3) 是 untracked tree
git show "stash@{N}^3:.learnings/path/to/file.md" > .learnings/path/to/file.md

# 单文件抠出后 commit 走 rolling 分支补合 develop
git checkout -b chore/learnings-rolling-YYYYMMDD origin/develop
git add .learnings/...
git commit -m "docs(learnings): 补救 X 条 PR 漏沉淀的 learnings"
git push -u origin chore/learnings-rolling-YYYYMMDD
```

参考 PR #287 这次 5 条补救的实操。
