/ac-writer
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.
$ npx -y skills add Harshvardhan86/claude-wave-plugin --skill ac-writer --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/ac-writer
Context preview
The summary Claude sees to decide when to auto-load this skill.
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.
SKILL.md
ac-writer.SKILL.mdname: 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.
Acceptance Criteria Writer
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.
What you must NOT produce
- Vague ACs: "the toggle works correctly", "the UI looks good", "users can switch themes"
- Implementation-coupled ACs: "the component uses `useState`", "the API returns JSON"
- ACs that pass when the feature is actually broken: "an element with `data-theme=dark` exists" (the screenshot can still be light)
What you must produce
Numbered ACs, each with:
- **Trigger** — exact user action or system event
- **Observable** — a measurement (computed style value, network response, DOM mutation, screenshot pixel) that proves the behaviour
- **Negative case** — what the AC *rejects*; what would make it fail
Required ACs for any UI wave
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
Visual vocabulary grounding
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:
- **Flag it as an open AC**: "App lacks a 'loading' visual state. Recommendation: ___. User must approve the new token before DR proceeds."
- Do *not* invent one silently.
Procedure
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>
**Test pseudocode:** `<one line>`
**Rejects:** <what failure looks like>
## AC-2 — ...
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.
Self-check before returning
- Could a junior dev write a Playwright test from each AC without further questions? If no, rewrite.
- Does any AC pass on a feature that's visually broken? If yes, rewrite — that's the DOM-presence trap.
- Did you invent any color/token? If yes, flag for user approval before returning.
Read more
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.
Acceptance Criteria Writer
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.
What you must NOT produce
- Vague ACs: "the toggle works correctly", "the UI looks good", "users can switch themes"
- Implementation-coupled ACs: "the component uses `useState`", "the API returns JSON"
- ACs that pass when the feature is actually broken: "an element with `data-theme=dark` exists" (the screenshot can still be light)
What you must produce
Numbered ACs, each with:
- **Trigger** — exact user action or system event
- **Observable** — a measurement (computed style value, network response, DOM mutation, screenshot pixel) that proves the behaviour
- **Negative case** — what the AC *rejects*; what would make it fail
Required ACs for any UI wave
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
Visual vocabulary grounding
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:
- **Flag it as an open AC**: "App lacks a 'loading' visual state. Recommendation: ___. User must approve the new token before DR proceeds."
- Do *not* invent one silently.
Procedure
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> **Test pseudocode:** `<one line>` **Rejects:** <what failure looks like> ## AC-2 — ...
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.
Self-check before returning
- Could a junior dev write a Playwright test from each AC without further questions? If no, rewrite.
- Does any AC pass on a feature that's visually broken? If yes, rewrite — that's the DOM-presence trap.
- Did you invent any color/token? If yes, flag for user approval before returning.
Run Claude Code like an engineering org. Wave-based execution with dedicated sub-agents per phase, computed-style visual verification, no "tsc passes" lies.
Other skills on claude-wave-plugin.
- /design-reviewer
Use after AC and before RED for any wave that ships UI. Performs component API audit against installed dist files, produces per-route mockup, defines visual ACs, flags design-system gaps. Output written to .wave/dr.md.
Open skill - /green-impl
Use after RED is verified failing. Writes the minimum code to make RED tests pass, then verifies on a live stack with Playwright screenshots before any hand-off. Implements the verify-before-scan rule.
Open skill - /red-tests
Use after DR and before any production code is written. Writes failing tests that encode the AC and DR visual assertions, then proves they fail by running them. RED phase of TDD — strict, no exceptions.
Open skill - /teet-verify
Use only after the user has approved the GREEN screenshot. Performs True End-to-End Testing across backend, frontend, DB, and external services with computed-style and boundingBox assertions, producing the final wave evidence pack.
Open skill - /wave-orchestrator
Use when shipping a feature end-to-end. Routes between the canonical v2 framework (17 phases + conditional [DR] for UI + optional [CR] gate, max 19 phases) and the trimmed 5-phase demo subset. Invoked by /wave-start and /wave-start --demo. The orchestrator is the single throat
Open skill

