Repository navigation
chore(skills): delete the published objectstack-pm-dispatch skill and retire every reference that pinned it - #17325
Conversation
… retire its references
Maintainer ruling 2026-09-10 (verbatim, untranslated):
「发布版 skills/objectstack-pm-dispatch 删」
Deletes skills/objectstack-pm-dispatch/{SKILL.md,rules/dev-template.md} and
retires every reference that pinned it: the catalog row and docs page
(regenerated with gen:skill-docs), the check:skill-frame-sync COPIES entry
(one declared copy now — coherence + anti-dormancy stay, the cross-copy
isomorphism is discharged), the freshness self-test's one-copy fixture,
the dispatch-gates tier-table entry and self-test cases, the two token
ratchet pins, the compatibility exemption and its fixtures, the
doc-authoring / empty-changeset fixtures, the governed-merges comments,
the liveness ledger (pruned with --update) and the create-objectstack
expected-skill list.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MoTv7pn338AZ71owsp19gQ
…from the walk; read the symlink farm on its enumerate path The token ratchet's self-test pinned eleven SKILL.md ceilings as a literal, so a skill deleted by ruling reddened it without naming a file; it now asks the walk how many catalog entrypoints exist and that every one is priced. The create-objectstack summary test modelled a ten-link `.claude/skills/` farm, which sits exactly at COLLAPSE_AT and enumerates; the symlink-size property is now read off the ten lines themselves (lstat size, never the target tree), with the threshold assumption asserted in the test. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MoTv7pn338AZ71owsp19gQ
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
维护者速读改了什么 —— 按你的「发布版 skills/objectstack-pm-dispatch 删」,删掉对外发布目录里的 PM Dispatch 技能(SKILL.md 726 行 + 开发者模板 130 行),并把钉着它的 14 处引用一并退役:技能目录表与 docs 页(用生成器重生成)、docs 里那句「九个领域技能 + PM Dispatch」改成「+ Upgrade」、决策框架同步门禁只剩内部一份拷贝、 为什么改 —— 发布版是内部协议的过期快照(09-03 后没动过,只有三态模型,与现行六态 / 座位贴 / 条款② / 总监制完全不一致),却随 风险与代价(含回滚) —— 风险一点:决策框架同步门禁原来比较两份拷贝,现在只剩一份,跨拷贝的同构比较「被裁决清空了比较对象」,dev 保留了单份拷贝的自洽检查与「防拷贝悄悄回来」的扫描(自测里钉了一条:谁把它在原路径恢复就变红),一旦再声明第二份拷贝,比较自动重新武装。已安装到客户项目里的旧拷贝不受影响,它们本来也不会同步。回滚 = revert 一个提交,两个文件与 14 处引用一起回来。 席位意见 —— 本席按契约复审档自审通过: 你要做的 —— 人工合并本 draft PR(受管面 Generated by Claude Code |
Fixes #17311
裁决 — the maintainer's words, verbatim and untranslated (chat, 2026-09-10)
This is 删已发布能力 on the manual floor, ruled in those words. It REVERSES the 2026-09-03 batch-3 ruling, item 4 option B, which narrowed the decision-frame COPIES to two and kept the published copy —
scripts/check-skill-frame-sync.mjs:2–:4onorigin/mainread 「exists as TWO hand-written copies across two files (#5798, narrowed to two by the 2026-09-03 batch-3 ruling, item 4 option B — see COPIES below)」. The newer ruling wins: the published copy leaves with its file, and COPIES holds the internal copy alone.Governed surface (
skills/**andscripts/pm/**): draft PR, human merge only — never ready, queued, auto-merged or approved by a seat. Dispatched by the skills seat, sessionsession_01MoTv7pn338AZ71owsp19gQ(GitHubos-justin),mode:subagent, built atCONTRACT_REVIEW_TIER(clause ①: the surface editsMANDATORY_TIER_GLOBS).Every reference in the card — before → after
Measured on
origin/mainat8c9bd8f5; landed at7f9ff5ae3(16 files, +263 / −1126).skills/objectstack-pm-dispatch/SKILL.md(726 lines) andrules/dev-template.md(130 lines)npm create objectstackandnpx skills add … --skill '*'installgit rm;git ls-files skills/objectstack-pm-dispatchis emptyskills/README.md:49[PM Dispatch]catalog rowpnpm --filter @objectstack/spec gen:skill-docs("Generated from 10 SKILL.md files"); the README prose states no countpackages/spec/scripts/build-skill-docs.ts:121{ name: 'objectstack-pm-dispatch', label: 'PM Dispatch' }inDISPLAYcontent/docs/ai/skills-reference.mdxregenerated by the same tool (row :55 and section :188 gone, never hand-edited);check:skill-docsgreencontent/docs/ai/skills.mdx:129— found by the item-12 grep, not listed in the cardprocessskill that teaches no schema: it runs the multi-agent backlog → dispatch → review → land loop …"processskill that teaches no schema: it carries a metadata project across a protocol major …" — the catalog's one remaining process skill, which the sentence had omittedscripts/check-skill-frame-sync.mjs:2–:10,:130–:150published-pmCOPIES entry with English anchorsencolumn is unread; pass line says "the one declared copy … is internally coherent" instead of "1 copies … isomorphic across 1 files" — reading belowscripts/check-skill-frame-freshness.mjsSAMPLE_FRAME_FILEandFRAME_FILESfrom COPIESscripts/pm/dispatch-gates.mjs:10633MANDATORY_TIER_GLOBSentryglob: 'skills/objectstack-pm-dispatch/SKILL.md'skills/**entry from PR #17294 untouched; the docblock at :10591 gains one sentence recording the deletionscripts/pm/dispatch-gates.mjs:19182!ownPopulation.includes('skills/objectstack-pm-dispatch/SKILL.md')!ownPopulation.includes('skills/**')scripts/pm/dispatch-gates.mjs:21002scripts/pm/dispatch-gates.mjs:21022–:21023hits.length === 2)skills/**; and no per-file entry for the deleted skill survives, its old path carrying the root mandate onlyscripts/check-skills-token-ratchet.mjs:362,:454–:458scripts/check-skills-token-ratchet.mjsself-test:771,:971–:97211SKILL.md ceilingsskillMdOnDisk), with a non-vacuity case; a deleted skill can no longer red the self-test without naming a filescripts/check-skill-compatibility-version.mjs:148EXEMPTentry for the process skillscripts/check-skill-compatibility-version.mjs:552,:622,:632,:642exemptDispatchfixture in 14 cases; the three exemption cases exercised on the PM skillskills/objectstack-upgrade/SKILL.md(justification gone / grows a pin / wrong pin); R5 proves staleness with the upgrade file absent; 18 cases as beforescripts/check-doc-authoring.mjs:1807–:1809skills/objectstack-pm-dispatch/skills/objectstack-upgrade/; the narrative at :291 notes the skill's deletionscripts/check-empty-changeset.mjs:631–:632skills/objectstack-upgrade/SKILL.mdscripts/pm/check-governed-merges.mjs:211,:3661objectstack-upgradeandobjectstack-pm-dispatchhave no SKILL_MAP entry"objectstack-upgradehas no SKILL_MAP entry" (comments only)scripts/skill-identifier-liveness-ledger.json:4/:10/:16leg1Exemptionsfor the deleted filenode scripts/check-skill-identifier-liveness.mjs --update("0 exemption(s) (3 pruned; --update NEVER adds one)");leg1Exemptions: []packages/create-objectstack/src/created-summary.test.ts:58'objectstack-pm-dispatch'in the expected list of 11skills-install.tsenumerates nothing by name (--skill '*'), so no source moved — assumption D belowItem 12, the tree-wide grep after the edits (
git grep -n 'objectstack-pm-dispatch\|PM Dispatch', excludingcontent/docs/releases/): zero hits under.claude/**(none existed at the base either), zero in docs, apps, templates and fixtures. Every remaining hit is justified: the frame-sync header and COPIES docblock (the ruling and the history), its new anti-dormancy case that plants a frame at the deleted path on purpose, the token-ratchet note where the row was, the dispatch-gates docblock sentence and self-test case that pin the entry's absence, and one comment in the create-objectstack test explaining the count. The compatibility gate's header mentions "the published PM skill" by description, not by path.The one-copy reading for the two frame gates
check:skill-frame-sync— measured with a one-entry COPIES,runAllChecksstill judges: the copy's own coherence (declared count = written entries; declaring and binding sentences agree; every axis resolves through AXIS_MAP; no axis twice; every in-file count mention agrees) and the anti-dormancy scan (74 markdown files under.claude/andskills/, the declared file excluded, read for a fingerprint of the frame). The cross-copy isomorphism (the counts set, the sequence set) has one member and cannot fire. That half is DISCHARGED, not weakened: the maintainer removed its whole comparison population, and the code re-arms untouched the moment a second COPIES entry is declared. The gate stays wired; its header and pass line now say exactly which half ran. What a single copy loses in-tree is axis ORDER — it was only ever judged copy against copy — andcheck:skill-frame-freshnessjudges the sole copy's count and sequence againstorigin/maininstead.Its self-test went from 13 to 14 cases. Four cases lost their subject with the pair (cross-copy count; the English "both axes" quantifier; cross-copy reorder; the zh-pattern swap that reddened only through cross-copy disagreement). They are replaced by single-copy checks that had no pin before — the declaring/binding self-contradiction, a duplicate axis, AXIS_MAP losing a spelling — plus one discharge pin (a coherent three-axis rewrite of the sole copy stays GREEN, recorded so that a PR declaring a second copy has to flip it) and one new anti-dormancy regression pin: a frame reappearing at
skills/objectstack-pm-dispatch/SKILL.mdis red. Threepublished-pmcases were re-pointed atinternal-pm(the binding sentence removed; the declaring sentence removed; a count-mention drift, injected beside the binding sentence because the internal copy's only mention IS its declaring sentence). Roster and floor moved 13 → 14.check:skill-frame-freshness(assumption A) — the gate's arithmetic tolerates one copy:SAMPLE_COPY_ID,SAMPLE_FRAME_FILEandFRAME_FILESare all derived from COPIES, and the two-axis specimen is manufactured per copy. One self-test fixture did not tolerate it: case 7 ("a framework file exists here but not on the ref") built its ref side as every frame file except the sample — an EMPTY set with one copy — and git cannot commit an empty tree, sorefSharead as an empty string and the case judged against nothing. Measured before the fix: "✗ a framework file exists here but not on the ref → WARN, both readings stated — expected warn, got ok". Fixed inside the gate's own self-test contract (a sentinel non-frame file on the ref side, and a guard that throws if the ref commit did not land); the verdict code is untouched. Not a bypass.Reverse verification — the reds measured before each repair
rules/dev-template.md); "2 of 46 published bundle file(s) failed their check". A pinned path that no longer exists is a red read, not a "ceilings down" notice — assumption B below.readCopies()reading the deleted file — red by crash, not by skip.COLLAPSE_ATand enumerates (a directory collapses only above the threshold).维护者速读(草稿)
改了什么。 按你 2026-09-10 的裁决,删掉对外发布的
skills/objectstack-pm-dispatch技能(SKILL.md 与 rules/dev-template.md 两个文件),并把仓库里所有钉着它的地方一起收掉:技能目录索引与文档页(由生成器重生成)、决策框架同步门禁里的发布拷贝条目、派发工具的强制档位表条目、两条 token 棘轮上限、兼容性豁免与其夹具、若干门禁自测夹具、活性台账里的三条豁免、脚手架测试的期望清单。.claude/**一字未动。为什么改。 这份发布版是内部 PM 协议的一份三态旧拷贝(只认 pm:queue / pm:dispatched / needs-user-decision),和今天的协议已完全对不上,却随每个
npm create objectstack装进客户项目;已知消费者为零。留着它等于向客户 AI 分发一套过时的流程。这一裁决推翻了 2026-09-03 第三批第 4 项选 B 的决定(当时把决策框架拷贝收窄到两份并保留发布版);以新裁决为准。风险与代价(含回滚)。 已装过该技能的项目不会被动删除,只是以后不再装;仓库里没有代码引用它。决策框架的「跨拷贝同构比较」因为只剩一份拷贝而自然失效——这是比较对象被裁掉,不是门禁被削弱;单份拷贝的自洽检查与「防止拷贝悄悄回来」的扫描照常运行,并新增一条回归钉:该路径若再出现决策框架即红。回滚 = revert 本 PR 一个提交即可,所有变更都在同一提交链上,无数据迁移。
席位意见。
你要做的。 确认上述读法(尤其「同构比较已卸责」这一条),然后人工合并。本 PR 已挂
skip-changeset:没有任何 npm 包的发布内容移动(证据见下)。Acceptance notes
Gates — verdict lines (final head
7f9ff5ae3, working tree clean)pnpm check:skill-frame-sync: "✓ check-skill-frame-sync self-test: 14 cases pass, plus 5 dispatch-gates declaration cases and 3 scan-population cases (74 markdown files walked under the scan roots, 36 of them inside a references/ directory)." then "✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent (.claude/skills/pm-dispatch/SKILL.md; no second copy to compare — the cross-copy comparison is discharged until a second COPIES entry is declared) / 4 axes: business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline / binding sentence present in it; 1 count mention(s) agree; 74 markdown files scanned for undeclared copies."pnpm check:skill-frame-freshness: "✓ check-skill-frame-freshness self-test: 12 cases pass." then "✓ check-skill-frame-freshness: the decision frame in this tree is current with … 1 copy across 1 file; 4 axes: business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline / 1/1 framework files are byte-identical to the ref".node scripts/check-skills-token-ratchet.mjs --self-test: "✓ check-skills-token-ratchet self-test: 65 cases pass." Gate: "✓ check-skills-token-ratchet: 34 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted." Price tag: ratcheted (authored) 128869 / 145552 (−16683); bundle total 139495.pnpm check:skill-compatibility: "✓ check-skill-compatibility-version self-test: 18 cases pass, plus 7 dispatch-gates declaration cases." then "✓ check-skill-compatibility-version: 10 SKILL.md file(s) reconciled against 80 workspace packages / 11 pinned major(s) all match the workspace (@objectstack/spec is 17.x) / 1 justified exemption(s), each with its stated reason still true of the file."pnpm check:skill-identifier-liveness: "check-skill-identifier-liveness OK — Leg 1: 457 citation(s) over 44 published file(s) checked against 100936 implementation word tokens (0 ledgered exemption(s)); Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)."node scripts/pm/dispatch-gates.mjs --self-test(detached, 10 min): "✓ dispatch-gates self-test: 1639 cases pass." — and the CI formpnpm check:pm-dispatch-gates, run detached as well, reports the same line.--tier skills/objectstack-data/SKILL.mdis pinned inside that battery ("a catalog file is covered by exactly ONE entry — skills/**").pnpm check:doc-authoring(self-test + gate): "16 declared batteries, 198 cases registered, every battery at or above its pinned floor." then "44 published skill files clean — no internal issue-id references."node scripts/check-empty-changeset.mjs --self-test: "✓ check-empty-changeset --self-test: 118 assertions over real temp git repos (real scan() path)";--base origin/mainexit 0.pnpm check:pm-governed-merges: "✓ check-governed-merges --self-test: 274 assertions …".node scripts/pm/check-governed-merges.mjs --test FILES: exit 3 GOVERNED — "skills/** ×3 — the published skills catalog" (the two deleted files andskills/README.md).pnpm --filter @objectstack/spec run check:skill-docs: "✅ Skill docs in sync".check:docs(afterpnpm --filter @objectstack/spec buildthrough the verify lock): exit 0.check:skill-examples(after building the@objectstack/client-react...closure through the verify lock): "✅ 258 prose examples type-check across 3 surface(s)".pnpm --filter create-objectstack test(verify lock): "Test Files 16 passed (16) / Tests 203 passed (203)".typecheck: exit 0, andtsc --noEmit --listFileslistscreated-summary.test.ts(1 hit), so the typecheck covers the edited test.pnpm check:pm-skill-ratchet,pnpm check:pm-skill-id-lint,pnpm check:nul-bytes("scanned 8148 text file(s) … no raw ASCII control bytes"),pnpm check:adr-links,check:doc-anchors,check:published-readme-links,check:corpus-claim-drift,check:docs-audit-scope,check:docs-transcript-drift,@objectstack/lint check:doc-formula-expressionsandcheck:doc-security-posture(after building the@objectstack/lint...closure): all exit 0.node --stack-size=4000 node_modules/eslint/bin/eslint.js . --no-inline-config --format json— 6474 files linted, 0 errors, 0 warnings (the ten lintable files in this diff each report 0/0).node scripts/pm/dispatch-gates.mjs --commandson this worktree derived 113 families (change set read from git: 16 paths vs merge base8c9bd8f5); every family was run except two that refuse on an unbuilt tree and are recorded as NOT-MEASURED with their reason —pnpm check:dual-build-cjs-loads("PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/") andpnpm check:type-check-debt("PREREQUISITE NOT MET … Build the closure first, exactly as lint.yml does"). Both belong to the Build Core job CI runs on every PR; neither reads a file in this diff.check-plugin-teardown-shape --self-testfirst refused on the shallow clone; aftergit fetch --unshallow origin mainit passed (47 cases).check:skills-pathsand nodoc-linksscript inpackage.json; the nearest gates over skill and doc paths (check:published-readme-links,check:adr-links,check:doc-anchors,check:skill-identifier-liveness) all ran green. There is nocheck-changeset-presencescript either — see the changeset verdict.PM mechanism assumptions A–F, measured
packages/spec/scripts/build-skill-docs.ts, wired aspnpm --filter @objectstack/spec gen:skill-docs/check:skill-docs(filter-scoped, not a root script);check:skill-docsis in the derived list and is green. It also rewrites the README's generated block, which is how the catalog row left.skills-install.tsinstalls with--skill '*' --agent claude-codeand enumerates no name; the only list is the test's literal expectation, so only the test changed. Built through the verify lock and grepped:dist/has 0 hits forobjectstack-pm-dispatchagainst 3 hits for the positive controlobjectstack-ai/objectstack/skills, and the test's bytes are not indist/. One wrinkle: the ten-link.claude/skills/farm sits exactly atCOLLAPSE_ATand enumerates, so the "counts symlinks without following them" case now reads the property off the ten symlink lines (lstat size = the target path string, never the pointed-to tree) and asserts the threshold assumption explicitly. No changeset owed.Restart-touch: scripts/pm/dispatch-gates.mjs): this diff touches only theMANDATORY_TIER_GLOBStable (one entry removed), one docblock sentence, and the self-test (one case removed, two added, one path swapped). Nothing in how dispatch-gates resolves gates, populations or hints moved; the self-test's 1639 cases pass. Named here, not folded..claude/**): zero files touched (git diff --name-only BASE..HEADhas no.claude/path) and no gate asked for one. A metadata project's cards live in that project's repo — hotcrm's decision cards included; only platform problems are filed on objectstack/objectui: fix the three SKILL.md rows and the core-rules twins that send them to the objectstack inbox #17288's dev keeps that tree.Changeset verdict
No
check-changeset-presencescript exists (greppedpackage.json,scripts/,.github/). The changeset-family gates that do exist ran green:check-empty-changeset --base origin/main,check-changeset-no-major --base origin/main,check-adr-0087-registration --base origin/main,check:changeset-gate-self-tests. Theskip-changesetcriterion is that nothing published moves:packages/create-objectstackshipsdist,README.md,CHANGELOG.md—dist/grep 0 hits for the deleted name against 3 positive-control hits, and the edited test is not indist/;packages/specshipsdist,json-schema,liveness,prompts,llms.txt,README.md,src/**/*.zod.ts,api-surface,spec-changes.json— 0 hits forobjectstack-pm-dispatchorPM Dispatchacross all of them against a positive control (defineStackin README, 1 hit);skills/**,content/docs/**andscripts/**are not npm-published.skip-changesetapplied.Noted, not filed
packages/create-objectstack/src/skills-install.ts:13, :25andscaffold-skills-single-copy.test.ts:10still say "(11 skills)" inside comments that record a measurement againstskills@1.5.23on the day it was taken; a reading names its tree, so the numbers stay. 承接者: whoever next re-measures that install.%Q%insoft(), thebothnumeral, theencolumn of AXIS_MAP, the**Axisentry shape) and the freshness gate itsCOUNT_WORDS.en; all unexercised now that every declared copy iszh. Left in place and described as unread, not retired — retiring them is a gate-shape decision, not a deletion-card rider. 承接者: the skills seat, if a second copy is ever declared or the English support is retired.content/docs/ai/skills.mdxhad omitted the Upgrade skill from its catalog sentence before this change; corrected in the same sentence edit.Generated by Claude Code