benefit-contract
Use at Phase 0.8 of a behaviour-changing wave, before any acceptance criteria are written. Produces the Benefit AC, the authority…
Use as the first phase of a wave. Drafts brutal, testable acceptance criteria for a feature. Each AC must be falsifiable by a real-world test. Output written to .wave/ac.md.
Claude Code
$ npx -y skills add Harshvardhan86/claude-wave-plugin --skill ac-writer --agent claude-code
Codex
$ npx skills add Harshvardhan86/claude-wave-plugin --skill ac-writer -a codex -y
Cursor
$ npx skills add Harshvardhan86/claude-wave-plugin --skill ac-writer -a cursor -y
Gemini CLI
$ npx skills add Harshvardhan86/claude-wave-plugin --skill ac-writer -a gemini-cli -y
GitHub Copilot
$ npx skills add Harshvardhan86/claude-wave-plugin --skill ac-writer -a github-copilot -y
OpenCode
$ npx skills add Harshvardhan86/claude-wave-plugin --skill ac-writer -a opencode -y
Windsurf
$ npx skills add Harshvardhan86/claude-wave-plugin --skill ac-writer -a windsurf -y
name: ac-writer description: Use as the first phase of a wave. Drafts brutal, testable acceptance criteria for a feature. Each AC must be falsifiable by a real-world test. Output written to .wave/ac.md.
You write **brutal acceptance criteria** for the feature the orchestrator passes you. "Brutal" means: every AC is a falsifiable claim that a Playwright test or a curl + grep can prove or disprove.
Numbered ACs, each with:
Every criterion that asserts on a user-visible surface must hold in three pinned data states:
Write the three outcomes on one `**Data states:**` line per such criterion. A criterion that only says what happens when the new records exist is not finished: the state it does not name is the state every user will be in first.
Never write a criterion whose condition is the presence of data — "when a hold exists, the badge reads Bug Fixing" — without also stating the absent-data outcome in the same criterion. The brutal review at `[ACB]` rejects those, and hunts for the surfaces where you forgot to ask.
If the wave ran `[UIA]`, read `.wave/uia.md` first: every `UIA-n` must be covered by at least one of your criteria, and each `UIA-n` already names the data state it is about. If the wave ran `[BEN]`, read `.wave/ben.md`: the Benefit AC is the outcome your criteria have to make observable, and it is not itself one of them.
You always include these unless the orchestrator says "non-UI":
1. **Computed visual effect** — at least one AC asserting `getComputedStyle()` value (e.g., `body` background colour after toggle = `rgb(...)`) 2. **Bounding box** — element that should be visible has `boundingBox.width > 0 && height > 0` 3. **Persistence (if applicable)** — refresh the page; state survives via the documented mechanism (localStorage / cookie / server) 4. **Keyboard accessibility** — feature is reachable and operable via keyboard alone 5. **No regression** — list 1–2 nearby features the wave must not break, with the same observable rigour
Before writing any color/token AC, confirm the value comes from the app's *compiled* CSS, not the framework's default palette. Many projects override their CSS framework's config, which means a "standard" token name (e.g. a Tailwind palette colour) may not actually compile. Audit the live `<style>` output, or the project's compiled CSS in `dist/` / `.next/static/css/` / equivalent — never trust theoretical class names.
If the app has *no* existing pattern for a needed visual state:
1. Read the feature description. 2. If a project memory or `CLAUDE.md` exists, scan for project-specific AC conventions (e.g., the project may demand WCAG AA contrast). 3. Draft 5–10 ACs. Fewer is suspicious; more is over-spec. 4. For each AC, write its observable as a one-line pseudocode test (e.g. `expect(getComputedStyle(body).backgroundColor).toBe('rgb(17, 17, 17)')`). 5. Write to `.wave/ac.md` with this structure:
# Acceptance Criteria — <feature> ## AC-1 — <one-line summary> **Trigger:** <action> **Observable:** <measurement> **Data states:** empty → <outcome>; partial → <outcome>; full → <outcome> **Test pseudocode:** `<one line>` **Rejects:** <what failure looks like> ## AC-2 — ...
The `**Data states:**` line is required on every criterion that asserts on a user-visible surface, and omitted on the ones that do not.
6. Return to the orchestrator with the file path and a one-line summary of how many ACs and how many are flagged for user approval.
Run your coding agent like an engineering org. Wave-based execution with dedicated sub-agents per phase, computed-style visual verification, no "tsc passes" lies.
Use at Phase 0.8 of a behaviour-changing wave, before any acceptance criteria are written. Produces the Benefit AC, the authority…
Use after AC and before RED for any wave that ships UI or changes existing behaviour. Audits component APIs against installed…
Use after RED is verified failing. Writes the minimum code to make RED tests pass, then verifies on a live stack with Playwright…
Use after DR and before any production code is written. Writes failing tests that encode the AC and DR visual assertions, then…
Use only after the user has approved the GREEN screenshot. Performs True End-to-End Testing across backend, frontend, DB, and…
Use when shipping a feature end-to-end. Routes between the canonical v2 framework (31 phase rows, 18 always and 13 conditional)…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.