Curated library of 16 public Ruby AI agent skills: 10 atomic skills (YARD docs, service objects, calculator pattern, API clients, DDD, bug triage, code review, skill routing), 5 process-discipline skills (TDD, refactoring, review, security, test planning), and 1 planning skill (TDD task generation). Zero agents — this is a foundational library consumed by framework-specific tiles like rails-agent-skills and hanakai-yaku.
95
96%
Does it follow best practices?
Impact
95%
1.05xAverage score across 16 eval scenarios
Passed
No known issues
| Dimension | Rule |
|---|---|
| Test Boundary | Test at the highest boundary that directly expresses the feature's business goal (e.g. integration/request vs unit) |
| Coverage Goal | Cover all primary paths, all input boundary values, and all expected error flows |
| First Failing Test | Select the single simplest assertion that will fail on the current code and prove the feature is missing |
| Isolation | Isolate tests from external networks, dates, and shared database states |
TEST PLANNING GATES:
1. DO NOT write test cases without defining a test plan first.
2. ALWAYS start testing at the most relevant boundary (don't write 10 unit tests for a feature that needs a request test, and vice versa).
3. The first failing test MUST be identified explicitly in the plan before writing it.
4. All test data must be synthetic; never use real production values or API payloads in test plans.Identify where the behavior is observed:
For the selected boundary, map out the test matrix:
Align with the user:
POST /users — create a new user accountSelected Boundary: Request / API (verifies HTTP status and JSON response shape)
| # | Type | Description | Expected Result | First Failing? |
|---|---|---|---|---|
| 1 | Happy path | Valid email + password | 201 Created, body contains id | ✅ Yes |
| 2 | Boundary | Password at minimum length (8 chars) | 201 Created | |
| 3 | Error | Missing email field | 422 Unprocessable Entity | |
| 4 | Error | Duplicate email already in database | 409 Conflict |
First Failing Test — skeleton (Python / pytest + requests):
def test_create_user_returns_201_with_id(client):
payload = {"email": "alice@example.test", "password": "s3cr3t!X"}
response = client.post("/users", json=payload)
assert response.status_code == 201
assert "id" in response.json()First Failing Test — skeleton (JavaScript / Jest + supertest):
test('POST /users returns 201 with id for valid payload', async () => {
const res = await request(app)
.post('/users')
.send({ email: 'alice@example.test', password: 's3cr3t!X' });
expect(res.status).toBe(201);
expect(res.body).toHaveProperty('id');
});Run the skeleton as-is — it should fail (Red). Proceed to tdd-process to make it pass.
| Context | Next Skill |
|---|---|
| Writing the failing test | tdd-process |
| General design modeling | model-domain |
docs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
skills
code-quality
respond-to-review
ddd
define-domain-language
model-domain
review-domain-boundaries
docs
write-yard-docs
orchestration
skill-router
patterns
create-service-object
implement-calculator-pattern
planning
generate-tdd-tasks
process
testing
triage-bug