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.From its SKILL.md
npx -y skills add Harshvardhan86/claude-wave-plugin --skill ac-writerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
3.5 KB, as published. Nobody here has run it
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=darkexists" (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":
- Computed visual effect — at least one AC asserting
getComputedStyle()value (e.g.,bodybackground colour after toggle =rgb(...)) - Bounding box — element that should be visible has
boundingBox.width > 0 && height > 0 - Persistence (if applicable) — refresh the page; state survives via the documented mechanism (localStorage / cookie / server)
- Keyboard accessibility — feature is reachable and operable via keyboard alone
- 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
- Read the feature description.
- If a project memory or
CLAUDE.mdexists, scan for project-specific AC conventions (e.g., the project may demand WCAG AA contrast). - Draft 5–10 ACs. Fewer is suspicious; more is over-spec.
- For each AC, write its observable as a one-line pseudocode test (e.g.
expect(getComputedStyle(body).backgroundColor).toBe('rgb(17, 17, 17)')). - Write to
.wave/ac.mdwith 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 — ...
- 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.