Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Pre-refactor safety checklist. Verifies test coverage exists before AI modifies existing code. Use before asking AI to refactor anything.
.claude/skills/rshankras-tdd-refactor-guard/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 190% | 0% |
A safety gate that runs before any AI-assisted refactoring. Ensures tests exist to catch regressions. If coverage is insufficient, generates characterization tests first.
Use this skill when the user:
Without guard: With guard:
"Claude, refactor this" "Claude, refactor this"
→ AI rewrites code → Guard checks for tests
→ Something breaks → Tests missing → generate them
→ You don't know what → Tests pass → proceed with refactor
→ Debugging nightmare → Tests fail → exact regression foundWhat code is being refactored?
Ask user: "Which files/classes are you planning to refactor?"Or detect from context:
Glob: [files mentioned in conversation]
Read: each file to understand scopeDetermine:
Grep: "class.*Tests.*XCTestCase|@Suite.*Tests|struct.*Tests" in test targets
Grep: "@Test|func test" that reference the classes being refactored| Level | Criteria | Action | |-------|----------|--------| | Good (> 80%) | Most public methods have tests for happy + error paths | Proceed with refactoring | | Partial (40-80%) | Some methods tested, missing edge cases | Add characterization tests for uncovered methods | | Minimal (< 40%) | Few or no tests | Generate full characterization test suite first | | None (0%) | No test file exists | STOP — create characterization tests before any refactoring |
Even if tests exist, check quality:
swift// ❌ Low-quality test — doesn't actually verify behavior @Test("test items") func testItems() { let vm = ViewModel() vm.loadItems() #expect(true) // Always passes, tests nothing } // ❌ Tests implementation, not behavior @Test("calls repository") func testCallsRepo() { let vm = ViewModel() vm.loadItems() #expect(mockRepo.fetchCallCount == 1) // Brittle } // ✅ Tests observable behavior @Test("loads items into published array") func testLoadsItems() async { let vm = ViewModel(repo: MockRepo(items: [.sample])) await vm.loadItems() #expect(vm.items.count == 1) #expect(vm.items.first?.title == "Sample") }
Quality checklist:
#expect(true) or always-passing assertionsIf coverage is insufficient, use characterization-test-generator/:
markdownBefore refactoring [ClassName], generate characterization tests: 1. Read the source file 2. Identify all public methods 3. Generate tests that capture CURRENT behavior 4. Run and verify all pass
markdown## Refactor Guard: ✅ PROCEED **Files**: ItemManager.swift, ItemRepository.swift **Test coverage**: Good (12 tests covering 8/9 public methods) **Test quality**: Adequate — tests verify behavior, not implementation Safe to refactor. Run tests after each change: `xcodebuild test -scheme YourApp`
markdown## Refactor Guard: ⚠️ NEEDS TESTS **Files**: ItemManager.swift, ItemRepository.swift **Test coverage**: Partial (5 tests covering 4/9 public methods) **Missing coverage**: - `ItemManager.sort()` — no test - `ItemManager.filter(by:)` — no test - `ItemRepository.sync()` — no test - Error paths for `save()` and `delete()` — not tested **Action**: Generate characterization tests for uncovered methods before refactoring. Use `characterization-test-generator` skill.
markdown## Refactor Guard: 🔴 STOP **Files**: ItemManager.swift, ItemRepository.swift **Test coverage**: None (0 tests found) **Action**: Do NOT refactor until characterization tests exist. Refactoring without tests is like surgery without monitoring — you won't know if you killed the patient. Run `characterization-test-generator` on: 1. ItemManager (7 public methods) 2. ItemRepository (5 public methods) Then re-run this guard.
After refactoring is complete:
bash# Run all tests xcodebuild test -scheme YourApp # Check specifically for regressions xcodebuild test -scheme YourApp \ -only-testing "YourAppTests/ItemManagerCharacterizationTests"
These typically don't change behavior:
These can change behavior:
Full contract tests recommended:
markdown## Refactor Guard Report **Scope**: [Files/classes to be refactored] **Verdict**: ✅ PROCEED / ⚠️ NEEDS TESTS / 🔴 STOP ### Coverage Summary | Class | Public Methods | Tests | Coverage | Verdict | |-------|---------------|-------|----------|---------| | ItemManager | 9 | 12 | 89% | ✅ | | ItemRepository | 5 | 2 | 40% | ⚠️ | ### Missing Coverage - [ ] `ItemRepository.sync()` — needs characterization test - [ ] Error path for `ItemRepository.delete()` — untested ### Recommendations 1. [Action item] 2. [Action item]
testing/characterization-test-generator/ — generates tests this guard may requiretesting/tdd-feature/ — for building new code during refactorOther measured skills in the registry, with their headline benchmark lift.