Skip to content

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning - #13505

Draft
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules
Draft

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claude claude Bot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Fixes #12668

#12779 is folded into this PR per the 2026-08-28 triage routing on both cards, and #12779 remains open — it is the evidence card for the measured near-miss; the PM retires it manually after landing. (Deliberately a Part of relationship with no closing keyword next to that number — the exact safe spelling this PR writes into the checklist.)

What lands where

Rule 1 — pull-directed priority order for split four-facet analyses (maintainer 2026-08-27, verbatim 「tong y 4」):

  • All four sync-guarded decision-frame copies carry the anchor: internal PM SKILL.md (after the binding sentence, with the full order and the binding constraint: 只排推荐, 分歧块照旧升级, 四棱同向置信门与代裁面不变, pointer to decision-analysis.md); .claude/agents/os-dev.md (line-neutral in-place extension of the binding-sentence lines); the published PM copy and its embedded dev template (minimal generalized anchors, names not numbers).
  • Detail with the facet numbering lives in references/decision-analysis.md (+2 lines, now at its ceiling 46/46): ② measured pull ⇒ recommend ① long-term end state; zero pull ⇒ recommend ④ non-proliferation; ③ breaks remaining ties loud/structural; security and hard-to-reverse always human floor; ranks recommendations only, split still escalates, the auto-adjudication face does not widen. The frame's structure (axis count, order, binding sentence) is untouched — check:skill-frame-sync stays green by measurement, not by luck.

Rule 2 — startup-stage no-gradualism (maintainer 2026-08-27, verbatim 「6335 和以后这种类似的,都立即退休。项目在创业阶段,用户也很少,短期不考虑渐进。」 and the directed placement 「创业阶段不渐进 应该写入项目总监skills」):

  • Full form as an extension of the internal frame copy's axis-④ entry (quoting the class ruling): deprecated aliases/spellings and retired-capability transitions default to IMMEDIATE retirement, no phased windows, no dual-spelling grace periods; a staged option is presentable only with named external-user evidence.
  • Directed placement: a compact bullet in references/lanes/director.md 基本原则, quoting the placement directive verbatim.
  • Deliberately NOT added to the published mirror: the published copy delegates the capability-expansion stance to the installer's conventions file (the recorded generalization decision), and this is a this-repo stance.

Rule 3 — release-reminder discipline (maintainer 2026-08-27, verbatim 「要发版本我会自己点。除非重要修复要发版本你可以提醒我。」):

  • New guardrail bullet immediately after the 版本发布必须人工 anchor in the internal PM SKILL.md: Version Packages PRs are never nudged by default (a pending one is normal state, not maintainer-summary material); the one exception is an important fix merged on main waiting on a release, and the reminder must name the fix and the user-facing consequence of it staying unreleased. Composition stated in the text: this rule governs WHEN to speak, the anchor above it governs WHO acts.

#12779 fold — the bookkeeping-sentence trap, placed at the switch point:

  • The warning lands inside the references/review-checklist.md PR-shape bullet at the exact sentence that orders the switch to Part of — not only in the closing-keyword bullet. Substance: the body most likely to write a closing keyword next to a card number is the body explaining why it is NOT closing that card — the who-will-retire-it bookkeeping sentence, negations, and quote/backtick wrappings are all read by the reference parser the same way; nowhere in a PR body may a closing keyword sit adjacent to a card number.
  • Safe spelling given, not just the prohibition: bare card number with zero closing verb next to it, and the closing plan goes into a comment instead of the PR body. The worked safe form from the prevention case reads "Deliberately a Part of link and not a closing keyword". The adjacent 闭合关键词两读 bullet was deduplicated (its negation-trap parenthetical now lives, sharpened, at the switch point) — that dedup funds the fold at net-zero lines (84/84).
  • Evidence discipline: the measured instance is PR refactor(service-analytics): derive the auto-bridge's engine view from the declared contracts #12777's red-then-green (check runs 98634479836 failure at 18:52:17Z, 98634968551 success at 18:54:28Z, same head); the PR test(rest): drive the tenancy axis of GET /ui/view/:object/:type — an anonymous caller can name another environment and receive its UI view #13258 sentence rewrite is PREVENTION, not a measurement, and is not cited as measured. The Part-of PR must not also close its card gate is untouched — the gate was right and the red was right.

skills/ readings (both mandatory readings, lines and tokens)

surface before after delta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines) 1069 1077 +8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4)) 14239 14391 +152
whole package, all 11 published SKILL.md files (lines) 10515 10523 +8
whole package, ratcheted authored tokens (gate report line) 170515 170660 +145 net (this file +152, sibling drift −7)

Declared deviations — two ratchet pins moved, each on its gate's own quoted-ruling path

  1. references/lanes/director.md ceiling 75 → 77 in scripts/pm/check-skill-line-ratchet.mjs. The placement directive 「创业阶段不渐进 应该写入项目总监skills」 lands two lines in a zero-headroom file. Arithmetic: the bullet needs ~230 bytes; total tail slack across the contextually-correct lines of the touched sections measured at most 68 bytes; no losslessly compressible wording found in those sections (the long lines there are verbatim maintainer quotations, which are not mine to compress); re-wrap-as-funding is banned. The gate's header names exactly this path: raise only with a maintainer ruling quoted in the raising PR — quoted above and in the pin comment.
  2. Published pm-dispatch token pin 14239 → 14391 (+152) in scripts/check-skills-token-ratchet.mjs (self-test subtotal bound shifted by the same +152, commented). The 「tong y 4」 ruling directs the split-resolution rule into the decision-frame copies; two of the four enforced copies live in the published file, and the recorded drift lesson for this frame is precisely a semantics change that skipped the published mirror and served a stale frame to third-party installers for two days. Anchors were compressed to minimal form first (from +244 tokens down to +152).

Both pins are governed-face content and this PR stays draft for the maintainer's manual merge — the merge is the review record; if either raise is unwanted, the corresponding piece can be dropped to a follow-up without disturbing the rest.

Also declared: .claude/agents/os-dev.md is line-neutral (466/466) via in-place extension of the three binding-sentence lines only; the compression inside those touched lines drops the connectives 「同样,」/「返回」 and tightens 「先重试到足以确认不是你的改动」 to 「重试到足以排除你的改动」 — same instruction, fewer bytes. The parked NOT MEASURED passage (lines 198–203) is untouched; git diff shows the frame region only.

Line-budget ledger (every touched ratcheted file)

  • .claude/skills/pm-dispatch/SKILL.md 947 → 960 (ceiling 1005, headroom 45)
  • .claude/skills/pm-dispatch/references/decision-analysis.md 44 → 46 (ceiling 46, headroom 0)
  • .claude/skills/pm-dispatch/references/review-checklist.md 84 → 84 (net-zero, funded by the dedup described above)
  • .claude/skills/pm-dispatch/references/lanes/director.md 75 → 77 (ceiling 75 → 77, deviation 1)
  • .claude/agents/os-dev.md 466 → 466 (line-neutral)

Verification (all at commit 04b9d28; working tree clean, 0 dirty paths at union time)

Derived via node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack from the actual diff (7 content paths + 2 gate scripts). Full local union, every exit code captured redirect-then-capture, all 0 at 04b9d28:

check:agent-model-declared · check:agent-test-spelling · check:bash32-floor · check:cli-command-ids · check:cross-package-test-inputs · check:doc-authoring · check:doc-formula-expressions (lint pkg; 「22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean」) · check:entry-guard · check:nul-bytes · check:parse-guard · check:pm-governed-merges · check:pm-governed-prose · check:pm-skill-id-lint (「23 file(s) clean」) · check:pm-skill-ratchet (all touched files green, quoted below) · check:pnpm-filter-targets · check:required-contexts · check:role-word · check:skill-compatibility · check:skill-frame-sync (「4 copies of the decision frame are structurally isomorphic across 3 files … binding sentence present in all 4; 4 count mention(s) agree」) · check:skill-frame-freshness · check:watch-hint-literal · check:pm-dispatch-gates · check-ci-filter-parity · check-skills-token-ratchet gate + self-test (64 cases) · bare-root-worklist self-test (edited-gate-script convention obligations).

Edited gate scripts' own suites: check-skill-line-ratchet.mjs --self-test 111 cases pass; check-skills-token-ratchet.mjs --self-test 64 cases pass.

NOT MEASURED locally, CI-owned by their own design: check-governed-queue-guard (reads the workflow event payload; refuses to run without it — correct), and the Test Core shard jobs that ci.yml path filters trigger for scripts/skills changes (shard attestation and test completeness are properties of the CI run; the local check:cross-package-test-inputs equivalent ran green).

Reverse verification (both mutation legs proven on disk by marker grep, both restores proven by git diff HEAD empty plus git hash-object equal to the HEAD blob; no build step exists for these doc gates — they read sources, stated per the ablation contract):

  • Frame-sync ablation: mutated the os-dev copy's declaring numeral (marker counts 1→0 / 0→1 on disk). Predicted RED naming that copy; observed the gate's own verdict: 「internal-dev … this copy contradicts itself: the declaring sentence says 3 axes, the binding sentence says 4.」 Restored; hash e169ceda… matches HEAD blob.
  • Ratchet leg on the tightest touched file: appended one marker line to decision-analysis.md (47 lines on disk, marker count 1). Predicted RED at 47 over ceiling 46; observed: 「decision-analysis.md is 47 lines; the ratchet ceiling is 46.」 Restored; hash e8dcd1b3… matches HEAD blob.

Governed face

Draft PR; human merge only; no ready flip, no queue, no auto-merge, no review submission from any seat. Before the manual merge the base must be updated to current main and the gates re-run.

Generated by Claude Code


Generated by Claude Code

… Part-of trap warning

Pull-directed priority order for split four-facet analyses (recommendations
only; a split still escalates), startup-stage no-gradualism with its directed
director-charter placement, release-reminder discipline beside the
manual-release anchor, and the closing-keyword bookkeeping-sentence warning at
the Part-of switch point with the safe spelling. All four decision-frame
copies carry the pull-first anchor; details live in decision-analysis.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant