crap-analyzer
Use 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.…
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
$ npx -y skills add swingerman/disciplined-agentic-engineering --skill atdd --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/atddContext preview
The summary Claude sees to decide when to auto-load this skill.
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
name: atdd description: >- 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".
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 `;=== .txt` format?** Run the converter: > `dae_gherkin_convert.py specs/feature.txt features/NNN-slug/spec.md`. > The `.txt` format is deprecated; new specs are Gherkin `spec.md`.
**Format rules:**
**The 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 user
**Present 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:
1. **Parser** — `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:
2. **Generator** — reads `.build/spec.json`, produces executable test files for the project's framework (pytest, Jest, JUnit, Go testing, RSpec, etc.) 3. **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:
# parse spec.md → IR → generate tests → run tests ./run-acceptance-tests.sh
Run 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:
1. Write a failing unit test for the smallest piece of the feature 2. Write minimal code to make it pass 3. Refactor 4. Repeat until the acceptance tests pass
**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
A methodology kit for engineering-led AI development — spec-driven, test-driven, charter-bound. ATDD + mutation testing + deterministic guardrails. AI agents do the typing. Engineers stay in charge of architecture, behavior contracts, and verification.
Repo: swingerman/disciplined-agentic-engineering
Use 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.…
Use to check a feature's code against the charter's architecture rules — dependency layering, cycles, forbidden patterns, file naming, file size. Triggers —…
Use when a single DAE artifact has ambiguities to resolve. Triggers — "/engineer.clarify", "clarify this spec", "resolve ambiguities", "this is vague — tighten…
Use to validate DAE artifacts for schema correctness and cross-artifact consistency. Triggers — "/engineer.consistency-check", "check consistency", "validate…
Use when a Ready feature needs its acceptance criteria discovered before specs are written. Triggers — "/engineer.discover-acs",…
Use when exploring a feature idea before committing, or revisiting a parked one. Triggers — "/engineer.discuss", "/engineer.discuss <slug>", "I have an idea…