Audit cicd
π¦Curated Cursor AI agent skills, slash commands, MCP configs, subagents & rules for full-stack dev β React 19, Next.js 15, Supabase, Tailwind v4, TypeScript
npx -y skills add kensaurus/cursor-kenji --skill audit-cicdAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Audit CI/CD pipelines (GitHub Actions) for cost, speed, and safety. Use when the GitHub Actions bill is high, when the user mentions Actions minutes, runner cost, workflow cost, slow CI, artifact/cache storage, or wants a CI/CD / workflow audit. Finds double-billing triggers, missing concurrency, macOS/large runners on push, missing path filters, long artifact retention, and doomed jobs β then proposes fixes that never delete tests or break deploys.
The file declares its own license as MIT. That is the authorβs claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
7.8 KB, as published. Nobody here has run it
CI/CD Audit Skill
Systematic audit of GitHub Actions workflows to cut the Actions bill (minutes +
storage) and speed up CI without losing test coverage or deploy safety.
Uses the gh CLI for live billing, run history, and storage data.
Step 0: Inventory the account and pipelines
Measure before optimizing. Only private repos consume the paid minute allowance; public repos get free minutes β don't spend effort there.
# Which repos actually cost money (private, active, recent pushes)?
gh repo list <owner> --limit 200 --json name,visibility,isArchived,pushedAt \
--jq 'sort_by(.pushedAt)|reverse|.[]|select(.visibility=="PRIVATE" and .isArchived==false)|"\(.name)\t\(.pushedAt[0:10])"'
# Per repo: active workflows, run volume (last 14d), and runner types
gh api "repos/<owner>/<repo>/actions/workflows" --jq '.workflows[]|select(.state=="active")|.name'
gh run list --repo <owner>/<repo> --created ">=YYYY-MM-DD" --limit 200 --json databaseId --jq 'length'
# Storage (the other half of the bill)
gh api "repos/<owner>/<repo>/actions/artifacts" --paginate --jq '[.artifacts[]|select(.expired==false)|.size_in_bytes]|add'
gh api "repos/<owner>/<repo>/actions/cache/usage" --jq '.active_caches_size_in_bytes'
Rank repos by runs Γ runner-multiplier. A macos-* job counts ~10x a
ubuntu job; *-large/bigger runners cost more than standard.
Step 1: Anti-pattern scan (per workflow)
For each .github/workflows/*.yml, check for the recurring cost drivers:
- Double-billing triggers β the same jobs run on both
push: [main]andpull_requestfor main (every merge bills twice). PR gates verification; a separatedeploy.ymlhandles main. If both are needed, guard per-job withif: github.event_name == '...'. - Missing
concurrencyβ nocancel-in-progress, so rapid pushes/PR syncs stack full runs instead of superseding. - Expensive runners on ordinary pushes β
macos-*/*-largefiring on every push instead ofworkflow_dispatchor version tags only. - No path filters β docs/config-only changes run the full heavy suite
(add
paths:/paths-ignore:). - Doomed jobs β a costly job (visual/e2e/Lighthouse) runs in parallel
with a cheap gate and keeps burning minutes after the gate fails
(gate it with
needs: [...]). - Long/default artifact retention β
upload-artifactwithoutretention-dayskeeps outputs 90 days; heavy reports uploaded on success (if: always()) instead ofif: failure(). - Self-uploading SARIF pile-ups β e.g. gitleaks-action uploads a tiny SARIF artifact every run for 90 days.
- Over-frequent crons β daily
schedule:where weekly suffices. - Redundant rebuilds β two jobs each run the same build instead of building once and sharing via artifact (only when their build env is identical β see Safety).
Step 2: Cost levers (highest impact first)
| Lever | Fix | Impact |
|---|---|---|
| macOS/large on push | Gate to workflow_dispatch / tags | Very high (~10x) |
| Doomed heavy jobs | needs: [cheap-gate] so they skip on failure | High |
| Double-billing triggers | Drop the redundant trigger (keep the gate) | High |
| No concurrency | Add cancel-in-progress | Medium |
| No path filters | paths: / paths-ignore: | Medium |
| Daily crons | Move to weekly | Medium |
| Artifact retention | retention-days: 1β7 + if: failure() | Storage |
| Repeated installs | Cache deps / Playwright browsers / build cache | Medium |
Step 3: Fix patterns
# Concurrency β every workflow. CI/verification cancels superseded runs:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
# Deploy/release: never cancel a live deploy. For combined verify-on-PR +
# deploy-on-push workflows, cancel PR churn only:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
# Expensive runner: dispatch/tag-only, not every push
build-ios:
runs-on: macos-15
if: ${{ inputs.platform == 'ios' || startsWith(github.ref, 'refs/tags/') }}
timeout-minutes: 60 # cap runaway 10x spend
# Lean artifacts
- uses: actions/upload-artifact@v4
if: failure()
with: { name: report, path: report/, retention-days: 3 }
# Stop the gitleaks SARIF pile-up
env: { GITLEAKS_ENABLE_UPLOAD_ARTIFACT: "false" }
Step 4: Storage cleanup (destructive β confirm first)
Artifacts and caches are ephemeral CI outputs; deleting them is safe but irreversible. Confirm with the user, then:
# Delete non-expired artifacts in a repo
gh api "repos/<owner>/<repo>/actions/artifacts" --paginate \
--jq '.artifacts[]|select(.expired==false)|.id' \
| xargs -I{} gh api -X DELETE "repos/<owner>/<repo>/actions/artifacts/{}"
# Delete caches
gh api "repos/<owner>/<repo>/actions/caches" --paginate --jq '.actions_caches[].id' \
| xargs -I{} gh api -X DELETE "repos/<owner>/<repo>/actions/caches/{}"
Safety rules (do NOT trade coverage or deploys for cost)
- Never delete, skip, or weaken a test to save minutes. Make advisory
scans (
npm audit, CVE scans)continue-on-erroror move them to ascheduleβ keep the check. - Keep the deploy gate. If
deploy.ymltriggers on the CIworkflow_runforpush, do not remove thepushtrigger from CI. - Only share a build across jobs when their build env is identical. Reusing an artifact built with different secrets/flags (prod env, QA build stamps) ships or tests the wrong bundle.
- Update branch protection when renaming/merging jobs. If a required status
check's job name changes,
PATCHrequired_status_checks.contextsin the same change or merges hang. Verify:gh api repos/<owner>/<repo>/branches/<main>/protection/required_status_checks --jq '.contexts' - Verify with live runs. After pushing, confirm no
startup_failure(YAML parses) and that intended jobs skip/run:gh run view <id> --json jobs --jq '.jobs[]|"\(.conclusion // .status) \(.name)"'
Account backstops (one-time, GitHub UI β cannot be set via API)
- Default artifact/log retention β Settings β Actions β General β drop from 90 days to ~14 (applies to all repos, including future ones).
- Spending budget β Settings β Billing β Budgets β set an Actions budget with 75/90/100% alerts; keep "Stop usage" off so production deploys never hard-break.
- Rotate any secret leaked in a workflow/remote (the user must revoke; you can only strip it from configs).
Output: CI/CD Cost Audit Report
## CI/CD Audit: [owner]
### Spend snapshot
- Actions billable: ~$X/mo (private repos exhaust the included minutes)
- Top spenders: [repo β ~$Y, driver], ...
- Storage: [X GB artifacts / Y GB caches]
### Findings (prioritized)
| # | Repo | Workflow | Anti-pattern | Fix | Impact |
|---|------|----------|--------------|-----|--------|
| 1 | repo | build-mobile.yml | macOS on every push | dispatch/tag-only | ~10x |
### Already healthy
- [repos/workflows already using concurrency, gated runners, path filters]
### Manual actions (user-only)
- [ ] Default artifact/log retention β 14 days
- [ ] Actions spending budget + alerts
- [ ] Rotate leaked secret(s), if any
### Expected outcome
~$A β ~$B/mo, no loss of test coverage or deploy safety.