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 面清单:
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
The contradiction, both sides quoted and line-numbered
Read first-hand on
origin/mainat 2026-09-20T13:55Z, ⛔ not on the shared checkout's working tree.The playbook,
.claude/skills/spec-property-retirement/SKILL.md:291, in its 面清单: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:Controls on the reading:
changesetoccurs 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.mjsexits non-zero on amajor, 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
majorchangeset 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.
metrics.zod.tsandtracing.zod.ts, and followed by PR #19363 — is a tombstone saying@objectstack/spec 17.5.0while 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 theskillslane 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 playbookOrigin: 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:specexecution seat 1) — ⛔ not graded and ⛔ not routed by this seat.Generated by Claude Code