# SKILL.md sync gate. # # Why: the root SKILL.md (read by Claude Code) and # .agents/skills/oci-deal-accelerator/SKILL.md (read by Codex) MUST # stay byte-aligned modulo the auto-generated banner. If they drift, # the two agents give the user different instructions — exactly the # class of regression that produced the workload-driven-mode incident # Diego flagged on 2026-04-25. # # This workflow blocks the merge if a PR/push leaves them out of # sync. Locally, ``make install-hooks`` enables a pre-commit hook # that auto-syncs before the commit lands; this CI step is the # safety net for anyone who skipped the hook. name: SKILL.md sync on: push: branches: [main] paths: - 'SKILL.md' - '.agents/skills/oci-deal-accelerator/SKILL.md' - 'scripts/sync-skill.py' pull_request: branches: [main] paths: - 'SKILL.md' - '.agents/skills/oci-deal-accelerator/SKILL.md' - 'scripts/sync-skill.py' workflow_dispatch: jobs: check-sync: runs-on: ubuntu-latest timeout-minutes: 2 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Python run: | apt-get update -qq apt-get install -y --no-install-recommends python3 python3 --version - name: Verify SKILL.md is in sync with the Codex copy run: | python3 scripts/sync-skill.py --check - name: Reject .agents/ edits without a matching root SKILL.md change if: github.event_name == 'pull_request' run: | # If only .agents/skills/.../SKILL.md is in the diff (no # change to root SKILL.md), someone edited the auto-generated # copy directly. That edit will be silently destroyed by the # next sync. Block the PR with a clear message. base="${{ github.event.pull_request.base.sha }}" head="${{ github.event.pull_request.head.sha }}" changed=$(git diff --name-only "$base" "$head" || true) if echo "$changed" | grep -qx ".agents/skills/oci-deal-accelerator/SKILL.md"; then if ! echo "$changed" | grep -qx "SKILL.md"; then echo "::error::PR edits .agents/skills/.../SKILL.md without touching root SKILL.md." echo "::error::That file is auto-generated. Move the edit to SKILL.md and run 'make sync-skill'." exit 1 fi fi