Uh oh!
There was an error while loading. Please reload this page.
fix(pm): correct stale four/two-copy decision-frame comments to two-copy truth - #15105
Merged
Merged
Conversation
…opy truth check:skill-frame-sync's COPIES table dropped from four entries to two (internal-pm, published-pm) when the dev-side frame copies were retired — the dev prompt now receives the frame pasted from the PM's own copy at dispatch time instead of embedding one. Six comments across dispatch-gates.mjs, check-skill-line-ratchet.mjs and check-skills-token-ratchet.mjs still described the old four/two-copy state as present-tense fact; this rewrites them to the current truth without touching any behaviour, verdict line, or ceiling value (every affected self-test prints the identical case count before and after). Also moves dispatch-gates.mjs's `--changed` flag from a whole-invocation usage-line alternative (implying it excludes --commands/--json) to the position `<path> ...` occupies, matching how #15036 placed --residue — `--changed --commands` is legal and answers, so the old line advertised a refusal the argv chain does not make. New self-test pins lock the fix, including a live CONTROL that the combination really works. Fixes#14870 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
os-steve
marked this pull request as ready for review
September 3, 2026 23:00
os-steve
enabled auto-merge
September 3, 2026 23:01
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Sep 3, 2026
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#14870
What
check:skill-frame-sync'sCOPIEStable dropped from four entries to two (internal-pm→.claude/skills/pm-dispatch/SKILL.md,published-pm→skills/objectstack-pm-dispatch/SKILL.md) once the dev-side frame copies were retired — the dispatch PM now pastes its own copy into the dev prompt's{decision_frame}slot at dispatch time instead of either side embedding one. Six comments across three gate scripts still described the old four/two-copy state as present-tense fact. This PR rewrites exactly those six sites to the current truth, plus one unrelated one-word usage-line fix folded in by the seat. Comment/string text only — no behaviour, no verdict line, no ceiling value changed anywhere.The six sites (before → after)
scripts/pm/dispatch-gates.mjsMANDATORY_TIER_GLOBSwhy-string for.claude/agents/os-dev.md— kept the mandate (clause ① protocol semantics still holds), fixed only the false reason:…every dispatched dev runs under it, and it carries an enforced copy of the decision frame…every dispatched dev runs under it, and receives the decision frame the PM pastes into its prompt at dispatch time rather than carrying a copy of its ownMANDATORY_TIER_GLOBSwhy-string forskills/objectstack-pm-dispatch/SKILL.md:…the published PM skill carries two enforced copies of the decision frame (check:skill-frame-sync COPIES)……the published PM skill carries one enforced copy of the decision frame (check:skill-frame-sync COPIES)…t('the published PM skill (two enforced frame copies) is fable-mandatory', …)t('the published PM skill (one enforced frame copy) is fable-mandatory', …)Docblock line at the old
:8468("every file carrying an enforced copy of the decision frame (the COPIES table…)") was checked against the ruling's "if it counts wrongly" condition and left untouched: it never asserts a specific number, and it already lists the dev-agent definition as a separate item rather than as a frame-copy carrier — so it doesn't count wrongly post-reduction.scripts/pm/check-skill-line-ratchet.mjs— theos-dev.mdceiling ledger comment justifying its 466→469 raise: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 pm-dispatch SKILL:决策分析轴由两条扩为三条 —— 补「实际业务需求」轴与创业聚焦原则(维护者 2026-08-04 指示) #5130 drift is exactly a frame-semantics change that skipped a mirror.`This file is not a \check:skill-frame-sync` COPIES entry, but it names the decision frame's mechanism (the dev reads it from the PM's pasted copy at dispatch time), and a rule that changes which recommendation the frame yields still has to reach that description — the pm-dispatch SKILL:决策分析轴由两条扩为三条 —— 补「实际业务需求」轴与创业聚焦原则(维护者 2026-08-04 指示) #5130 drift is exactly a frame-semantics change that skipped a mirror.`scripts/check-skills-token-ratchet.mjs— three ledger comments forskills/objectstack-pm-dispatch/SKILL.md's history:…and this file carries TWO enforced frame copies (check:skill-frame-sync COPIES)…→…and this file carries one enforced frame copy (check:skill-frame-sync COPIES)……this file carries TWO\n enforced frame copies (check:skill-frame-sync COPIES)…→…this file carries one\n enforced frame copy (check:skill-frame-sync COPIES)……the two gate-pinned copies of the decision frame stay in this file…→…the one gate-pinned copy of the decision frame stays in this file…:324) against the same "if it counts wrongly" condition: it's an unrelated sense of "frame" (the skill-package reading order, not the decision frame) and an unrelated "five"/"four" (SKILL.md package count, not COPIES) — left untouched, per the mechanism-assumptions note that this file's comment block counts other things ("the fiverules/*.mdrows" elsewhere) for reasons that have nothing to do with frame COPIES.The one-word member (folded in per the seat's dispatch)
dispatch-gates.mjs'sUSAGE_LINEpresented--changedas a whole-invocation alternative that takes no other flag (… [<path> ...] | --changed | --self-test), though--changed --commandsis legal and answers (verified live: exit 0, 23 commands). Moved--changedinto the position<path> ...occupies — the other path source it stands in for — matching how #15036 placed--residueinside the alternation it really combines with:Pinned beside the existing
#15036usage-line pins with three new self-test cases, including a live CONTROL that--changed --commandsreally answers (so the fix isn't cosmetic on a refusal that doesn't exist).Tests
All run through the shared verify lock; self-test verdict lines quoted exactly, before/after byte-identical for the six comment-text sites.
node scripts/check-skill-frame-sync.mjs(unaffected file, sanity check both before and after):✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files— unchanged.node scripts/pm/check-skill-line-ratchet.mjs --self-test: before✓ check-skill-line-ratchet self-test: 136 cases pass.— after✓ check-skill-line-ratchet self-test: 136 cases pass.(identical).node scripts/pm/check-skill-line-ratchet.mjs(regular verdict, post-edit): green, ceilings/headroom unchanged (AGENTS.md1157/1162,CLAUDE.md36/86, one declared cross-file move, etc.) — no ratcheted file was touched by this PR.node scripts/check-skills-token-ratchet.mjs --self-test: before✓ check-skills-token-ratchet self-test: 64 cases pass.— after✓ check-skills-token-ratchet self-test: 64 cases pass.(identical).node scripts/check-skills-token-ratchet.mjs(regular verdict): before/afterdiffon full output is empty (byte-identical) —✓ check-skills-token-ratchet: 36 authored bundle file(s) within their ceilings; 11 generator-owned file(s) measured, not ratcheted.node scripts/pm/dispatch-gates.mjs --self-test(the heavy one, run through the lock each time):origin/main0f94cc7c):✓ dispatch-gates self-test: 1319 cases pass.✓ dispatch-gates self-test: 1322 cases pass.— exactly +3, the new--changedusage-line pins (item 2); zero✗anywhere in either run.pnpm check:pm-skill-ratchet(the wrapped gate form): green, same ceiling readings as the direct run above.pnpm check:skill-frame-sync:✓ check-skill-frame-sync self-test: 13 cases pass, plus 5 dispatch-gates declaration cases and 3 scan-population casesthen✓ check-skill-frame-sync: 2 copies … across 2 files— the 5 "dispatch-gates declaration cases" cross-checkMANDATORY_TIER_GLOBSagainstCOPIESand stayed green, confirming cross-file consistency after the edits.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(live re-derivation against this diff, no paths passed): 28 families owed total (21 matched by path + 1 by change-kind convention [node scripts/pm/bare-root-worklist.mjs --self-test, triggered because this diff edits gate scripts] + 6 always-run whole-tree). All 28 run below.cd303b24(this PR's exact head, after push):node scripts/pm/dispatch-gates.mjs --self-test→✓ dispatch-gates self-test: 1322 cases pass.(exit 0);node scripts/pm/check-skill-line-ratchet.mjs --self-test→✓ check-skill-line-ratchet self-test: 136 cases pass.(exit 0, identical to baseline);node scripts/check-skills-token-ratchet.mjs --self-test→✓ check-skills-token-ratchet self-test: 64 cases pass.(exit 0, identical to baseline).npx eslint scripts/pm/dispatch-gates.mjs scripts/pm/check-skill-line-ratchet.mjs scripts/check-skills-token-ratchet.mjs --no-inline-config --format json: 3 files linted (count read from the JSON output itself), 0 errors, 0 warnings. Narrowed-but-proven per this repo's own lint config, which never enables type-aware linting for any file (eslint.config.mjs's own comment: "never enables type-aware linting … for ANY" file) — so this diff (comment/string edits in 3 files) cannot move any untouched file's verdict, and the full repo-widepnpm lintis deferred to CI rather than re-run locally.Full local gate table (all green, exit code captured before any pipe)
Also ran ad hoc (not on the given list, but load-bearing for this PR):
Repo-wide
pnpm lintand the changeset-triggered gate family were not run locally — this PR's surface is exactly threescripts/**files (no package publish, no.changeset/), so those either don't apply or are deferred to CI per the standard local-scope discipline.Scope discipline
.md, no other script.check-skill-frame-sync.mjsitself is untouched — it's already correct (2 copies, 2 files) since the [Decision] Skills optimization program — batch 3 (5 items): DATA-F-07defineHook()vs the platform's own examples · #13597 Phase-2 — X0 quote policy ·CLAUDE.mdexcerpt form · the four-copy decision frame · cross-file line-budget moves #14685 item-4 flight landed; this PR only follows up the comments elsewhere that hadn't caught up.skip-changeset
This PR publishes nothing from any released package (
scripts/pm/**andscripts/*.mjstooling only) — applying theskip-changesetlabel per the repo's real mechanism, with an additive write and read-back.Generated by Claude Code