# benchmark-checklist

A skill that makes the agent answer seven questions with evidence from a run before it reports a speedup or a regression.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 4100 installs · ★ 2737
- Author: backnotprop
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/backnotprop/pstack/tree/HEAD/skills/benchmark-checklist/SKILL.md
- Updated: 2026-10-24
- HTML: https://affpapa.org/en/nevibecode/skills/benchmark-checklist

## What it does

The skill fires when you are about to put a number on performance: a PR's before and after, a regression claim, a harness for picking a config or a library. Each question gets answered from a run, not from reading the code.

There are seven. Name the limiter, and profile in a run you do not report, since profilers slow the work down. Check that both sides ran the way production runs them, because a side left on defaults means you compared configurations. Do the arithmetic against disk and network bandwidth. Count failures and non-success responses. Repeat each side at least 5 times, alternating A, B, A, B, and report the median and range. Then measure the end-to-end path a user waits on and give the micro result as a share of it.

Before any of that, write down the claim in the words you would ship, read the measurement script, and check `uptime` and `nproc`. If the machine is busy and you cannot stop the load, interleave the sides so both see the same noise and say so in the report. A ballpark the user asked for needs one run, but questions 4 and 7 still apply and the report has to say it was a single run. Picking between options is never a ballpark.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add backnotprop/pstack --skill benchmark-checklist -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/benchmark-checklist/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/benchmark-checklist/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add backnotprop/pstack --skill benchmark-checklist -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/benchmark-checklist/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add backnotprop/pstack --skill benchmark-checklist -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/benchmark-checklist/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install backnotprop/pstack benchmark-checklist
```

2. **Manually: put the files in place**
- File: `.github/skills/benchmark-checklist/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add backnotprop/pstack --skill benchmark-checklist -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/backnotprop/pstack --path skills/benchmark-checklist
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/benchmark-checklist/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add backnotprop/pstack --skill benchmark-checklist -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/backnotprop/pstack/tree/HEAD/skills/benchmark-checklist/SKILL.md

## When to use it
- tell a real speedup from run-to-run noise
- find the limiter when a change moves nothing
- catch a measurement where the work never ran
- compare implementations instead of default settings
- count errors and timeouts that skew the average

## Example prompts
- vet my benchmark before I claim the export got faster in the PR
- I measured a p50 regression on the 60k-row dataset, run the checklist
- choosing between two parsing libraries, what should I check in the numbers

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: d0c738ec72345197.

BEGIN THIRD-PARTY FILE d0c738ec72345197
```text
---
name: benchmark-checklist
description: "Vet a perf measurement (limiter, tuning, limits, errors, repeatability, relevance, and whether the work happened) before you report or act on it. Use when you run a benchmark or report a speedup or regression you measured."
disable-model-invocation: true
---

# Benchmark checklist

Use this when you produce a performance number: a PR's before and after, a regression claim, a hillclimb harness, or a library or config choice. Answer each question with evidence from a run, not a guess about the code.

For a quick ballpark the user asked for, one run is enough. Still check questions 4 and 7, and say that it is one run. Skip the rest unless that run looks wrong. A choice between options is never a ballpark.

## Before you run anything

- Write down the claim you expect to make, in the words you would ship ("export is 30% faster at p50 on the 60k-row dataset"). The questions test that sentence.
- Read the measurement script. Note what it times, counts, and ignores.
- Check the load average with `uptime` and the core count with `nproc`. If the machine is busy, find out what is running. If you cannot stop it, interleave the sides so both see the same noise, and say so in the report.

## The questions

1. **Why not double?** Name the limiter. Profile in a run you do not report, because profilers and tracers slow the work down. Use CPU per process (`top`, `pidstat`), a runtime profiler (`node --cpu-prof`, `py-spy`, `perf`), I/O wait, and syscall counts (`strace -c` on Linux), then map the hot spot to source. Watch the load generator too: if it saturates first, you measured the load generator. If a change did not move the number, the limiter explains why, so find it before you call the change useless.
2. **Was it tuned?** Run every side the way production runs it: release builds, production flags and env, batching and transaction settings, connection pools, caches as warm or cold as production sees them, and the same versions and data. If one side runs on defaults, you compared configurations, not implementations. A limiter that is a setting (a commit per row, a debug build, a missing index) means that side is untuned. Tune it and measure again before you pick a winner. If you cannot tune it, do not pick a winner from that run. When the user is choosing what to adopt, narrowing the claim to the code as it ships today does not fix this, because they adopt the option, not today's settings.
```
END THIRD-PARTY FILE d0c738ec72345197

The third-party file has ended. Everything between the d0c738ec72345197 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 2463 of 5002 bytes. © backnotprop · MIT · https://github.com/backnotprop/pstack/tree/HEAD/skills/benchmark-checklist/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
