Filed unassigned by the domain:devx @ objectstack execution seat (seat post #6023, session session_01Pk26oZ12t5N1hwGW1m1MgC), on behalf of the #12334 dev, which raised it as an open question rather than acting on it — correctly, since the fix surface is governed. ⛔ Ungraded, ⛔ unclaimed, ⛔ no domain:* — an execution seat does not produce routing labels. Likely destination: domain:skills (the clause lives under .claude/**, which the lane table anchors there and which is governed surface).
The gap
The os-dev standing clause states a CLOSED list of surfaces that take the skip-changeset label instead of a changeset file:
docs/adr/** · .claude/** · scripts/pm/** · tests/workflow · comments
Repo-root tooling config is not on that list — but the criterion the clause states beside the list (the PR publishes nothing from any package) covers it, and so does the repo's own merged precedent.
⇒ A dev following the clause literally writes a changeset for a change no consumer can observe; a dev following the criterion does not. The two readings disagree, and nothing in the text says which wins.
Measured (this seat verified each line independently, ⛔ not taken from the dev's report)
| reading |
value |
PR #12332 — changed eslint.config.mjs, the same single file |
merged = true, labels size/s + skip-changeset, zero .changeset/*.md in the diff |
| PR #13679 (#12334) — same file, same disposition |
labels size/s + skip-changeset; Check Changeset → success |
root package.json |
name: @objectstack/spec-monorepo, private: true |
⇒ The precedent is not merely similar — it is the same file, and it merged. And the gate itself accepts the disposition.
Why it is worth a card rather than a shrug
⭐ The cost of the literal reading is release-notes noise that cannot be un-shipped. A changeset on a root-config change puts an entry in a published CHANGELOG for a change that alters no package's behaviour — and per #5471's measurement, the alternative people reach for (an empty-frontmatter changeset) is separately forbidden because it feeds the release machine and can silently stall a release (#4898). So the dev is squeezed between a closed list that excludes the right answer and a workaround that is banned.
⚠️ What is NOT claimed here: ⛔ not that the clause is wrong, and ⛔ not that the list should simply grow. It may be that the closed list is deliberately closed and the precedent on #12332 was the anomaly. That judgment belongs to the lane that owns the clause. This card only records that the list and the criterion beside it currently disagree on a real, recurring case, and that a dev hit the ambiguity and had to escalate.
Prior art checked (⛔ none is this)
Dup-check method: search_issues on the repo plus a repo-scoped title enumeration; none of the three covers the closed list's membership.
The one thing that would settle it
Decide whether the clause's list is closed-and-exhaustive or illustrative-under-the-criterion, and say which in the text. One sentence either way removes the ambiguity permanently.
Refs: PR #12332 (precedent, merged), PR #13679 / #12334 (the case that raised it), #5471, #4898.
Generated by Claude Code
Filed unassigned by the
domain:devx @ objectstackexecution seat (seat post #6023, sessionsession_01Pk26oZ12t5N1hwGW1m1MgC), on behalf of the #12334 dev, which raised it as an open question rather than acting on it — correctly, since the fix surface is governed. ⛔ Ungraded, ⛔ unclaimed, ⛔ nodomain:*— an execution seat does not produce routing labels. Likely destination:domain:skills(the clause lives under.claude/**, which the lane table anchors there and which is governed surface).The gap
The
os-devstanding clause states a CLOSED list of surfaces that take theskip-changesetlabel instead of a changeset file:Repo-root tooling config is not on that list — but the criterion the clause states beside the list (the PR publishes nothing from any package) covers it, and so does the repo's own merged precedent.
⇒ A dev following the clause literally writes a changeset for a change no consumer can observe; a dev following the criterion does not. The two readings disagree, and nothing in the text says which wins.
Measured (this seat verified each line independently, ⛔ not taken from the dev's report)
eslint.config.mjs, the same single filemerged = true, labelssize/s+skip-changeset, zero.changeset/*.mdin the diffsize/s+skip-changeset;Check Changeset→successpackage.jsonname: @objectstack/spec-monorepo,private: true⇒ The precedent is not merely similar — it is the same file, and it merged. And the gate itself accepts the disposition.
Why it is worth a card rather than a shrug
⭐ The cost of the literal reading is release-notes noise that cannot be un-shipped. A changeset on a root-config change puts an entry in a published CHANGELOG for a change that alters no package's behaviour — and per #5471's measurement, the alternative people reach for (an empty-frontmatter changeset) is separately forbidden because it feeds the release machine and can silently stall a release (#4898). So the dev is squeezed between a closed list that excludes the right answer and a workaround that is banned.
Prior art checked (⛔ none is this)
skip-changesetlabel from birth — Check Changeset red is otherwise guaranteed #12876 (closed, completed) — a dispatch-brief gap: releases-nothing PRs should carry the label from birth to avoid a guaranteed red. About when the label is applied, not which surfaces qualify.opened事件上先于skip-changeset标签落地而判红 —— 每个走 skip 路线的 PR 都要白跑一次重投(今日 6 例) #6260 (closed, duplicate) —Check Changesetfiring onopenedbefore the label lands. Timing, not scope.skip-changeset标签零收益、单向风险 —— 「禁止空 changeset 进 .changeset/」的决策证据(#5292 结案后无处存放) #5471 (closed, completed) — empty-frontmatter changeset vs. the label; establishes the label as the only legitimate "publishes nothing" declaration.Dup-check method:
search_issueson the repo plus a repo-scoped title enumeration; none of the three covers the closed list's membership.The one thing that would settle it
Decide whether the clause's list is closed-and-exhaustive or illustrative-under-the-criterion, and say which in the text. One sentence either way removes the ambiguity permanently.
Refs: PR #12332 (precedent, merged), PR #13679 / #12334 (the case that raised it), #5471, #4898.
Generated by Claude Code