
Finops Waste
- 50 installs
- 49 repo stars
- Updated August 4, 2026
- laurigates/claude-plugins
Helps with ai & agent building tasks.
About
finops-waste is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- finops-waste
- AI & Agent Building
- AI-coding skill
Finops Waste by the numbers
- 50 all-time installs (skills.sh)
- Ranked #7,278 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/laurigates/claude-plugins --skill finops-wasteAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 50 |
|---|---|
| repo stars | ★ 49 |
| Last updated | August 4, 2026 |
| Repository | laurigates/claude-plugins ↗ |
What it does
Helps with ai & agent building tasks.
Files
/finops:waste
Identify GitHub Actions waste patterns and provide actionable fix suggestions. Analyzes skipped runs, bot triggers, missing concurrency groups, and missing path filters.
When to Use This Skill
| Use this skill when... | Use a sibling instead when... |
|---|---|
| You want actionable fixes for CI cost waste — concurrency, path filters, bot guards | You need a high-level billing and health snapshot — use /finops:overview |
You need to add cancel-in-progress to PR workflows | You need workflow run frequency and duration stats — use /finops:workflows |
| You are auditing skipped runs and bot-triggered noise | You are auditing cache bloat or stale caches — use /finops:caches |
| You want to fix one repo's workflow config | You want to rank waste across many repos — use /finops:compare |
Context
- Current repo URL: !
git remote get-url origin - Workflow files: !
find .github/workflows -maxdepth 1 \( -name '*.yml' -o -name '*.yaml' \)
Parameters
| Parameter | Description | Default |
|---|---|---|
repo | Repository in owner/name format | Current repository |
Execution
1. Run API-based waste analysis:
bash "${SKILL_DIR}/scripts/waste-analysis.sh" "$REPO"2. Workflow file analysis (requires local filesystem):
echo ""
echo "=== Workflow File Analysis ==="
for f in .github/workflows/*.yml .github/workflows/*.yaml 2>/dev/null; do
[ -f "$f" ] || continue
name=$(basename "$f")
issues=""
# Check for concurrency
if ! grep -q "concurrency:" "$f"; then
issues="${issues}missing-concurrency "
fi
# Check for path filters (on push/pull_request without paths)
if grep -qE "^\s*(push|pull_request):" "$f" && ! grep -q "paths:" "$f"; then
issues="${issues}no-path-filter "
fi
# Check for bot filter
if ! grep -q "github.event.sender.type" "$f" && ! grep -q "github.actor" "$f"; then
issues="${issues}no-bot-filter "
fi
# Check for cancel-in-progress
if grep -q "pull_request:" "$f" && ! grep -q "cancel-in-progress:" "$f"; then
issues="${issues}no-cancel-in-progress "
fi
if [ -n "$issues" ]; then
echo " $name: $issues"
else
echo " $name: OK"
fi
doneFix Suggestions
After analysis, provide specific fixes based on findings:
Fix: Missing Concurrency Group
# Add to workflow file at top level or per-job
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # For PR workflowsFix: Bot Trigger Filter
jobs:
build:
# Skip if triggered by a bot
if: github.event.sender.type != 'Bot'
runs-on: ubuntu-latest
steps: ...Or for specific bots:
if: github.actor != 'dependabot[bot]' && github.actor != 'renovate[bot]'Fix: Add Path Filters
on:
push:
branches: [main]
paths:
- 'src/**'
- 'package.json'
- 'package-lock.json'
paths-ignore:
- '**.md'
- 'docs/**'
- '.github/**'
pull_request:
paths:
- 'src/**'
- 'package.json'Fix: Cancel Duplicate PR Runs
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: trueOutput Format
=== Waste Analysis: org/repo ===
=== Skipped Runs ===
Total runs: 100
Skipped: 15 (15%)
By workflow:
CI: 10 skipped
CodeQL: 5 skipped
=== Bot-Triggered Runs ===
Bot-triggered: 25/100 runs
By bot:
dependabot[bot]: 15 runs
renovate[bot]: 10 runs
=== Workflow File Analysis ===
ci.yml: missing-concurrency no-path-filter
deploy.yml: OK
codeql.yml: no-bot-filter
=== Potential Duplicate Runs ===
Commit abc1234: 3 runs (CI, CodeQL, Security)
=== High-Frequency Workflows ===
CI: 67 runs in sample - review trigger conditionsAgentic Optimizations
| Context | Command |
|---|---|
| Skipped runs count | `gh run list --limit 100 --json conclusion --jq '[.[] |
| Failed runs (compact) | gh run list --limit 50 --status failure --json name,createdAt |
| Workflow file check | bash "${SKILL_DIR}/scripts/waste-analysis.sh" "$REPO" |
| Check concurrency in file | grep -l "concurrency:" .github/workflows/*.yml |
| Bot-triggered runs | `gh run list --limit 100 --json actor,conclusion --jq '[.[] |
Post-actions
1. Offer to apply fixes: For each issue found, offer to edit the workflow file directly 2. Prioritize by impact: Focus on high-frequency workflows first 3. Test recommendations: Suggest testing changes on a feature branch first 4. Create tracking issue: Optionally create a GitHub issue to track optimization work
#!/usr/bin/env bash
# Waste Analysis
# Identifies GitHub Actions waste patterns: skipped runs, bot triggers,
# duplicate runs, and high-frequency workflows.
# Usage: bash waste-analysis.sh [repo]
#
# Args:
# repo Repository in owner/name format (default: current repo)
#
# Note: Workflow file analysis (concurrency, path filters) requires local
# filesystem access and is handled inline in SKILL.md.
# shellcheck disable=SC2016 # jq expressions use $ for variable references, not shell expansion
set -euo pipefail
REPO="${1:-$(gh repo view --json nameWithOwner --jq '.nameWithOwner')}"
echo "=== Waste Analysis: $REPO ==="
echo ""
echo "=== Skipped Runs ==="
SKIPPED_DATA=$(gh api "/repos/$REPO/actions/runs?per_page=100" \
--jq '{
total: (.workflow_runs | length),
skipped: [.workflow_runs[] | select(.conclusion == "skipped")] | length,
by_workflow: ([.workflow_runs[] | select(.conclusion == "skipped")] |
group_by(.name) |
map({workflow: .[0].name, count: length}) |
sort_by(-.count))
}')
echo "$SKIPPED_DATA" | jq -r '"Total runs: \(.total)\nSkipped: \(.skipped) (\(if .total > 0 then (.skipped * 100 / .total | floor) else 0 end)%)"'
echo ""
echo "By workflow:"
echo "$SKIPPED_DATA" | jq -r '.by_workflow[] | " \(.workflow): \(.count) skipped"'
echo ""
echo "=== Bot-Triggered Runs ==="
gh api "/repos/$REPO/actions/runs?per_page=100" \
--jq '{
total: (.workflow_runs | length),
bot_triggered: [.workflow_runs[] | select(.triggering_actor.type == "Bot")] | length,
bots: ([.workflow_runs[] | select(.triggering_actor.type == "Bot")] |
group_by(.triggering_actor.login) |
map({bot: .[0].triggering_actor.login, count: length}) |
sort_by(-.count))
} |
"Bot-triggered: \(.bot_triggered)/\(.total) runs\n\nBy bot:\(.bots | map("\n \(.bot): \(.count) runs") | join(""))"'
echo ""
echo "=== Potential Duplicate Runs ==="
gh api "/repos/$REPO/actions/runs?per_page=100" \
--jq '.workflow_runs | group_by(.head_sha) |
map(select(length > 1)) |
map({
sha: .[0].head_sha[0:7],
runs: length,
workflows: [.[].name] | unique
}) |
.[0:5][] |
" Commit \(.sha): \(.runs) runs (\(.workflows | join(", ")))"'
echo ""
echo "=== High-Frequency Workflows ==="
gh api "/repos/$REPO/actions/runs?per_page=100" \
--jq '.workflow_runs | group_by(.name) |
map(select(length > 30)) |
map({workflow: .[0].name, count: length}) |
sort_by(-.count)[] |
" \(.workflow): \(.count) runs in sample - review trigger conditions"'