ci: add ci-skills-json gate enforcing skills.json regen-in-PR (closes #455)#457
Merged
Conversation
Closes #455. Adds a CI workflow that regenerates skills.json from skills/*/SKILL.md + aeon.yml and fails any PR that changed a generator input without committing the refreshed manifest — the drift class behind #456/#445. Two correctness details the proposal's naive `git diff` missed, both handled: - fetch-depth: 0 (per-skill sha/updated come from `git log --follow`; a shallow checkout yields a bogus diff) - the `generated` timestamp is normalized out before comparing, else every PR false-fails Also regenerates skills.json here so main is consistent with the gate from day one (heals soul-builder/strategy-builder bookkeeping that drifted since the last full regen); without it the gate would be born red. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
aaronjmars
added a commit
that referenced
this pull request
Jun 12, 2026
…anifest (#458) The ci-skills-json gate (#457) compared the full manifest, including each skill's git-derived sha/updated. Squash-merging a skill PR rewrites that skill's commit, so the merged sha goes stale in skills.json until the next regen — making the gate false-fail the *next*, innocent skills PR. Normalize sha/updated out of the comparison alongside generated, so the gate enforces only semantic catalog fields (category/name/description/...) — the #454/#456 drift class it's meant to catch — and is immune to squash churn. Also regenerate skills.json to heal the beamr-route sha/updated drift left by #419's squash merge. Co-authored-by: aaronjmars <aaronjmars@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the CI gate proposed in #455 — fails any PR that changes a
skills.jsoninput (skills/**,aeon.yml,generate-skills-json, or the manifest itself) without committing the regeneratedskills.json. This stops the stale-manifest drift behind #456 and #445, where a source change merges and the manifest catches up in a later commit.Mirrors the existing
ci-capabilities-parity.yml(#301) in shape and permissions.Two correctness details the naive
git diff --exit-code skills.jsonapproach would get wrong — both handled:fetch-depth: 0—generate-skills-jsonderives each skill'ssha/updatedfromgit log --follow. A shallow checkout (theactions/checkoutdefault) collapses that history and emits a bogus diff for skills last touched before the fetched commit. (We literally hit this today — a shallow clone made 137 entries drift.)generated-timestamp normalization — the generator rewrites a fresh UTC timestamp every run, so the committed and regenerated manifests are compared with that one fieldsed'd out. Without this, every PR would false-fail.Why this PR also touches
skills.json: main's manifest had two bookkeeping entries (soul-builder,strategy-builder) that drifted since the last full regen, so the gate would be born red. This PR regenerates the manifest to bring main into agreement with the gate from day one. (Thegeneratedtimestamp value itself is irrelevant — the check normalizes it out.)Note: this workflow doesn't watch
.github/workflows/**, so it won't run on this PR; it activates on the next PR that touches a generator input.🤖 Generated with Claude Code