Curated library of 41 public AI agent skills for Ruby on Rails development. Organized by category: planning, testing, code-quality, ddd, engines, infrastructure, api, patterns, context, and orchestration. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and TDD automation. Repository workflows remain documented in GitHub but are intentionally excluded from the Tessl tile.
95
93%
Does it follow best practices?
Impact
96%
1.77xAverage score across 41 eval scenarios
Passed
No known issues
Style source of truth: Style and formatting defer to the project's configured linter(s). This skill adds non-style behavior and architecture guidance only. For Hotwire + Tailwind specifics, see apply-stack-conventions.
| Topic | Rule |
|---|---|
| Style/format | Detect → run → defer to project linter(s); do not invent style rules here |
| Principles | DRY, YAGNI, PORO where it helps, CoC, KISS |
| Comments / tags | Explain why; tagged notes need actionable context |
| Logging | First arg: static string; second arg: hash with event: key; no interpolation; backtrace on errors |
| Deep stacks | Chain apply-stack-conventions → domain skills (services, jobs, RSpec) |
TESTS GATE IMPLEMENTATION:
When this skill guides new behavior, the tests gate still applies:
PRD → TASKS → TEST (write, run, fail) → IMPLEMENTATION → …
No implementation code before a failing test. See write-tests.When reviewing or refactoring Rails code, follow this sequence:
.rubocop.yml or .standard.yml), run the appropriate tool, note absence if none found. Do not invent style rules.Rails.logger calls use static strings + structured hashes with an event: key, plus backtrace for errors.TODO:, FIXME:) have actionable context (owner, ticket).Comment why, not what. Tagged notes — TODO: / FIXME: / HACK: / NOTE: / OPTIMIZE: — are MANDATORY in these triggers; every tag carries actionable context. Naked tags (# TODO: fix this) fail review.
# BAD — naked tag, no context
# TODO: fix this
# GOOD — TODO with next step + dependency
# TODO(jsmith, JIRA-1234): replace TIER_RATES with DB-backed lookup once billing API v2 is stable.MANDATORY SHAPE — every Rails.logger.* call uses exactly two positional arguments.
Rails.logger.<level>(static_string_message, { event: "dot.namespaced", ...domain_fields })
# GOOD — error path with backtrace
rescue StandardError => e
Rails.logger.error("order.processing_failed", {
event: "order.processing_failed",
error: e.message,
backtrace: e.backtrace.first(5).join("\n")
})
raise
endevent:.| Area | Path pattern | Guidance |
|---|---|---|
| ActiveRecord performance | app/models/**/*.rb | Eager load in loops; prefer pluck / exists? / find_each. |
| Controllers | app/controllers/**/*_controller.rb | Strong params; thin actions → services; IDOR / PII → security-check. |
| RSpec | spec/**/*_spec.rb | FactoryBot; let > let! unless eager setup required. |
| Service objects | app/services/**/*.rb | Single responsibility; .call / injected deps. |
| Background jobs | app/jobs/**/*.rb / app/workers/**/*.rb | Idempotency, retries, queue choice, and side-effect boundaries → implement-background-job. |
let_it_be (test-prof)Only recommend let_it_be if test-prof is already in Gemfile.lock. Otherwise default to let; reach for let! only when lazy evaluation would break the example. Don't introduce test-prof unless asked.
Load these files only when their specific content is needed:
When applying conventions, your output MUST include:
.rubocop.yml / .standard.yml, run the matching linter, and explicitly state that style/formatting defers to the detected config. If no config exists, say so instead of inventing style rules.let; use let! only when lazy evaluation would break the example; recommend let_it_be only after confirming test-prof already exists in Gemfile.lock; do not introduce test-prof unless asked.TODO: / FIXME: / HACK: / NOTE: / OPTIMIZE:) on every assumption, deferred work, or business-rule constant; every tag carries actionable context (owner, ticket id, deadline).event:, and a backtrace line on every error rescue.| Skill | When to chain |
|---|---|
| apply-stack-conventions | Stack-specific: PostgreSQL, Hotwire, Tailwind |
| model-domain | When domain concepts and invariants need clearer Rails-first modeling choices |
| create-service-object | Implementing or refining service objects |
| implement-background-job | Workers, queues, retries, idempotency |
| write-tests | Spec style, tests gate (red/green/refactor), request vs controller specs |
| security-check | Controllers, params, IDOR, PII |
| code-review | Full PR pass before merge |
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
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
scenario-27
scenario-28
scenario-29
scenario-30
scenario-31
scenario-32
scenario-33
scenario-34
scenario-35
scenario-36
scenario-37
scenario-38
scenario-39
scenario-40
scenario-41
mcp_server
skills
api
generate-api-collection
implement-graphql
code-quality
apply-code-conventions
apply-stack-conventions
assets
snippets
code-review
refactor-code
respond-to-review
review-architecture
security-check
context
load-context
setup-environment
ddd
define-domain-language
model-domain
review-domain-boundaries
engines
create-engine
create-engine-installer
document-engine
extract-engine
release-engine
review-engine
test-engine
upgrade-engine
infrastructure
implement-background-job
implement-hotwire
optimize-performance
review-migration
seed-database
version-api
orchestration
skill-router
patterns
create-service-object
implement-calculator-pattern
write-yard-docs
planning
create-prd
generate-tasks
plan-tickets
testing
plan-tests
test-service
triage-bug
write-tests
workflows