swingerman/engineer/atdd
Claude Code and agent skill by swingerman/engineer
- community
Checking that the SKILL.md file is still in the repository.
Use to drive feature work through the Acceptance Test Driven Development workflow — Given/When/Then specs before code, a project-specific test pipeline, and two parallel test streams (acceptance + unit). Triggers — "/atdd", "build a feature", "implement a feature", "add functionality", "start development", "write acceptance tests", "write specs", "use ATDD", "use TDD with acceptance tests".
Install
npx vskill@latest install swingerman/engineer/atddSKILL.md
Acceptance Test Driven Development
Enforce the ATDD workflow for feature development. This methodology is adapted from Robert C. Martin's acceptance test approach.
Core Principle
"The two different streams of tests cause Claude to think much moredeeply about the structure of the code."— Robert C. Martin
Two test streams constrain development:
- Acceptance tests define WHAT the system does (external observables)
- Unit tests define HOW the system does it (internal structure)
Both must pass. Neither alone is sufficient.
Workflow
Follow these steps strictly, in order. Do not skip steps.
Before Step 1, create one TodoWrite todo per step of this workflow (Steps 1–7), all at once — the full list up front, as a roadmap. Flip each todo to in_progress / completed as you go. See ${CLAUDE_PLUGIN_ROOT}/references/progress-indicator.md.
Step 1: Understand the Feature
Before writing anything, understand what is being built:
- Ask clarifying questions about the feature's purpose
- Identify the domain language (what terms do users/stakeholders use?)
- Determine success criteria: what observable behavior proves it works?
- Scope it: "just enough specs for this sprint" — do not design the whole system
Step 2: Write GWT Acceptance Specs
Write the feature's spec.md in standard Gherkin (DAE Foundation §7):
spec.md is markdown — prose and headings around the Gherkin are fine; the parser ignores non-Gherkin lines.
Migrating from the legacy `;=== .txt` format? Run the converter:dae_gherkin_convert.py specs/feature.txt features/NNN-slug/spec.md.The.txtformat is deprecated; new specs are Gherkinspec.md.
Format rules:
Scenario:names one behavior;Scenario Outline:+Examples:for varying dataGivensets preconditions;Whenthe action (one per scenario, ideally);Thenthe observable outcomeAndcontinues the previous keyword- Use natural domain language, never implementation language
The spec-leakage rule — CRITICAL:
Specs must describe external observables only. Never reference:
- Class names, function names, method names
- Database tables, columns, queries
- API endpoints, HTTP methods, status codes
- Framework-specific terms (controllers, services, repositories)
- Internal state, variables, data structures
- File paths or module names
Present specs to the user for approval before proceeding. Specs are co-authored, but the human has final approval — ferociously defended.
Step 3: Generate the Test Pipeline
The pipeline's front end is portable and shipped — you don't generate it:
- Parser —
dae_gherkin.pyparsesspec.md→.build/spec.json, the
fixed JSON IR (see the engineer plugin's references/spec-ir.md).
Invoke the pipeline-builder agent to generate the project-specific half:
- Generator — reads
.build/spec.json, produces executable test files
for the project's framework (pytest, Jest, JUnit, Go testing, RSpec, etc.)
- Step handlers — bind each step's exact text to system internals.
The generator must have deep knowledge of the system internals. This is NOT Cucumber — it produces complete, runnable tests that call into the system, not stubs requiring manual fixtures.
pipeline-builder also generates a runner so the user can run:
Step 4: Run Acceptance Tests (Red)
Run the generated acceptance tests. They should fail — this confirms the specs describe behavior that doesn't exist yet.
If they pass, either:
- The behavior already exists (specs are redundant — revise or remove)
- The generator is not testing the right thing (fix the pipeline)
Step 5: Implement with TDD
Now implement the feature using standard TDD:
- Write a failing unit test for the smallest piece of the feature
- Write minimal code to make it pass
- Refactor
- Repeat until the acceptance tests pass. The loop is capped: at most 2 × the
acceptance tests failing at the start, and stop early if a few rounds in a row turn no test green (manifest.autonomy.stuck_loop_threshold, default 3). Either stop means surface the still-red tests rather than keep going.
Faster iteration with impact analysis: if the project has acceptance.impact_analysis: on, the runner's impact-run mode (dae_impact.py select) runs only the scenarios your change affects — use it for the tight TDD loop. The full acceptance run still gates Step 5's completion: do not mark the feature done until every scenario passes a full run.
Both streams must pass:
- Unit tests verify internal correctness
- Acceptance tests verify external behavior matches specs
Step 6: Review Specs for Leakage
After implementation, invoke the spec-guardian agent to review all spec files for implementation details that may have crept in during development.
If leakage is found, clean the specs back to domain language.
Step 7: Iterate
Return to Step 1 for the next feature. Each iteration adds specs only for the current feature — never design the whole system upfront.
Rules
These rules govern how spec files and the pipeline are handled. They are non-negotiable.
Spec file discipline
- Never modify a `spec.md` without explicit user permission.
Specs are the user's contract. Always ask before changing them.
- If a step is ambiguous, report the ambiguity rather than guessing.
Let the user clarify.
Pipeline discipline
- Never modify generated test files in
.build/generated/.
Only delete and regenerate them by re-running the pipeline from spec.md.
- `.build/` is gitignored — the IR and generated tests are artifacts.
The project-specific generator and step handlers ARE committed source.
- Before running the pipeline, check modification dates: if
spec.md
is newer than .build/spec.json or the generated tests, re-parse and regenerate before running.
- Clear state before each test. Generated tests must reset all
application state before each scenario execution to ensure isolation.
Failure handling
- On test failure, **report the source
spec.mdand the failing
scenario name**. Traceability back to the spec is critical.
- If a scenario cannot be translated into a test, **still generate it as a
failing test** that documents the desired behavior. Report to the user which scenario and why it could not be fully translated.
- Mock non-deterministic behavior (random numbers, timestamps, etc.) in
generated tests to ensure reproducibility.
Before pushing
- Before a git push, **ask the user whether acceptance tests should be
run**. Do not push without confirming both test streams pass.
Anti-Patterns to Watch For
"Let me just write the code first"
No. Specs first, always. The spec-before-code hook will warn about this.
"The specs are too high-level to test"
Then the specs need to be more specific. Break the feature into smaller observable behaviors. Each spec should describe one concrete scenario.
"Let me add implementation details so the generator is easier to write"
This is the perverse incentive. Fight it. The generator should be smart enough to map domain language to system internals. If it can't, improve the generator — don't pollute the specs.
"We only need acceptance tests, unit tests are redundant"
No. Two streams constrain development differently. Acceptance tests alone leave internal structure unchecked. Unit tests alone miss integration.
File Organization
DAE stores specs and pipeline artifacts per feature folder:
What to commit vs. gitignore
Commit these (source of truth):
features/NNN-slug/spec.md— the acceptance specsacceptance/generator.*— the project-specific generatoracceptance/handlers.*— the step handlersrun-acceptance-tests.sh— the pipeline runner script
Gitignore these (regenerated from `spec.md`):
features/*/.build/— the IR and generated tests
Add to the project's .gitignore:
The parser (dae_gherkin.py) is portable and shipped with the plugin — it is not part of the project's committed source.
Project CLAUDE.md integration
After setting up the pipeline, add an Acceptance Tests section to the project's CLAUDE.md (or create one if it doesn't exist). This ensures Claude Code understands the ATDD setup in every session:
spec.md → dae_gherkin.py → .build/spec.json (IR) → generator → tests
Adapt the commands and paths to match the project's language and test framework. The pipeline-builder agent generates this CLAUDE.md section automatically when creating the pipeline.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/atdd/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/swingerman/engineer/atdd)