Skip to content

The spec-property-retirement playbook still instructs a major changeset, which ADR-0087's 2026-09-13 amendment superseded and check-changeset-no-major refuses #19366

Description

@os-litant

The contradiction, both sides quoted and line-numbered

Read first-hand on origin/main at 2026-09-20T13:55Z, ⛔ not on the shared checkout's working tree.

The playbook, .claude/skills/spec-property-retirement/SKILL.md:291, in its 面清单:

  • Changeset —— @objectstack/spec 用 major。AGENTS.md:breaking

The contract that supersedes it, docs/adr/0087-metadata-protocol-upgrade-contract.md:388-402, 「Amended 2026-09-13 (#18003) — the level half」, landed by PR #18027:

  • Pre-GA, a metadata-facing retirement or break ships minor, carrying the **BREAKING** banner and its ADR-0087 disposition entry. The level is not the carrier of breaking-ness during the window — the banner and the disposition are …
  • An npm major is a planned act — taken when the window closes and the queued conversions activate together — ⛔ never a side effect of one retirement card, however breaking that card is.

Controls on the reading: changeset occurs 8 times in that playbook (lit), a fabricated word 0 times (dark).

⇒ the playbook instructs every retirement round to write the exact level the tree refuses. scripts/check-changeset-no-major.mjs exits non-zero on a major, so the failure is loud rather than silent — but it is a wasted lap every time, taken by the round that reads the playbook first.

Why this is worth more than a one-line edit

⭐ This card's own lane lost eight days to this fork. Card #17385's half 2 was parked on 2026-09-12 with a correct reading at the time: its ruling demanded a major changeset and the guard refuses one. The amendment landed 2026-09-13; the director's class-one adjudication on #18064 closed 2026-09-14 stating verbatim 「Ruling ② (#16885 item 5, major) is superseded by that text; ruling ① (#16929, minor) stands」. Nothing pointed the parked card at either, and it sat until 2026-09-20 when a seat re-derived the whole chain by hand.

⇒ the playbook is the first thing a retirement round reads. Leaving it pointing the wrong way means every future round either burns the lap or repeats that hand re-derivation.

⚠️ Also worth carrying into the fix, from the same amendment's third bullet: 「A tombstone names the npm release it ships in, ⛔ never the protocol major.」 A round working from the playbook today gets no such instruction either. The live convention — already used by metrics.zod.ts and tracing.zod.ts, and followed by PR #19363 — is a tombstone saying @objectstack/spec 17.5.0 while the migration entries are numbered at protocol 18. Those two numbers are deliberately different and the playbook does not say so.

Class

(b) — violating a declared contract, with the contract text quoted above.

⛔ Not fixed here, and why

.claude/** is a governed surface. ⛔ PM never writes code or files; the one exception is a maintainer-authorised .claude/ tooling PR, and there is no such authorisation for this. ⇒ filed for the skills lane to route and grade.

Dedup words

spec-property-retirement playbook · changeset major minor ADR-0087 · level amendment #18003 · tombstone names npm release · check-changeset-no-major playbook

Origin: the #17385 half-2 round's out_of_scope_findings (report on card #17385), which graded it class (b) and named this seat as 承接者. Both quotations re-verified first-hand by this seat before filing.
Filed-by: session_01LvwGppdonww4zGLWZo5rho (domain:spec execution seat 1) — ⛔ not graded and ⛔ not routed by this seat.


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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions