> Records visual proof while testing UI behavior — screen recording with structured test/assertion annotations — then posts the video and a results summary to the PR and tracker issue. Use whenever a change needs verifiable evidence that it works, instead of prose claims — including headless environments (scripted screenshots and probes) and non-UI changes (measured numbers, output pairs).
npx skills add https://github.com/michaelshimeles/skills --skill evidence-driven-testing
Record annotated proof of behavior, then attach it to the PR and tracker issue.
setup annotation describing the starting context, e.g. "Logged in, navigating to connectors page".test_start annotation in Jest style: It should execute the tool directly when permission is 'always'.assertion annotation with result passed, failed, or untested.untested with the reason — never skip silently.When the agent has no desktop to record, keep the same assertion discipline;
swap the recorder for scripted capture:
.artifacts/<task-name>/ (gitignore it — evidence getsuploaded, never committed). Keep the capture script beside the captures so
the run is repeatable.
before-and-after CLI (@vercel/before-and-after)captures URLs or elements and its pairs feed PR embeds directly. In
containers/VMs where Chrome fails with "No usable sandbox", set
AGENT_BROWSER_ARGS="--no-sandbox".
adding playwright to the project's dependencies:
npx --yes --package=playwright node record.mjs
(Plain npx playwright node record.mjs fails — node is not a Playwright
CLI command; --package=playwright is what puts the module on the path.)
Minimal record.mjs:
import { chromium } from "playwright";
const browser = await chromium.launch();
const context = await browser.newContext({
recordVideo: { dir: ".artifacts/<task-name>/" },
});
const page = await context.newPage();
await page.goto("http://localhost:3000/path-under-test");
// ...drive the flow, one meaningful state change per step...
await context.close(); // finalizes the .webm
await browser.close();
Trim or compress with ffmpeg if the file is large.
with the assertion in the name — 01-precondition-signed-in.png,
02-it-saves-on-blur-passed.png — and keep an assertions.md in the
artifacts folder listing each test_start / assertion with its result
(passed / failed / untested + reason).
counts per phase, latency before/after — captured to probe-output.txt.
(diff values), reviewed by eye and saved as PNGs.
and response.
fix — that capture is the "before" half of a before/after pair.
right process), especially when multiple agents share a machine:
lsof -i :<port> — or where lsof isn't installed,
ss -ltnp "sport = :<port>" to find the listener's PID, then
ps -p <pid> -o args= to confirm it's yours.
replaces them.
(e.g. before-and-after before.png after.png --markdown).
Take michaelshimeles/evidence-driven-testing from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npx.
Without those the skill loads but fails at the first command.