Skip to content

ci: add ci-skills-json gate enforcing skills.json regen-in-PR (closes #455)#457

Merged
aaronjmars merged 1 commit into
mainfrom
ci-skills-json-gate
Jun 12, 2026
Merged

ci: add ci-skills-json gate enforcing skills.json regen-in-PR (closes #455)#457
aaronjmars merged 1 commit into
mainfrom
ci-skills-json-gate

Conversation

@aaronjmars

Copy link
Copy Markdown
Owner

Implements the CI gate proposed in #455 — fails any PR that changes a skills.json input (skills/**, aeon.yml, generate-skills-json, or the manifest itself) without committing the regenerated skills.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.json approach would get wrong — both handled:

  • fetch-depth: 0generate-skills-json derives each skill's sha/updated from git log --follow. A shallow checkout (the actions/checkout default) 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 field sed'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. (The generated timestamp 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

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 aaronjmars merged commit 9f66864 into main Jun 12, 2026
2 checks passed
@aaronjmars aaronjmars deleted the ci-skills-json-gate branch June 12, 2026 14:04
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant