Skip to content

chore(skills): delete the published objectstack-pm-dispatch skill and retire every reference that pinned it - #17325

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-17311-delete-published-pm-skill
Sep 10, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-17311-delete-published-pm-skill

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #17311

裁决 — the maintainer's words, verbatim and untranslated (chat, 2026-09-10)

  • The question, 03:1xZ: 「对外发布的 skills/objectstack-pm-dispatch/SKILL.md 这个很老了,和现在的也完全不一致吧?是否建议删除。」
  • The ruling, 05:3xZ: 「发布版 skills/objectstack-pm-dispatch 删」

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–:4 on origin/main read 「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/** and scripts/pm/**): draft PR, human merge only — never ready, queued, auto-merged or approved by a seat. Dispatched by the skills seat, session session_01MoTv7pn338AZ71owsp19gQ (GitHub os-justin), mode:subagent, built at CONTRACT_REVIEW_TIER (clause ①: the surface edits MANDATORY_TIER_GLOBS).

Every reference in the card — before → after

Measured on origin/main at 8c9bd8f5; landed at 7f9ff5ae3 (16 files, +263 / −1126).

Reference Before After
skills/objectstack-pm-dispatch/SKILL.md (726 lines) and rules/dev-template.md (130 lines) shipped into every npm create objectstack and npx skills add … --skill '*' install deleted with git rm; git ls-files skills/objectstack-pm-dispatch is empty
skills/README.md:49 the [PM Dispatch] catalog row row gone — the table is a generated block, rewritten by pnpm --filter @objectstack/spec gen:skill-docs ("Generated from 10 SKILL.md files"); the README prose states no count
packages/spec/scripts/build-skill-docs.ts:121 { name: 'objectstack-pm-dispatch', label: 'PM Dispatch' } in DISPLAY entry removed; content/docs/ai/skills-reference.mdx regenerated by the same tool (row :55 and section :188 gone, never hand-edited); check:skill-docs green
content/docs/ai/skills.mdx:129 — found by the item-12 grep, not listed in the card "plus PM Dispatch, a process skill that teaches no schema: it runs the multi-agent backlog → dispatch → review → land loop …" "plus Upgrade, a process skill that teaches no schema: it carries a metadata project across a protocol major …" — the catalog's one remaining process skill, which the sentence had omitted
scripts/check-skill-frame-sync.mjs:2–:10, :130–:150 header claims TWO copies; published-pm COPIES entry with English anchors header rewritten for one copy; entry removed; AXIS_MAP / ENTRY_START docblocks say the en column is unread; pass line says "the one declared copy … is internally coherent" instead of "1 copies … isomorphic across 1 files" — reading below
scripts/check-skill-frame-freshness.mjs derives SAMPLE_FRAME_FILE and FRAME_FILES from COPIES one self-test fixture needed a one-copy reading (assumption A below); pass line pluralised ("1 copy across 1 file")
scripts/pm/dispatch-gates.mjs:10633 MANDATORY_TIER_GLOBS entry glob: 'skills/objectstack-pm-dispatch/SKILL.md' entry removed (the self-test refuses a dead glob); the skills/** entry from PR #17294 untouched; the docblock at :10591 gains one sentence recording the deletion
scripts/pm/dispatch-gates.mjs:19182 !ownPopulation.includes('skills/objectstack-pm-dispatch/SKILL.md') !ownPopulation.includes('skills/**')
scripts/pm/dispatch-gates.mjs:21002 "the published PM skill (one enforced frame copy) is fable-mandatory" case removed — no subject
scripts/pm/dispatch-gates.mjs:21022–:21023 "covered by its own entry AND skills/**" (hits.length === 2) two cases: a catalog file is covered by exactly ONE entry, skills/**; and no per-file entry for the deleted skill survives, its old path carrying the root mandate only
scripts/check-skills-token-ratchet.mjs:362, :454–:458 ceilings 9708 (SKILL.md) and 1838 (dev-template.md) both rows removed with their provenance comments; a short note stays where the SKILL.md row was. Ceilings down by 11,546 (157,098 → 145,552); authored subtotal 128,869; bundle total 139,495
scripts/check-skills-token-ratchet.mjs self-test :771, :971–:972 a literal 11 SKILL.md ceilings derived from the walk (skillMdOnDisk), with a non-vacuity case; a deleted skill can no longer red the self-test without naming a file
scripts/check-skill-compatibility-version.mjs:148 EXEMPT entry for the process skill removed; the header now says ONE exempt file
scripts/check-skill-compatibility-version.mjs:552, :622, :632, :642 exemptDispatch fixture in 14 cases; the three exemption cases exercised on the PM skill fixture removed; the three cases re-pointed at skills/objectstack-upgrade/SKILL.md (justification gone / grows a pin / wrong pin); R5 proves staleness with the upgrade file absent; 18 cases as before
scripts/check-doc-authoring.mjs:1807–:1809 placeholder fixture planted under skills/objectstack-pm-dispatch/ planted under skills/objectstack-upgrade/; the narrative at :291 notes the skill's deletion
scripts/check-empty-changeset.mjs:631–:632 GREEN 3 fixture spells the PM skill path spells skills/objectstack-upgrade/SKILL.md
scripts/pm/check-governed-merges.mjs:211, :3661 "objectstack-upgrade and objectstack-pm-dispatch have no SKILL_MAP entry" "objectstack-upgrade has no SKILL_MAP entry" (comments only)
scripts/skill-identifier-liveness-ledger.json:4/:10/:16 three leg1Exemptions for the deleted file pruned by the script's own node 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 11 name dropped (10); skills-install.ts enumerates nothing by name (--skill '*'), so no source moved — assumption D below

Item 12, the tree-wide grep after the edits (git grep -n 'objectstack-pm-dispatch\|PM Dispatch', excluding content/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, runAllChecks still 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/ and skills/, 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 — and check:skill-frame-freshness judges the sole copy's count and sequence against origin/main instead.

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.md is red. Three published-pm cases were re-pointed at internal-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_FILE and FRAME_FILES are 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, so refSha read 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

  • Token ratchet on the bare deletion: "✗ check-skills-token-ratchet: cannot read skills/objectstack-pm-dispatch/SKILL.md — red, not a skip (check:react-declaration-parity 是唯一没接进任何 workflow 的源码审计门禁,且无 MANIFEST 时静默 skip 退出 0 —— 它现在永远不可能红 #4690)" (and the same for 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.
  • Compatibility gate on the bare deletion: "stale exemption: skills/objectstack-pm-dispatch/SKILL.md is on the exemption list but was not found."
  • Liveness gate on the bare deletion: "[stale-exemption] 3 ledger entries are no longer reached by the scan … run with --update to prune the ledger and commit it."
  • Frame-sync on the bare deletion: ENOENT thrown from readCopies() reading the deleted file — red by crash, not by skip.
  • Freshness self-test with one copy and the old fixture: "expected warn, got ok" (above).
  • Token-ratchet self-test with the literal pin: "✗ every SKILL.md still carries its own ceiling (got 10, want 11)".
  • create-objectstack with a ten-name list and the old assertion: "AssertionError: .claude/skills/ must appear as its own line: expected undefined to be truthy" — the ten-link farm sits exactly at COLLAPSE_AT and 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 form pnpm check:pm-dispatch-gates, run detached as well, reports the same line. --tier skills/objectstack-data/SKILL.md is 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/main exit 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 and skills/README.md).
  • pnpm --filter @objectstack/spec run check:skill-docs: "✅ Skill docs in sync". check:docs (after pnpm --filter @objectstack/spec build through 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, and tsc --noEmit --listFiles lists created-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-expressions and check:doc-security-posture (after building the @objectstack/lint... closure): all exit 0.
  • Full lint, not narrowed: 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).
  • Derivation and reconciliation: node scripts/pm/dispatch-gates.mjs --commands on this worktree derived 113 families (change set read from git: 16 paths vs merge base 8c9bd8f5); 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/") and pnpm 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-test first refused on the shallow clone; after git fetch --unshallow origin main it passed (47 cases).
  • Dispatch-named gates that do not exist by that spelling: there is no check:skills-paths and no doc-links script in package.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 no check-changeset-presence script either — see the changeset verdict.

PM mechanism assumptions A–F, measured

  • A (one-copy COPIES): the freshness arithmetic tolerates one copy; only its case-7 fixture hard-coded a pair by construction (empty ref side). Fixed in the gate's own self-test; stated above.
  • B (token ratchet): removing a pinned file does not lower the total by itself — the ratchet reds on the dead row ("cannot read … red, not a skip"), so the rows must go with the files. After that, the price tag reads ceilings down by 11,546 in the shrink-only direction, no ruling needed.
  • C (docs generator): packages/spec/scripts/build-skill-docs.ts, wired as pnpm --filter @objectstack/spec gen:skill-docs / check:skill-docs (filter-scoped, not a root script); check:skill-docs is in the derived list and is green. It also rewrites the README's generated block, which is how the catalog row left.
  • D (create-objectstack): skills-install.ts installs with --skill '*' --agent claude-code and 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 for objectstack-pm-dispatch against 3 hits for the positive control objectstack-ai/objectstack/skills, and the test's bytes are not in dist/. One wrinkle: the ten-link .claude/skills/ farm sits exactly at COLLAPSE_AT and 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.
  • E (dispatch-gates: STAGE-THEN-RUN reaches a program by an edge neither follow traverses — check:objectui-changeset inherits nothing from scripts/bump-objectui.sh #14290, Restart-touch: scripts/pm/dispatch-gates.mjs): this diff touches only the MANDATORY_TIER_GLOBS table (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.
  • F (.claude/**): zero files touched (git diff --name-only BASE..HEAD has 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-presence script exists (grepped package.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. The skip-changeset criterion is that nothing published moves: packages/create-objectstack ships dist, README.md, CHANGELOG.md — dist/ grep 0 hits for the deleted name against 3 positive-control hits, and the edited test is not in dist/; packages/spec ships dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, api-surface, spec-changes.json — 0 hits for objectstack-pm-dispatch or PM Dispatch across all of them against a positive control (defineStack in README, 1 hit); skills/**, content/docs/** and scripts/** are not npm-published. skip-changeset applied.

Noted, not filed

  • packages/create-objectstack/src/skills-install.ts:13, :25 and scaffold-skills-single-copy.test.ts:10 still say "(11 skills)" inside comments that record a measurement against skills@1.5.23 on the day it was taken; a reading names its tree, so the numbers stay. 承接者: whoever next re-measures that install.
  • The frame-sync gate keeps its English-copy machinery (%Q% in soft(), the both numeral, the en column of AXIS_MAP, the **Axis entry shape) and the freshness gate its COUNT_WORDS.en; all unexercised now that every declared copy is zh. 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.
  • With one copy, the axis ORDER of the sole frame copy is not machine-checked in-tree (it never was except against another copy); the header says so. A canonical-order pin against AXIS_MAP would be a new check. 承接者: none — the population was removed by ruling.
  • content/docs/ai/skills.mdx had omitted the Upgrade skill from its catalog sentence before this change; corrected in the same sentence edit.

Generated by Claude Code

… 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
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing 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
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 501959b72a1c08ffa861c72493324a830c080fd0 → packageMentionDocs.

@os-justin os-justin added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 10, 2026 — with Claude
@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling labels Sep 10, 2026

Copy link
Copy Markdown
Collaborator Author

维护者速读

改了什么 —— 按你的「发布版 skills/objectstack-pm-dispatch 删」,删掉对外发布目录里的 PM Dispatch 技能(SKILL.md 726 行 + 开发者模板 130 行),并把钉着它的 14 处引用一并退役:技能目录表与 docs 页(用生成器重生成)、docs 里那句「九个领域技能 + PM Dispatch」改成「+ Upgrade」、决策框架同步门禁只剩内部一份拷贝、dispatch-gates 强制档表里它自己那条与两条自测、token 棘轮两条 pin、兼容版本登记与夹具、两处门禁夹具、审计脚本注释、标识存活台账三条、create-objectstack 的安装清单测试。没有任何发布包的源码改动,不欠 changeset。

为什么改 —— 发布版是内部协议的过期快照(09-03 后没动过,只有三态模型,与现行六态 / 座位贴 / 条款② / 总监制完全不一致),却随 npm create objectstack 装进每个新应用、随 npx skills add --skill '*' 装进存量项目;已知消费者为零(hotcrm 没装,你是开两个仓跑 PM)。它教客户一套不存在的状态机,删掉比维护第二份真理便宜。这推翻 09-03 批 3 第 4 项 B(当时保留发布拷贝、把框架拷贝收窄到两份),新裁决为准,PR 正文写明。

风险与代价(含回滚) —— 风险一点:决策框架同步门禁原来比较两份拷贝,现在只剩一份,跨拷贝的同构比较「被裁决清空了比较对象」,dev 保留了单份拷贝的自洽检查与「防拷贝悄悄回来」的扫描(自测里钉了一条:谁把它在原路径恢复就变红),一旦再声明第二份拷贝,比较自动重新武装。已安装到客户项目里的旧拷贝不受影响,它们本来也不会同步。回滚 = revert 一个提交,两个文件与 14 处引用一起回来。

席位意见 —— 本席按契约复审档自审通过:git ls-files skills/objectstack-pm-dispatch 为空,全树对该名字只剩注释与自测夹具(都是解释「为什么没了」的);frame-sync(自测 14 例)、freshness(12 例)、token 棘轮(65 例)、兼容版本(18 例)、存活台账、doc-authoring、empty-changeset、governed-merges 自测、--tier 对目录技能仍印 skills/** 强制档,本席在复核 worktree 全部重跑通过;dispatch-gates 1639 例自测在真实 node_modules 的 worktree 重跑(见验收评论)。dev 顺手改了 content/docs/ai/skills.mdx 一句(卡上没列、grep 出来的),并把 Upgrade 补进那句目录话,本席认可。

你要做的 —— 人工合并本 draft PR(受管面 skills/**,席位不翻 ready、不入队、不批准)。合入后,客户侧要拿掉这个技能只能靠他们自己重装(skills-lock.json 在他们仓里)。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 10, 2026 07:43
@os-zhuang
os-zhuang enabled auto-merge September 10, 2026 07:44
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 10, 2026
Merged via the queue into main with commit be7fa37 Sep 10, 2026
46 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-17311-delete-published-pm-skill branch September 10, 2026 08:09
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 needs-user-decision size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate tests tooling

Projects

None yet

3 participants