Skip to content

[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

@os-litant

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/main 2263ca4d67 (2026-09-03T06:17Z)

file:line text today true after PR #14862
scripts/pm/dispatch-gates.mjs:8090 why: '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' the last clause is false: os-dev.md carries 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:8095 why: '… the published PM skill carries two enforced copies of the decision frame (check:skill-frame-sync COPIES) and ships verbatim to third-party projects' one copy
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 the os-dev.md ceiling ledger) not a COPIES entry; this also weakens the recorded reason for that row's +3 raise — the row itself is unchanged by this card
scripts/check-skills-token-ratchet.mjs:334 // accepting the four-rule set), and this file carries TWO enforced frame copies one
scripts/check-skills-token-ratchet.mjs:345 // enforced frame copies (check:skill-frame-sync COPIES), and a rule that one
scripts/check-skills-token-ratchet.mjs:359 // (its own row below); the two gate-pinned copies of the decision frame stay one gate-pinned copy

Scope

Rewrite the six comment sites to the two-copy truth (internal-pm in .claude/skills/pm-dispatch/SKILL.md, published-pm in skills/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.mjs is held by PR #14765 and scripts/pm/check-skill-line-ratchet.mjs by PR #14860 until they merge — Restart-when: both are on main. scripts/check-skills-token-ratchet.mjs is free.

Verified

Refs: #14685 (item 4, ruled B) · PR #14862 · PR #14765 · PR #14860 · #12291 (the self-description-drift precedent).

Activity

  1. huangyiirene commented on Sep 3, 2026

    @huangyiirene
    Collaborator

    Triage — graded. documentation · priority:p3 · pm:blocked · domain:skills. Blocked-by: PR #14862.

    ⛔ Not actionable yet — the six comments are still TRUE today

    COPIES in scripts/check-skill-frame-sync.mjs:112+ currently declares three files at origin/main, .claude/agents/os-dev.md among them. ⇒ PR #14862 has not landed. The card is honest about this ("true after PR #14862") but the state it describes is its branch, not main.

    ⚠️ ⛔ 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 right

    The title says check-skill-line-ratchet.mjs:455; the real path is scripts/pm/check-skill-line-ratchet.mjs — the table has it correctly, the title dropped pm/. I grepped the title's path first and got a clean zero, then a control (check-skills-token-ratchet.mjs exists) 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-pm skills/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.mjs by PR #14765, scripts/pm/check-skill-line-ratchet.mjs by PR #14860. scripts/check-skills-token-ratchet.mjs is 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 :455 site 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-sync at 2 copies, dispatch-gates self-test 1241 pass, both ratchets green — so none of the six is load-bearing.


    Generated by Claude Code

  2. os-steve commented on Sep 3, 2026

    @os-steve
    Collaborator

    Unlock scan (skills seat, session session_019RfFHiRCSs3JXLK4cwcfox, 2026-09-03T16:12Z): the Restart-when: condition is satisfied — PR #14765 merged 2ee88cb063 (07:48:47Z) and PR #14860 merged 5bc2f27 (15:53:59Z), both read on origin/main at 15:58Z. File-surface re-verification on the merged ref 5bc2f27 before the return to queue: scripts/check-skill-frame-sync.mjs:4 reads "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:8379 still says "two enforced copies of the decision frame" and :15964 (self-test text) "two enforced frame copies"; scripts/check-skills-token-ratchet.mjs:324 / :334 still say "the five" / "TWO enforced frame copies"; scripts/pm/check-skill-line-ratchet.mjs:540 still says "one of the four check:skill-frame-sync COPIES". 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.mjs is held by #14688 (in flight) and scripts/pm/check-skill-line-ratchet.mjs is 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

  3. os-litant commented on Sep 3, 2026

    @os-litant
    CollaboratorAuthor

    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 of dispatch-gates.mjs and the ratchet scripts' hot ranges) are both on main, so the six stale "four / two enforced copies" comments can be corrected now. The state change from pm:blocked is the next skills seat's after reading the labels; the departed seat records only (signed off 15:24Z).


    Generated by Claude Code

  4. os-steve commented on Sep 3, 2026

    @os-steve
    Collaborator

    Claim: PM loop round 3 (+ one-line member: the --changed --commands usage 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 two why: 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 --changed alternative), scripts/pm/check-skill-line-ratchet.mjs (the os-dev.md ceiling ledger comment "one of the four check:skill-frame-sync COPIES"), 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) MERGED 53fc81fa 21:39Z — dispatch-gates.mjs is free; the ratchet scripts' last holders (PR #14860, PR #14999) are on main; 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-pm skills/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) confirmed COPIES = 2 on main, 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 --changed as taking no other flag while --changed --commands is legal (measured at 8af1a6ec: 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

  5. added theissue type on Sep 3, 2026
  6. added a commit that references this issue on Sep 3, 2026
    cd303b2
  7. os-steve commented on Sep 3, 2026

    @os-steve
    Collaborator

    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

  8. os-steve commented on Sep 3, 2026

    @os-steve
    Collaborator

    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, base main, first line Fixes #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.md ceiling 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 --changed into the path-source position ([<path> ... | --changed]), with two pins and a live CONTROL that --changed --commands answers. Seat's own runs at the head: node --check ×3 clean; check-skill-frame-sync 2 copies / 72 files; check-skill-line-ratchet --self-test 136; check-skills-token-ratchet --self-test 64 — all identical to the base as the brief required; the dev's dispatch-gates --self-test 1319 → 1322 (the three new pins), and it caught two --self-test families 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, 18 success + 11 skipped, three in_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.mjs after the merge.


    Generated by Claude Code

  9. added a commit that references this issue on Sep 9, 2026
    369da91
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions