Uh oh!
There was an error while loading. Please reload this page.
skills(pm-dispatch): split the entry into SKILL.md + rules/ under #14296 items 1 and 4 (entry 9,708 tokens, package net −21) - #14660
Merged
Conversation
…rules/dev-template.md; the gate-pinned decision frame stays in the entry #14296 item 1 (A) + item 4 (A), under the #14568 = A reading. The template fence moves verbatim into rules/dev-template.md; the "When to STOP" block — the published-dev copy that check:skill-frame-sync pins to SKILL.md by file path — stays in the entry as a fenced block the PM inserts at the template's {decision_frame} line. Entry 11,567 -> 9,788 tokens; package 11,567 -> 11,556 (-11): the split's structural overhead (the rules H1, the placeholder line, the entry fence, the pointer's link) is funded by two dispatch-prompt bullets that restated template rule 2 and the template's top paragraph verbatim, and by the template intro's stand-alone sentence, which step 5 already states. Ratchet rows: the new file pinned at 1,768 (its landed count); the entry re-locked at 9,788. No other row changes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ent template — the verify-lock non-guarantee and the ratchet funding discipline The follow-up sync PR #14444 recorded, from .claude/agents/os-dev.md on origin/main: (1) resource rule 1 now states the lock's non-guarantee — it does not promise an idle machine, only excludes work routed through it, so wall-clock readings under a hold are shared-box readings; (2) a size ratchet is paid only by deleting content — a re-wrap is not payment, a densification that adds nothing is a repair, a ceiling is raised only by the maintainer, nothing left to delete means "blocked". Additions +108 tokens, funded in the same package: three dispatch-prompt non-negotiables that restated the template's binding-file paragraph, the "When to STOP" rule and rule 4 verbatim; the template's top-paragraph restatement of the final-message rule; the sanitizer trap's HTML-comment clause (stated at the report block); and rule 4's published-only rationale sentence about disk exhaustion, which the oracle does not carry. Package 11,556 -> 11,546 (-10 for this commit, -21 against main). Ratchet rows re-pinned at the landed counts: entry 9,708, rules/dev-template.md 1,838. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
This was referenced Sep 2, 2026
os-zhuang
approved these changes
Sep 2, 2026
os-zhuang
marked this pull request as ready for review
September 2, 2026 22:49
os-zhuang
enabled auto-merge
September 2, 2026 22:49
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Sep 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#14300
Round 2 of the skills catalog optimization program #14292 member card for
skills/objectstack-pm-dispatch(maintainer mandate 2026-09-02, verbatim: 「审核所有的 skills,进行全面的优化。」). Round 1 (PR #14444, merged 08:57Z) took the diet, 14,549 → 11,567 tokens. This PR is the entry +rules/split plus the two deferrals the seat's ACCEPT on #14444 recorded (PMD-H-01, the #14229 two-delta sync). Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1 — branchclaude/issue-14300-pm-dispatch-split, baseca48cf37, headfef3b449.Rulings this PR runs on (one line each, verbatim and untranslated)
SKILL.mdinto entry +rules/are authorized under three conditions (≥10% off the whole package in the same PR; every new file's ceiling pinned at its landed count; a split is never a channel for added prose); item 4: the publishedobjectstack-pm-dispatchpackage stays, ≤10k target, developer template externalized torules/.Files
skills/objectstack-pm-dispatch/SKILL.md(entry, hand-edited),skills/objectstack-pm-dispatch/rules/dev-template.md(new — text moved out of the entry),scripts/check-skills-token-ratchet.mjs(exactly two rows: the new file's row, the entry's re-lock)..claude/skills/pm-dispatch/**,.claude/agents/os-dev.md,CLAUDE.mdread as the comparison oracle only;scripts/pm/check-skill-line-ratchet.mjs, generated files,content/docs/releases/**untouched; no other package. Frontmatter untouched ⇒skills/README.md/content/docs/ai/skills-reference.mdxneed no regeneration (check:skill-docssays "Skill docs in sync").Clause-②: no— protocol text, no platform contract; clause ① applies (a tier-mandated surface) and the skill-face review is the seat's, in-seat. Governedskills/**⇒ this PR stays DRAFT; review requests are the seat's step.Token account (convention
ceil(utf8 bytes / 4),node scripts/check-skills-token-ratchet.mjs)ca48cf37)fef3b449)SKILL.md(entry)rules/dev-template.mdskills/objectstack-pm-dispatch/; no generated file)Per commit, each droppable on its own: the split commit
da02d0c1lands the package at 11,556 (−11); the sync commitfef3b449at 11,546 (−10 more). Whole bundle: 157,662 → 157,641; ratcheted subtotal 141,214 / 165,532 → 141,193 / 162,529.The three conditions, with numbers
skills/objectstack-pm-dispatch/rules/dev-template.md= 1,838. The entry's row lowered 14,549 → 9,708 (a re-lock of this file only). No stub existed, so no row is dropped (see PMD-H-01). No other row changes;--self-test64 cases pass.rules/dev-template.mdis a sentence moved fromSKILL.md, minus the deletions listed below, plus exactly one heading and one placeholder line ({decision_frame}) that marks where the gate-pinned block re-enters the pasted prompt; the entry carries one pointer line for the moved section. The two agents(os-dev): verify-lock non-guarantee clause + ratchet funding discipline in the dev contract #14229 deltas are additions in the sync commit, not in the split commit, and are funded by deletions in the same package (below).Item 4: the entry ends ≤ 10,000 tokens — measured 9,708.
File map (old section → new file, tokens)
origin/main)## The developer-agent operating templateintro + the 4-backticktextfence (:626-799), minus the "When to STOP instead of coding" blockrules/dev-template.md— H1 + the same fence with{decision_frame}on the line the block occupied (rules/dev-template.md:99):704-755) — thepublished-devcopy thatcheck:skill-frame-syncpins toskills/objectstack-pm-dispatch/SKILL.mdby file pathtextfence under the same heading (SKILL.md:620-660; anchors now at:633"Analyze every option on four fixed axes:" and:654"Justify your recommendation on all four axes")**Report contract.**paragraphSKILL.md:662-668) — it is the PM's reading of the report, not the dev'sThe frame fence — measured, and what the script would do
scripts/check-skill-frame-sync.mjsCOPIESbindspublished-pm(start "and analyze every option on the four fixed axes below.", binding "recommendation must be justified on … axes") andpublished-dev(start "Analyze every option on four fixed axes:", binding "Justify your recommendation on … axes") toskills/objectstack-pm-dispatch/SKILL.mdby file path. Had thepublished-devblock moved intorules/with the template,analyzeCopy()would have read the entry, matched the start anchor 0 times and recorded "could not extract the decision frame: the declaring sentence anchor matched 0 time(s), expected exactly 1" — a hard FAIL (exit 1), not a vacuous pass; the anti-dormancy scan (FINGERPRINTSover.claudeandskills,rules/included) would additionally have flaggedrules/dev-template.mdas an undeclared copy (/fixed axes/i).check:skill-frame-freshnessimports the sameCOPIESand extractor and would have failed the same way. So both copies stay in the entry (:534and:633), neither block is edited, and the rules file carries no fingerprint: the sync gate now reports "36 markdown files scanned for undeclared copies" (35 at base — the new file is scanned and clean). Both gates green on every commit.Per-move / per-deletion 落点 | before | after (keyed by finding id)
SKILL.md:626-799→rules/dev-template.md:1-130+SKILL.md:620-668SKILL.md:382"- The issue is already claimed; do not touch its assignee." → deleted;SKILL.md:388"Return ONLY the JSON report defined in the operating procedure." → deleted; template intro sentence "It is written to stand alone: an agent with no prior context and no custom agent type can follow it." → deletedrules/dev-template.md:44-50(resource rule 1)rules/dev-template.md:80-83, after the definition of doneSKILL.md:381"{conventions_file} in that repository is binding — read it before your first edit." → deleted;SKILL.md:383-385the needs_decision bullet → deleted;:382"Never merge anything." → deleted;rules/dev-template.md:7-8"It is parsed mechanically, so the final message is the JSON and nothing else." → deleted;:128"and HTML comments alike" → deleted;:57-58"Leftover dependency trees exhaust the container's disk, which fails as confusingly as running out of memory." → deletedRule 4's remaining lines were re-flowed after the deletion (bytes unchanged, 7,352 before and after the re-flow — a re-wrap moves no tokens and pays nothing).
PMD-H-01 — disposition: no stub exists; nothing to delete, no row to drop
Evidence:
git ls-tree -r --name-only origin/main -- skills/objectstack-pm-dispatch/lists exactlySKILL.md;git grep -n "objectstack-pm-dispatch/evals" origin/mainreturns nothing;CEILINGSinscripts/check-skills-token-ratchet.mjscarries noevals/row for this package (the audit's package-facts table said the same: "evals/absent; 8 of 11 published packages have one"). The audit's PMD-H-01 proposed ADDING anevals/README.md(+300, new ceiling); #14296 item 2 = A deletes planned-eval stubs and adds none, which forecloses that addition. Neither a stub to delete (the PR #14585 / #14578 precedent does not apply) nor a real fixture to keep:premise_false: PMD-H-01 — the deferral presumed an evals stub; the package has never had an evals/ directory.#14229 sync — the two deltas and their oracle lines (
.claude/agents/os-dev.mdonorigin/main, verbatim and untranslated)os-dev.md:85-88: 「同一张清单的非保证:它不保证机器空闲 —— 只排除经这个入口进来的工作,check:*门禁、install、dev server 不走它,与持锁同核并跑(脚本每次获取与 VERDICT 行同述此界)⇒ 锁下墙钟绝对值一律是共享盒读数,不是安静机器承诺。」 → template resource rule 1 (rules/dev-template.md:47-50).os-dev.md:323-327: 「付行数棘轮的唯一合法货币是删内容。 维护者 2026-08-17 裁「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,行数只是机读代理,新增以删减付账;密度优化仅随净减内容的 PR 顺带」、2026-08-29 裁「筹行(为内容购买行数)⛔ vs 独立密度修复(无内容购买)允许」。分界只问折行有没有为新增内容买行 —— 门禁分不出两种 net-0;⛔ 不买内容的密度修复是修复,不要当筹行拒掉。删不出等量内容 ⇒ 报blocked,⛔ 不抬 ceiling(人工地板)。」 → one template paragraph after the definition of done (rules/dev-template.md:80-83), carrying the rule without this repo's dates or quoted rulings (the 已发布 skillobjectstack-pm-dispatch仍是两轴决策框架 —— 与.claude/内部三轴(#5130)分叉,且「创业聚焦」轴是否该泛化给第三方项目未定 #5451 route-B convention the published copy follows).The other three hunks of #14229 (the model-pin comment shrunk to a pointer, the stash mechanism delegated to
CLAUDE.md, the footer measurement delegated toAGENTS.md) are internal delegations with no published counterpart — the published template carries no model pin, already states the stash ban with its mechanism (round 1 F-03), and has no footer text — so nothing to sync there.premise_false
PMD-H-01 — the deferral presumed an evals stub; the package has never had an evals/ directory(evidence above).check:doc-links / check:published-readme-links verify the cross-file link — neither gate walks skills/**:check-published-readme-links.mjssweeps published package READMEs and the spec prompt files;check-doc-anchors.mjssweepscontent/**plus the rootREADME.md/ARCHITECTURE.md; nocheck:doc-linksscript exists. The one cross-file link (SKILL.md:622→./rules/dev-template.md) was verified by hand: the target exists at that relative path, and the only intra-file anchor (#the-developer-agent-operating-template,SKILL.md:354) still resolves because the heading stays in the entry.check:skill-examples marks travel with their fences— the package has zeroos:checkmarks and zero TypeScript fences (audit package facts), so nothing travelled; the gate is not in this PR's derived family.check:skill-identifier-liveness Leg 2— re-measured:BINDINGShas no row for this file (8 registered sections, none inskills/objectstack-pm-dispatch/**); the three Leg 1 exemptions (backlogRepo,conventionsFile,routingLabelPrefix) are in the Configuration table, which did not move, and still resolve.check:role-word— 0 occurrences of the word in both files before and after (grep -c= 0; the file is not in the baseline), so the count could not move.Gates — head
fef3b449(union re-derived AFTER the last move:node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no paths, "gate list derived from the tree of 'objectstack-ai/objectstack' at commit fef3b44"; 25 commands; every exit code captured by redirect before any pipe)node scripts/check-skills-token-ratchet.mjs(+--self-test)skills/objectstack-pm-dispatch/SKILL.md 9708 / 9708 (+0),skills/objectstack-pm-dispatch/rules/dev-template.md 1838 / 1838 (+0); self-test "64 cases pass"pnpm check:skill-frame-syncpnpm check:skill-frame-freshness(dispatch-named, not in the derived family)pnpm check:skill-identifier-livenesspnpm check:skill-compatibilitypnpm --filter @objectstack/spec run check:skill-docspnpm check:role-wordpnpm check:corpus-claim-driftpnpm check:doc-authoringpnpm --filter @objectstack/lint run check:doc-formula-expressions@objectstack/formulais not built"; afterpnpm --filter '@objectstack/lint...' --filter '@objectstack/formula...' run buildunderscripts/pm/os-verify-lock.sh(OS_VERIFY_LOCK_SLOT=issue-14300-r2; "VERDICT command-exit 0 · held the lock 130s · waited 406s"): "✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 422 files / 1364 TS blocks judged clean by @objectstack/formula."pnpm check:pm-governed-mergespnpm check:pm-dispatch-gatespnpm check:ratchet-remedy-authoritypnpm check:watch-hint-literalnode scripts/check-ci-filter-parity.mjsnode scripts/check-cross-package-test-inputs.mjs/pnpm check:cross-package-test-inputsnode scripts/check-shard-attestation.mjsnode scripts/pm/bare-root-worklist.mjs --self-testpnpm check:agent-test-spelling·pnpm check:bash32-floor·pnpm check:cli-command-ids·pnpm check:entry-guard·pnpm check:parse-guard·pnpm check:pnpm-filter-targets--filteroccurrence(s) … resolve"pnpm check:nul-bytes(any edit)node scripts/check-empty-changeset.mjs --base origin/mainNOT MEASURED:
node scripts/check-test-completeness.mjs— exit 3, "PREREQUISITE NOT MET — this gate grades a savedturbo run testlog, and no log was named" (CI tees the log; by design not measurable here). The derivation printed its stale-tree notice ("1 commit(s) behind origin/main, 1 file(s) it derives from CHANGED") —origin/mainmoved by one unrelated commit (20b88391) after the branch was cut; neitherscripts/check-skills-token-ratchet.mjsnorskills/objectstack-pm-dispatch/**moved onmain(git log HEAD..origin/main -- …empty before both pushes), so no merge was needed.Baseline on the untouched worktree at
ca48cf37, before the first move: ratchet "skills/objectstack-pm-dispatch/SKILL.md 11567 / 14549 (-2982)", frame-sync "35 markdown files scanned", liveness "41 published file(s)".Changeset
skip-changeset: nothing is released by any package — the diff touchesskills/**and one root gate script's ceiling rows;scripts/check-empty-changeset.mjs's route for a PR that releases nothing is this label, and it confirms no changeset is added.🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code