Skip to content

os-dev 的「Add the one label」条款在 PUT-only 工具面下不可执行 —— 照做就是它要防的整集抹除(实测于 PR #5683) #5684

Description

@os-zhuang

发现于 #5649 的 CI 侧实施(PR #5683)中对 MCP issue_write 写入语义的实测。查重:搜 issue_write labels PUTos-dev.md skip-changeset label 均无既有单(仅命中 #5649 本身与 PM 登记表 #4604)。

事实

#5650(修 #5559)已落地的 .claude/agents/os-dev.md 收尾清单条款写的是:

Add the one label instead of writing the label set — a set-write wipes the size/* / documentation / tests the bots just applied

意图正确。问题是:os-dev 手上唯一能写标签的工具是 MCP issue_writelabels 字段,而它是整集 PUT。 于是「只加一个标签」照字面执行 —— issue_write(labels: ['skip-changeset']) —— 恰好就是条款要禁止的那次整集抹除。

实测(PR #5683,2026-08-06,写入前标签为 ["ci/cd","size/s"]):

调用 issue_write(method=update, issue_number=5683, labels=["skip-changeset"])
回读 GET /pulls/5683 → ["skip-changeset"]          # ci/cd 与 size/s 都不见了

timeline:
00:07:04  unlabeled  ci/cd           os-zhuang
00:07:04  unlabeled  size/s          os-zhuang
00:07:04  labeled    skip-changeset  os-zhuang

对照同一 PR 上传全集的一次写入,只产生 labeled、零 unlabeled:

调用 issue_write(labels=["skip-changeset","ci/cd","size/s"])
回读 → ["ci/cd","size/s","skip-changeset"]
00:08:04  labeled  ci/cd   os-zhuang
00:08:04  labeled  size/s  os-zhuang

补充事实(两条都是本次实测,写进单里省得下一个人再验一遍):

  • 容器里没有 gh CLI,未认证 curl 也无法写 —— 真正的新增语义 POST /issues/{n}/labels 对 os-dev 当前不可达。
  • MCP issue_readget_labels 对 PR 号直接报 Could not resolve to an Issue with the number of 5683,所以「回读」这一步也不能用它,得走 REST GET /pulls/{n}issue_read get

为什么值得修

建议的修法(措辞层面,不改工具)

把条款从「add the one label」改成工具面真正可执行的动作:先回读当前标签,再把「现有全集 + skip-changeset」一次写回,并写明为什么 —— issue_writelabels 是 PUT,不存在「只加一个」的调用方式;同时把「回读用 REST GET /pulls/{n},别用 get_labels」记进去。

⚠️ 落点是 .claude/agents/os-dev.md(以及若有同款措辞的 pm-dispatch SKILL),与 #5649 的 CI 侧 PR #5683 无文件重叠,可独立进行。

Found-during: #5649(devx 车道第 8 轮,dev 会话 session_01GX3sL71LFq8m2usg6VqTSE)。unassigned,交 PM 分诊。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions