From 2a9ad36e9777c258a4341c3be4384f54915bed04 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 1 Sep 2026 07:12:34 +0000 Subject: [PATCH 1/2] skills(pm): encode the axis-weighting and decision-batch presentation rulings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2 --- .claude/agents/os-dev.md | 9 +++-- .claude/skills/pm-dispatch/SKILL.md | 6 +++ .../references/decision-analysis.md | 14 +++++-- scripts/check-skills-token-ratchet.mjs | 24 +++++++++++- scripts/pm/check-skill-line-ratchet.mjs | 38 ++++++++++++++++++- skills/objectstack-pm-dispatch/SKILL.md | 12 +++++- 6 files changed, 92 insertions(+), 11 deletions(-) diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index 4f25baffd2..00a184b065 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -412,9 +412,12 @@ not decoration:** 2026-08-04:这是创业项目,核心能力优先):能力扩张默认从紧,无拉动的声明面按 implementation-first 处置,已发布零消费的能力不因沉没成本获得豁免。 -Your recommendation must be justified on all four axes;四轴冲突时推荐按拉动排序:实测拉动→长远, -零拉动→不扩散,防错破平,安全与难逆恒人工(只排推荐);权衡如实呈现交维护者拍板。`main` -在你脚下碎了、依赖未合并、CI 基础设施故障⇒`blocked`(附证据),重试到足以排除你的改动。 +Your recommendation must be justified on all four axes;长远合理性权重恒 ≥50%(2026-09-01 +裁「四维分析中,长期合理应该权重最高,至少50%」):推荐以它领起,另三轴合起来投不翻 +它,按本义读(缩小而非扩大特例/契约增生),⛔ 不为投机扩张背书;四轴冲突时推荐按拉动排 +序:实测拉动→长远,零拉动→不扩散,防错破平,安全与难逆恒人工(权重与序都只排推荐,⛔ +不授权、不移人工地板);权衡如实呈现交维护者拍板。`main` 在你脚下碎了、依赖未合并、CI +基础设施故障⇒`blocked`(附证据),重试到足以排除你的改动。 ## 终报消息 —— 恰好这段 JSON,不带任何环绕散文 diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index ce917358bb..aa806662db 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -882,6 +882,12 @@ finding 定级换结果态,永不留挂)/ `Blocked-by:` 活性现验(合并一 防错轴破余下平局向响亮/结构性;安全/权限边界与破坏性难逆动作恒在人工地板。 ⛔ 此序只排推荐:分歧块照旧升级,四棱同向置信门与代裁面不变, 细则见 `references/decision-analysis.md`。 +**长远合理性权重恒 ≥50%**(维护者 2026-09-01 裁,逐 +字:「四维分析中,长期合理应该权重最高,至少50%」):四轴冲突时推荐以长远的读数领 +起,另三轴合起来投不翻它;权重按该轴本义读 —— 缩小而非扩大特例与契约增生 —— ⛔ +不据它为投机扩张背书。与分歧推荐序 compose 不取代:后者按拉动定指向,本条定下限。⛔ 权 +重是推荐规则不是授权规则:50% 不把人工地板的事变成可派发的事,安全/权限边界与破坏性 +难逆动作照旧恒交维护者。 **标准四棱卡面块是落卡与升级的必备件**(四棱维护者 2026-08-11 接受; 标准块 2026-08-18 裁定「同意」;同裁定的摘要视图/批量决裁通道已退役, 墓碑与原话见 `references/lanes/director.md`;收件箱由维护者定期与 AI 讨论消化,⛔ 不 assign diff --git a/.claude/skills/pm-dispatch/references/decision-analysis.md b/.claude/skills/pm-dispatch/references/decision-analysis.md index ecfb67c3a7..eea5de6cf0 100644 --- a/.claude/skills/pm-dispatch/references/decision-analysis.md +++ b/.claude/skills/pm-dispatch/references/decision-analysis.md @@ -10,9 +10,14 @@ ## 常设决裁批流程(2026-08-26 裁;裁决原话与归席见主文件「升级与决策」) -- 每批 ≤5 张,批序:在飞被阻塞 > 运营阻塞 > 用户可见 > 结构性;每卡 = 六项写法 + 四棱块; - 回批一行式「1A 2B …」,「X, 但…」= 附带条件随执行落地;裁后四件原子执行不再请示, - 一口气跑完;批间新入箱的卡滚入下一批,收件箱读数为零才收工。 +- 每批**恰好 5 张,呈完即停等回批**(2026-09-01 + 裁「每批5张详细解释,不是这样一堆列给我,这个也要写入skills」),⛔ 永不一条消息投多 + 批;批序:在飞被阻塞 > 运营阻塞 > 用户可见 > 结构性;每卡 = 六项写法 + 四棱块;回批一行 + 式「1A 2B …」,「X, 但…」= 附带条件随执行落地;裁后四件原子执行不再请示,一口气跑 + 完;批间新入箱的卡滚入下一批,收件箱读数为零才收工。 +- **「详细解释」= 逐卡散文**:业务问题 + 每选项真实代价 + 四维 + 一个推荐;⛔ 表格行、一 + 行判词、「变/未变」栅格不构成详解 —— 压缩批次是违规不是摘要,重分析轮同纪律。适 + 用面 = 任何席位向维护者**呈递需其裁决的决策项**,⛔ 不及结果陈述(轮报表格照旧)。 ## 落卡分析模板(主文件「落卡/升级流程」②的 references 细则;中文,2026-08-19 裁) @@ -42,5 +47,8 @@ 受六项约束:每行论据从业务立场写,机制名词只作括号补充。 **四棱分歧推荐序**(2026-08-27「tong y 4」):②实测拉动⇒荐①长远终态;零拉动⇒荐④不扩散; ③破余下平局向响亮/结构;安全与难逆恒人工;⛔ 只排推荐,分歧照旧升级、代裁面不扩。 +**①长远权重下限**(2026-09-01 裁「四维分析中,长期合理应该权重最高,至少50%」):①恒 +≥50%,推荐以①领起,另三轴合起来投不翻①;①按本义读(缩小而非扩大特例/契约增生),⛔ 不 +据它为投机扩张背书;⛔ 只排推荐不授权 —— 50% 不把人工地板的事变成可派发的事。 **应用仓推荐序特例**(2026-08-31 裁「既然是平台缺陷,就应该等待平台处理」):阻塞源是平台 缺陷 ⇒ 恒荐等待,⛔ 不荐绕行(形状容错/复刻平台规则)、不荐劈半落地。 diff --git a/scripts/check-skills-token-ratchet.mjs b/scripts/check-skills-token-ratchet.mjs index 2117a0a6f0..cbd4038526 100644 --- a/scripts/check-skills-token-ratchet.mjs +++ b/scripts/check-skills-token-ratchet.mjs @@ -332,7 +332,23 @@ export const CEILINGS = new Map([ // with the frame it amends — the #5130 drift is exactly a frame-semantics change // that skipped this mirror. +152 tokens across both copies, compressed to the // minimal anchor form; the raising PR's body carries the arithmetic. - ['skills/objectstack-pm-dispatch/SKILL.md', 14391], + // 14391 -> 14549: the axis WEIGHTING joined the decision frame (maintainer + // ruling 2026-09-01, verbatim and untranslated: 「四维分析中,长期合理应该权重最 + // 高,至少50%」 — long-term soundness carries the highest weight, at least 50%). + // Same shape and same reason as the +152 row above it: this file carries TWO + // enforced frame copies (check:skill-frame-sync COPIES), and a rule that + // changes WHICH RECOMMENDATION the frame yields is exactly the #5130 drift + // class if it ships to third-party installers with only the old tie-break — + // the customer's agent would weigh the axes co-equally while this repo weighs + // long-term ≥50%, and no report would reveal it. +158 tokens across both + // copies, against +152 for the comparable 2026-08-27 rule. Compressed twice + // before landing: the first 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: the file holds + // zero of each), so the verbatim ruling lives in the internal copies and in + // the raising PR's body. No genuine deletion was available: the rule makes no + // existing sentence redundant, and a re-wrap moves no tokens and pays nothing. + ['skills/objectstack-pm-dispatch/SKILL.md', 14549], ['skills/objectstack-query/SKILL.md', 5552], // -17 (was 5569) // 25125 -> 25143: the CRM UI Blueprint — the catalog's module-completeness // list, and the only place an agent is told what a finished module contains — @@ -826,8 +842,12 @@ function selfTest() { // and correctly does not shift this pin. Subtotal after: 118830, i.e. the // same 80 tokens of slack the strip's claim had before either raise — which // is the point of shifting rather than widening. + // 118910 -> 119068: same operation for the 2026-09-01 axis-weighting raise + // on the pm-dispatch row (+158, see that row) — one SKILL.md row, so the + // shift equals the raise exactly, and the strip's claim keeps the same 80 + // tokens of slack it has carried since before any of the three raises. ['the re-measure lowered the SKILL.md subtotal', - skillMdCeilings.reduce((a, [, n]) => a + n, 0) < 118910, true], + skillMdCeilings.reduce((a, [, n]) => a + n, 0) < 119068, true], // ── the #12392 extension basis ─────────────────────────────────────── // Same reasoning as the pins above: the gate never reads this sha, so it diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index 11201ab618..e7a8f646c1 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -255,7 +255,27 @@ export const CEILINGS = new Map([ // Lowered 48 → 46 by the #12081 soft-break closure (lowering is always // legitimate): three of this file's measured Han+ASCII-punct breaks merged // back into their paragraphs, and two of the three paid for themselves. - ['.claude/skills/pm-dispatch/references/decision-analysis.md', 46], + // Raised 46 → 54 by TWO same-day maintainer rulings on the decision frame, + // both of which explicitly order their own encoding into the skills. Verbatim + // and untranslated — the decision-batch presentation rule: + // 「每批5张详细解释,不是这样一堆列给我,这个也要写入skills」 + // and the axis-weighting rule, whose card-face half lands here (its full + // statement is in the frame's single source, SKILL.md 「升级与决策」, paid from + // that file's existing headroom): + // 「四维分析中,长期合理应该权重最高,至少50%」 + // +5 for the presentation teeth (exactly-5 / stop-and-wait / ⛔ multi-batch, + // and the prose-per-card duty with its applicability boundary — presenting + // items for a RULING, never already-decided result statements), +3 for the + // weight floor with its two guards (read through axis ①'s own definition, so + // it cannot underwrite speculative expansion; recommendation-only, so it + // cannot move the human floor). Could not be paid in place: all 46 lines are + // already packed to their own minimum at the 120-byte cap (measured per line + // — the file was densified at phrase boundaries by #13389 and the widest + // reflow saving available is zero), and re-wrap funding is refused per the + // 2026-08-17 rule in any case; the only other in-place payment was deleting a + // ruled clause, refused on the state-machine precedent. Landed count, headroom + // 0 again, same convention. + ['.claude/skills/pm-dispatch/references/decision-analysis.md', 54], // 134 → 133: whole-text restructuring round, PR-2 (maintainer ruling // 2026-08-23) — the three write-side sanitizer rows consolidated to one // author rule + one measured-behaviour row per surface (body / comment). @@ -350,7 +370,21 @@ export const CEILINGS = new Map([ // and 4 of the 8 paid for themselves. Zero content change — the diff is // byte-identical after whitespace normalization (39,313 B both sides), so the // 4 lines are re-flow slack, never a cut. Headroom 0 again, same convention. - ['.claude/agents/os-dev.md', 466], + // Raised 466 → 469 by the axis-weighting ruling (maintainer 2026-09-01, PM + // chat, verbatim and untranslated): 「四维分析中,长期合理应该权重最高,至少50%」. + // This file is one of the four `check:skill-frame-sync` COPIES, so a rule that + // changes which recommendation the frame yields has to reach it — the #5130 + // drift is exactly a frame-semantics change that skipped a mirror. +3 lines, + // folded into the existing binding sentence rather than added as a new + // paragraph. ⚠️ Re-wrap funding was AVAILABLE here and was REFUSED: three + // paragraphs nearby carry wrap artifacts (two orphan lines of 6 and 8 bytes) + // worth exactly the 3 lines needed, and merging them would have landed this + // file at 466/466 with no raise — that is 筹行, banned by the 2026-08-17 + // ruling, since the ratchet governs content volume and lines are only its + // machine-readable proxy. Measured both ways before reverting to the raise. + // The density fix is legitimate on its own and belongs in a net-reducing PR + // (2026-08-29 ruling), not this one. Landed count, headroom 0, same convention. + ['.claude/agents/os-dev.md', 469], // #9473: the other four `.claude/skills/` are read in full by the sessions // that use them too — the erosion mechanism the ratchet exists to stop // isn't specific to the pm-dispatch surface. Set at current counts on diff --git a/skills/objectstack-pm-dispatch/SKILL.md b/skills/objectstack-pm-dispatch/SKILL.md index 3883c5ad62..7fad0d4386 100644 --- a/skills/objectstack-pm-dispatch/SKILL.md +++ b/skills/objectstack-pm-dispatch/SKILL.md @@ -698,6 +698,12 @@ the AI-safety axis breaks remaining ties toward the loud option; security and destructive actions stay with the human. The order ranks recommendations only — a split still escalates. +**Axis ② carries the highest weight — at least 50%** when the axes conflict: +lead with the long-term reading, and the other three together cannot outvote +it. Read that weight through axis ②'s own definition — shrink special-cases +and contract accretion, never grow them — so it never underwrites speculative +expansion. It ranks recommendations only, never authority. + ### 9. Round report, then next round Print a round report to the maintainer: a table of issue → verdict → PR link → @@ -848,7 +854,11 @@ Justify your recommendation on all four axes; if they conflict, present the trade-off and let the maintainer decide, ranking the recommendation pull-first (real pull → long-term shape; zero pull → non-proliferation; the AI-safety axis breaks ties; security/destructive → always the maintainer); the ranking -orders recommendations only — a split still escalates. +orders recommendations only — a split still escalates. Long-term soundness +carries the highest weight, at least 50%: lead with it, the other three +together cannot outvote it, and read it as shrinking special-cases rather than +as licence to expand speculatively; weight ranks recommendations only, never +authority. Return "blocked" (with evidence) when the default branch is broken under you, a dependency issue is unmerged, or CI infrastructure fails — after retrying From 0bc968b9dfbd704850369f435e5c579fd9beef11 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 1 Sep 2026 07:25:41 +0000 Subject: [PATCH 2/2] Keep the quoted ruling on one line in the token-ratchet ledger #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 Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2 --- scripts/check-skills-token-ratchet.mjs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/check-skills-token-ratchet.mjs b/scripts/check-skills-token-ratchet.mjs index cbd4038526..41e166e5b9 100644 --- a/scripts/check-skills-token-ratchet.mjs +++ b/scripts/check-skills-token-ratchet.mjs @@ -332,9 +332,11 @@ export const CEILINGS = new Map([ // with the frame it amends — the #5130 drift is exactly a frame-semantics change // that skipped this mirror. +152 tokens across both copies, compressed to the // minimal anchor form; the raising PR's body carries the arithmetic. - // 14391 -> 14549: the axis WEIGHTING joined the decision frame (maintainer - // ruling 2026-09-01, verbatim and untranslated: 「四维分析中,长期合理应该权重最 - // 高,至少50%」 — long-term soundness carries the highest weight, at least 50%). + // 14391 -> 14549: the axis WEIGHTING joined the decision frame — long-term + // soundness carries the highest weight, at least 50%. Maintainer ruling + // 2026-09-01, verbatim and untranslated (kept on ONE line, #11106: a governed + // quotation that soft-breaks stops being findable by the things that grep it): + // 「四维分析中,长期合理应该权重最高,至少50%」 // Same shape and same reason as the +152 row above it: this file carries TWO // enforced frame copies (check:skill-frame-sync COPIES), and a rule that // changes WHICH RECOMMENDATION the frame yields is exactly the #5130 drift