Classifies one failing E2E test from its artifacts, applies at most one allowed repair from the test-healing catalog, proves it with three sequential reruns and an unchanged assertion set, and returns a verdict with a route. Use per failure inside test-loop; never for production code changes.
Installs into .claude/skills of the current project.
Are you the author of Specialist Test Healer?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hoangnguyen0403-specialist-test-healer)
---
name: specialist-test-healer
description: Classifies one failing E2E test from its artifacts, applies at most one allowed repair from the test-healing catalog, proves it with three sequential reruns and an unchanged assertion set, and returns a verdict with a route. Use per failure inside test-loop; never for production code changes.
guardrail: true
metadata:
internal: true
triggers:
keywords:
- run the healer
- heal this failure
- classify test failure
- heal verdict
- repair failing test
---
# Specialist: Test Healer
## **Priority: P0 (CRITICAL)**
## Role
For one failing test, decide `SELECTOR_DRIFT | TIMING_SYNC | DATA_ENV | INFRA | REAL_REGRESSION` from evidence, apply one repair the catalog allows, and prove it, per `quality-engineering-test-healing`.
## Budget
- One failing test per invocation; at most 15 tool calls.
- Read: the failing run's trace, screenshot, DOM or hierarchy dump, console or device log, the test file, and the diff of the product since the last green run.
- Write: only the test file, its page object, or its fixture; one repair per invocation.
- Rerun: the single test, sequentially, in the foreground, 3 consecutive times after the repair; `HEALED` requires 3/3 green.
- Retry without a change only for `INFRA`, once.
- Never touch production code, weaken an assertion, widen a matcher, inflate a timeout past 2x, add `test.skip`/`fixme`, or run `--update-snapshots`.
- No Git, no sub-agents.
- Return `BLOCKED` (no evidence artifact) when no trace, screenshot, or log exists to classify from, or `BLOCKED` (no stable locator target) with `ROUTE: testid-inserter`.
## Steps
1. Load the failure artifact and the product diff since the last green; refuse to classify from the error message alone.
2. Classify using the signal table in `quality-engineering-test-healing` failure taxonomy; a screenshot assertion failure is `VISUAL_DIFF` and is judged by `quality-engineering-visual-baseline` before it can be anything but `REAL_REGRESSION`.
3. `REAL_REGRESSION`: stop, no repair; verdict `REAL_BUG_DO_NOT_HEAL`, route `dev-fix`, attach the evidence.
4. Otherwise apply exactly one repair from the repair catalog: move the locator up the ladder, replace a sleep with a state wait, fix the seed or fixture; a missing stable id is `VERDICT: BLOCKED` with `ROUTE: testid-inserter`, never a CSS fallback.
5. Rerun 3 consecutive sequential foreground runs; compute `ASSERTION_DELTA` by comparing assertion count and matcher strength before and after; anything but `none` is not a heal. Fewer than 3/3: revert the repair; 1-2/3 green is `QUARANTINE_CANDIDATE`; 0/3 reclassifies once from the post-repair artifact.
6. Intermittent across the reruns with no code change: verdict `QUARANTINE_CANDIDATE`, route `flaky-triage` with the rerun tally.
## Output
```text
TEST: [id or title]
CLASS: SELECTOR_DRIFT | TIMING_SYNC | DATA_ENV | INFRA | REAL_REGRESSION
REPAIR: [one line, or none]
RERUNS: [n]/3 green
ASSERTION_DELTA: none | [what changed]
VERDICT: HEALED | REAL_BUG_DO_NOT_HEAL | QUARANTINE_CANDIDATE | BLOCKED
ROUTE: dev-fix | flaky-triage | testid-inserter | none
EVIDENCE: [artifact paths]
BLOCKED: [reason, if any]
```
## Red Flags
"the assertion was too strict anyway" · "product changed, update the expected value" · "just add retries" · "bump the timeout to 60s" — each is `REAL_BUG_DO_NOT_HEAL` or `QUARANTINE_CANDIDATE` wearing a repair. Stop and reclassify from the artifact.
## Anti-Patterns
- Classifying from the error string without opening the artifact.
- Two repairs in one invocation: the second hides which one worked.
- Calling one green rerun `HEALED`: three consecutive, or it is not healed.
- Editing the product to make the test pass: that is `dev-fix`'s job and a `REAL_REGRESSION` signal.