@@ -751,46 +751,68 @@ jobs:
751751 1. It releases something
752752 -> run 'pnpm changeset' and name the packages it releases.
753753
754- WHICH LEVEL: A purely additive widening of a published package's
755- public surface (a new exported symbol on an `index`, a new accepted
756- key or value) takes at least `minor`. The commit type may raise a
757- bump but never lower it below what the act requires; a `fix(` that
758- widens an index is therefore `minor`, and a `fix(` that changes no
759- public surface stays `patch`. During the launch window `major` stays
760- refused by `check-changeset-no-major` and breaking-ness is carried by
761- the BREAKING banner plus the ADR-0087 disposition, not by the level.
762- Ruled by the maintainer on 2026-09-04 (decision batch #35) on #15294,
763- which recorded two contract reviews reading the repo's own history to
764- OPPOSITE bumps for the same additive act. The commit type is not the
765- discriminator it looked like: it correlates with the act, and when
766- they disagree the act wins. The 64 historical `patch` precedents are
767- pre-rule and nothing is retro-fixed.
754+ WHICH LEVEL: the level follows the METADATA PROTOCOL alone -- the
755+ change to what a metadata author can write -- and the commit type
756+ never decides it (maintainer ruling A, 2026-10-21, on #25105; it
757+ amends the 2026-09-04 rule of decision batch #35 on #15294, under
758+ which nearly every release was a minor: of 95 pending changesets
759+ about half were `minor` and about a dozen moved the protocol).
760+ Declare the kind on a line of its own, in the PR body AND in the
761+ changeset body, beside the `Clause-②:` line:
762+
763+ Metadata-protocol: added a new authorable key, a new accepted
764+ value or enum member, a new metadata
765+ type -> `minor`
766+ Metadata-protocol: narrowed a key removed or tombstoned, a value
767+ refused, a requirement tightened
768+ (declare the `(narrowing)` arm too)
769+ -> `minor`
770+ Metadata-protocol: semantic the meaning or default of an
771+ authorable key changes -> `minor`
772+ Metadata-protocol: none everything else: description or
773+ error text, non-authorable internal
774+ types, REST, drivers, services, the
775+ console, `feat:` and `fix!:` alike
776+ -> `patch`
777+
778+ `added` takes `minor` because spec schemas are not `.strict()`: an
779+ older runtime silently strips a key it does not know, so an app
780+ that writes a new key must be able to name a minor floor. Where
781+ several kinds apply, name the one highest in breaking-ness:
782+ `narrowed` over `semantic` over `added`. A non-protocol breaking
783+ change ships `patch` and KEEPS its carriers: the BREAKING banner
784+ and the ADR-0087 disposition are unchanged. `major` stays refused
785+ by `check-changeset-no-major` during the launch window. The
786+ GitHub Release body is grouped from these declarations by what the
787+ reader must do: 需手动处理 / 自动迁移 / 新增能力 / 语义变化 / 其他修复.
768788
769789 PART OF THIS IS A GATE, and which part is the difference between
770790 grading well and being refused. `check-changeset-no-major.mjs`
771- refuses `major` and says why in its header. Since #16055 the SAME
772- script also runs a LEVEL AXIS over the rule above, and that
773- script's header states its scope: "a PR that DECLARES clause ② (a
774- new key on a published payload) must grade AT LEAST ONE package
775- whose published source it moves `minor` or above". It mechanizes
776- this ruling "for exactly the PRs where the widening is already
777- DECLARED, and for no others", and its `judgeLevel` verdict table
778- spells both directions: `not-declared`, "the declaration reads
779- `no`", exits 0; `enforce`, "declared `yes`, moved packages graded
780- `patch` and NONE of them graded `minor` or above", exits 1. So on
781- a PR that declares clause ②, grading `patch` across the board is
782- refused; on every other PR the axis stands down and the two levels
783- below `major` are yours, as they always were.
791+ refuses `major` and says why in its header. The SAME script runs
792+ the LEVEL AXIS over the rule above, reading both lines from the PR
793+ body on every `opened`, `synchronize` and `edited` event, and its
794+ `judgeLevel` verdict table spells every direction: a declared kind
795+ must grade at least ONE package whose published source the diff
796+ moves `minor` or above (`enforce`, exit 1 otherwise); a declared
797+ `none` must grade every entry it introduces `patch` (`none-minor`,
798+ exit 1) and may not move a `packages/spec/authorable-surface/` or
799+ `authorable-defaults/` shard (`none-baseline-moved`, exit 1);
800+ `added` beside `Clause-②: no`, or `narrowed` beside a line without
801+ the `(narrowing)` arm, is a `contradiction` (exit 1); and a PR that
802+ introduces a changeset entry with no readable `Metadata-protocol:`
803+ line is refused as NOT MEASURED (exit 1) rather than ticked -- the
804+ body is re-read on `edited`, so that red clears with no push.
784805
785806 WHAT THE AXIS DOES NOT JUDGE, in its own words: "WHICH of the
786807 packages above received that widening is NOT something this gate
787- can read, and it does not claim to. Clause ② is declared ONCE, FOR
788- THE PR" -- the declaration line in the PR body names no package.
789- The axis cross-checks a declaration
790- against the levels; it never reads the diff to find the act.
791- Judging the act is still yours, this paragraph is still where the
792- rule lives, and everything in it the axis does not reach is still
793- prose.
808+ can read, and it does not claim to. The kind is declared ONCE, FOR
809+ THE PR" -- the declaration lines in the PR body name no package. A
810+ refused value, a narrowed enum or a changed meaning is invisible to
811+ the baselines, so the declaration, not the diff, is the carrier.
812+ The axis cross-checks the declarations against the levels; it never
813+ reads the diff to find the act. Judging the act is still yours,
814+ this paragraph is still where the rule lives, and everything in it
815+ the axis does not reach is still prose.
794816
795817 2. It releases nothing (.github/, .claude/, docs/, content/,
796818 examples/, tests-only, and the like)
0 commit comments