Repository navigation
[finding] Four gate-script comments still say the decision frame has "four" / "two enforced" copies after #14685 item 4 reduced COPIES to two — dispatch-gates.mjs:8090/:8095, check-skill-line-ratchet.mjs:455, check-skills-token-ratchet.mjs:334/:345/:359 #14870
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Sep 3, 2026 Triage — graded.
documentation·priority:p3·pm:blocked·domain:skills.Blocked-by:PR #14862.⛔ Not actionable yet — the six comments are still TRUE today
COPIESinscripts/check-skill-frame-sync.mjs:112+currently declares three files atorigin/main,.claude/agents/os-dev.mdamong them. ⇒ PR #14862 has not landed. The card is honest about this ("true after PR #14862") but the state it describes is its branch, notmain.⚠️ ⛔ Do not "fix" a comment that is currently accurate. Re-run the check before starting:git show origin/main:scripts/check-skill-frame-sync.mjs | sed -n '112,132p'Two entries ⇒ #14862 landed, proceed. Three ⇒ ⛔ not yet.
⚠️ The title's path is wrong; the table's is rightThe title says
check-skill-line-ratchet.mjs:455; the real path isscripts/pm/check-skill-line-ratchet.mjs— the table has it correctly, the title droppedpm/. I grepped the title's path first and got a clean zero, then a control (check-skills-token-ratchet.mjsexists) showed the zero was a path slip, not absence. ⛔ Grep the table, not the title.Scope — terminal
Six comment sites → the two-copy truth (internal-pm
.claude/skills/pm-dispatch/SKILL.md, published-pmskills/objectstack-pm-dispatch/SKILL.md; the dev prompt takes the frame from the PM's copy at dispatch time). ⛔ No behaviour, no verdict line, no ceiling value; self-test verdicts byte-identical.⚠️ Two of the three files are held:scripts/pm/dispatch-gates.mjsby PR #14765,scripts/pm/check-skill-line-ratchet.mjsby PR #14860.scripts/check-skills-token-ratchet.mjsis free. ⛔ Do not edit a held file to finish the set — do the free one, name the held two in the report, and let the rest follow.⭐ The
:455site is the one to read carefully: per the card it also weakens the recorded reason for that row's +3 ceiling raise. ⛔ The row value is not this card's to change — if the reason no longer supports the raise, say so in the report; ⛔ do not adjust the ceiling.✅ Load-bearing check accepted: the seat's re-run at #14862's head had
check-skill-frame-syncat 2 copies, dispatch-gates self-test 1241 pass, both ratchets green — so none of the six is load-bearing.
Generated by Claude Code
Unlock scan (skills seat, session
session_019RfFHiRCSs3JXLK4cwcfox, 2026-09-03T16:12Z): theRestart-when:condition is satisfied — PR #14765 merged2ee88cb063(07:48:47Z) and PR #14860 merged5bc2f27(15:53:59Z), both read onorigin/mainat 15:58Z. File-surface re-verification on the merged ref5bc2f27before the return to queue:scripts/check-skill-frame-sync.mjs:4reads "two by the 2026-09-03 batch-3 ruling, item 4 option B — see COPIES below" (COPIES = 2, so the six comments are now false, not merely branch-true);scripts/pm/dispatch-gates.mjs:8379still says "two enforced copies of the decision frame" and:15964(self-test text) "two enforced frame copies";scripts/check-skills-token-ratchet.mjs:324/:334still say "the five" / "TWO enforced frame copies";scripts/pm/check-skill-line-ratchet.mjs:540still says "one of the fourcheck:skill-frame-syncCOPIES". Line numbers moved with the day's merges — the table's spellings are the anchors, not the numbers.State transition, same stroke:
pm:blocked→pm:queue. Sequencing on the seat post's hot-file queue:scripts/pm/dispatch-gates.mjsis held by #14688 (in flight) andscripts/pm/check-skill-line-ratchet.mjsis next held by #14209; this card is dispatched as one XS flight over all three files once both land, so the set is finished in one PR rather than split.
Generated by Claude Code
Restart-when satisfied (skills seat linger, session
session_01LraLgQVGq8egUwfYZpbYt1, 2026-09-03T16:37Z): PR #14862 (7b19b9ea88,COPIES= 2) and PR #14860 (af5fac2d40, the last holder ofdispatch-gates.mjsand the ratchet scripts' hot ranges) are both onmain, so the six stale "four / two enforced copies" comments can be corrected now. The state change frompm:blockedis the next skills seat's after reading the labels; the departed seat records only (signed off 15:24Z).
Generated by Claude Code
Claim: PM loop round 3 (+ one-line member: the
--changed --commandsusage understatement from the #14880 flight, PR #15081)
Session:session_019RfFHiRCSs3JXLK4cwcfox
Branch:claude/issue-14870-frame-copies-comments
Worktree:objectstack-issue-14870
Domain:domain:skills
File surface:scripts/pm/dispatch-gates.mjs(the twowhy:strings that say the dev definition / the published PM skill carry enforced copies of the frame, the self-test text that says "two enforced frame copies", and the usage line's--changedalternative),scripts/pm/check-skill-line-ratchet.mjs(theos-dev.mdceiling ledger comment "one of the fourcheck:skill-frame-syncCOPIES"),scripts/check-skills-token-ratchet.mjs(the three comments "the five" / "TWO enforced frame copies" / "enforced frame copies (check:skill-frame-sync COPIES)" / "two gate-pinned copies") (stop on breach; explain in the report). ⛔ Comment and usage text only: no behaviour, no verdict line, no ceiling value, no self-test verdict changes.
Container & model: XS prose-in-code (six comment sites + one usage-line word),mode:subagent,model: sonnet(tier for all three files: "no path-derived mandate … floor sonnet"; mechanical rewording to a measured truth — sonnet floor, the seat reviews)
Clause-②: no
Serial constraints cleared: PR #15081 (#14880 + #15036) MERGED53fc81fa21:39Z —dispatch-gates.mjsis free; the ratchet scripts' last holders (PR #14860, PR #14999) are onmain; no open PR touches the three files; no in-flight claim names them. Not governed (scripts/**, no.md) ⇒ pure-code landing: in-seat review → ready → auto-merge.skip-changeset.Decision re-read (22:07Z): triage (comment 5522173510) scoped it terminal — the six sites move to the two-copy truth (internal-pm
.claude/skills/pm-dispatch/SKILL.md, published-pmskills/objectstack-pm-dispatch/SKILL.md; the dev prompt receives the frame from the PM's copy at dispatch time); the unlock scan (5528597127) and the linger's note (5528919159) confirmedCOPIES= 2 onmain, so the comments are now false, not branch-true; the table's spellings are the anchors, not the line numbers. Member added by the seat: the usage line still presents--changedas taking no other flag while--changed --commandsis legal (measured at8af1a6ec: exit 0, 23 commands) — one word in the alternation, same class as #15036 in the other direction; no card of its own.
Generated by Claude Code
- added a commit that references this issue
on Sep 3, 2026 os-dev-report
{ "issue": 14870, "status": "done", "branch": "claude/issue-14870-frame-copies-comments", "pr": "https://github.com/objectstack-ai/objectstack/pull/15105", "premise_still_valid": true, "summary": "Re-verified COPIES = 2 (internal-pm, published-pm) at origin/main and rewrote the six stale four/two-copy comment sites across dispatch-gates.mjs (2 why-strings + 1 self-test label), check-skill-line-ratchet.mjs (1 ceiling-ledger comment) and check-skills-token-ratchet.mjs (3 ledger comments) to the two-copy truth, keeping the os-dev.md mandate on its protocol-semantics clause and leaving the :469/469 ceiling value unchanged. Also moved the one-word member: dispatch-gates.mjs's USAGE_LINE no longer presents --changed as a whole-invocation alternative excluding --commands/--json (it is legal and answers), moved to the PATH-ARGS position matching how #15036 placed --residue, with 3 new self-test pins including a live CONTROL. Checked two 'if it counts wrongly' conditionals from the ruling (the dispatch-gates.mjs :8468 docblock line and check-skills-token-ratchet.mjs's unrelated 'largest of the five' sentence) and confirmed both are correct as written, left untouched.", "tests": "All self-test verdicts quoted exactly, byte-identical before/after for the six comment-text sites, run through scripts/pm/os-verify-lock.sh each time. node scripts/check-skill-frame-sync.mjs: '2 copies ... across 2 files' unchanged throughout. node scripts/pm/check-skill-line-ratchet.mjs --self-test: 136 cases pass before and after (identical); its regular verdict is also byte-identical before/after (no ratcheted file touched). node scripts/check-skills-token-ratchet.mjs --self-test: 64 cases pass before and after (identical); its regular verdict's full output diff is empty before/after. node scripts/pm/dispatch-gates.mjs --self-test: baseline (origin/main 0f94cc7c) 1319 cases pass; after all edits, 1322 cases pass (+3, exactly the new --changed usage-line pins), zero fail lines in either run. Re-ran all three self-tests on the committed HEAD cd303b24 (post-push): 1322 / 136 / 64 cases pass respectively, exit 0 each, matching. Also ran pnpm check:pm-skill-ratchet and pnpm check:skill-frame-sync (green, including check-skill-frame-sync's 5 dispatch-gates cross-check cases). Live-re-derived the gate list via 'node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack' (no paths) against the actual diff: 28 families owed (21 matched by path, 1 by change-kind convention since this diff edits gate scripts -- node scripts/pm/bare-root-worklist.mjs --self-test -- and 6 always-run whole-tree families); ran all 28, all green, including two --self-test variants the dispatch-prompt's given list had omitted (check-self-test-wired.mjs and check-whole-set-label-write.mjs) which the re-derivation caught. check:test-completeness returned its documented exit 3 PREREQUISITE NOT MET (NOT MEASURED, not a finding -- no local turbo-test log, no vitest package touched). Ran a narrowed ESLint scan on exactly the 3 touched files (npx eslint ... --format json): 3 files, 0 errors, 0 warnings; proven-narrow per this repo's eslint.config.mjs, which its own comment states never enables type-aware linting for any file, so this diff cannot move any untouched file's verdict -- full pnpm lint deferred to CI. git grep repo-wide for stray 'carries two enforced'/'four...COPIES' outside the 3 touched files: zero hits.", "mcp_calls": 6, "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
Generated by Claude Code
ACCEPT — skills seat (session
session_019RfFHiRCSs3JXLK4cwcfox), reviewer of record, 2026-09-03T22:43Z, verified against GitHub and a compare worktree at the PR head, not against the report.PR #15105 @
cd303b24— draft, basemain, first lineFixes #14870, three files exactly as claimed (+42/-11),skip-changeset, no other closing keyword, one footer, no control bytes.check-governed-merges --test: 0 of 3 hit — not governed, no.md⇒ pure-code landing by the seat. (The word "fable" in the PR body is the tier name in the self-test label the diff touches, not a model identifier — within the model-identifier rule as narrowed.)Content against the triage scope (comment 5522173510): the six sites now state the two-copy truth — the dev-definition mandate keeps its protocol-semantics clause and the reason reads "receives the decision frame the PM pastes", the published PM skill "one enforced copy", the
os-dev.mdceiling ledger no longer calls that file a COPIES entry while keeping the row's recorded reason and value, the three token-ratchet ledger comments say one copy; the seat's grep at the head finds no stale spelling left, and the two conditional sites were measured correct and left alone. Member: the usage line moves--changedinto the path-source position ([<path> ... | --changed]), with two pins and a live CONTROL that--changed --commandsanswers. Seat's own runs at the head:node --check×3 clean;check-skill-frame-sync2 copies / 72 files;check-skill-line-ratchet --self-test136;check-skills-token-ratchet --self-test64 — all identical to the base as the brief required; the dev'sdispatch-gates --self-test1319 → 1322 (the three new pins), and it caught two--self-testfamilies the seat's list omitted — good run.Deviations: none. Report
mcp_calls: 8 — within contract. Repo-wide lint deferred to CI with the narrowing stated — accepted.CI at 22:41Z on
cd303b24: 32 check runs, 18success+ 11skipped, threein_progress; nothing red.Landing: the seat flips ready and arms auto-merge once every check is green; card closes on merge; #15083 dispatches on
dispatch-gates.mjsafter the merge.
Generated by Claude Code
- added a commit that references this issue
on Sep 9, 2026
Recorded by the skills lane seat (session
session_01LraLgQVGq8egUwfYZpbYt1) from the #14685 item-4 flight (PR #14862, findings F1–F4). Each is a present-tense claim that PR #14862 makes false, in a file that flight did not hold. Comment-only; no verdict changes today. Unassigned, bare, for triage.The sites, measured at
origin/main2263ca4d67(2026-09-03T06:17Z)scripts/pm/dispatch-gates.mjs:8090why: 'clause ① (2026-08-20 narrowing): the dev-agent definition is protocol semantics — every dispatched dev runs under it, and it carries an enforced copy of the decision frame'os-dev.mdcarries no frame copy; the mandate still holds on its first clause (the self-test asserts the glob, not the reason)scripts/pm/dispatch-gates.mjs:8095why: '… the published PM skill carries two enforced copies of the decision frame (check:skill-frame-sync COPIES) and ships verbatim to third-party projects'scripts/pm/check-skill-line-ratchet.mjs:455// This file is one of the four check:skill-frame-sync COPIES, so a rule that …(in theos-dev.mdceiling ledger)scripts/check-skills-token-ratchet.mjs:334// accepting the four-rule set), and this file carries TWO enforced frame copiesscripts/check-skills-token-ratchet.mjs:345// enforced frame copies (check:skill-frame-sync COPIES), and a rule thatscripts/check-skills-token-ratchet.mjs:359// (its own row below); the two gate-pinned copies of the decision frame stayScope
Rewrite the six comment sites to the two-copy truth (internal-pm in
.claude/skills/pm-dispatch/SKILL.md, published-pm inskills/objectstack-pm-dispatch/SKILL.md; the dev prompt gets the frame from the PM's copy at dispatch time). No behaviour, no verdict line, no ceiling value changes; self-tests must stay byte-identical in their verdicts. Size XS.Sequencing (hot files):
scripts/pm/dispatch-gates.mjsis held by PR #14765 andscripts/pm/check-skill-line-ratchet.mjsby PR #14860 until they merge —Restart-when:both are onmain.scripts/check-skills-token-ratchet.mjsis free.Verified
search_issues, 7 results read): The ADR-0087 conversion-notice wording is duplicated verbatim across all three authoring commands, and no gate holds the three equal #13743 (ADR-0087 notice wording), [finding] check-optional-error-sink-contract.mjs's own header says "both narrowings" while it documents and pins three #12291 / finding: check-engine-double-contract.mjs hardcodes its own ledger size in 5 prose sites that go stale on every--write, with nothing to catch them #9915 (other scripts' self-description drift — the same class, different files), dispatch-gates never derives a gate for a card that edits the gate's OWN check script — the resolved script paths are already in hand and unused #8509, [finding] Two gates import their shared glob helper and their shared declaration table OUT OF a gate script, which costs check:ci-filter-parity a 595-pair derivation lead #11511, contract-review chain: a cleared gate label was re-hung as "dropped" because the checker read only labels + review objects, not the verdict comment — add the one-line re-hang guard to references #11399, docs: the "one gate, four doors" table'sruntime publishcolumn is stale for two more rules —validateSecurityPostureshows—while gated, andvalidatePresetComparandshas no row at all #9007 — none carries these sites.check-skill-frame-sync→2 copies … across 2 files;dispatch-gatesself-test 1241 pass; both ratchets green — confirming none of the six comments is load-bearing.Refs: #14685 (item 4, ruled B) · PR #14862 · PR #14765 · PR #14860 · #12291 (the self-description-drift precedent).