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

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claudeclaudeBot 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)

surfacebeforeafterdelta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines)10691077+8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4))1423914391+152
whole package, all 11 published SKILL.md files (lines)1051510523+8
whole package, ratcheted authored tokens (gate report line)170515170660+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
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 02:29
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 02:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 3d08974Aug 31, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12668-ruled-standing-rules branch August 31, 2026 02:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning by claude[bot] · Pull Request #13505 · objectstack-ai/objectstack · GitHub
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

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claudeclaudeBot 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)

surfacebeforeafterdelta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines)10691077+8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4))1423914391+152
whole package, all 11 published SKILL.md files (lines)1051510523+8
whole package, ratcheted authored tokens (gate report line)170515170660+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
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 02:29
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 02:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 3d08974Aug 31, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12668-ruled-standing-rules branch August 31, 2026 02:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning by claude[bot] · Pull Request #13505 · objectstack-ai/objectstack · GitHub
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

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claudeclaudeBot 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)

surfacebeforeafterdelta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines)10691077+8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4))1423914391+152
whole package, all 11 published SKILL.md files (lines)1051510523+8
whole package, ratcheted authored tokens (gate report line)170515170660+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
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 02:29
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 02:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 3d08974Aug 31, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12668-ruled-standing-rules branch August 31, 2026 02:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning by claude[bot] · Pull Request #13505 · objectstack-ai/objectstack · GitHub
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

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claudeclaudeBot 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)

surfacebeforeafterdelta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines)10691077+8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4))1423914391+152
whole package, all 11 published SKILL.md files (lines)1051510523+8
whole package, ratcheted authored tokens (gate report line)170515170660+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
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 02:29
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 02:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 3d08974Aug 31, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12668-ruled-standing-rules branch August 31, 2026 02:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning by claude[bot] · Pull Request #13505 · objectstack-ai/objectstack · GitHub
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

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claudeclaudeBot 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)

surfacebeforeafterdelta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines)10691077+8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4))1423914391+152
whole package, all 11 published SKILL.md files (lines)1051510523+8
whole package, ratcheted authored tokens (gate report line)170515170660+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
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 02:29
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 02:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 3d08974Aug 31, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12668-ruled-standing-rules branch August 31, 2026 02:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning by claude[bot] · Pull Request #13505 · objectstack-ai/objectstack · GitHub
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

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claudeclaudeBot 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)

surfacebeforeafterdelta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines)10691077+8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4))1423914391+152
whole package, all 11 published SKILL.md files (lines)1051510523+8
whole package, ratcheted authored tokens (gate report line)170515170660+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
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 02:29
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 02:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 3d08974Aug 31, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12668-ruled-standing-rules branch August 31, 2026 02:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning by claude[bot] · Pull Request #13505 · objectstack-ai/objectstack · GitHub
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

docs(pm-dispatch): three maintainer-ruled standing rules + the Part-of bookkeeping-sentence warning#13505
os-zhuang merged 1 commit into
mainfrom
claude/issue-12668-ruled-standing-rules

Conversation

@claude

@claudeclaudeBot 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)

surfacebeforeafterdelta
skills/objectstack-pm-dispatch/SKILL.md (changed file, lines)10691077+8
skills/objectstack-pm-dispatch/SKILL.md (tokens, gate convention ceil(bytes/4))1423914391+152
whole package, all 11 published SKILL.md files (lines)1051510523+8
whole package, ratcheted authored tokens (gate report line)170515170660+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
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 02:29
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 02:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 3d08974Aug 31, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12668-ruled-standing-rules branch August 31, 2026 02:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude