Check tests
Run test suite, track coverage trends, and detect regressions. Detect phase skill — uses config.test_command to execute tests and records results.From its SKILL.md
npx -y skills add mataeil/OODA-loop --skill check-testsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 5 stars5 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.
- runs commandsInstructs the agent to run 1 command, including `{config.test_command} 2>&1`.
SKILL.md
9.1 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
check-tests: Test Suite Runner & Coverage Tracker
Runs the configured test command, tracks pass/fail counts and coverage percentage
over time, and alerts when regressions appear or coverage drops. READ-ONLY in
terms of PRs — writes only to agent/state/test_coverage.json.
Safety Rules
- HALT File — Check
config.safety.halt_filefirst. If it exists, print reason and stop. - Read-only — Writes only to
agent/state/test_coverage.json. Never touches test files or source. - No test_command — If
config.test_commandis empty or unset, skip gracefully.
Step 0: Safety
0-A: HALT Check
if file exists at config.safety.halt_file:
Print "[HALT] check-tests stopped. Reason: {file_content}"
EXIT immediately.
0-B: Config Validation
if config.test_command is missing or empty:
Print "No test command configured. Skipping check-tests."
Print "Set config.test_command (e.g. \"npm test\", \"pytest\", \"go test ./...\") to enable."
EXIT cleanly (not an error).
Step 1: Load Previous State
Read agent/state/test_coverage.json. If missing, initialize with:
{ "schema_version": "1.0.0", "last_run": null, "run_count": 0, "status": "unknown",
"results": { "total": 0, "passed": 0, "failed": 0, "skipped": 0, "coverage_pct": null },
"previous_results": null, "alerts": [], "history": [] }
Note previous passed, failed, and coverage_pct values for Step 3.
Step 2: Run Tests
Execute with a configurable timeout (read config.test_timeout_seconds; default 300):
{config.test_command} 2>&1
Capture exit code, stdout, stderr. Parse:
- Counts: try framework-specific patterns in order:
- Jest: Parse each token independently from the
Tests:summary line —(\d+) failed,(\d+) passed,(\d+) skipped,(\d+) totalas separate optional matches (default 0 when absent). IMPORTANT: theTests:line omits "failed" when all tests pass (e.g.,Tests: 26 passed, 26 total), so a combined pattern requiring all tokens will fail. - pytest:
(\d+) passed,(\d+) failed,(\d+) skipped,(\d+) error - Go: count lines matching
^ok\s+\tas passed packages, lines matching^FAIL\tas failed packages (IMPORTANT: Go emits multiple lines containingFAILper failed package —--- FAIL: TestName, standaloneFAIL,FAIL\tpkg/path, and a trailingFAILsummary. ONLY^FAIL\tfollowed by a package path represents a failed package. Similarly,--- PASS:lines are per-test, not per-package.) In verbose mode (-v), also count--- PASS:lines for individual test counts and--- FAIL:for individual test failures, reporting both:Tests: {test_passed}/{test_total} passed (packages: {pkg_passed}/{pkg_total}) - Mocha:
(\d+) passing,(\d+) failing,(\d+) pending - RSpec:
(\d+) examples?,\s*(\d+) failures?(?:,\s*(\d+) pending)? - Rust/Cargo:
test result: (?:ok|FAILED)\.\s*(\d+) passed;\s*(\d+) failed;\s*(\d+) ignored— Cargo emits a single summary line.ignoredmaps toskipped. Coverage is not emitted by default; requirescargo-tarpaulinorcargo llvm-cov. - Python unittest (stdlib
python -m unittest):Ran\s+(\d+)\s+tests?givestotal. If a line matches^OK\b→failed=0, passed=total(OK \(skipped=(\d+)\)setsskipped). If a line matches^FAILED\s*\((.+)\)→ inside the parens readfailures=(\d+)anderrors=(\d+)(sum →failed) andskipped=(\d+)if present; thenpassed = total - failed - skipped. unittest emits NO coverage — usepython3 -m coverage run -m unittest && coverage reportfor the pytest-covTOTAL ... %line. (Listed — and therefore tried — BEFORE Bun, since Bun also matchesRan (\d+) tests.) - Bun:
(\d+)\s+pass(?:\b)for passed,(\d+)\s+fail(?:\b)for failed — Bun uses present tense (pass/fail) NOT past tense (passed/failed). AlsoRan\s+(\d+)\s+testsfor total.(\d+)\s+skipfor skipped. Coverage requires--coverageflag. - Vitest: Uses the same Istanbul/v8 table format as Jest for coverage. Test counts use
Tests\s+(\d+)\s+passed\s+\((\d+)\)format — note: no colon afterTests, no comma separators. Parse each token independently as with Jest. - Fallback: generic
(\d+)\s+(?:tests?\s+)?passed,(\d+)\s+(?:tests?\s+)?failed - Go skipped: count
--- SKIP:lines for skipped tests (only visible in verbose-vmode; if not verbose, skipped count defaults to 0) - Compute
total = passed + failed + skippedwhen the framework does not emit a total
- Jest: Parse each token independently from the
- Coverage: try patterns in order:
All files\s*\|\s*([\d.]+)(Istanbul/nyc table format — NOTE: data rows use bare numbers, no%sign. The first column afterAll files |is statement coverage.)TOTAL\s+.*?([\d.]+)%(pytest-cov)coverage:\s*([\d.]+)%(Go)Statements\s*:\s*([\d.]+)%(Jest text-summary reporter, NOT the default table)([\d.]+)%\s*coverage(generic fallback) Use first match; if none match recordnull. Go multi-package note: Go emits onecoverage:line per package. When multiple matches exist, compute the average across all matched values (this approximates aggregate coverage since Go does not produce a single aggregate figure). Ignorecoverage: 0.0%from packages with[no test files].
- Status: exit 0 →
"passing", exit 127 (command not found) or 126 (permission denied) →"error"with detail"test command not found or not executable", timeout →"error"with detail"timeout after Ns", other non-zero →"failing"
Step 3: Detect Regressions
Skip regression detection when: (a) first run (no previous state), (b) current run status is "error", or (c) previous run status was "error". In these cases record results only, no alerts. Otherwise compare against the last successful ("passing" or "failing") run:
| Condition | Type | Severity |
|---|---|---|
| failed increased by > 5 | regression | critical |
| failed increased by 1–5 | regression | warning |
| coverage dropped by > 5% | coverage_drop | warning |
| failed → 0 (was > 0) | recovery | info |
Alert format: {"severity": "warning", "type": "regression", "detail": "3 new failures (was 2, now 5)"}
Step 4: State Update
Write to agent/state/test_coverage.json:
{
"schema_version": "1.0.0",
"last_run": "ISO 8601",
"run_count": N,
"status": "passing|failing|error",
"results": { "total": N, "passed": N, "failed": N, "skipped": N, "coverage_pct": N.N },
"previous_results": { "...previous results object..." },
"previous_status": "passing|failing|error",
"new_failures": N,
"coverage_drop": N.N,
"alerts": [{"severity": "warning", "type": "regression", "detail": "..."}],
"history": [{"timestamp": "...", "passed": N, "failed": N, "coverage_pct": N.N}]
}
previous_status— the prior run'sstatus, persisted so Step 3's rule (c) ("previous run status was error") is actually decidable next run.new_failures—max(0, results.failed - previous_results.failed)this run (0 on first run).coverage_drop—max(0, previous coverage_pct - current)in percentage points. These two are the variables evolve's 4-B chain trigger evaluates (new_failures >= 1 OR coverage_drop > 5) — they must be written EVERY run, not only when an alert fires.
History: append the current run, then truncate to the most recent 50 entries (drop oldest first). If the array already exceeds 50 (e.g., manual edits), truncate to 50 in this write.
Step 5: Report
Tests: {passed}/{total} passed, {skipped} skipped {coverage_section}
Status: {passing|failing|error}
vs Previous: {delta_section or "first run / no comparison available"}
Alerts: {alert list or "none"}
Where:
{coverage_section}=(X.X% coverage)when available, or(coverage: n/a)whencoverage_pctisnull.- If
totalis 0 and status is not"error", displayTests: 0 found (check test_command output). {delta_section}omits coverage delta when either the current or previouscoverage_pctisnull.
Example: Tests: 142/145 passed, 0 skipped (87.3% coverage) | Status: failing | vs Previous: +3 failed, coverage -1.2% | Alerts: [warning] regression — 3 new failures
Graceful Degradation
- No
test_command→ skip with message - Test command fails to start → record
"error"status, write state - Coverage parsing fails → record
coverage_pct: null, continue - Timeout (exceeds
config.test_timeout_seconds, default 300) → kill process, record"error"with timeout note - State file corrupt → treat as first run, re-initialize
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most quality gates skills give in ~2.4k tokens
Counted across 1,524 of the 2,830 authors here whose files we hold, read 2026-09-06
- Read full output and check exit codein 45 of 1524, across 40 files
- Verify output confirms the claimin 44 of 1524, across 39 files
- Identify the command that proves the claimin 43 of 1524, across 39 files
- Execute the full verification commandin 36 of 1524, across 30 files
- Produce a verification reportin 34 of 1524, across 18 files
- Review git diff changesin 30 of 1524, across 16 files
- Fix build failures immediatelyin 29 of 1524, across 9 files
- Group findings by severityin 28 of 1524
- State claim only with evidencein 27 of 1524, across 22 files
- Verify regression tests with red-green cyclein 26 of 1524, across 22 files
- Run the full test suitein 26 of 1524, across 25 files
- Run test suite with coveragein 25 of 1524, across 10 files
Said here and by no other author read
- Check the halt file before starting
- Skip execution if test command is missing
- Read previous test state from file
- Execute the configured test command
- Parse test counts and coverage percentage
- Detect regressions and coverage drops
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.