Skip to content

docs(skills): the absence pin a deleting PR writes is tree-scoped - #15088

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14878-playbook-tree-scoped-pin
Sep 4, 2026
Merged

docs(skills): the absence pin a deleting PR writes is tree-scoped#15088
os-zhuang merged 1 commit into
mainfrom
claude/issue-14878-playbook-tree-scoped-pin

Conversation

@claude

@claude claude Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Part of #14878 — this is the governed half of that card's ruling D, travelling separately from the code by the ruling's own permission.

Draft on purpose, and it stays draft. .claude/skills/** is a governed surface: the maintainer merges it by hand, it is never armed, and it is never flipped ready by a seat. The code half — the two tree-scoped pins, the two live stale mentions, the reworded history line — is PR #15085. Bundling one sentence with it would have dragged the whole change onto the human-merge path.

What the ruling asked for, verbatim

The retirement playbook's deleting-PR checklist gains one sentence: the absence pin a deleting PR writes is tree-scoped.

What is here

Four lines added to the Pin 测试 item of the deleting-PR checklist in .claude/skills/spec-property-retirement/SKILL.md, in the file's own language and voice. They say: the absence pin is tree-scoped and never file-scoped; a file-scoped one only sees the file its author thought of, and the references that rot are the ones the author did not know about (measured — five surviving references across three packages, two cards, two of them written after the deletion by a later PR); exclude **/CHANGELOG.md, .changeset/ and the pin itself with the reason written beside it, ⛔ never an allowlist file; and ⛔ an assertion of absence is not a stale mention — "repairing" it deletes the guard.

That last clause is the one this card exists for. The pin the playbook is teaching contains expect(plugin!.text).not.toContain(...), and a naive fixer clearing a stale-mention report would delete exactly that line.

Ratchet — paid, not raised

✓ check-skill-line-ratchet: .claude/skills/spec-property-retirement/SKILL.md
    is 337 lines (ceiling 337; headroom 0)
pnpm check:pm-skill-ratchet   EXIT=0

333 → 337, inside the headroom that already existed. ⛔ No ceiling raised (that needs a maintainer ruling), ⛔ nothing re-wrapped to buy room — the first draft was six lines and was rewritten shorter rather than paid for out of neighbouring text.

This file is .claude/skills/** (internal agent tooling), not the published skills/ surface, so the published-skill net-growth budget does not apply to it; the line ratchet above is what governs it and it is green.

Verification, at 025072000

Gate family from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack — 18 commands, exit codes captured before any pipe. 16 green, including check:pm-skill-ratchet, check:pm-governed-merges, check:skill-frame-sync, check:doc-authoring, check:agent-test-spelling, check:nul-bytes, check:required-contexts and both cross-package-inputs limbs.

Two came back exit 3 = NOT MEASURED (never a pass, never a red): check-test-completeness (wants a saved turbo run test log) and check:doc-formula-expressions (PREREQUISITE NOT MET in an unbuilt worktree).

@objectstack/spec declares this exact file as a cross-package test input, so its reader was run rather than assumed:

pnpm --filter @objectstack/spec exec vitest run src/shared/retired-key-migrate-sentence.test.ts
  Test Files  1 passed (1)      Tests  14 passed (14)

🤖 Generated with Claude Code

Generated by Claude Code


Generated by Claude Code

The retirement playbook's deleting-PR checklist tells an author to write a
negative pin, and said nothing about its SCOPE. A file-scoped one can only look
where its author thought to look, and the whole failure mode is references the
author did not know about — measured on a real removal: five surviving
references across three packages, two triage cards, and two of the five written
AFTER the deletion by a later PR, which only a pin that runs on every PR can
catch.

Four lines, inside the existing ratchet headroom (337 lines, ceiling 337). ⛔ No
ceiling was raised and nothing was re-wrapped to buy room.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@os-zhuang
os-zhuang marked this pull request as ready for review September 4, 2026 04:46
@os-zhuang
os-zhuang enabled auto-merge September 4, 2026 04:46
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 4, 2026
Merged via the queue into main with commit 7851d38 Sep 4, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14878-playbook-tree-scoped-pin branch September 4, 2026 05:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants