SKILL.md
TDD Persona
Agent Phases
Phase 1: Context & Test Design
- load-context: Load schema, routes, and patterns.
- plan-tests: Choose the best first failing spec.
- write-tests: Write test and verify failure.
**HARD GATE — tdd-process *(from ruby-core-skills)***
- Test EXISTS and is RUN.
- FAILS for correct reason (e.g.,
undefined method 'full_name'). - If FAIL is incorrect (syntax, config), return to
write-tests.
Phase 2: Implementation
- Proposal Checkpoint: Propose implementation (e.g., "Concatenate first + last name").
- User Approval: Wait for explicit confirmation.
- Minimal Implement: Smallest change to pass test.
- Verify PASS:
bundle exec rspec spec/path/to/spec.rb.
If test does not pass, fix minimal changes and re-verify.
Phase 3: Iterate (Optional)
Return to Phase 1 for next behavior or proceed to Phase 4.
Phase 4: Finish
- Quality Check:
bundle exec rubocop && bundle exec brakeman && bundle exec rspec. - **write-yard-docs *(from ruby-core-skills)***: Document public Ruby API.
- code-review: Self-review PR diff.
- Open PR: Feature complete.
Concrete Example
Abbreviated walkthrough for adding a full_name method to a User model. For the full end-to-end example, see [assets/example.md](assets/example.md).
Step 1 — Write the failing spec (spec/models/user_spec.rb):
RSpec.describe User, type: :model do
describe '#full_name' do
it 'returns first and last name joined by a space' do
user = User.new(first_name: 'Jane', last_name: 'Doe')
expect(user.full_name).to eq('Jane Doe')
end
end
end
Run: bundle exec rspec spec/models/userspec.rb Expected failure: NoMethodError: undefined method 'fullname' for #<User ...> ✅
Step 2 — Propose & confirm
Proposal: Add
def fullname = "#{firstname} #{last_name}"toapp/models/user.rb. Proceed?
Step 3 — Minimal implementation (app/models/user.rb):
def full_name
"#{first_name} #{last_name}"
end
Run: bundle exec rspec spec/models/user_spec.rb → 1 example, 0 failures ✅
Step 4 — Quality check:
bundle exec rubocop && bundle exec brakeman && bundle exec rspec
All green → write YARD docs → self-review → open PR.
Output Style
When completing a TDD cycle, produce a report following the template in [assets/tdd-report-template.md](assets/tdd-report-template.md). At minimum the report must include:
- RED: spec file path and line, exact failure class and message, confirmation the failure is for the correct reason.
- Proposal: one-line implementation summary and explicit user approval confirmation.
- GREEN: implementation file path and line range, spec pass confirmation.
- Iterate: number of additional RED→GREEN cycles and a summary of each.
- Quality Gate: RuboCop, Brakeman, full RSpec suite, YARD docs, and self-review results.
Integration
| Predecessor | This Persona | Successor |
|---|---|---|
| load-context | tdd | code-review |
| define-domain-language | tdd | quality |
| None (standalone) | tdd | PR submission |
Use plan-tests alone if you only need to decide which test to write next.
Use write-tests alone if the test design is already decided and you only need to implement the spec.
Error Recovery
Test fails for the wrong reason (syntax/config error):
- Identify error class —
SyntaxError,NameError,LoadErrorindicate test problems, not missing features. - Fix the test to correctly target the missing behavior and re-run until the failure class is correct (e.g.,
NoMethodError).
Implementation makes test pass but breaks other tests:
- Run
bundle exec rspecto identify regressions. - Revise implementation to satisfy both the new test and existing tests.
- If impossible, the feature conflicts with existing behavior — discuss with user before proceeding.
Quality gate fails (RuboCop/Brakeman):
- Run
bundle exec rubocop -afor auto-correctable offenses; fix remaining ones manually. - For Brakeman warnings, assess whether they are false positives — if real, fix before proceeding.