Skip to content

check:skill-frame-freshness is red on main — self-test fixture drifted after the principles-only rewrites, so the gate never scans #8024

Description

@huangyiirene

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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions