Skip to content

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

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules
Aug 31, 2026
Merged

os-zhuang merged 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
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
This was referenced Aug 30, 2026
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

2 participants