skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-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)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings
Sep 1, 2026
Merged

skills(pm): encode the axis-weighting and decision-batch presentation rulings#14142
os-zhuang merged 4 commits into
mainfrom
claude/issue-14030-14032-decision-frame-rulings

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#14030
Fixes#14032

Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly order
their own encoding into the skills. Landed together because they are two halves of one
decision-presentation discipline: one governs how to weigh, the other how to
present
. Landing either alone leaves the other half still wrong.

HEAD at verification: 58337bf97.

The two rulings, verbatim and untranslated

#14030 — axis weighting

四维分析中,长期合理应该权重最高,至少50%

#14032 — decision-batch presentation

每批5张详细解释,不是这样一堆列给我,这个也要写入skills

What landed, per card

#14030 — long-term soundness carries the highest weight, ≥50%

Encoded in all fourcheck:skill-frame-sync copies plus the card-face
serialization. The rule: when the axes conflict, lead the recommendation with the
long-term reading, and the other three axes together cannot outvote it.

Two guards land with it, because the ruling implies both and neither is safe to leave
to the reader:

  1. Read the weight through that axis's own definition — 缩小而非扩大特例/契约增生,
    shrink special-cases and contract accretion rather than grow them. Without this, a
    50% weight on "long-term soundness" is exactly the sentence someone reaches for to
    justify building the grand speculative surface now, which is the opposite of what
    the axis says.
  2. It ranks RECOMMENDATIONS, never authority. A 50% weight cannot make a
    human-floor matter dispatchable; 安全/权限边界 and 破坏性难逆动作 stay with the
    maintainer whatever the weight says. This is the boundary triage flagged as
    最要紧, and it is written in as a ⛔ clause rather than implied.

Composition with the 2026-08-27 tie-break, verified rather than asserted. The
existing 分歧推荐序 (「tong y 4」) is untouched and still ranks. The new rule is the
stronger constant floor: the 08-27 order says which way ① points given pull
evidence; this ruling sets the minimum weight ① carries. I tried to construct a
conflicting case and could not — see "Stop conditions" below.

No axis was reordered. The ruling is about weight, not list position; reordering
would move check:skill-frame-sync's axis NAME SEQUENCE across all four copies and is
a larger change than was ruled. The gate confirms the sequence is unchanged.

#14032 — exactly 5 per batch, full prose per card

The teeth the existing text lacked:

  1. 恰好 5 张、呈完即停等回批 — the file said 「每批 ≤5 张」, which permits the
    incident (~20 items in one message). ⛔ 永不一条消息投多批.
  2. 「详细解释」= 逐卡散文 — business problem + each option's real cost + the
    four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
    verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
  3. Re-analysis passes follow the same discipline as first presentations.
  4. An applicability boundary, which triage explicitly asked for so the rule is not
    read as "no tables anywhere in skills": the duty attaches to 任何席位向维护者呈递
    需其裁决的决策项 — presenting items for a ruling — and ⛔ 不及结果陈述
    (轮报表格照旧), stating results already decided. Written as 任何席位 rather than
    naming the director seat, because triage measured the same concern arriving on a
    second channel (the 分诊席 batch-processing question the same day).

Landing map — one home per duty, measured not assumed

The stop condition was "the presentation duty has TWO existing homes". It does
not.
Measured:

FaceWhat it ownsAction
references/decision-analysis.md 「常设决裁批流程」the duty's mechanics (批序与写法)✅ teeth land here
references/lanes/director.md 「基本原则」the maintainer's 2026-08-27 charter quote, and an explicit pointer: 「呈报批序与写法见 ../decision-analysis.mduntouched — the pointer already reaches the new text

director.md delegates rather than duplicates, so it is a pointer, not a second home;
its 「三要素:每批 5 张」 is already consistent with "exactly 5" and needed no edit.
decision-analysis.md is also the correct home on the merits: it is the cross-seat
file, while director.md is director-only, and triage established this rule's readers
extend past the director seat. No third home created; no copy made.

For #14030 the corpus already has an established two-place pattern for this exact rule
class (the 08-27 tie-break sits in both): the authoritative statement in the frame's
single source, and a card-face restatement. I followed it exactly rather than inventing
a placement.

Frame-sync

✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
— 4 axes, sequence business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline, binding sentence present in all 4, 4 count mentions agree.

All four copies carry the weighting. That is deliberate and follows the precedent
recorded in the token-ratchet ledger for the 2026-08-27 rule: this published file
carries two enforced frame copies, so a rule that changes which recommendation the
frame yields
must reach them, or third-party installers weigh the axes co-equally
while this repo weighs long-term ≥50% — the #5130 drift shape exactly, and a lying
green light (the sync gate compares structure, so it would stay green).

Line and token budgets — before/after, with funding source

FileMetricBeforeAfterCeilingFunding
references/decision-analysis.mdlines465446 → 54⚠️ ruling-quoted raise
.claude/agents/os-dev.mdlines466469466 → 469⚠️ ruling-quoted raise
.claude/skills/pm-dispatch/SKILL.mdlines9659711005 (unchanged)existing headroom
skills/objectstack-pm-dispatch/SKILL.mdtokens143901454914391 → 14549⚠️ ruling-quoted raise

Verdict lines on the final tree:

✓ .claude/skills/pm-dispatch/SKILL.md is 971 lines (ceiling 1005; headroom 34).
✓ .claude/skills/pm-dispatch/references/decision-analysis.md is 54 lines (ceiling 54; headroom 0).
✓ .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).
✓ skills/objectstack-pm-dispatch/SKILL.md is 14549 tokens (ceiling 14549; headroom 0).

Three ceilings move and all three are flagged for the human merge. Each is
recorded in its map with the standing convention (the raise, the quoted ruling, the
arithmetic, and what funding was attempted first). Both rulings explicitly order these
encodings, which is the ratchet's sanctioned quoted-ruling escape.

Funding, ladder-first

  • decision-analysis.md (+8) — no reflow slack exists: all 46 lines are already
    packed to their own minimum at the 120-byte cap (the file was densified at phrase
    boundaries by Densify the pm-dispatch governed corpus at phrase boundaries (whitespace-only) + the ruled funding-ban distinction #13389; the measured saving available is zero). No genuine deletion
    either — the rulings make no existing clause redundant. The one in-place payment left
    was deleting a ruled clause, refused on the state-machine precedent.
  • os-dev.md (+3)⚠️re-wrap funding was available here and was deliberately
    refused.
    Three nearby paragraphs carry wrap artifacts (two orphan lines of 6 and 8
    bytes) worth exactly the 3 lines needed; merging them lands this file at 466/466 with
    no raise at all. I measured it both ways, then reverted it: that is 筹行, banned
    by the 2026-08-17 ruling — 「⛔ re-wrap(折行合并)不得用作筹行 —— 棘轮治理的是内容体量,
    行数只是机读代理,新增以删减付账」. The density fix is legitimate on its own and belongs
    in a net-reducing PR (2026-08-29), not this one. The cheaper-looking green was the
    wrong answer and this PR does not take it.
  • SKILL.md internal (+6) — paid entirely from existing headroom, no raise. The
    full statement of the weighting deliberately lands here (the frame's single source)
    rather than in the ratcheted-to-zero reference file.

skills/** — the two required readings

Per the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):

  • Changed file, whole-file:skills/objectstack-pm-dispatch/SKILL.md14390 →
    14549 tokens (+159)
    ; lines +11/−1.
  • Whole published bundle: ratcheted (authored) subtotal 171410, bundle total
    (whole shipped tree) 187891. This is the only skills/** file in the diff.

Proportionality: +159 against the +152 the comparable 2026-08-27 frame rule
cost across the same two copies — essentially the same size for the same rule class.
It got there by compression, not by first draft: the initial cut measured +242, and
the provenance was then removed on the #5451 route-B convention — the published copy
carries the rule without this repo's dates or quoted rulings. Verified empirically:
the published file contains zero date-shaped strings and zero 「」 quotations,
and the only ones present before this correction were the ones I had just added. The
verbatim rulings live in the internal copies and in this PR body, which is where the
corpus keeps provenance.

Stop conditions — both checked, neither tripped

"The weighting conflicts with the 08-27 tie-break in some constructible case." I
tried and could not construct one. The candidate is the zero-pull branch: 08-27 says
recommend ④不扩散, and one might expect ①'s ≥50% to override toward building the
general capability. It does not, because axis ①'s own definition is 「缩小还是扩大
特例/契约增生」 — an unconsumed declared surface is contract accretion, so ① and ④
point the same way there. The pull-bearing branch (荐①长远终态) is already the
weighting's own direction. The two compose: 08-27 supplies the direction, this ruling
supplies the floor. This is also precisely why guard (1) above is written in — the
only way the conflict becomes real is if someone reads ① against its own definition,
and the encoded text now closes that reading.

"The presentation duty has two existing homes." It has one, plus a pointer — see
the landing map. No third home created.

Premise verification, and one triage input already satisfied

Both premises re-checked against today's origin/main (the file was reflowed tonight;
I read the current text, not the line numbers on the cards):

Verification

Full derived gate union re-derived on the final tree (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-built path list; clean derivation,
no stale-tree warning): 29 families, 27 exit 0.

The two non-zero are both self-declared NOT MEASURED, not findings:

  • node scripts/check-test-completeness.mjsexit 3, needs a saved turbo run test
    log; its own text says "the local reading for this gate is NOT MEASURED … ⛔ It is not
    a red".
  • node scripts/pm/check-governed-queue-guard.mjsexit 1, requires
    GITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannot
    look.

Exit codes were captured before any pipe throughout (cmd > log 2>&1; rc=$?).

Also run beyond the derived union:

  • pnpm lint (repo-wide eslint . --no-inline-config) — exit 0, no narrowing
    needed, run under the shared verify lock (VERDICT command-exit 0 · held the lock 69s).
  • Both edited gate scripts' own --self-test legs: line ratchet 111 cases pass,
    token ratchet 64 cases pass. The token self-test initially failed one case — the
    SKILL.md subtotal pin — which is by its own documented convention shifted by exactly
    the authorized raise (118910 → 119068), the same operation the two prior raises
    recorded.
  • Verbatim-quote integrity: both rulings verified byte-identical to the card bodies
    fetched from the API, and each occurrence confirmed to sit on a single line
    ([finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 — a governed quotation that soft-breaks stops being findable by the things
    that grep it; one had wrapped in a comment and was fixed in its own commit).
  • Control-byte self-scan over every changed file: clean.

Merge notes

⚠️ Governed faces (.claude/** + published skills/**) ⇒ draft only, human merge.
Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the os-dev.md one additionally records the re-wrap funding that was
available and refused.

No changeset: the diff publishes nothing from any package, and the five most recent
commits touching this published file all carry zero changesets. skip-changeset applied
and read back.

Generated by Claude Code


Generated by Claude Code

… rulings
Two maintainer rulings from the 2026-09-01 PM chat, both of which explicitly
order their own encoding into the skills.
Axis weighting: long-term soundness carries the highest weight, at least 50%,
when the axes conflict. Recommendations lead with the long-term reading and the
other three axes together cannot outvote it. Landed in all four
check:skill-frame-sync copies plus the card-face serialization, with two guards
the ruling implies: the weight is read through that axis's own definition
(shrink special-cases and contract accretion, never grow them), so it cannot
underwrite speculative expansion; and it ranks RECOMMENDATIONS only, never
authority, so a 50% weight cannot make a human-floor matter dispatchable.
Decision-batch presentation: exactly 5 cards per batch, one batch per report,
stop and wait for the reply. "Detailed explanation" is prose per card; a table
row, a one-line verdict or a changed/unchanged grid does not discharge the duty
— compressing the batch is a violation of it. Applicability is bounded to
presenting items for a RULING, never to already-decided result statements.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
#11106: a governed quotation that soft-breaks stops being findable by the
things that grep it, and the raise's authorization is exactly such a quote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claude
claudeBot requested review from hotlong and os-zhuangSeptember 1, 2026 07:36
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 1, 2026
@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation labels Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

2 participants

@os-zhuang@claude