agentleFS
renzrollonrenzrollon/interlock/skills/fix-tests/SKILL.md

fix-tests

Skill61 starsChanged 7 days agoMITView on GitHub

Discover and persist how a project's tests run, then run the suite and repair failures by root cause — clustering failures by error signature, fixing the shared cause once, and asserting no test was weakened. Use when tests are failing, the suite is red, CI pasted a failure log, or someone asks to make the tests pass.

7 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use deploy.

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.
  • VercelSkill

    deploy

    Deploy applications to Vercel. Use when the user says "deploy", "deploy to Vercel", "push to production", "deploy my app", or "go live".

    Also in 3 projects that use this

The file

We split this skill into the rules it gives an agent

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

  • 0

    Common

    Most of the 7 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 5

    Very specific

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

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Read .claude/testing/profile.json.

    line 31
  2. Very specific:

    Run the unit command under the permissions already granted to this project.

    line 43
  3. Distinctive:

    Source first: When a test and the code disagree, the default assumption is that the code is wrong.

    line 88
  4. Very specific:

    Never: delete a test, add .skip/.only, loosen an assertion to match observed output, narrow a glob, raise a timeout to hide a race, or …

    line 90
  5. Distinctive:

    After 5 iterations, stop and report the unresolved clusters and what was tried.

    line 94
  6. Distinctive:

    Run the full suite again, then assert against the baseline:

    line 100
  7. Very specific:

    Write at most 3 .claude/memory/failure-modes/<slug>.md entries for genuinely recurring gotchas, with index lines in …

    line 114
  8. Very specific:

    Write .claude/metrics/fix-tests-<YYYYMMDD-HHMMSS>.json with the baseline, final counts, clusters, fixes applied, and anything unresolved.

    line 115

“Common” is measured: kept by at least 6 in 10 of the 7 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

Make the suite green without making it weaker.

The failure mode this skill exists to prevent is the one where a suite goes green by shrinking — a deleted assertion, a .skip, a narrowed glob, a loosened matcher. That is not a fix; it is the bug plus a lie. Every step below is built around detecting it.

FlagEffect
--e2eAlso run the e2e suite (only when e2e.command is configured)
--dry-runDiagnose and propose; edit nothing
--baseline <ref>Treat failures already present at <ref> as pre-existing
--from-log <path>Parse a pasted CI log instead of running the suite first
--reconfigureRe-run test discovery from scratch

1. Resolve the test profile

Read .claude/testing/profile.json. If it is missing or --reconfigure was passed, run the discovery ladder in ${CLAUDE_PLUGIN_ROOT}/shared/TEST-PROFILE.md: manifests, then runner configs, then CI workflows, then at most four questions for gaps that genuinely block a correct run.

Resolve typecheck.command and lint.command on the same pass, the way coverage.command is resolved: the profile's own value first, then package.json scripts.typecheck / scripts["type-check"] and scripts.lint, then the step in the CI job that runs it. Never ask for either and never invent one — nothing found is command: null, which a ship run skips with a stated reason. A ship run's inter-wave checkpoint has no typecheck to run unless this field is filled, and a typecheck failure is a halting kind there.

This is the only skill permitted to interview the user about tests. Every later run is zero-question.

Persist the profile and mirror it into the ## Testing block of the first instruction file that exists — CLAUDE.md, then .claude/CLAUDE.md, then AGENTS.md — between the managed markers, idempotently.


2. Run and baseline

Run the unit command under the permissions already granted to this project. This skill does not pre-approve a shell. Record total, passed, failed, skipped — this is the baseline that step 6 asserts against.

Split failures into:

  • Newly broken — not failing at --baseline <ref> (or all failures when no baseline was given)
  • Pre-existing — already failing at the baseline. Report only. Do not absorb them into this fix unless the user explicitly widens scope.

3. Flake check

Re-run only the failing files or test names, once, using single_file / filter_syntax.

  • Still failing → a real failure; continue.
  • Passed on re-run → record it in profile.known_flaky and do not "fix" it. Mention it in the report. A test that passes on retry is a flaky test, and "fixing" it usually means deleting the thing that caught a race.

4. Cluster by error signature

SignatureExampleLikely shared root cause
Same missing importCannot find module './utils'Missing export or wrong path
Same type errorType 'X' not assignable to 'Y'Interface shape mismatch
Same fixture or setupReferenceError: db is not definedMissing shared setup
Same env or configECONNREFUSED, env.X is undefinedMissing env or config
Same assertion patternMany expected X received YLogic bug in shared code

With --from-log, parse the log into the same clusters without an initial run — but still record a live baseline before applying any fix.


5. Fix by root cause

iterations = 0, MAX = 5

WHILE failures remain AND iterations < MAX AND NOT --dry-run:
  1. Pick the cluster covering the MOST failures
  2. Choose ONE fix — source first
  3. Apply it
  4. Re-run ONLY the affected tests
  5. Drop resolved failures; iterations++

Source first. When a test and the code disagree, the default assumption is that the code is wrong. Change the test only when you can state why the test's expectation was incorrect — and say that out loud in the report.

Never: delete a test, add .skip/.only, loosen an assertion to match observed output, narrow a glob, raise a timeout to hide a race, or catch-and-ignore an error to make a run pass.

--dry-run stops after clustering: print the diagnoses and proposed fixes, edit nothing.

After 5 iterations, stop and report the unresolved clusters and what was tried. Do not thrash.


6. Full re-run and no-regression assert

Run the full suite again, then assert against the baseline:

  • total >= baseline.total
  • skipped <= baseline.skipped

If either assert fails, revert the weakening change — something deleted tests or added skips. A green suite that runs fewer tests than it did before is a regression wearing a green badge.


7. Persist

  • Refresh .claude/testing/profile.json (updated, known_flaky, notes) with anything learned about running tests. Preserve every key you did not resolve yourself.
  • After a green full unit run, record unit.timeout_ms as that run's wall time in whole milliseconds, rounded up — a JSON integer, never seconds, a decimal or a string, any of which either aborts verification planning or reads as a far smaller allowance. Never write a value below a wall time you measured: a ship run derives its inter-wave verify budget from this field, and a value under the real runtime makes every checkpoint skip the suite. Do not apply a multiplier and do not copy a number from elsewhere — the measured time is the input.
  • Confirm the ## Testing block is still a single idempotent pair of markers.
  • Write at most 3 .claude/memory/failure-modes/<slug>.md entries for genuinely recurring gotchas, with index lines in .claude/memory/MEMORY.md. One-off typos do not belong in memory.
  • Write .claude/metrics/fix-tests-<YYYYMMDD-HHMMSS>.json with the baseline, final counts, clusters, fixes applied, and anything unresolved.

8. Report

Baseline → final counts. Root causes fixed, one line each. Failures reverted as pre-existing. Flaky tests recorded. Anything still red, and what was tried. If you changed a test rather than source, say which and why.

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.