Skip to content

update_pull_request 每次编辑都剥掉尾部 _Generated by [Claude Code]_ footer —— 只剥裸 URL 那种,带 session URL 的存活;它被误读成「机器在改我的 PR」,已造成一次 auto-merge 静默销毁 #6567

Description

@hotlong

发现于 #6494 / PR #6556 实施期间(devx 车道执行座位)。按 Prime Directive #10 只记录不修,未认领未打 finding:它不是「今天没人撞得到」的观察类 —— 今晚已经撞出一次事故(见下),但定级仍留分诊座位,我不自评。

机制(复现两次,第三次按假设修复成功)

派发模板要求 PR 正文以这一段收尾:

---
_Generated by [Claude Code](https://claude.ai/code)_

实测在 PR #6556 上:

动作 正文尾部(pull_request_read get / search_issues 回读的存储态
create_pull_request 建单,正文含裸 URL footer footer ,但 URL 被改写为 https://claude.ai/code/session_01BDmDsu2575gDxeMCxXhDE3(我没写过这个形式)
第 1 次 update_pull_request,正文含裸 URL footer footer 整段消失--- 与那一行都没了)
第 2 次 update_pull_request,裸 URL footer,--- 与正文之间多加一个空行 仍然整段消失
第 3 次 update_pull_request,footer 改用 session URL 形式 footer 存活至今

即:被剥的是 URL 为裸 https://claude.ai/code 的那一种;带 session URL 的那一种存活。 建单路径(create_pull_request)不剥,只把裸 URL 改写成 session 形式;编辑路径(update_pull_request)直接剥掉。

⚠️ 我只测到「哪种被剥、哪种存活」,没有测到是谁剥的(平台 sanitizer、MCP 工具层、还是仓内某个 workflow 的正文后处理,本条无法区分)。这一格留空,不猜。

为什么这条比它本身重要:它解开了今晚一桩事故的成因

#6327 的 dev 读回自己的 PR 正文,发现 footer 变成了他没写过的形式,把这当成「有机器在后处理我的 PR」的指纹,据此推断「那 draft 状态也是同一个后处理翻的」,于是把 PM 已翻成 ready 的 PR 改回 draft —— 静默销毁了 auto-merge 与合并队列成员资格(pull_request_read 两者都不暴露,所以他也看不见自己毁了什么)。

没看错:平台确实在改写 footer,这是上表第一行的实测。他错在推理的第二步 —— 从「机器动过正文」推出「机器也动了 draft」。这两件事没有关系:正文改写是本条记录的机制,而 draft 翻转是 PM 流程的正常一步(dev 交草稿 → PM 翻 ready 并挂 auto-merge)。

所以本单要留下的是两件事,缺一不可:

  1. 机制本身 —— 哪种 URL 被剥、哪种存活、哪条路径剥、复现几次(上表)。
  2. 它会被误读成什么 —— 一个 agent 在自己的 PR 上看到自己没写过的正文形式,最自然的解释就是「有东西在自动改我的 PR」;一旦接受了这个前提,任何别的状态变化(draft、label、assignee、auto-merge)都会被归到同一个「它」头上,然后被「纠正」回去。共享 GitHub 身份让这一步格外滑:那些变化确实不是他做的,只不过来自另一个 agent,不是机器。

建议写进 AGENTS.md / 派发模板的一句话(措辞留分诊与维护者定):正文被改写是已知且无害的;它不是任何其它状态变化的证据。在共享身份下,一个意料之外的状态变化远比机器噪音更可能是另一个 actor —— 问 PM,不要「纠正」。

对本条机制本身的应对(已验证可用)

写 footer 时直接使用 session URL 形式:

---
_Generated by [Claude Code](https://claude.ai/code/session_XXXXXXXX)_

建单与编辑两条路径下都存活。(PR #6556 现在就是这个形态。)

相邻(非重复)

去重检索:PR 正文 sanitizer 改写footer Generated by Claude Codedraft auto-merge 合并队列 回退 三次 search_issues 均无同形单。

发现会话:session_01BDmDsu2575gDxeMCxXhDE3(devx 车道执行座位)。严重度与路由留分诊座位判定。


Generated by Claude Code

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions