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
text or json
Inputs
Optional:
RUN_GLOB (default: artifacts/github-actions/*.json)
TOP_N (default: 20)
OUTPUT_FORMAT (text or json, default: text)
FAIL_ON_FAILURES (0 or 1, default: 0) — exit non-zero when failure groups exist
MIN_OCCURRENCES (default: 1) — hide groups below this repeat count
WORKFLOW_MATCH (regex, optional) — include only workflows whose names match
WORKFLOW_EXCLUDE (regex, optional) — drop workflows whose names match
BRANCH_MATCH (regex, optional) — include only runs whose branch names match
BRANCH_EXCLUDE (regex, optional) — drop runs whose branch names match
JOB_MATCH (regex, optional) — include only base job names that match
JOB_EXCLUDE (regex, optional) — drop base job names that match
AXIS_MATCH (regex, optional) — include only parsed matrix-axis strings that match
AXIS_EXCLUDE (regex, optional) — drop parsed matrix-axis strings that match
CONCLUSION_MATCH (regex, optional) — include only specific failure conclusions (failure, timed_out, cancelled, etc.)
CONCLUSION_EXCLUDE (regex, optional) — drop specific failure conclusions
FAILED_STEP_MATCH (regex, optional) — include only jobs whose terminal failed step matches
FAILED_STEP_EXCLUDE (regex, optional) — drop jobs whose terminal failed step matches
RUN_ID_MATCH (regex, optional) — include only runs whose run id matches
RUN_ID_EXCLUDE (regex, optional) — drop runs whose run id matches
RUN_URL_MATCH (regex, optional) — include only runs whose URL matches
RUN_URL_EXCLUDE (regex, optional) — drop runs whose URL matches
HEAD_SHA_MATCH (regex, optional) — include only runs whose headSha matches
HEAD_SHA_EXCLUDE (regex, optional) — drop runs whose headSha matches
REPO_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
0 by default (reporting mode)
- Exit
1 if FAIL_ON_FAILURES=1 and at least one failure group is found
- In
text mode, prints summary + top failure matrix groups
- In
json mode, prints machine-readable summary and grouped failures