Skip to content

docs(skills): repair five semantic minors in the axis-weighting and batch-presentation encoding - #14779

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14146-frame-copy-minors
Sep 3, 2026
Merged

docs(skills): repair five semantic minors in the axis-weighting and batch-presentation encoding#14779
os-zhuang merged 1 commit into
mainfrom
claude/issue-14146-frame-copy-minors

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes #14146

Five semantic minors in the axis-weighting / batch-presentation encoding, caught by the at-tier compensating review of PR #14142 and fixed exactly as the reviewer prescribed. Every edit is in place: zero net lines in all four ratcheted files, and the published entry shrinks.

Positions are re-measured on today's main (224f8ea4a); the card's line numbers predate two merges, so they are restated below with the old number in parentheses.

Item 1 — stale cap-form restatement replaced by a pointer

Landing: .claude/skills/pm-dispatch/SKILL.md L454 (card: L441)

before …照旧现场呈报,走每批 ≤5 与详细写法纪律。
after …照旧现场呈报,走常设决裁批流程与详细写法纪律。

The class-2/3 live-presentation route carried an inline 每批 ≤5 while the single home now rules 恰好 5 张 — a seat following the old line could present a 2-card batch and claim compliance. The number is gone; 常设决裁批流程 is the verbatim section heading in references/decision-analysis.md, so the pointer is greppable and there is now exactly one place that states the batch size. Line is 119 bytes (limit 120), zero lines added.

Item 2 — the final partial batch gets its legal move

Landing: .claude/skills/pm-dispatch/references/decision-analysis.md L13

before - 每批**恰好 5 张,呈完即停等回批**(2026-09-01
after - 每批**恰好 5 张(末批不足照呈),呈完即停等回批**(2026-09-01

恰好 5 张 plus 收件箱读数为零才收工 (L17) forbade both presenting fewer than 5 and holding the remainder — the last batch of any queue that is not a multiple of five had no legal move. Inserted in place on the existing line: 57 B to 77 B, file stays at 54 lines (ceiling 54, headroom 0).

Item 3 — count-free wording, in every copy

Chosen: count-free wording. NOT a MENTION_PATTERNS extension. The reasoning, since the card left the choice open:

  • The gate's own charter is "blind to prose and sharp on shape", and its %N% / %Q% design exists so that an anchor never spells the value it compares. A count − 1 mention check re-introduces a derived arithmetic relationship that the regex must know in two languages — and a regex can only ever see the spellings it enumerates. Miss one (另外三轴, 其余三条, the remaining three) and the gate is green while the text is stale: the exact defect being repaired, one layer up.
  • Count-free wording removes the failure mode instead of policing it. After this PR there is no derived count anywhere in the four copies, so there is nothing for a future axis-count change to leave behind.
  • A MENTION_PATTERNS extension landed alongside count-free wording would have zero live matches — a dormant pattern, which is the shape this repo's gates treat as rot.

frameCountMentions still sees and checks the 4 real count mentions (gate output below); this change adds nothing to it and removes nothing from it.

Six sites, all count − 1 hard-codings (the card named five weighting clauses; the sixth, L553, is the same defect class in the axis-① worked example — same file already in this claim's surface, same gate family, mechanical, no new verification surface):

landing before after
.claude/skills/pm-dispatch/SKILL.md L905 另三轴合起来投不翻它 其余各轴合起来投不翻它
references/decision-analysis.md L51 另三轴合起来投不翻① 其余各轴合起来投不翻①
.claude/agents/os-dev.md L418 推荐以它领起,另三轴合起来投不翻它 推荐以它领起,其余各轴合起来投不翻它
skills/objectstack-pm-dispatch/SKILL.md L553 On the other three axes they On the other axes they
skills/objectstack-pm-dispatch/SKILL.md L593 the other three together cannot outvote the others together cannot outvote
skills/objectstack-pm-dispatch/SKILL.md L659 lead with it, the other three lead with it, the others

另三轴 and the other three are now at 0 occurrences across all four copies.

Item 4 — published entry: dangling anchor and the dropped term

Landing: skills/objectstack-pm-dispatch/SKILL.md L594 (card: L703) and L660-661 (card: L859)

site before after
L594 Read that weight through axis ②'s own definition — shrink special-cases and contract accretion, never grow them Read that weight as shrinking special-cases and contract accretion, never growing them
L660-661 read it as shrinking special-cases rather than as licence to expand speculatively read it as shrinking special-cases and contract accretion rather than as licence to expand speculatively

The L594 citation pointed at that file's axis-② definition for the shrink-not-grow reading, which that definition nowhere states (the real anchor deliberately does not ship under the route-B generalization) — it is now self-contained and asserts the reading directly. L660-661 regains and contract accretion, the term the zero-pull no-conflict argument turns on.

Item 5 — the lead-with-long-term duty, unconditional in all five encodings

The card's premise held on today's tree: 3 unconditional, 2 scoped to axis conflict.

encoding before after
.claude/skills/pm-dispatch/SKILL.md L904-905 四轴冲突时推荐以长远的读数领起,另三轴合起来投不翻它conditional 推荐以长远的读数领起,四轴冲突时其余各轴合起来投不翻它 — unconditional lead
skills/objectstack-pm-dispatch/SKILL.md L592-593 **Axis ② carries the highest weight — at least 50%** when the axes conflict: lead with the long-term reading, and…conditional **Axis ② carries the highest weight — at least 50%.** Lead with the long-term reading; when the axes conflict, the others…
references/decision-analysis.md L50-51 ①恒 ≥50%,推荐以①领起 — already unconditional unchanged (item 3 rewording only)
.claude/agents/os-dev.md L417-418 推荐以它领起 — already unconditional unchanged (item 3 rewording only)
skills/objectstack-pm-dispatch/SKILL.md L659 lead with it — already unconditional unchanged (item 3 rewording only)

Conflict-scoping is kept, in both rewritten copies, on the cannot-outvote consequence only — which is where it is meaningful, since there is nothing to outvote absent a conflict.

Line and token arithmetic, per file

file lines before lines after ceiling headroom
.claude/skills/pm-dispatch/SKILL.md 989 989 1005 16 (unchanged)
.claude/skills/pm-dispatch/references/decision-analysis.md 54 54 54 0 (unchanged)
.claude/agents/os-dev.md 469 469 469 0 (unchanged)
skills/objectstack-pm-dispatch/SKILL.md 753 753 not line-ratcheted

No line in any edited file exceeds the 120-byte rule; the widest edited lines are SKILL.md L454 (119 B), L904 (118 B) and os-dev.md L418 (120 B). max-table-row-bytes pins are untouched — no table was edited.

Published entry, token ratchet (convention ceil(utf8 bytes / 4)), measured per site:

site items before after delta
L553 3 77 B 71 B −6 B
L592-596 3, 4, 5 372 B 335 B −37 B
L657-662 3, 4 235 B 253 B +18 B
file 38,832 B = 9,708 tokens 38,807 B = 9,702 tokens −25 B / −6 tokens

How item 4's added words are paid, inside the same file, without a re-wrap and without a ceiling change: item 4's only cost is and contract accretion at L660-661, +23 B. It is paid by item 4's own other half — deleting the dangling citation through axis ②'s own definition — (38 B, replaced by as , 3 B) at L594 — with item 3's −16 B of count-free rewording on top. The ceiling stays at 9,708 and is not lowered, per the dispatch's explicit no-ceiling-change constraint; the file now sits 6 tokens under it.

Published-surface readings (skills/** diff)

Both readings the published surface requires, lines first, tokens beside them:

reading before after delta
edited file — skills/objectstack-pm-dispatch/SKILL.md 753 lines · 38,832 B · 9,708 tokens 753 lines · 38,807 B · 9,702 tokens 0 lines · −25 B · −6 tokens
whole published package — all 11 skills/*/SKILL.md 6,862 lines · 318,948 B · 79,737 tokens 6,862 lines · 318,923 B · 79,731 tokens 0 lines · −25 B · −6 tokens

No net expansion in either reading: this PR corrects wording in place and the published surface comes out marginally smaller. There is no new capability here and therefore no "small feature, big write-up" to price — the one clause that gains words (item 4's and contract accretion) is paid twice over inside the same file.

skip-changeset

Applied. The diff publishes nothing from any package: .claude/** agent protocol plus the skills/** catalog, which ships through npx skills add, not through a package release. Measured rather than assumed — none of the six most recent commits touching skills/objectstack-pm-dispatch/SKILL.md carried a .changeset/ file (c985ae958, a9b2be0b0, 2bff79ae3, bcc9189e6, 3d0897459, d250754fd), and 2bff79ae3 is this card's own parent PR with the identical face set.

Gates

Every command ran through scripts/pm/os-verify-lock.sh (slot issue-14146), each exit code captured by redirect before any pipe. The union below was re-derived after the final commit with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands and run at dd9f7d39f — the branch head.

gate verdict line
check:skill-frame-sync ✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files · 4 axes: business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline · binding sentence present in all 4; 4 count mention(s) agree; 40 markdown files scanned for undeclared copies.
check:skill-frame-sync --self-test ✓ check-skill-frame-sync self-test: 12 cases pass, plus 5 dispatch-gates declaration cases.
check:skill-frame-freshness ✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).
check:skill-frame-freshness --self-test ✓ check-skill-frame-freshness self-test: 12 cases pass.
check:pm-skill-ratchet ✓ …SKILL.md is 989 lines (ceiling 1005; headroom 16). · ✓ …decision-analysis.md is 54 lines (ceiling 54; headroom 0). · ✓ …os-dev.md is 469 lines (ceiling 469; headroom 0).
check:pm-skill-ratchet --self-test ✓ check-skill-line-ratchet self-test: 111 cases pass.
check:pm-skill-id-lint ✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g). · self-test 14 cases pass.
check-skills-token-ratchet ✓ …skills/objectstack-pm-dispatch/SKILL.md is 9702 tokens (ceiling 9708; headroom 6). · ✓ …36 authored bundle file(s) within their ceilings
check-skills-token-ratchet --self-test ✓ check-skills-token-ratchet self-test: 64 cases pass.
@objectstack/spec check:skill-docs ✓ skills/README.md · ✓ content/docs/ai/skills-reference.mdx · ✅ Skill docs in sync
check:nul-bytes check-nul-bytes: OK (scanned 8052 text file(s) — 8052 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes). · self-test 75 assertions

Full derived union at dd9f7d39f20 of 22 green, and the two that are not green are NOT MEASURED, not red:

check-ci-filter-parity · check-cross-package-test-inputs · check-shard-attestation · check-skills-token-ratchet · check:skill-docs · check:agent-model-declared · check:agent-test-spelling · check:corpus-claim-drift · check:cross-package-test-inputs · check:doc-authoring · check:nul-bytes · check:pm-governed-merges · check:pm-governed-prose · check:pm-skill-id-lint · check:pm-skill-ratchet · check:role-word · check:skill-compatibility · check:skill-frame-sync · check:skill-identifier-liveness · check:skill-frame-freshness — all green.

  • check-test-completenessexit 3, NOT MEASURED. Its own text: "That list names this script with NO argument… There is no local log to hand it, so the local reading for this gate is NOT MEASURED. ⛔ It is not a red, and there is nothing here to fix." It consumes a turbo run test log that only CI produces; this diff touches no test.
  • check:doc-formula-expressionsexit 3, PREREQUISITE NOT MET (@objectstack/formula is not built in this worktree). Not a finding. Building it needs the shared verify lock, and two bounded acquisitions timed out at the 540 s budget behind a sibling's run (exit 99, place kept — also NOT MEASURED, never a red). Declared narrowing, measured from the gate's own predicate rather than asserted: fencedBlocks() keeps only fences whose language tag is ts, typescript or tsx, and the text scan is FIELD_RULE_TEXT_RE (visibleWhen|readonlyWhen|requiredWhen). Across all four edited files the gate would parse 0 fenced blocks — the fences present are bash, json, text and bare, none of them a parsed language — 0 of the 17 changed lines fall inside a parsed block, and there are 0 FIELD_RULE_TEXT_RE occurrences. The gate has nothing to read in this diff, so its verdict cannot move. CI builds the package and runs it for real.

Beyond the derived union I also self-scanned the four edited files for raw control bytes (grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'): zero hits.

Premise notes


🤖 Generated with Claude Code

https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1


Generated by Claude Code

… encoding

Five in-place, zero-net-line corrections to the escalation decision frame's
four copies and the decision-analysis reference:

1. The class-2/3 live-presentation route in the internal PM skill restated a
   stale per-batch cap; it now points at the single home that rules the batch
   size, so the two cannot drift apart again.
2. The standing adjudication batch flow had no legal move for a final partial
   batch (an exact-size rule plus a drain-the-inbox rule forbade both
   presenting short and holding the remainder). The short last batch is now
   presented as-is.
3. Every weighting clause hard-coded "the other three", an axis-count minus one
   that the frame-sync gate's MENTION_PATTERNS structurally cannot see. All six
   sites are now count-free, so no derived count can go stale.
4. Published entry: the shrink-not-grow reading no longer cites an axis
   definition that does not state it, and the embedded dev template regains
   "and contract accretion" — the term the zero-pull argument turns on.
5. The lead-with-long-term duty is now unconditional in all five encodings;
   conflict-scoping is kept only on the cannot-outvote consequence.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
@github-actions github-actions Bot added the size/s label Sep 3, 2026
@os-litant os-litant added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s labels Sep 3, 2026 — with Claude
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 3, 2026
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 33706142983 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Test Core (1/6) — 失败步骤: Run this shard's tests

    @objectstack/cli:test:  FAIL   integration  test/run-dev-unbuilt-workspace.e2e.test.ts > the mirror direction: a reader that is never coming back > gives up and exits instead of waiting forever
      ↳ 失败原因: @objectstack/cli:test: AssertionError: expected 'SIGKILL' to be null
    

↳ 失败原因 是判读的关键:超时Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

跨 PR 相同签名(24h,按失败测试文件聚合):

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 39 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

Merged via the queue into main with commit db07f69 Sep 3, 2026
39 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14146-frame-copy-minors branch September 3, 2026 02:51
This was referenced Sep 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants