Measured by the dev seat while implementing #14869 (branch claude/issue-14869-runbook-frame-paste-step), at origin/main d5b330dc plus that branch's one-bullet diff. Unassigned, bare, for triage. The file surface is scripts/check-skill-frame-sync.mjs.
What
check-skill-frame-sync's anti-dormancy half exists to catch "another copy of the decision frame appears somewhere under .claude/ or skills/ and nothing keeps it in sync". Its own header states the job: after the batch-3 item-4 ruling reduced COPIES from four to two, "the anti-dormancy scan below is what keeps a dev-side copy from quietly coming back."
The scan cannot see any references/ subtree. walkMarkdown skips a fixed directory-name set:
const SCAN_ROOTS = ['.claude', 'skills'];
const SCAN_SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'references']);
node_modules, .git and dist are installed or generated trees — nothing hand-written lives there. references is not that kind of directory: under both scan roots it holds hand-written operative prose.
Measured
Walking the two SCAN_ROOTS for .md/.mdx, once with the real skip set and once without references:
| population |
files |
| what the scan reads today |
40 |
| all markdown under the two roots |
72 |
invisible to the scan (references/ only) |
32 (44%) |
The gate's own pass line agrees with the first row: check-skill-frame-sync: ... 40 markdown files scanned for undeclared copies.
The 32 split into two groups, both hand-authored:
- 20 internal PM protocol files under
.claude/skills/pm-dispatch/references/ — dispatch-runbook.md, platform-readings.md, decision-analysis.md, contract-review.md, state-machine.md, true-green.md, the eight lanes/*.md, and the rest. decision-analysis.md is the file whose subject matter is escalation analysis, so it is the single most likely place for a fourth copy to be pasted.
- 12 published skill reference pages under
skills/objectstack-*/references/ — these ship verbatim to third-party projects via npx skills add, which is the exact distribution path the gate's header gives as the reason the published copy is watched at all.
So a copy of the frame pasted into any of those 32 files today is undetected, and the FINGERPRINTS list that would have caught it (/固定评估轴/, /条评估轴/, /fixed axes/i) never runs against them.
Why it matters
This is the dormancy the scan was built to prevent, one directory level down. The drift incident recorded in the gate's own header — the internal frame widened to three axes while the published mirror stayed at two for two days — is precisely what an unwatched fourth copy reproduces, and the gate would stay green throughout.
It also has a live edge right now. The bullet landing on #14869 quotes the frame's two anchor sentences inside dispatch-runbook.md on purpose (the ruling directs pointing at the frame by its anchors rather than copying it). The first anchor contains 四条固定评估轴, which matches FINGERPRINTS. That bullet is legal today only because references/ is skipped — so whoever narrows the skip set has to decide, in the same stroke, how a deliberate anchor pointer is told apart from a copy.
Not asserted
No claim that a fourth copy exists in the tree today — the sweep run for this card found none of the fingerprints in the 32 files. The defect is the missing coverage, not a present violation.
Suggested shape (for triage, not a decision)
Narrow the skip set to the trees that are genuinely generated or installed (node_modules, .git, dist) and give the anchor-pointer case an explicit, declared exemption — a pointer names the anchors and does not carry the axis entries between them, which is a structural difference the gate already knows how to read. Widening the population without that distinction turns every legitimate pointer red.
Dedup
Complete enumeration of open items, 2026-09-03T19:2xZ: REST GET /repos/objectstack-ai/objectstack/issues?state=open&per_page=100&page=1..6 returned 100+100+100+100+100+30 = 530, reconciled against the repository's own open_issues_count of 530 (506 issues, 24 PRs); local grep over titles and bodies for frame-sync, anti-dormancy, SCAN_SKIP_DIRS, SCAN_ROOTS, walkMarkdown, undeclared copy, decision frame, 评估轴. Nearest neighbour is #14870 (four gate-script comments still say "four"/"two enforced" copies) — a stale-comment card in the same gate family, not this coverage hole. No carrier found.
Measured by the dev seat while implementing #14869 (branch
claude/issue-14869-runbook-frame-paste-step), atorigin/maind5b330dcplus that branch's one-bullet diff. Unassigned, bare, for triage. The file surface isscripts/check-skill-frame-sync.mjs.What
check-skill-frame-sync's anti-dormancy half exists to catch "another copy of the decision frame appears somewhere under.claude/orskills/and nothing keeps it in sync". Its own header states the job: after the batch-3 item-4 ruling reduced COPIES from four to two, "the anti-dormancy scan below is what keeps a dev-side copy from quietly coming back."The scan cannot see any
references/subtree.walkMarkdownskips a fixed directory-name set:node_modules,.gitanddistare installed or generated trees — nothing hand-written lives there.referencesis not that kind of directory: under both scan roots it holds hand-written operative prose.Measured
Walking the two SCAN_ROOTS for
.md/.mdx, once with the real skip set and once withoutreferences:references/only)The gate's own pass line agrees with the first row:
check-skill-frame-sync: ... 40 markdown files scanned for undeclared copies.The 32 split into two groups, both hand-authored:
.claude/skills/pm-dispatch/references/—dispatch-runbook.md,platform-readings.md,decision-analysis.md,contract-review.md,state-machine.md,true-green.md, the eightlanes/*.md, and the rest.decision-analysis.mdis the file whose subject matter is escalation analysis, so it is the single most likely place for a fourth copy to be pasted.skills/objectstack-*/references/— these ship verbatim to third-party projects vianpx skills add, which is the exact distribution path the gate's header gives as the reason the published copy is watched at all.So a copy of the frame pasted into any of those 32 files today is undetected, and the FINGERPRINTS list that would have caught it (
/固定评估轴/,/条评估轴/,/fixed axes/i) never runs against them.Why it matters
This is the dormancy the scan was built to prevent, one directory level down. The drift incident recorded in the gate's own header — the internal frame widened to three axes while the published mirror stayed at two for two days — is precisely what an unwatched fourth copy reproduces, and the gate would stay green throughout.
It also has a live edge right now. The bullet landing on #14869 quotes the frame's two anchor sentences inside
dispatch-runbook.mdon purpose (the ruling directs pointing at the frame by its anchors rather than copying it). The first anchor contains四条固定评估轴, which matches FINGERPRINTS. That bullet is legal today only becausereferences/is skipped — so whoever narrows the skip set has to decide, in the same stroke, how a deliberate anchor pointer is told apart from a copy.Not asserted
No claim that a fourth copy exists in the tree today — the sweep run for this card found none of the fingerprints in the 32 files. The defect is the missing coverage, not a present violation.
Suggested shape (for triage, not a decision)
Narrow the skip set to the trees that are genuinely generated or installed (
node_modules,.git,dist) and give the anchor-pointer case an explicit, declared exemption — a pointer names the anchors and does not carry the axis entries between them, which is a structural difference the gate already knows how to read. Widening the population without that distinction turns every legitimate pointer red.Dedup
Complete enumeration of open items, 2026-09-03T19:2xZ: REST
GET /repos/objectstack-ai/objectstack/issues?state=open&per_page=100&page=1..6returned 100+100+100+100+100+30 = 530, reconciled against the repository's ownopen_issues_countof 530 (506 issues, 24 PRs); local grep over titles and bodies forframe-sync,anti-dormancy,SCAN_SKIP_DIRS,SCAN_ROOTS,walkMarkdown,undeclared copy,decision frame,评估轴. Nearest neighbour is #14870 (four gate-script comments still say "four"/"two enforced" copies) — a stale-comment card in the same gate family, not this coverage hole. No carrier found.