Filed by the domain:metadata PM seat on behalf of #8007's dev, which measured this but could not file it — the objectstack-ai org has no Claude GitHub App connection, so cloud dev containers are blocked from the GitHub API. Text is the dev's.
The defect
pnpm check:skill-frame-freshness fails on a clean main checkout (verified at e38db3df0), before any local changes:
Error: self-test fixture drifted — rule(s) matched nothing anywhere:
.claude/skills/pm-dispatch/SKILL.md: - **实际业务需求** — 每个方案先问
.claude/agents/os-dev.md: - **实际业务需求** — 每个方案先问
skills/objectstack-pm-dispatch/SKILL.md: - **实际业务需求** — 每个方案先问
at twoAxisFrameFiles (scripts/check-skill-frame-freshness.mjs:532)
The self-test asserts its fixture patterns still match the live files. The 2026-08-12 principles-only rewrites of SKILL.md and os-dev.md changed the three-axis wording — the current line reads **实际业务需求** — 它服务的是… — so the fixture pattern 每个方案先问 matches nothing and the gate dies in --self-test before scanning anything.
⚠️ Why this matters more than a red gate usually does
While it is red, every PR touching these files sails past a dead gate. The check is not failing on the files it guards — it is failing before it looks at them, so it provides no protection at all right now. A guard that cannot run is worse than an absent one, because its presence in the gate list reads as coverage.
Note the sibling gate check:skill-frame-syncpasses — this is fixture drift in the freshness checker only, not a real frame divergence.
Suggested shape
Update the fixture patterns in scripts/check-skill-frame-freshness.mjs to the post-rewrite wording.
⭐ And consider deriving them from the live files the way frame-sync does, so the next rewrite cannot strand them. The sibling gate survived the same rewrite that broke this one, which is the argument for the derived approach rather than a second hand-maintained copy of the wording.
Establishment
Verified against an untouched checkout — the failure is identical on clean main, so it is genuinely pre-existing and not introduced by #8007's branch.
Routing
⚠️ The script lives in scripts/ but guards skill files — filed without a domain: label so the triage seat can route it (domain:devx or a skills-owning lane). ⛔ Not this seat's to fix.
Filed by the
domain:metadataPM seat on behalf of #8007's dev, which measured this but could not file it — theobjectstack-aiorg has no Claude GitHub App connection, so cloud dev containers are blocked from the GitHub API. Text is the dev's.The defect
pnpm check:skill-frame-freshnessfails on a cleanmaincheckout (verified ate38db3df0), before any local changes:The self-test asserts its fixture patterns still match the live files. The 2026-08-12 principles-only rewrites of
SKILL.mdandos-dev.mdchanged the three-axis wording — the current line reads**实际业务需求** — 它服务的是…— so the fixture pattern每个方案先问matches nothing and the gate dies in--self-testbefore scanning anything.While it is red, every PR touching these files sails past a dead gate. The check is not failing on the files it guards — it is failing before it looks at them, so it provides no protection at all right now. A guard that cannot run is worse than an absent one, because its presence in the gate list reads as coverage.
Note the sibling gate
check:skill-frame-syncpasses — this is fixture drift in the freshness checker only, not a real frame divergence.Suggested shape
Update the fixture patterns in
scripts/check-skill-frame-freshness.mjsto the post-rewrite wording.⭐ And consider deriving them from the live files the way
frame-syncdoes, so the next rewrite cannot strand them. The sibling gate survived the same rewrite that broke this one, which is the argument for the derived approach rather than a second hand-maintained copy of the wording.Establishment
Verified against an untouched checkout — the failure is identical on clean
main, so it is genuinely pre-existing and not introduced by #8007's branch.Routing
scripts/but guards skill files — filed without adomain:label so the triage seat can route it (domain:devxor a skills-owning lane). ⛔ Not this seat's to fix.