TDD Workflow
hellangleZ/burn-in-cceverywhere-ralph
A skill your agent uses when writing new features, fixing bugs, or refactoring code.
A skill your agent uses 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…
$ npx skills add swingerman/engineer --skill atdd -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install swingerman/engineer atdd --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/swingerman/engineer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/atdd .claude/skills/atdd && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "atdd" agent skill from https://github.com/swingerman/engineer/tree/master/skills/atdd into .claude/skills/atdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atdd", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/swingerman/engineer/tree/master/skills/atddType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add swingerman/engineer --skill atdd -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install swingerman/engineer atdd --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swingerman/engineer.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/atdd .agents/skills/atdd && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "atdd" agent skill from https://github.com/swingerman/engineer/tree/master/skills/atdd into .agents/skills/atdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atdd", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add swingerman/engineer --skill atdd -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install swingerman/engineer atdd --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swingerman/engineer.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/atdd .cursor/skills/atdd && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "atdd" agent skill from https://github.com/swingerman/engineer/tree/master/skills/atdd into .cursor/skills/atdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atdd", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/swingerman/engineer.git --path skills/atdd--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add swingerman/engineer --skill atdd -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install swingerman/engineer atdd --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swingerman/engineer.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/atdd .gemini/skills/atdd && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "atdd" agent skill from https://github.com/swingerman/engineer/tree/master/skills/atdd into .gemini/skills/atdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atdd", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install swingerman/engineer atddInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add swingerman/engineer --skill atdd -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/swingerman/engineer.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/atdd .github/skills/atdd && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "atdd" agent skill from https://github.com/swingerman/engineer/tree/master/skills/atdd into .github/skills/atdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atdd", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add swingerman/engineer --skill atdd -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install swingerman/engineer atdd --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swingerman/engineer.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/atdd .opencode/skills/atdd && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "atdd" agent skill from https://github.com/swingerman/engineer/tree/master/skills/atdd into .opencode/skills/atdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atdd", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
atddA skill your agent uses 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…
Atdd is an agent skill from swingerman/engineer. 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".
Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering End-to-end testing and Test-driven development. The repository describes itself as: Disciplined Agentic Engineering — a methodology kit for Claude Code: acceptance-test-first specs, explicit checkpoints, and autonomy you can actually leave running. The engineer… The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 32947eb. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are gherkin and markdown).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Atdd loads about 2.8k tokens when it runs. Until then it costs about 100 tokens; SKILL.md has 1,149 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from swingerman/engineer at commit 32947eb, republished under its MIT licence (© swingerman). 1,149 words, ~2,750 tokens.
.claude/skills/atdd/SKILL.md (or your agent's skills folder).Enforce the ATDD workflow for feature development. This methodology is adapted from Robert C. Martin's acceptance test approach.
"The two different streams of tests cause Claude to think much more deeply about the structure of the code." — Robert C. Martin
Two test streams constrain development:
Both must pass. Neither alone is sufficient.
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.
Before writing anything, understand what is being built:
Write the feature's spec.md in standard Gherkin (DAE Foundation §7):
Feature: <feature name>
Scenario: <behavior being specified>
Given <precondition in domain language>
And <another precondition if needed>
When <the action the user/system takes>
Then <observable outcome>
And <another observable outcome if needed>
Scenario Outline: <a behavior with varying data>
Given <a step with a <parameter>>
...
Examples:
| parameter | expected |
| value | result |spec.md is markdown — prose and headings around the Gherkin are fine;
the parser ignores non-Gherkin lines.
Migrating from the legacy
;=== .txtformat? 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 dataGiven sets preconditions; When the action (one per scenario, ideally); Then the observable outcomeAnd continues the previous keywordThe spec-leakage rule — CRITICAL:
Specs must describe external observables only. Never reference:
BAD: Given the UserService has an empty userRepository
GOOD: Given there are no registered users
BAD: When a POST request is sent to /api/users
GOOD: When a new user registers with email "bob@example.com"
BAD: Then the database contains 1 row in the users table
GOOD: Then there is 1 registered userPresent specs to the user for approval before proceeding. Specs are co-authored, but the human has final approval — ferociously defended.
The pipeline's front end is portable and shipped — you don't generate it:
dae_gherkin.py parses spec.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:
.build/spec.json, produces executable test files
for the project's framework (pytest, Jest, JUnit, Go testing, RSpec, etc.)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:
# parse spec.md → IR → generate tests → run tests
./run-acceptance-tests.shRun the generated acceptance tests. They should fail — this confirms the specs describe behavior that doesn't exist yet.
If they pass, either:
Now implement the feature using standard TDD:
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:
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.
Return to Step 1 for the next feature. Each iteration adds specs only for the current feature — never design the whole system upfront.
These rules govern how spec files and the pipeline are handled. They are non-negotiable.
spec.md without explicit user permission.
Specs are the user's contract. Always ask before changing them..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.spec.md
is newer than .build/spec.json or the generated tests, re-parse and
regenerate before running.spec.md and the failing
scenario name. Traceability back to the spec is critical.No. Specs first, always. The spec-before-code hook will warn about this.
Then the specs need to be more specific. Break the feature into smaller observable behaviors. Each spec should describe one concrete scenario.
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.
No. Two streams constrain development differently. Acceptance tests alone leave internal structure unchecked. Unit tests alone miss integration.
DAE stores specs and pipeline artifacts per feature folder:
project-root/
├── features/
│ └── NNN-slug/
│ ├── spec.md # acceptance specs (standard Gherkin) — committed
│ └── .build/ # GITIGNORED (regenerated)
│ ├── spec.json # — the IR (from dae_gherkin.py)
│ └── generated/ # — the generated acceptance tests
├── acceptance/ # project-specific pipeline — committed
│ ├── generator.* # — emits tests from the IR
│ └── handlers.* # — step handlers bound to system internals
└── run-acceptance-tests.sh # pipeline runner — committedCommit 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 scriptGitignore these (regenerated from spec.md):
features/*/.build/ — the IR and generated testsAdd to the project's .gitignore:
.build/The parser (dae_gherkin.py) is portable and shipped with the plugin —
it is not part of the project's committed source.
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:
## Acceptance Tests
Acceptance specs are `spec.md` files (standard Gherkin) under
`features/NNN-slug/`.
### Pipeline
spec.md → dae_gherkin.py → .build/spec.json (IR) → generator → tests
1. **Parse:** `dae_gherkin.py` — `spec.md` → `.build/spec.json` (portable, shipped)
2. **Generate:** [generate command] — reads the IR, produces tests in `.build/generated/`
3. **Run:** [test command] — executes the generated tests
Full pipeline: `./run-acceptance-tests.sh`
### Rules
- Never modify a `spec.md` without explicit permission.
- Never modify generated tests — only delete and regenerate via the pipeline.
- `.build/` is gitignored — do not commit the IR or generated tests.
- Before a push, run the full acceptance test pipeline.
- On failure, report the `spec.md` and the failing scenario name.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.
© swingerman, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/atdd of swingerman/engineer.
Open the folder on GitHubat commit 32947eb
Atdd next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Atdd this skillswingerman/engineer | 154 | — | ~2.8k | Automated safety check: Pass | MIT | |
| TDD WorkflowhellangleZ/burn-in-cceverywhere-ralph | 112 | 11 repos | ~2.4k | Automated safety check: Pass | None | |
| Bmad Testarch Atddbmad-code-org/bmad-method-test-architecture-enterprise | 104 | 3 repos | ~893 | Automated safety check: Pass | Custom licence | |
| Agentic TDDreticlehq/reticle | 1.2k | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Openspec Plus TDDelastic/terraform-provider-elasticstack | 210 | 1 repos | ~4.7k | Automated safety check: Pass | Apache-2.0 | |
| Bmad Tea Testarch Atddchenjackle45/SayIt | 114 | 1 repos | ~225 | Automated safety check: Pass | MIT |
hellangleZ/burn-in-cceverywhere-ralph
A skill your agent uses when writing new features, fixing bugs, or refactoring code.
bmad-code-org/bmad-method-test-architecture-enterprise
Generate red-phase acceptance test scaffolds using the TDD cycle.
reticlehq/reticle
Applies red-green TDD to behavior unit tests cannot reach, by stating the expected outcome against the running app with Reticle before writing the feature.
elastic/terraform-provider-elasticstack
MANDATORY skill that activates whenever code is written to implement an OpenSpec change task.
chenjackle45/SayIt
Generate failing acceptance tests using TDD cycle. An agent skill from chenjackle45/SayIt.
affaan-m/ECC
新機能の作成、バグ修正、コードのリファクタリング時にこのスキルを使用します。ユニット、統合、E2Eテストを含む80%以上のカバレッジでテスト駆動開発を強制します。
swingerman/engineer
A skill your agent uses to produce a risk-based refactor + test plan for recently-changed code on a diff/branch/PR by computing CRAP (complexity × untested) on changed methods.
swingerman/engineer
A skill your agent uses to add a third validation layer to the ATDD workflow — after acceptance tests verify WHAT and unit tests verify HOW, mutation testing verifies the tests actually catch bugs.
swingerman/engineer
A skill your agent uses to drive a bug fix from first report through close, with a "why didn't we catch it?" loop at the end.
swingerman/engineer
Use after a feature passes Light Verify (CP7), to prove the tests actually catch bugs and, where the code warrants it, to formally check its invariants — Checkpoint 8.
swingerman/engineer
Use at the start of a work session, or any time the question is "what should I pick up now" across the whole project.
swingerman/engineer
Use immediately after a PR is merged to clean up the local feature branch and resync main.
Categories
A skill your agent uses 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…. Atdd is an agent skill from swingerman/engineer. 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).
Atdd fits situations like: drive feature work through the Acceptance Test Driven Development workflow — Given/When/Then specs before code; A project-specific test pipeline; two parallel test streams (acceptance + unit); build a feature.
Run `npx skills add swingerman/engineer --skill atdd -a claude-code`. Or copy the skill folder (skills/atdd in swingerman/engineer) into .claude/skills/atdd in your project. Claude Code loads it when a task matches its description.
Run `npx skills add swingerman/engineer --skill atdd -a codex`. Or copy the skill folder (skills/atdd in swingerman/engineer) into .agents/skills/atdd in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add swingerman/engineer --skill atdd -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/atdd, .gemini/skills/atdd, .github/skills/atdd and .opencode/skills/atdd in your project.
SKILL.md names no scripts, command-line tools or credentials: Atdd is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Atdd is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Atdd: TDD Workflow (hellangleZ/burn-in-cceverywhere-ralph, 112 stars), Bmad Testarch Atdd (bmad-code-org/bmad-method-test-architecture-enterprise, 104 stars), Agentic TDD (reticlehq/reticle, 1.2k stars) and Openspec Plus TDD (elastic/terraform-provider-elasticstack, 210 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
swingerman (a GitHub user) maintains it in swingerman/engineer, which has 154 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on September 23, 2026.
Source: swingerman/engineer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.