Uh oh!
There was an error while loading. Please reload this page.
skills(pm): encode the axis-weighting and decision-batch presentation rulings - #14142
Merged
Merged
Conversation
… 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
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
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
os-zhuang
approved these changes
Sep 1, 2026
os-zhuang
marked this pull request as ready for review
September 1, 2026 07:37
os-zhuang
enabled auto-merge
September 1, 2026 07:37
This was referenced Sep 1, 2026
Uh oh!
There was an error while loading. Please reload this page.
os-zhuang
deleted the
claude/issue-14030-14032-decision-frame-rulings
branch
September 1, 2026 08:13
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#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
#14032 — decision-batch presentation
What landed, per card
#14030 — long-term soundness carries the highest weight, ≥50%
Encoded in all four
check:skill-frame-synccopies plus the card-faceserialization. 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:
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.
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 isa 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:
incident (~20 items in one message). ⛔ 永不一条消息投多批.
four-axis analysis written out + one recommendation. ⛔ A table row, a one-line
verdict, or a 「变/未变」 grid does not discharge the duty: 压缩批次是违规不是摘要.
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:
references/decision-analysis.md「常设决裁批流程」references/lanes/director.md「基本原则」../decision-analysis.md」director.mddelegates 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.mdis also the correct home on the merits: it is the cross-seatfile, while
director.mdis director-only, and triage established this rule's readersextend 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
references/decision-analysis.md.claude/agents/os-dev.md.claude/skills/pm-dispatch/SKILL.mdskills/objectstack-pm-dispatch/SKILL.mdVerdict lines on the final tree:
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 alreadypacked 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) —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.mdinternal (+6) — paid entirely from existing headroom, no raise. Thefull 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 readingsPer the 2026-08-21 ruling (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」
/「……不能为了一个小功能扩写很多。」):
skills/objectstack-pm-dispatch/SKILL.md14390 →14549 tokens (+159); lines +11/−1.
(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):
skills: encode the maintainer's axis-weighting ruling into the four-axis decision framework — long-term soundness carries the highest weight, at least 50% #14030 suggests landing in
references/decision-analysis.mdbecause it is "outsidethe ratchet". It is not — the line ratchet covers
references/too, at 46/46 withzero headroom. That is why this PR pays a raise there and puts the bulk in SKILL.md
instead.
Triage recommended listing the four canonical axes verbatim inside the 四棱 card-block
template. They have been there since 2026-08-20 (feat(pm-dispatch): decision analyses argue from the business standpoint (2026-08-20 ruling) #10186) —
decision-analysis.mdlines 38–41 spell all four in the block itself. So the seat's drift to self-invented
axis names was not caused by the canon being absent from the point of use, and the
proposed fix would have been a no-op. What the block genuinely lacked at the point of
use is the weight, which this PR adds immediately adjacent to those four lines.
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.mjs→ exit 3, needs a savedturbo run testlog; 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.mjs→ exit 1, requiresGITHUB_EVENT_PATH; CI-context only, and it correctly refuses to exit 0 when it cannotlook.
Exit codes were captured before any pipe throughout (
cmd > log 2>&1; rc=$?).Also run beyond the derived union:
pnpm lint(repo-wideeslint . --no-inline-config) — exit 0, no narrowingneeded, run under the shared verify lock (
VERDICT command-exit 0 · held the lock 69s).--self-testlegs: 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.
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).
Merge notes
.claude/**+ publishedskills/**) ⇒ draft only, human merge.Three ceilings move; each raise quotes its authorizing ruling in the map beside the
number, and the
os-dev.mdone additionally records the re-wrap funding that wasavailable 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-changesetappliedand read back.
Generated by Claude Code
Generated by Claude Code