GitHub Actions Failure Matrix
Use this skill to turn noisy GitHub Actions run JSON into a matrix-focused failure report.
What this skill does
- Reads one or more JSON exports from GitHub Actions runs (via
gh run view --json) - Detects failure-like matrix jobs (
failure,timed_out,cancelled, etc.) - Extracts matrix axes from common job-name patterns (
name (a, b),name [a, b],name / a / b) - Groups repeated failures by workflow + job + matrix axis signature
- Emits ranked triage output in
textorjson
Inputs
Optional:
RUN_GLOB(default:artifacts/github-actions/*.json)TOP_N(default:20)OUTPUT_FORMAT(textorjson, default:text)FAIL_ON_FAILURES(0or1, default:0) — exit non-zero when failure groups existMIN_OCCURRENCES(default:1) — hide groups below this repeat countWORKFLOW_MATCH(regex, optional) — include only workflows whose names matchWORKFLOW_EXCLUDE(regex, optional) — drop workflows whose names matchBRANCH_MATCH(regex, optional) — include only runs whose branch names matchBRANCH_EXCLUDE(regex, optional) — drop runs whose branch names matchJOB_MATCH(regex, optional) — include only base job names that matchJOB_EXCLUDE(regex, optional) — drop base job names that matchAXIS_MATCH(regex, optional) — include only parsed matrix-axis strings that matchAXIS_EXCLUDE(regex, optional) — drop parsed matrix-axis strings that matchCONCLUSION_MATCH(regex, optional) — include only specific failure conclusions (failure,timed_out,cancelled, etc.)CONCLUSION_EXCLUDE(regex, optional) — drop specific failure conclusionsFAILED_STEP_MATCH(regex, optional) — include only jobs whose terminal failed step matchesFAILED_STEP_EXCLUDE(regex, optional) — drop jobs whose terminal failed step matchesRUN_ID_MATCH(regex, optional) — include only runs whose run id matchesRUN_ID_EXCLUDE(regex, optional) — drop runs whose run id matchesRUN_URL_MATCH(regex, optional) — include only runs whose URL matchesRUN_URL_EXCLUDE(regex, optional) — drop runs whose URL matchesHEAD_SHA_MATCH(regex, optional) — include only runs whoseheadShamatchesHEAD_SHA_EXCLUDE(regex, optional) — drop runs whoseheadShamatchesREPO_MATCH(regex, optional) — include only runs whose repository matches (repository.nameWithOwner/full_name/name)REPO_EXCLUDE(regex, optional) — drop runs whose repository matches
Collect run JSON
gh run view <run-id> --json databaseId,workflowName,headBranch,headSha,url,repository,jobs \
> artifacts/github-actions/run-<run-id>.json
Run
Text report:
RUN_GLOB='artifacts/github-actions/*.json' \
TOP_N=15 \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
JSON output for CI annotation/upload:
RUN_GLOB='artifacts/github-actions/*.json' \
OUTPUT_FORMAT=json \
FAIL_ON_FAILURES=1 \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Filter to a specific workflow + branch + matrix axis (for targeted triage):
RUN_GLOB='artifacts/github-actions/*.json' \
WORKFLOW_MATCH='(CI|Test)' \
BRANCH_MATCH='^(main|release/)' \
AXIS_MATCH='ubuntu-latest \| python-3\.12' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Isolate timeout-only matrix failures:
RUN_GLOB='artifacts/github-actions/*.json' \
CONCLUSION_MATCH='^timed_out$' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Exclude noisy flaky suites while keeping the rest of the matrix view:
RUN_GLOB='artifacts/github-actions/*.json' \
WORKFLOW_EXCLUDE='nightly|experimental' \
JOB_EXCLUDE='lint|docs' \
AXIS_EXCLUDE='windows-latest' \
CONCLUSION_EXCLUDE='^cancelled$' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Focus only on setup/toolchain breakages by failed step name:
RUN_GLOB='artifacts/github-actions/*.json' \
FAILED_STEP_MATCH='setup|install|dependency' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Limit triage to a specific run range or workflow URL pattern:
RUN_GLOB='artifacts/github-actions/*.json' \
RUN_ID_MATCH='^(28419|28420)' \
RUN_URL_MATCH='example/repo/actions/runs' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Scope triage to a commit range by headSha:
RUN_GLOB='artifacts/github-actions/*.json' \
HEAD_SHA_MATCH='^(abc123|def456)' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Scope triage to specific repositories when aggregating exports from multiple repos:
RUN_GLOB='artifacts/github-actions/*.json' \
REPO_MATCH='^flowcreatebot/(yf-api-saas|conspiracy-canvas)$' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Run with bundled fixtures:
RUN_GLOB='skills/github-actions-failure-matrix/fixtures/*.json' \
bash skills/github-actions-failure-matrix/scripts/failure-matrix.sh
Output contract
- Exit
0by default (reporting mode) - Exit
1ifFAIL_ON_FAILURES=1and at least one failure group is found - In
textmode, prints summary + top failure matrix groups - In
jsonmode, prints machine-readable summary and grouped failures