agentleFS
mblodemblode/agent-skills/skills/test-audit/SKILL.md

test-audit

Skill189 starsChanged 2 months agoMITView on GitHub

Prunes low-value tests across a whole suite to a measured target while holding coverage. Use when asked to "remove useless tests", "prune the test suite", "we have too many tests", "agents keep writing pointless tests", or "cut 20% of tests without losing coverage".

80 other projects use a version of this, 17 of them edited.

Adopted by

Most recently taken up by

Used with

Projects with it also use chips, redo and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • udecodeSkill

    chips

    Run the project's suggested-task ledger, the chips. /chips alone brings this session's open tasks up to date: it applies what the ledger helper says, settles stale and split tasks, cards what can start and reports the board, and /chips all also takes the ship-list tasks and the ones no live session owns, and merges duplicate tasks across the board. Use for /chips, /chips offer, start or drop, \"what chips are open\", \"suggest a task for X\", \"update the chips\", \"clean up the chips\", \"which chips are stale\", \"is this chip still worth doing\", \"merge duplicate chips\", at the last hand-back of a run that offered a task, and whenever pstack would file a tracked issue, a follow-up, a reflect Backlog item or an out-of-band PR.

    Also in 3 projects that use this

  • Scylla23Skill

    redo

    Re-run the last routed task one model tier up (haiku → sonnet → opus → fable). User-invoked escalation when the previous result missed. Pass --dry-run to preview without running.

    Also in 3 projects that use this

  • Aetheria-Labs1Skill

    plan-page

    Plan one storefront page from strategy through final copy, section order, proof, offers, template direction, responsive layout, and production asset requirements. Stops at an approved execution-ready specification.

    Also in 3 projects that use this

  • SocialKit-APISkill

    video-transcripts

    Extract transcripts from social videos through SocialKit across YouTube, TikTok, Instagram, Facebook, X/Twitter, LinkedIn, and direct video file URLs. Use when the user asks to transcribe, get captions or subtitles, pull the spoken text, or read what a video says, including one video or many at once. Returns full text plus timestamped segments. Not for posting, private accounts, or unrelated website scraping.

    Also in 3 projects that use this

  • clawdbotSkill

    pr-simplify

    Simplify your own change to its smallest complete fix. Use before opening a PR, before pushing large repairs to one, or when asked to shrink a PR or clean up slop.

    Also in 3 projects that use this

  • spitoglouSkill

    technical-documentation

    Create and improve technical documentation including architecture designs, PRDs, API docs, code explanations, and visual diagrams. Use when asked to document systems, explain codebases, create design documents, write PRDs, generate Mermaid/PlantUML diagrams, review architecture, write user stories, or create pull request descriptions. Triggers include "document this", "create a design doc", "explain this code", "write a PRD", "create a diagram", "architecture overview", "user story for", "PR description".

    Also in 3 projects that use this

The file

We split this skill into the rules it gives an agent

5 rules. 0 are common, 5 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 77 edited versions we read keep these.

  • 5

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Keep a test when it independently enforces a public API, protocol, config, migration, storage, security, platform, default value, generated …

    line 55
  2. Distinctive:

    call ordering when the order is observable behavior

    line 57
  3. Distinctive:

    Before judging, read the complete test, the production owner, its callers and callees, sibling implementations, overlapping tests, and the …

    line 66
  4. Distinctive:

    test name and location, and what failure it can actually detect

    line 68
  5. Distinctive:

    Run the owner and sibling tests for each batch.

    line 82

“Common” is measured: kept by at least 6 in 10 of the 77 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Test Audit

Tests earn their place by catching a credible regression that nothing else catches. Agents write a test for every small change, and most of those re-assert the source, replay a stronger test through a mock, or pin a private call shape. Coverage barely moves when they go; maintenance cost and suite time do.

  • IS: sweeping a directory for low-value, misplaced, and skipped tests, and campaign-pruning a whole subsystem or repo to a measured target with coverage held, plus deleting the test-only production seams those tests kept alive.
  • IS NOT: gating a test before it lands or reviewing a feature diff (tidy), making CI faster by splitting or sharding (ci-speedup), or writing tests for untested code.

Pick a mode

ModeWhenDone means
AuditA focused sweep of named files or a directoryA handful of high-confidence candidates with full evidence, deleted in one coherent batch with validation green
CampaignA subsystem's or repo's whole test surface, or any request with a target ("remove 20%")The target is met or the ledger shows why it cannot be, coverage held within tolerance, and the preservation review passed. Read references/campaign.md first

Set a target before starting

An open-ended "clean up the tests" stops after a few obvious deletions, because every remaining candidate looks defensible in isolation. Audit and Campaign need a number to work against. When the user gave one, use it. When they did not, propose one and proceed on it rather than waiting:

Remove the least useful 20% of test declarations in <scope>, keeping line and branch coverage within 2 percentage points of the baseline and every retained test green.

Measure the baseline first (references/coverage.md), then keep deleting in order of lowest value until the target is met or the coverage budget is spent. Stopping short is a valid result only with a ledger showing that the remaining candidates each guard a named contract. The target is a floor on effort, not permission to cut uncertain tests: the retention bar below still wins over the number.

Junk patterns

What an audit or campaign hunts for:

  • assertion-free coverage probes, and tests whose only assertion is "does not throw" on a path that cannot throw
  • self-comparisons, identity copies, and expected values produced by the helper or renderer under test
  • copied fixtures, inventories, manifests, export lists, or snapshots of data the test also defines
  • exact source, import, or string greps that fail on a rename and survive a real behavior change
  • private predicate or call-shape tests (toHaveBeenCalledWith on an internal) duplicated at a real boundary
  • duplicate invocations of one contract, and per-provider replays of a shared helper
  • tests whose only purpose is keeping a test-only export, global, or wrapper alive, and production code whose only callers are tests
  • mocks that implement the asserted behavior, or one mock standing in for several different APIs
  • fixtures that supply the ordering, receipt, or callback the code under test should produce, or persistence asserted against a store the path never writes
  • capability tests that restate declared flags instead of exercising what the flag promises
  • negative controls that pass for an unrelated reason, such as a rejection from a different guard
  • names that promise more than the assertions check: judge the test by its assertions, not its title

Misplaced and skipped tests

Two more finding kinds. Neither is a removal candidate on that fact alone, and a move or an unskip is not a deletion toward the target.

  • Misplaced: the test lives in one owner's suite but only exercises another's, such as a slug-format check in routes/posts.test.ts that never touches the route and only calls lib/slug.ts. Move it to the canonical owner's suite, as "Edit shape" says for retained regressions.
  • Skipped: the test is disabled, such as it.skip('prorates refunds on downgrade'), xit, @pytest.mark.skip, or t.Skip(). Unskip it and run it first; never remove it on sight. If it passes, leave it enabled and judge it like any other test. If it fails, treat it as a possible product bug under the retention bar: reproduce it and fix the owner. A conditional skip with a real platform or environment reason is not a finding.

Retention bar

Keep a test when it independently enforces a public API, protocol, config, migration, storage, security, platform, default value, generated cross-language, package, release, or architecture contract. Also keep:

  • call ordering when the order is observable behavior
  • a regression with a credible failure mode
  • a source inspection when it is the cheapest independent guard: it fails when the user-facing key, byte, or path changes and survives an identifier-only rename
  • a retained test that fails on the baseline: treat it as a possible product bug, reproduce it, and fix the owner rather than deleting it

Static or slow is not a reason to delete. A test that resembles implementation may still be the only proof of a contract; show otherwise before removing it.

Evidence per candidate

Before judging, read the complete test, the production owner, its callers and callees, sibling implementations, overlapping tests, and the history that explains why the test exists. Record for each deletion:

  • test name and location, and what failure it can actually detect
  • non-test callers of the seam it covers
  • the stronger proof that remains (name the keeper test), or why no contract exists
  • the production or test-support code the deletion unlocks
  • coverage delta from removing it, when measured

A missing field means the candidate is not ready. Prefer a few high-confidence deletions over a long speculative list; do not convert uncertain candidates into deletions to reach the number.

Edit shape

Delete in coherent owner-boundary batches. With each batch, delete the test-only exports, globals, wrappers, reset hooks, and dead production paths it unlocks instead of keeping aliases. Move retained regressions to their canonical owner and fold duplicated setup into shared fixtures. Aim for net-negative production lines as well as test lines. Do not add replacement tests that restate the same implementation.

Validation

  1. Run the owner and sibling tests for each batch.
  2. Where a deleted test grepped source or asserted a plan, run the script or dry-run that owns the real contract.
  3. Re-measure coverage with the same command as the baseline and compare against the budget, per file.
  4. Report git diff --numstat with production and tooling lines separate from test lines.

Permissions

Running tests and coverage locally, and deleting tests and test-only seams in the working tree, are the task: do them without asking. Commit, push, or open a PR only when asked. A test that meets the retention bar stays; deleting one anyway is the user's call, as is changing coverage thresholds or CI gates.

Handoff

  • target, baseline, and final numbers: declarations or lines, and line and branch coverage
  • removed categories and the root cause behind them (what kept producing these tests)
  • production simplifications, counted separately from test lines
  • retained false positives and why each stays
  • validation actually run, with results
  • a proposed gate for the repo's AGENTS.md, drawn from the patterns this audit actually found, so agents stop writing them

Gotchas

  • Line coverage survives deletions that remove the only assertion on a path, because another test still executes the lines without checking them. Where a deletion looks free on coverage, confirm a keeper asserts the behavior, or run a mutation against the owner (references/coverage.md).
  • Aggregate coverage hides a subsystem that lost its only proof while an unrelated area gained. Compare per file for every production file the deleted tests touched.
  • Ranking candidates by unique line coverage alone deletes the wrong tests: a test with zero unique lines can still hold the only assertion on them. Unique coverage makes a test a candidate; a named keeper makes it a deletion.
  • Editing tests while Vitest or Jest runs in watch mode on the same checkout re-runs half-edited files, and the failures read as regressions from the deletion. Stop the watcher before a batch.

Reference files

FileRead when
references/campaign.mdCampaign mode, or any target-driven prune larger than one directory
references/coverage.mdMeasuring the baseline, per-file and per-test coverage, the budget check, and mutation spot checks

Maintenance only: evals/evals.json holds scenarios and routing prompts for changing this skill; it never loads during a task.

Related skills

  • tidy: gates a test the moment a diff adds or changes it, and reviews the rest of the diff alongside it. This skill only sweeps or campaign-prunes the existing suite; "audit these tests in my PR" routes to tidy, not here.

Credit

Adapted from OpenClaw's test-audit skill (openclaw/openclaw, MIT). Provenance lives in the repository's maintenance notes.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.