tdd-red-green-refactor
Skill1 starsChanged 8 months agoMITView on GitHub
Test-driven development using Red-Green-Refactor for bug fixes, new features, and regression prevention. Writes a failing test first to prove a defect or define behavior, then implements minimal code to pass, then refactors. Use when fixing bugs, encountering failing behavior, adding new features, writing tests, or when the user mentions TDD, red-green-refactor, regression test, failing test, test first, or test-driven.
8 other projects use a version of this.
Adopted by
Most recently taken up by
- kinhluan/skillstheir own version, first seen Nov 8, 2026
- vijaysuperpositionist/skillstheir own version, first seen Nov 1, 2026
- The-Utopia-Studio/skillstheir own version, first seen Oct 13, 2026
- google-labs-code/jules-sdktheir own version, first seen Oct 8, 2026
- google-labs-code/stitch-sdktheir own version, first seen Oct 8, 2026
- google-labs-code/design.mdtheir own version, first seen Oct 8, 2026
Used with
Projects with it also use typed-service-contracts, web-design-guidelines and 1 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
google-labs-codeSkilltyped-service-contracts
Architecture standard for building robust, type-safe TypeScript services using the "Spec and Handler" pattern. Use when building CLIs, libraries, or complex business logic.
Also in 5 projects that use this
VercelSkillweb-design-guidelines
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
Also in 3 projects that use this
StrayDragonSkillui-ux-pro-max
UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 8 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.
Also in 3 projects that use this
Other versions8 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 8
- google-labs-code/design.md★ 29ksame name
- google-labs-code/stitch-sdk★ 1.8ksame name
- google-labs-code/jules-sdk★ 137same name
- jorgeasaurus/agent-skills★ 14same name
- kinhluan/skills★ 6same name
- The-Utopia-Studio/skills★ 6same name
- helmedeiros/clean-code-skills★ 2same name
- vijaysuperpositionist/skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository33 other files it gives its agents.
- argocdSkill
- c-cpp-compilersSkill
- coding-guidelinesSkill
- devops-iac-engineerSkill
- dag-flowdSkill
- flowd-rules-authorSkill
- frontend-designSkill
- ghSkill
- grafana-dashboardsSkill
- helmSkill
- kustomizeSkill
- legalizerSkill
- lua-projectsSkill
- markdown-documentationSkill
- mermaid-diagramsSkill
- meta-cognition-parallelSkill
- podmasterSkill
- practical-haskellSkill
- rcaSkill
- researcherSkill
- security-auditSkill
- solidity-securitySkill
- svg-genSkill
- tmux-masterySkill
- tokenomics-designSkill
- ultimate-dbSkill
- ultimate-nixosSkill
- ultimate-rustSkill
- ultimate-web3Skill
- web3-frontendSkill
- web3-testingSkill
- web3-whitepaperSkill
- ziglangSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
39 rules. 0 are common, 27 are distinctive, and 12 are very specific to this project.
0
Common
Most of the 8 edited versions we read keep these.
27
Distinctive
This author's own choices. Worth a look.
12
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 20
When fixing a bug: prove it exists with a failing test before touching production code.
- Distinctive: line 58
If you cannot write a test, that is a design signal: the code is not testable enough.
- Distinctive: line 60
Do not write multiple tests at once.
- Distinctive: line 64
When the bug's root cause is unclear:
- Distinctive: line 68
Write a test targeting the top hypothesis.
- Distinctive: line 77
Write the smallest, simplest code that makes the failing test pass.
- Distinctive: line 78
Do not add features, abstractions, or optimizations not required by the test.
- Distinctive: line 79
Do not anticipate future tests -- solve only the current one.
- Distinctive: line 80
Run all tests -- the new test passes and no existing tests broke.
- Distinctive: line 85
If an existing test breaks, your change introduced a regression.
- Distinctive: line 87
If you find yourself writing significant code, consider whether you skipped a smaller intermediate test.
- Distinctive: line 94
Only enter this phase when all tests are green.
- Distinctive: line 96
Look for duplication, unclear naming, or structural issues.
- Distinctive: line 98
Run tests after each change -- they must remain green.
- Distinctive: line 108
Never refactor while RED. Get to GREEN first.
- Distinctive: line 109
If a refactoring breaks a test, undo and take a smaller step.
- Distinctive: line 110
Do not add new behavior during refactoring.
- Distinctive: line 132
Add the failing test that demonstrates the defect
- Distinctive: line 167
Test mocks internal collaborators
- Distinctive: line 168
Test accesses private methods or fields
- Distinctive: line 169
Test verifies internal state (e.g., querying a database directly instead of using the public interface)
- Distinctive: line 171
Test breaks when you rename an internal function
- Distinctive: line 195
Use this mental checklist for each RED-GREEN-REFACTOR cycle:
- Very specific: line 214
Use #[test] and #[should_panic] for unit tests
- Very specific: line 215
Place integration tests in tests/ directory
- Very specific: line 216
Use cargo test to run; cargo test -- --nocapture for stdout
- Very specific: line 217
Consider #[cfg(test)] mod tests for test modules alongside source
- Very specific: line 218
Use assert_eq!, assert_ne!, assert!
- Very specific: line 223
Use _test.go file suffix and func TestXxx(t *testing.T) signature
- Very specific: line 225
Use t.Errorf / t.Fatalf for assertions
- Very specific: line 227
Use t.Run for subtests
- Distinctive: line 231
Use test frameworks like vitest, jest, or node:test
- Distinctive: line 232
Run with the appropriate test runner command
- Very specific: line 233
Use describe/it/expect pattern
- Very specific: line 238
Use Foundry's forge test with function test_* naming
- Very specific: line 239
Use assertEq, assertTrue, vm.expectRevert for assertions
- Very specific: line 241
Use setUp() for test fixtures
- Distinctive: line 248
If writing a test is difficult or the environment lacks test infrastructure:
- Distinctive: line 250
Write a test that fails with an explicit message explaining the bug and why testing is hard.
“Common” is measured: kept by at least 6 in 10 of the 8 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Test-Driven Development: Red-Green-Refactor
Core Principle
Tests verify behavior through public interfaces, not implementation details. A test that breaks when you refactor internals -- but behavior is unchanged -- is testing implementation, not behavior. Good tests survive refactors.
When fixing a bug: prove it exists with a failing test before touching production code. The test is evidence. The fix is the response to that evidence.
Workflow Overview
RED -> Write a test that fails (proves the bug or defines missing behavior)
GREEN -> Write the minimum code to make the test pass
REFACTOR -> Improve structure, naming, duplication -- tests stay greenOne cycle per behavior. Vertical slices, not horizontal.
Phase 1: RED -- Establish Failure
For Bug Fixes
- Reproduce the bug -- identify the exact input, state, or sequence that triggers the defect.
- Write a test that exercises the buggy code path with the offending input.
- Assert the correct (expected) behavior, not the current broken output.
- Run the test -- it must fail. If it passes, your test is not capturing the bug. Rethink your assertion or test setup.
- Name the test descriptively -- include the bug/ticket reference if one
exists (e.g.,
test_bug_1234_negative_balance_rejected).
For New Features
- Define one behavior the feature should exhibit.
- Write a test for that single behavior using the public API/interface.
- Run the test -- confirm it fails (the feature does not exist yet).
RED Phase Rules
- The test must fail for the right reason (missing behavior, not a compile error or import failure).
- If you cannot write a test, that is a design signal: the code is not testable enough. Address testability first.
- Do not write multiple tests at once. One test, one behavior.
Hypothesis-Driven Bug Investigation
When the bug's root cause is unclear:
- Brainstorm multiple hypotheses about what causes the defect.
- Prioritize by likelihood and cost to falsify.
- Write a test targeting the top hypothesis.
- Timebox investigation -- if a hypothesis does not pan out within the timebox, move to the next one.
- A test that passes unexpectedly is useful data: it eliminates a hypothesis.
Phase 2: GREEN -- Minimal Implementation
- Write the smallest, simplest code that makes the failing test pass.
- Do not add features, abstractions, or optimizations not required by the test.
- Do not anticipate future tests -- solve only the current one.
- Run all tests -- the new test passes and no existing tests broke.
GREEN Phase Rules
- Minimal is enough: ugly code is fine at this stage. Correctness over elegance.
- If an existing test breaks, your change introduced a regression. Fix it before proceeding.
- If you find yourself writing significant code, consider whether you skipped a smaller intermediate test.
Phase 3: REFACTOR -- Improve Structure
Only enter this phase when all tests are green.
- Look for duplication, unclear naming, or structural issues.
- Apply one refactoring at a time.
- Run tests after each change -- they must remain green.
- Common refactorings at this stage:
- Extract shared logic into functions/methods
- Rename for clarity
- Simplify conditionals
- Move code to more appropriate modules
- Deepen modules (smaller public interface, richer implementation)
REFACTOR Phase Rules
- Never refactor while RED. Get to GREEN first.
- If a refactoring breaks a test, undo and take a smaller step.
- Do not add new behavior during refactoring. That is a new RED phase.
- Refactoring is optional per cycle -- skip if the code is clean enough.
Bug Fix Workflow (Detailed)
This is the primary use case. When encountering a bug:
1. UNDERSTAND -> Reproduce and isolate the defect
2. RED -> Write a test asserting correct behavior (test fails)
3. GREEN -> Fix the bug with minimal code (test passes)
4. REFACTOR -> Clean up if needed (tests stay green)
5. VERIFY -> Run full test suite; confirm no regressionsSeparation of Concerns in PRs
For team workflows, consider splitting into two commits or PRs:
Commit/PR 1 -- Expose the bug:
- Add the failing test that demonstrates the defect
- Assert the correct expected behavior (test will fail)
- This proves the bug is real and reproducible
Commit/PR 2 -- Fix the bug:
- Change production code to fix the defect
- The previously failing test now passes
- This proves the fix addresses the exact bug
This separation provides auditable evidence that the test actually catches the defect, not that it was written after-the-fact to rubberstamp a fix.
Anti-Patterns
Horizontal Slicing (write all tests, then all code)
Tests written in bulk test imagined behavior. You end up testing shapes and signatures instead of actual behavior. Tests become insensitive to real changes.
WRONG:
RED: test1, test2, test3, test4, test5
GREEN: impl1, impl2, impl3, impl4, impl5
RIGHT:
RED->GREEN: test1 -> impl1
RED->GREEN: test2 -> impl2
RED->GREEN: test3 -> impl3Testing Implementation Instead of Behavior
Bad signals:
- Test mocks internal collaborators
- Test accesses private methods or fields
- Test verifies internal state (e.g., querying a database directly instead of using the public interface)
- Test breaks when you rename an internal function
Skipping RED
Writing tests after the implementation ("test-after") does not provide the design feedback that TDD gives. If the test never failed, you have no proof it can catch regressions.
Gold-Plating in GREEN
Adding abstractions, optimizations, or extra features during the GREEN phase. The GREEN phase is about correctness, not elegance. Save structural improvements for REFACTOR.
Refactoring While RED
Changing structure while tests are failing makes it impossible to distinguish between test failures from the original defect and new failures from your refactoring.
Per-Cycle Checklist
Use this mental checklist for each RED-GREEN-REFACTOR cycle:
[ ] Test describes behavior, not implementation
[ ] Test uses the public interface only
[ ] Test would survive an internal refactor
[ ] Test fails for the right reason (RED)
[ ] Implementation is minimal for this test (GREEN)
[ ] No speculative features added (GREEN)
[ ] All tests pass after refactoring (REFACTOR)
[ ] No new behavior introduced during refactorLanguage-Specific Guidance
Rust
- Use
#[test]and#[should_panic]for unit tests - Place integration tests in
tests/directory - Use
cargo testto run;cargo test -- --nocapturefor stdout - Consider
#[cfg(test)] mod testsfor test modules alongside source - Use
assert_eq!,assert_ne!,assert!macros - For async tests:
#[tokio::test]with tokio runtime
Go
- Use
_test.gofile suffix andfunc TestXxx(t *testing.T)signature - Run with
go test ./... - Use
t.Errorf/t.Fatalffor assertions - Table-driven tests are idiomatic for testing multiple inputs
- Use
t.Runfor subtests
TypeScript
- Use test frameworks like vitest, jest, or node:test
- Run with the appropriate test runner command
- Use
describe/it/expectpattern - For async: return promises or use
async/awaitin test functions
Solidity
- Use Foundry's
forge testwithfunction test_*naming - Use
assertEq,assertTrue,vm.expectRevertfor assertions - Fork tests with
vm.createForkfor mainnet state - Use
setUp()for test fixtures - Fuzz tests:
function testFuzz_*(uint256 x)for property-based testing
When the Bug is Hard to Test
If writing a test is difficult or the environment lacks test infrastructure:
- Write a test that fails with an explicit message explaining the bug and why testing is hard.
- Fix the bug.
- Replace the explicit failure with a proper assertion once testability improves.
- Invest in making the code more testable -- this is a design improvement.
Additional Resources
- For concrete examples per language, see references/examples.md
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

