Skip to main content

test-analyzer

Analyze test failures from CTRF reports using jq for deterministic parsing

Source facts

Repository
lefant/agent-skills
Last source activity
February 4, 2026 at 10:28
Detected SKILL.md language
English
Stars
1
Forks
1

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
4 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
test-analyzer
description
Analyze test failures from CTRF reports using jq for deterministic parsing
invocationPattern
when user asks to analyze test failures, investigate failing tests, or understand test patterns
# Test Analyzer Skill ## Purpose Analyze CTRF test reports to identify failure patterns, suggest fixes, and provide insights into test health. Uses deterministic jq parsing for efficient, token-friendly analysis. ## When to Use Call this skill when: - Tests have failed and user wants analysis - User asks "what tests failed?", "analyze test failures", or "why did tests fail?" - User wants to understand test failure patterns or trends - User asks about slow tests, flaky tests, or test coverage ## Quick Reference **Using ctrf-utils.sh:** ```bash ctrf-utils.sh summary <file> # Show pass/fail summary ctrf-utils.sh failures <file...> # List failed test names ctrf-utils.sh failures-detail <file> # Show failures with error messages ctrf-utils.sh flaky <file> # Show tests with retry attempts ctrf-utils.sh slowest <N> <file> # Show N slowest tests ``` **Direct jq commands:** ```bash jq '.results.summary' report.ctrf.json jq -r '.results.tests[] | select(.status == "failed") | .name' report.ctrf.json ``` ## CTRF Schema Overview CTRF reports have this structure: ```json { "results": { "tool": { "name": "vitest" }, "summary": { "tests": 50, "passed": 48, "failed": 2, "skipped": 0 }, "tests": [ { "name": "should validate user input", "status": "failed", "duration": 156, "suite": "UserForm", "message": "Expected true, received false", "filePath": "src/components/UserForm.test.ts", "line": 23 } ] } } ``` **Required fields per test:** `name`, `status`, `duration` **Full schema:** [ctrf-schema.json](./ctrf-schema.json) ## Essential jq Examples (~10 most common) ### 1. Summary statistics ```bash jq '.results.summary' /workspace/artifacts/test/vitest.ctrf.json ``` ### 2. One-line summary ```bash jq -r '.results.summary | "Tests: \(.tests) | Passed: \(.passed) | Failed: \(.failed)"' /workspace/artifacts/test/vitest.ctrf.json ``` ### 3. List failed test names ```bash jq -r '.results.tests[] | select(.status == "failed") | .name' /workspace/artifacts/test/*.ctrf.json ``` ### 4. Failed tests with error messages ```bash jq -r '.results.tests[] | select(.status == "failed") | "❌ \(.name): \(.message // "No message")"' /workspace/artifacts/test/*.ctrf.json ``` ### 5. Group failures by error pattern ```bash jq '[.results.tests[] | select(.status == "failed")] | group_by(.message) | map({error: .[0].message, count: length, tests: map(.name)}) | sort_by(.count) | reverse' /workspace/artifacts/test/*.ctrf.json ``` ### 6. Slowest 10 tests ```bash jq '.results.tests | sort_by(.duration) | reverse | limit(10; .[]) | {name, duration}' /workspace/artifacts/test/vitest.ctrf.json ``` ### 7. Flaky tests (with retries) ```bash jq -r '.results.tests[] | select(.retries > 0 or .flaky == true) | "⚠️ \(.name) (retries: \(.retries // 0))"' /workspace/artifacts/test/*.ctrf.json ``` ### 8. Extract file paths for failed tests ```bash jq -r '[.results.tests[] | select(.status == "failed") | .filePath] | unique | .[]' /workspace/artifacts/test/vitest.ctrf.json ``` ### 9. Cross-project failure summary ```bash jq -s '{vitest: .[0].results.summary.failed, pytest: .[1].results.summary.failed, total: ((.[0].results.summary.failed // 0) + (.[1].results.summary.failed // 0))}' /workspace/artifacts/test/vitest.ctrf.json /workspace/artifacts/test/pytest.ctrf.json ``` ### 10. AI-friendly compact summary ```bash jq -c '{summary: .results.summary, failures: [.results.tests[] | select(.status == "failed") | {name, suite, message, file: "\(.filePath):\(.line)"}]}' /workspace/artifacts/test/*.ctrf.json ``` ## More jq Examples For comprehensive examples (24+), see: [jq-examples-comprehensive.md](./jq-examples-comprehensive.md) ## Scripts Reference Implementation scripts: - [ctrf-utils.sh](./ctrf-utils.sh) - CTRF utilities for deterministic parsing (used by skill) - [references/run-silent.sh](./references/run-silent.sh) - Silent-on-success wrapper pattern (reference) ## Research Background Context and research behind this approach: - [references/2026-01-15-context-efficient-backpressure-blogpost.md](./references/2026-01-15-context-efficient-backpressure-blogpost.md) - [references/2026-01-15-test-output-strategies-ai-agents-claude.md](./references/2026-01-15-test-output-strategies-ai-agents-claude.md) - [references/2026-01-15-test-output-strategies-ai-agents-gemini.md](./references/2026-01-15-test-output-strategies-ai-agents-gemini.md) - [references/2026-01-15-research-test-output-summarization-chatgpt.md](./references/2026-01-15-research-test-output-summarization-chatgpt.md) ## Skill Behavior When invoked: 1. **Locate CTRF reports** (common locations: `artifacts/test/`, `test-results/`, project root) 2. **Get summary:** ```bash jq -r '.results.summary | "Tests: \(.tests) | Passed: \(.passed) | Failed: \(.failed)"' *.ctrf.json ``` 3. **If failures exist, list them:** ```bash jq -r '.results.tests[] | select(.status == "failed") | "❌ \(.name): \(.message // "No message")"' *.ctrf.json ``` 4. **Analyze patterns** (group similar errors): ```bash jq '[.results.tests[] | select(.status == "failed")] | group_by(.message) | map({error: .[0].message, count: length})' *.ctrf.json ``` 5. **Read source files for failed tests** (extract file paths with jq, then read) 6. **Suggest fixes based on patterns** (group similar errors, identify root causes)
View on GitHub