From ring-default
Enforces the RED-GREEN-REFACTOR loop: write a failing test, see it fail, then minimal code to pass, then refactor. Use when starting new features or bugfixes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ring-default:test-driven-developmentThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
- Starting implementation of new feature
Write the test first. Watch it fail. Write minimal code to pass.
Core principle: If you didn't watch the test fail, you don't know if it tests the right thing.
NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
Write one minimal test showing what should happen. Name describes behavior. Tests real code (not mocks unless unavoidable).
Time limit: <5 minutes. Complex setup = design too complex.
# Run test — MANDATORY. Never skip.
npm test path/to/test.test.ts # or go test ./... | pytest
Paste the actual failure output. No output = violation.
| Test Type | Expected Failure |
|---|---|
| New feature | NameError: function not defined or AttributeError |
| Bug fix | Actual wrong output/behavior |
Test passes immediately? You're testing existing behavior — fix the test.
Write simplest code to pass the test. Nothing more. No extra features, no refactoring unrelated code.
Run test → confirm passes → confirm other tests still pass.
After green only. Remove duplication, improve names. Keep tests green. Don't add behavior.
Next failing test for next feature.
Only one action: DELETE IT. Immediately.
rm <files> # remove new files
git restore --staged --worktree <files> # discard changes to tracked files
# Destructive operations (e.g., git reset --hard) require user confirmation.
Delete means gone forever. These are NOT deleting: git stash, mv to .bak, commenting out, keeping as "reference."
No asking permission. No alternatives. No exceptions.
Then start over with TDD.
| Quality | Good | Bad |
|---|---|---|
| Minimal | One thing ("and" in name = split) | test('validates email and domain and whitespace') |
| Clear | Describes behavior | test('test1') |
| Fails correctly | Expected failure matches missing feature | Test errors out from typo |
Before marking work complete:
| Problem | Solution |
|---|---|
| Don't know how to test | Write wished-for API first, then assertion |
| Test too complicated | Design too complicated — simplify interface |
| Must mock everything | Code too coupled — use dependency injection |
| Test setup huge | Extract helpers; still complex = simplify design |
Write failing test reproducing the bug. Follow TDD cycle. Never fix bugs without a test.
Bug: empty email accepted RED: `test('rejects empty email')` → FAIL: `expected 'Email required', got undefined` GREEN: `if (!data.email?.trim()) return { error: 'Email required' }` VERIFY: PASSnpx claudepluginhub p/lerianstudio-ring-default-defaultEnforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Enforces TDD (Red-Green-Refactor) for every feature, bugfix, or refactor. Write failing tests first, never production code without a failing test.
Enforces strict Test-Driven Development (TDD): write failing test first for features, bug fixes, refactors before any production code.