---
date: 2026-05-11
tags: [gitea, workflow, weekly-retro, pr-template, automation]
---

# weekly-retro / follow-up issue 反复 stale：PR body 引用 issue 但漏 `Closes #N` magic keyword

## 现象

2026-05-11 一天内补关 3 个该自动闭环没自动闭环的 issue：

- #278 周复盘 2026-W19（被 #304 顺手覆盖了候选 1+4，但 #304 body 只说"针对 W19"）
- #284 follow-up 收尾清单 F6-F10（commit `43c14dff` 标题就是 "#284 F6-F9 收尾"，但 PR body 无 `Closes #284`）
- #302 周复盘 2026-W20（PR #304 body 写"针对 W20 周报（issue #302）候选改进"，但缺 magic keyword）

PR #320 / #322 反例：用了 `Closes #171` / `Closes #259`，merge 后立即自动关。

## 根因

Gitea（和 GitHub）只识别 PR body 里的 magic keyword 形式：
`Closes #N` / `Fixes #N` / `Resolves #N`（大小写不敏感）。
**纯文本引用**（"针对 #N"、"针对 W20 周报（issue #N）"、"#N 收尾"）一律不触发自动关闭。

commit message 标题里写 `#284 F6-F9 收尾` 同样不算（Gitea 只读 PR body）。

## 反复发生原因

weekly-retro skill 自动生成的 W19/W20 issue body 含完整的候选改进清单 + DOD，
开发者按候选实施时倾向**就事论事描述实现**（PR body = "针对 W20 P0 候选..."），
而**漏掉"用 Closes 关键字闭环 weekly-retro issue 本身"**这一步——
因为 weekly-retro issue 不是传统意义的 bug / feature，开发者心理上不把它当"待关闭工单"。

## 解决

### 短期（已做）

补关 #278 / #284 / #302。

### 中期（应做）

`.agents/skills/weekly-retro/SKILL.md` 在生成候选改进段末尾加显式提示：

```markdown
> **闭环要求**：实施本 issue 任一候选的 PR 必须在 body 用 `Closes #<本 issue 号>` 或 `Fixes #<本 issue 号>`，否则 merge 后 issue 仍 open，下周一 cron 触发新周报时会与新 issue 并存（label `weekly-retro` 双 open）。
```

`docs/standards/13-pr-spec.md`（PR 描述书写规范，PR #300 落地）应在 "关联 issue" 章节强调：
**"针对 #N"、"关联 #N"、"实现 #N" 等纯文本引用都不会自动关闭——要关必须用 `Closes #N`**。

### 长期（架构层）

weekly-retro cron 可在生成新周 issue 时扫一眼上周 issue：
若发现候选已被某 PR 实施（按 PR body 出现的候选关键字 / 落地 commit），
**主动评论提醒作者补 `Closes #<上周 issue>`，或脚本自动 close**——
否则会一直堆积陈年 weekly-retro issue。

## 排查方法

下次发现 weekly-retro / follow-up issue 该关没关：

1. `gh search prs` 或 Gitea API 找引用该 issue 号的 merged PR
2. 看 PR body 是否含 `Closes #N` / `Fixes #N` —— 如果是纯文本引用就是这个坑
3. 手工补关 + 在 PR body / 关闭评论里说清楚

## 关联

- PR #300（docs/standards/13-pr-spec.md PR 描述规范，应加强提醒）
- weekly-retro skill（SKILL.md 应在候选改进段加 Closes 闭环提示）
- 三次实例：#278 / #284 / #302（今天补关）
