Skip to content

decision(spec): 批 #65 明令的 major changeset 在落地时测出不可执行 —— PR #19610 已按 minor + BREAKING banner 出,请追认或否决 #19611

Description

@os-warren

Ruled: 5770445652 · letter A · 2026-09-22T02:40Z — batch #210 item 3; PR #19610 as merged is ratified; closed completed

Path: P3 | none | 对向事实 — 裁决批 #65 明令的 major changeset 在落地时测出不可执行

⏱️ Filed by the domain:spec execution seat 2 (session session_01UDXER3sdqfeVYpEWZs5mZx), under the standing clause: 裁决明令的动作实施中测出对向事实 ⇒ 冲突立成 needs-user-decision 卡,该 PR ⛔ 不挂 auto-merge 留异议窗口. PR #19610 is therefore ⛔ NOT enqueued and ⛔ NOT auto-merged.

⛔ The ruled ACTION — retiring the plugin-security scan-result family under ADR-0049 — is executed and is not in question. Only the changeset's digit is.

维护者速读

#65 你裁了「退役这组扫描结果面」,裁决里写的是 major changeset。实施时撞上一件事:major 现在根本落不了地

两条都在主干上,而且都比那条裁决:

  • scripts/check-changeset-no-major.mjs 是必过门禁,发射窗口期内直接拒收 major —— 因为 70 个包在同一个 fixed 组里,一个 major 会把它们全推上去。
  • 退役 playbook 已于 2026-09-20 改成明写 「@objectstack/specminor,⛔ 不用 major……破坏性语义由 BREAKING banner 承载」。那次提交的标题就是「the retirement playbook prescribes a minor changeset, not the major a li…」——它就是为了修这个而写的,而且比批 Add comprehensive test coverage for ObjectStack spec protocols - 100% coverage achieved #65 晚 13 天。

⚠️ 本段已更正,见本卡评论 5764818911 照字面写 major 会被那道守卫拒收 —— 但 ⛔ 不是「合不进去」:pr-automation.yml 里那一步带着 && steps.allow_major.outputs.allow != true,并在其上实时重读 PR 标签(⛔ 不读事件载荷),命中 allow-major 时守卫主动让开。⇒ 准确说法:major 需要某个人明示挂上 allow-major,代价是 fixed 组里 70 个包一起上大版本

⚠️ 另有第三件仪器站在 major 那边:packages/spec/scripts/build-schemas.ts:1072 的门禁失败提示至今写着 「a major changeset carrying the FROM → TO mapping」。散文不是强制,但若裁 minor,这段文本要跟着动,否则下一个退役的人照它写 major 再撞守卫。

⭐ 一条支持 minor 的硬事实:守卫的 judge()实跑的 —— .changeset/pre.json 在主干上不存在(2026-08-14 随 changeset pre exit 删除),majorenforce。⇒ 守卫比那条裁决早三周就武装好了,裁决写下 major 的当天它就落不了地。

dev 已按 minor + BREAKING banner(带 FROM → TO 映射与一行修复)+ ADR-0087 处置标记 落地,两道门都绿,并且在 PR 正文里单开一节写明了这个分歧,⛔ 没有偷偷选。

我荐 A = 维持现状。这不是我替你改裁决:裁决要的是「破坏性」这个语义,而本仓自己的写法把这个语义从版本号挪到了 banner 上。回一个字母即可;不回也行 —— 这是否决窗口,你不同意就回滚,改回 major 只要改一行。

os-decision-facets

  • ① 项目长远合理性:A 不新增特例 —— 它让退役走本仓已经成文的那一条路(banner 承载破坏性),裁决与 playbook 归一;B 则让一条裁决的字面把一个必过门禁永久钉红,以后每张退役卡都要再吵一次。
  • ② 实际业务拉动:今天为零 —— 这四个名字零消费者,正是最干净的退役时点。拉动来自下游:CHANGELOG.md 里的 BREAKING banner 才是升级中的 agent 撞到墓碑后 grep 的东西,版本号不是。
  • ③ 防 AI 犯错:A 的失败是响亮的(墓碑拒收 + banner 里的 FROM → TO);B 的失败是门禁常红,而常红的门禁就是被无视的门禁 —— 那比没有门禁更糟。
  • ④ 创业阶段不扩散:A 零新增义务;B 会把 70 个包一起推上一个大版本,发射窗口期内这是纯扩散。

Prior rulings read: changeset-major,launch-window,retirement-playbook,check-changeset-no-major → thread: 5564446653(批 #65,明令 major); 后续治理:2951c0f8f8(2026-09-20,playbook 改判 minor); 维护者 2026-08-27 「项目在创业阶段,用户也很少,短期不考虑渐进」

Options × real cost

option what is done what anyone can perceive
A — keep minor + BREAKING banner + ADR-0087 marker (already shipped, gates green) Nothing further. Upgrading readers get the FROM → TO mapping and the one-line fix in CHANGELOG.md, which is what they actually grep. The version digit does not move 70 packages.
B — write the literal major One-line changeset edit, plus a human hanging allow-major on the PR. Not a permanently red gate. It is 70 packages promoted to a new major in one go, plus one explicit human action — the cost moves from 「technically impossible」 to 「wide, but yours to choose」.
C — rule that this removal is the case that ends the launch-window convention early Lift the guard, then major. A real decision with real reach — it re-prices every package in the fixed group. ⛔ Far beyond this card.

业务含义直译 —— A =「破坏性写在发布说明里,版本号不动」;B =「按字面写,然后这张 PR 永远合不进去」;C =「借这一张卡结束发射窗口」。

推荐:A(已执行,否决窗口)。 回退项:若你要 B,一行 changeset 改回 major,代价是那道门禁常红直到 C 发生。置信缺口:我没有量过把发射窗口的守卫抬掉会波及多少已发布包的消费者,所以 C 的真实代价我只能说「至少是 70 个包的一次大版本」,不能说「就这么多」。

自检行:只看①选 A;②③④ 是否翻转:否。

Duplicate-search terms

check-changeset-no-major · 发射窗口 major 拒收 · spec-property-retirement changeset level · 批 #65 major · BREAKING banner 承载破坏性


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions