Atlas / Skills / emiliodominguez / test-skills

test-skillsBLOCK

skills/emiliodominguez/test-skills

Agent Skills for tests that can fail. Unit, integration, end-to-end, property-based, accessibility, visual, performance, security and LLM evals, with mutation checks and guards against weakened tests.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Version
—
Hosts
3 documented
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Tests that can fail. Seventeen Agent Skills for every kind of testing a coding agent writes: unit, component, integration, end-to-end, property-based, exploration, accessibility, visual, performance, security and LLM evals. Each technique skill ships evidence that its test catches a seeded bug, plus the tools that prove a green suite can fail.

[](https://agentskills.io/specification) [](https://github.com/vercel-labs/skills) [](https://skills.sh) [](LICENSE)

Install · Break a test · Choose a skill · Every kind of test · Run the demo · Evidence

Quick start

npx skills add emiliodominguez/test-skills

Pick your skills and agent. Node.js 22.20+ required. Codex, Claude Code, plugins and profiles →

Already have a suite? Start with test-audit and test-guard:

npx skills add emiliodominguez/test-skills --skill test-audit test-guard

Would your tests notice?

Suppose total([12, 8]) must return 20. This assertion passes:

assert.equal(total([12, 8]), total([12, 8]));
``
Read from source at commit 514c8edc9b8fOBSERVED · 2026-10-14
Advertisement
02

Install

Commands as the repository documents them. They are shown, not run.

npx skills add emiliodominguez/test-skills
npx skills add emiliodominguez/test-skills --skill test-audit test-guard
git clone https://github.com/emiliodominguez/test-skills && cd test-skills
npx skills add emiliodominguez/test-skills                                  # pick skills and agents
npx skills add emiliodominguez/test-skills -g -a <agent> -y                 # user scope, no prompts
npx skills add emiliodominguez/test-skills --skill test-audit test-guard    # just some skills
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
codexmentioned
cursormentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: test-accessibility
description: "Accessibility tests: axe in every state, keyboard and focus checks, names, contrast, screen reader smoke. Use when a11y, WCAG, keyboard or screen reader bugs come up. Hands off to `test-component` or `test-findings`."
compatibility: "Verified in this repository's example with axe-core 4.14 injected into Chromium through playwright-core 1.64, and axe-core 4.14 under jsdom 30. @axe-core/playwright, jest-axe, vitest-axe, pa11y and Lighthouse are described from their documentation."
metadata:
  stage: author
---

# Accessibility tests

Three layers, each catching what the others cannot: a rule engine scans every state a user can
reach, browser checks drive the keyboard and read the accessibility tree, and a short screen
reader pass covers what only a person can judge. Success is a gate that fails on new WCAG A and
AA violations, browser checks shown to fail on a seeded bug, and a recorded manual pass for the
flows that matter.

## What each layer can decide

| Layer | Decides | Cannot decide |
| --- | --- | --- |
| Rule engine (axe-core, pa11y, Lighthouse) | Missing names, labels and alt; invalid ARIA; contrast of plain text on solid backgrounds; duplicate ids in ARIA references; page language; target size | Anything that needs interaction, intent or judgment: focus order and visibility, traps, Escape, focus return, missing error wiring, announcements, reflow, motion, alt text quality |
| Browser checks (key presses, accessibility tree, viewport and media emulation) | Tab reaches every control in order, visible focus, dialog focus management, accessible description of a field, live regions, 320 px reflow, reduced motion | Whether the experience makes sense when heard |
| Manual screen reader pass | What is announced, in what order, and whether it is usable | Regressions between passes |

A clean engine run means "no detectable violations", not "accessible". Rule engines decide only
the criteria that reduce to DOM facts and computed style; published coverage figures differ with
how they count (success criteria versus issue volume), so never quote one as a guarantee. In this
repository's example, a page carrying nine of the fourteen seeded bugs passes axe with zero
violations.

## Process

1. **Fix the target.** WCAG 2.2 AA unless a contract names another version; regulations often cite
   2.0 or 2.1 AA, and 2.2 AA covers them except 4.1.1 Parsing, which 2.2 removed. List the user
   flows and the components with real risk (custom widgets, dialogs, forms, data tables, media,
   drag and drop). Read [references/wcag-map.md](references/wcag-map.md) to turn each risk into a
   criterion and a check.
2. **Assign each check a layer.**

   | Check | Layer |
   | --- | --- |
   | Names, roles, labels, ARIA wiring of one component | Component test with axe and role queries (`test-component`) |
   | Contrast, focus visibility, reflow, target size, layout-dependent rules | Real browser: jsdom has no layout, and axe under jsdom reports contrast as `incomplete` |
   | Keyboard paths, dialog focus, announcements, error wiring | Browser checks with key presses and the accessibility tree |
   | Every page and state on a schedule | A crawler (pa11y-ci, Lighthouse CI) or exploration (`test-explore`) |
   | What a screen reader says | Manual protocol per release |

3. **Scan every state, not the page as loaded.** A rule engine sees only what is rendered when it
   runs: closed dialogs, collapsed menus and unshown errors are not scanned. Enumerate the states
   (dialog open, menu expanded, validation errors shown, toast visible, empty, loading, failed,
   signed in, each breakpoint, dark theme) and scan after driving into each. For coverage of states
   nobody listed, run the generic accessibility properties of `test-explore` (`controlsHaveNames`,
   `focusStaysInModal`, `noSeriousAccessibilityIssues`) after every generated action.
4. **Configure the engine explicitly.** Run with `runOnly` tags `wcag2a`, `wcag2aa`, `wcag21a`,
   `wcag21aa`, `wcag22aa`: a default axe-core 4.14 run skips `target-size` (2.5.8, the only
   `wcag22aa` rule). Report `best-practice` separately as advisory. Treat `incomplete` as a review
   queue, never as a pass. Exclude a named third-party region with a reason and an expiry, never a
   rule globally. Read [references/automated.md](references/automated.md) for setup per runner.
5. **Baseline existing debt, fail only on new violations.** Fingerprint each violation as rule
   plus target selector plus page and state, record the current set, and fail when a scan adds
   one. Fail on resolved entries too until they are deleted, so the baseline only shrinks. Every
   entry has an owner; new code never enters the baseline. Re-record only in a reviewed diff.
6. **Write the browser checks the engine cannot make.** For every interactive surface touched:
   - Tab from the top reaches every control in reading order and eventually leaves the document
     (no trap); every stop shows a focus indicator.
   - Custom controls activate with Enter and Space; composite widgets (tabs, menus, listboxes,
     grids) take one tab stop and move with arrow keys.
   - Opening a dialog moves focus inside, Tab and Shift+Tab stay inside, Escape closes it, focus
     returns to the opener. A native `showModal()` dialog hands Tab past its last control to the
     browser UI (focus reads `body`): allow `body`, fail only on a page element outside it.
   - Skip links move focus to the main content; a sticky header never entirely covers the
     focused element (2.4.11; keeping it fully visible is 2.4.12, AAA).

   Press real keys; `element.focus()` skips the very handlers under test. Read
   [references/keyboard.md](references/keyboard.md) for the code.
7. **Assert names, descriptions and announcements from the accessibility tree, not attributes.**
   Query by role and name (`getByRole("button", { name: "Open menu" })` fails when the name is
   missing), and assert `toHaveAcce
05

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
none-observed
Shell
declared (4 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (17)

HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
skills/test-llm/SKILL.md:99
tool outputs, canary secrets and PII in context that must never reach output, a jailbreak
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
skills/test-llm/references/safety.md:42
## Jailbreak and harmful content
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
skills/test-llm/references/safety.md:44
Maintain a jailbreak set for the product's real risks (what would be harmful or embarrassing
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
examples/buggy-shop/bombadil/spec.ts:6
import { hostileTyping, keyboard, shortTyping, waiting } from "../../../skills/test-explore/assets/bombadil-kit/actions.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
examples/buggy-shop/bombadil/spec.ts:7
import { minorUnits } from "../../../skills/test-explore/assets/bombadil-kit/dom.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
examples/buggy-shop/bombadil/spec.ts:8
import { settles } from "../../../skills/test-explore/assets/bombadil-kit/temporal.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
examples/buggy-shop/bombadil/spec.ts:10
export * from "../../../skills/test-explore/assets/bombadil-kit/properties.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
examples/buggy-shop/fast-check/explore.mjs:16
import { findChromium } from "../../../skills/test-explore/assets/bombadil-run.mjs";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
examples/buggy-shop/fast-check/explore.mjs:151
const config = await fetch(`http://127.0.0.1:${port}/config.js`);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
examples/buggy-shop/fast-check/explore.mjs:201
url: `http://127.0.0.1:${options.port}/`,
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
examples/buggy-shop/hypothesis/test_explore.py:23
URL = f"http://127.0.0.1:{PORT}/"
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
examples/buggy-shop/serve.mjs:64
console.log(`buggy-shop (${fixed ? "fixed" : "with bugs"}${withKit ? ", page kit" : ""}) on http://127.0.0.1:${port}/`);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
examples/explore-kit/verify.mjs:115
origin: `http://127.0.0.1:${address.port}`,
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
js-yaml, @testing-library/dom, @testing-library/react, @testing-library/user-event, @types/node, @types/react, @types/react-dom, ai
Why it matters. 20 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.override · CWE-94, CWE-1427
skills/test-llm/references/safety.md:8
- **Direct:** user text that tries to override instructions ("ignore previous instructions",
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-14 · audit v0.4.1 · source sha 514c8edc9b8ffull audit observations/trust-audit/skill/emiliodominguez__test-skills.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-14514c8edc9b8fBLOCKD69first audit
07

Questions

What does the test-skills skill do?

Agent Skills for tests that can fail. Unit, integration, end-to-end, property-based, accessibility, visual, performance, security and LLM evals, with mutation checks and guards against weakened tests.

Is test-skills safe to install?

No — not without reading the findings first. The audit graded it D (69/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What can test-skills access on my machine?

The audit observed that it runs shell commands. Each of those is consistent with what it says it does. Secrets in the source: none found.

Which assistants does test-skills work with?

Its documentation mentions claude-code, codex and cursor. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (514c8edc9b8f), read on 2026-10-14. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement