TDD Skill
General-purpose Test-Driven Development workflow for product code.
Rule
For implementation work, TDD is the default.
- Do not start with production code changes.
- Start with a test plan, then failing tests (
RED), then minimum code (GREEN), then cleanup (REFACTOR).
- Only skip TDD when the user explicitly says tests are out of scope.
TDD Config Bootstrap (MANDATORY)
Persist TDD preference in the same tracking config hierarchy used by create/plan/run:
.agent/tracking.config.json
${ICA_HOME}/tracking.config.json
$HOME/.codex/tracking.config.json or $HOME/.claude/tracking.config.json
Behavior:
- If project config is missing, ask explicitly:
- "Use system tracking config for this project, or create a project-specific backend config?"
- On first TDD invocation, if selected config file does not exist, create it.
- If
tdd.enabled is missing, ask explicitly and persist:
- "TDD is active. Set default TDD behavior to enabled for this scope/config? (yes/no)"
- Write/update:
{
"tdd": { "enabled": true }
}
- Scope-level decision always takes precedence over stored default for current run.
- If user asks to change default later, update
tdd.enabled in the selected config file and confirm.
When to Use
- User asks for TDD, test-first, or red-green-refactor
- Implementing a new feature with clear behavior
- Fixing a bug and preventing regression
- Refactoring code while preserving behavior
- Working in unfamiliar code where tests reduce risk
When Not to Use
- One-off prototypes where tests are explicitly out of scope
- Tasks with no practical automated verification path
- Purely cosmetic edits where behavior does not change
Core Loop: Red -> Green -> Refactor
Define a single behavior slice
- Capture one user-visible outcome at a time.
- Prefer smallest meaningful increment.
Write a failing test first (RED)
- Add or update one focused test.
- Run the narrowest command that executes the test.
- Confirm it fails for the expected reason.
Implement the minimum code to pass (GREEN)
- Change only what is needed to satisfy the test.
- Avoid speculative abstractions.
- Re-run the focused test, then nearby tests.
Improve design without changing behavior (REFACTOR)
- Remove duplication and improve naming/structure.
- Keep tests green after each small refactor step.
Repeat
- Add the next failing test for the next behavior slice.
- Continue until acceptance criteria are covered.
Acceptance Tests (for this skill)
| Test ID |
Type |
Prompt / Condition |
Expected Result |
| T1 |
Positive trigger |
"Implement this in TDD" |
skill triggers |
| T2 |
Positive trigger |
"Write tests first, then code" |
skill triggers |
| T3 |
Positive trigger |
"Red green refactor this bug fix" |
skill triggers |
| T4 |
Negative trigger |
"Polish this dashboard layout" |
skill does not trigger |
| T5 |
Negative trigger |
"Draft release notes only" |
skill does not trigger |
| T6 |
Behavior |
skill triggered for code change |
requires test plan + RED evidence before implementation |
| T7 |
Behavior |
bug fix workflow |
regression test added first, initially failing |
| T8 |
Behavior |
completion |
reports failing-to-passing evidence and final suite result |
Test Planning Pattern (implementation work)
Before coding, define lightweight acceptance checks:
| Test ID |
Type |
Scenario |
Expected Result |
| T1 |
Happy path |
valid input |
expected output returned |
| T2 |
Edge case |
boundary input |
stable, correct behavior |
| T3 |
Error path |
invalid input |
safe, explicit failure |
| T4 |
Regression |
previously broken flow |
bug stays fixed |
Practical Rules
- Start with behavior, not internal implementation details.
- Use deterministic tests (no flaky timing/network dependencies).
- Keep tests readable (Arrange -> Act -> Assert).
- For bug fixes, write the regression test before the code fix.
- For legacy code, write characterization tests first, then refactor.
- Run full relevant test suite before finishing.
- Record the command/output proving the first failing test run.
- Record the command/output proving the final passing run.
Validation Checklist
Output Contract
When this skill is used, produce:
- Test plan (happy path, edge, error, regression)
- Evidence of initial failing test(s)
- Code change summary tied to passing tests
- Final test results and residual risks (if any)
1---2name: tdd3description: Activate when user asks for Test-Driven Development, test-first implementation, red-green-refactor, or enforcing tests before code. Use for feature work, bug fixes, and refactors; treat TDD as the default rule unless the user explicitly waives it.4---56# TDD Skill78General-purpose Test-Driven Development workflow for product code.910## Rule1112For implementation work, TDD is the default.13- Do not start with production code changes.14- Start with a test plan, then failing tests (`RED`), then minimum code (`GREEN`), then cleanup (`REFACTOR`).15- Only skip TDD when the user explicitly says tests are out of scope.1617## TDD Config Bootstrap (MANDATORY)1819Persist TDD preference in the same tracking config hierarchy used by create/plan/run:201. `.agent/tracking.config.json`212. `${ICA_HOME}/tracking.config.json`223. `$HOME/.codex/tracking.config.json` or `$HOME/.claude/tracking.config.json`2324Behavior:25- If project config is missing, ask explicitly:26 - "Use system tracking config for this project, or create a project-specific backend config?"27- On first TDD invocation, if selected config file does not exist, create it.28- If `tdd.enabled` is missing, ask explicitly and persist:29 - "TDD is active. Set default TDD behavior to enabled for this scope/config? (yes/no)"30- Write/update:31```json32{33 "tdd": { "enabled": true }34}35```36- Scope-level decision always takes precedence over stored default for current run.37- If user asks to change default later, update `tdd.enabled` in the selected config file and confirm.3839## When to Use4041- User asks for TDD, test-first, or red-green-refactor42- Implementing a new feature with clear behavior43- Fixing a bug and preventing regression44- Refactoring code while preserving behavior45- Working in unfamiliar code where tests reduce risk4647## When Not to Use4849- One-off prototypes where tests are explicitly out of scope50- Tasks with no practical automated verification path51- Purely cosmetic edits where behavior does not change5253## Core Loop: Red -> Green -> Refactor54551. **Define a single behavior slice**56 - Capture one user-visible outcome at a time.57 - Prefer smallest meaningful increment.58592. **Write a failing test first (`RED`)**60 - Add or update one focused test.61 - Run the narrowest command that executes the test.62 - Confirm it fails for the expected reason.63643. **Implement the minimum code to pass (`GREEN`)**65 - Change only what is needed to satisfy the test.66 - Avoid speculative abstractions.67 - Re-run the focused test, then nearby tests.68694. **Improve design without changing behavior (`REFACTOR`)**70 - Remove duplication and improve naming/structure.71 - Keep tests green after each small refactor step.72735. **Repeat**74 - Add the next failing test for the next behavior slice.75 - Continue until acceptance criteria are covered.7677## Acceptance Tests (for this skill)7879| Test ID | Type | Prompt / Condition | Expected Result |80| --- | --- | --- | --- |81| T1 | Positive trigger | "Implement this in TDD" | skill triggers |82| T2 | Positive trigger | "Write tests first, then code" | skill triggers |83| T3 | Positive trigger | "Red green refactor this bug fix" | skill triggers |84| T4 | Negative trigger | "Polish this dashboard layout" | skill does not trigger |85| T5 | Negative trigger | "Draft release notes only" | skill does not trigger |86| T6 | Behavior | skill triggered for code change | requires test plan + RED evidence before implementation |87| T7 | Behavior | bug fix workflow | regression test added first, initially failing |88| T8 | Behavior | completion | reports failing-to-passing evidence and final suite result |8990## Test Planning Pattern (implementation work)9192Before coding, define lightweight acceptance checks:9394| Test ID | Type | Scenario | Expected Result |95| --- | --- | --- | --- |96| T1 | Happy path | valid input | expected output returned |97| T2 | Edge case | boundary input | stable, correct behavior |98| T3 | Error path | invalid input | safe, explicit failure |99| T4 | Regression | previously broken flow | bug stays fixed |100101## Practical Rules102103- Start with behavior, not internal implementation details.104- Use deterministic tests (no flaky timing/network dependencies).105- Keep tests readable (Arrange -> Act -> Assert).106- For bug fixes, write the regression test before the code fix.107- For legacy code, write characterization tests first, then refactor.108- Run full relevant test suite before finishing.109- Record the command/output proving the first failing test run.110- Record the command/output proving the final passing run.111112## Validation Checklist113114- [ ] Tests were written/updated before implementation changes115- [ ] First test run failed for expected reason116- [ ] Minimal implementation made tests pass117- [ ] Refactor preserved green test state118- [ ] New behavior and regression paths are covered119- [ ] Relevant suite passes end-to-end120121## Output Contract122123When this skill is used, produce:1241251. Test plan (happy path, edge, error, regression)1262. Evidence of initial failing test(s)1273. Code change summary tied to passing tests1284. Final test results and residual risks (if any)