Curated library of 39 AI agent skills for Ruby on Rails development. Organized by category: planning, testing, code-quality, ddd, engines, infrastructure, api, patterns, context, orchestration, and workflows. Includes 5 callable workflow skills (rails-tdd-loop, rails-review-flow, rails-setup-flow, rails-quality-flow, rails-engines-flow) for complete development cycles. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and TDD automation.
95
98%
Does it follow best practices?
Impact
95%
1.20xAverage score across 35 eval scenarios
Passed
No known issues
Entry points identified first
75%
100%
Domain logic layer checked
100%
100%
Models and callbacks inspected
100%
100%
High: business logic in callbacks
100%
100%
High: controller multi-step workflow
100%
100%
Boundary problems prioritised
100%
100%
Medium finding identified
100%
100%
Affected files per finding
100%
100%
Risk described per finding
100%
100%
Improvement per finding
100%
100%
Concerns and helpers checked
100%
100%
Pass ID not object
100%
100%
Load record in perform
100%
100%
Idempotency check present
100%
100%
Side effect after guard
100%
100%
retry_on with attempts
0%
100%
discard_on permanent error
0%
100%
Thin perform — service delegation
62%
100%
Recurring in recurring.yml
100%
100%
Solid Queue adapter
100%
100%
Spec covers idempotency
90%
100%
Spec written for job
100%
100%
Self.call delegation
100%
100%
Instance call method
100%
100%
Success response key
50%
100%
Success response nesting
0%
100%
Error response key
50%
100%
Error response nesting
0%
100%
File location
100%
100%
Frozen string literal
100%
100%
Module namespace
100%
100%
No raw exceptions returned
100%
100%
Stable behavior statement
100%
100%
Characterization tests before refactoring
0%
93%
Characterization tests target current code
0%
30%
Smallest safe sequence proposed
80%
100%
Test run evidence per step
46%
100%
No behavior mixed with structure
100%
75%
Temporary compatibility noted
37%
50%
No forbidden confidence claims
100%
100%
One boundary extracted per step
100%
100%
Auth includes HTTParty
0%
100%
Auth credential validation
100%
100%
No hardcoded credentials
100%
100%
Auth token caching
100%
100%
Client::Error class
100%
100%
HTTP error wrapping
80%
100%
JSON error wrapping
100%
100%
Timeout configured
100%
100%
Missing config raises Client::Error
70%
100%
Retry constant
100%
100%
Spec covers error path
100%
100%
Error message constants
100%
100%
YARD on self.call
0%
100%
YARD on other public methods
100%
100%
Class-only service used
100%
100%
No instance state in class-only service
100%
100%
README present
0%
100%
Frozen string literal
100%
100%
Response format
0%
100%
Module namespace matches directory
100%
100%
Constants not duplicated inline
100%
100%
Transaction present
100%
100%
Transaction scope correct
100%
100%
SQL sanitization used
100%
100%
No SQL string interpolation
100%
100%
Module namespace
100%
100%
File path correct
100%
100%
README present
100%
100%
Frozen string literal
100%
100%
Response format
50%
100%
Error constants
37%
100%
Builder initializer attributes
0%
100%
Builder attribute filtering
70%
100%
Builder response parsing
57%
100%
Entity ATTRIBUTES constant
25%
100%
Entity DEFAULT_QUERY constant
0%
100%
Entity SEARCH_QUERY constant
0%
100%
Entity self.fetcher wiring
0%
100%
sanitize_sql usage
0%
100%
FactoryBot hash factory
60%
100%
Factory in correct directory
100%
100%
ShelterApi module namespace
100%
100%
No raw interpolation in queries
55%
100%
Version constant updated
100%
100%
CHANGELOG updated
100%
100%
Upgrade notes produced
70%
100%
Semantic version bump correct
100%
100%
Version bump reasoning provided
100%
100%
Gemspec verified
50%
100%
Test suite mentioned
87%
100%
Blockers called out
100%
100%
CHANGELOG entries are specific
100%
100%
No release without CHANGELOG
100%
100%
Early input validation
100%
100%
Specific rescue clauses
100%
100%
StandardError rescue
100%
100%
Error logged
0%
100%
Error hash returned
33%
100%
No exception leakage
100%
100%
Partial success response
100%
100%
Frozen string literal
100%
100%
Response format consistency
30%
100%
Backtrace logged for unexpected errors
0%
100%
Factory attributes minimal
100%
100%
SendgridClient mocked
100%
100%
No real HTTP/email calls
100%
100%
ActiveRecord finders NOT mocked
0%
100%
Factory file exists
100%
100%
SendgridClient failure case tested
100%
100%
RecordNotFound case tested
100%
100%
let used for factory setup
100%
100%
External mock at class method level
100%
100%
Factory attributes match service usage
100%
100%
Dataloader for association
0%
90%
Field-level guard on sensitive field
70%
100%
No type-only auth for sensitive field
100%
100%
Mutation returns errors array
100%
100%
Mutation no unhandled raise
100%
100%
Introspection disabled in production
100%
100%
max_depth set
100%
100%
max_complexity set
100%
100%
Dedicated resolver class
100%
100%
Connection type for paginated list
0%
100%
schema.execute in specs
100%
100%
descriptions on fields
0%
100%
Auth file exists
100%
100%
Client file exists
100%
100%
Fetcher file exists
100%
100%
Builder file exists
100%
100%
Domain entity file exists
100%
100%
Auth self.default
0%
0%
Auth token caching
62%
0%
Client::Error class
50%
0%
Client constants
0%
0%
Fetcher DI constructor
25%
12%
Fetcher constants
0%
0%
Builder attribute filtering
50%
50%
Entity ATTRIBUTES constant
0%
0%
Entity DEFAULT_QUERY constant
0%
0%
README present
100%
100%
File saved to /tasks/
0%
100%
Introduction section
42%
100%
Goals section
100%
100%
User Stories section
100%
100%
Functional Requirements section
100%
100%
Non-Goals section
100%
100%
Design and Technical Considerations
0%
100%
Implementation Surface section
25%
100%
Success Metrics section
100%
100%
Open Questions section
100%
100%
No implementation code
100%
100%
What/why focus
62%
87%
Next steps suggestion
0%
100%
isolate_namespace used
100%
100%
configure block pattern
100%
100%
Configuration class
100%
100%
Configurable user class
100%
100%
No hard-coded host constant
100%
100%
Migrations not auto-applied
90%
100%
Host contract documented
100%
100%
lib/audit_trail.rb minimal
87%
62%
Dummy app routes mount engine
100%
100%
Model namespaced
100%
100%
Engine type justified
100%
100%
Postman v2.1 schema
100%
100%
Correct file location
0%
100%
base_url variable used
100%
100%
All endpoints present
100%
100%
HTTP methods correct
100%
100%
Headers included
40%
100%
Body examples for POST/PUT
100%
100%
Syntactically valid JSON
100%
100%
URL path parameters
100%
100%
Correct severity levels used
0%
100%
permit! flagged Critical
57%
100%
N+1 query identified
100%
100%
Missing index flagged
100%
100%
Business logic in controller flagged
100%
100%
Review covers multiple areas
100%
100%
Each finding includes mitigation
100%
100%
Re-review explicitly required
100%
100%
html_safe / raw usage flagged
100%
100%
Severity action prescribed per level
66%
100%
Spec file at mirrored path
100%
100%
RSpec.describe uses module::class
100%
100%
describe for method
100%
100%
context for scenario variations
100%
100%
let used for test data
100%
100%
No let! for non-setup data
100%
100%
No 'and' in example descriptions
66%
100%
Frozen string literal
100%
100%
Subject defined
100%
100%
let_it_be NOT used
100%
100%
Auth/authz reviewed first
0%
100%
Parameter handling reviewed
100%
100%
Query safety reviewed
100%
100%
High severity: SQL injection identified
100%
100%
High severity: missing authz identified
100%
100%
Medium severity finding identified
100%
100%
Attack path per finding
100%
100%
Affected file per finding
100%
100%
Mitigation per finding
100%
100%
Exploitability focus
100%
100%
Secrets and output reviewed
100%
100%
Orchestrator call length
100%
100%
Sub-services extracted
100%
100%
Orchestrator delegates, not implements
100%
100%
No HTTP response returned
100%
100%
Data-only return
100%
100%
Single responsibility
100%
100%
Frozen string literal
0%
100%
File structure
100%
100%
Response format
50%
100%
Error handling
100%
100%
SERVICE_MAP constant
66%
100%
Factory NullService fallback
100%
100%
NullService never raises
100%
100%
Correct file structure
70%
100%
Single entry point API
62%
100%
Concrete overrides should_calculate?
0%
100%
Concrete overrides compute_result
87%
100%
NullService spec context
100%
100%
Variant spec coverage
100%
100%
Frozen string literal
0%
100%
SERVICE_MAP key type consistency
100%
100%
shared_examples defined
100%
100%
shared_examples consumed twice or more
100%
100%
travel_to used
0%
100%
Expiry true at >30 days
100%
100%
Expiry false at <30 days
100%
100%
let_it_be NOT used
100%
100%
Shared examples in spec/support/
100%
100%
403 response asserted in shared behavior
100%
100%
Model spec path correct
100%
100%
type: :request used
100%
100%
type: :controller NOT used
100%
100%
Model spec file exists
100%
100%
type: :model used
100%
100%
No system or feature spec
100%
100%
Request spec in spec/requests/
100%
100%
Endpoint URL in describe
100%
100%
Endpoint success case covered
100%
100%
Endpoint failure case covered
100%
100%
Model uniqueness validation tested
100%
100%
Feature branch task 0.0
0%
100%
TDD write-spec sub-task
30%
100%
TDD run-spec-fail sub-task
0%
100%
TDD implement sub-task
62%
100%
TDD run-spec-pass sub-task
0%
100%
Exact file paths in sub-tasks
100%
100%
Saved in /tasks/ with correct name
100%
100%
YARD post-implementation gate
0%
100%
Documentation update task
87%
100%
Code review gate
100%
100%
Relevant Files section
0%
100%
process_log.md exists
100%
100%
Spec content before implementation
100%
100%
Expected failure documented
100%
100%
Test design phase present
100%
100%
Implementation plan before code
100%
100%
No implementation code before spec phase
100%
100%
At least three distinct phases
100%
100%
Spec file exists
100%
100%
Implementation file exists
100%
100%
Spec uses describe/context structure
100%
100%
Class-level summary
100%
100%
self.call @param
100%
100%
@option for hash keys
100%
100%
self.call @return
70%
100%
@raise for InvalidPlanError
20%
100%
@raise for PaymentGatewayError
12%
100%
supported_plans @return
100%
100%
English only
100%
100%
No logic changes
100%
100%
initialize documented
100%
100%
@example present
100%
100%
No what-comments
93%
86%
Why-comments on business rules
100%
100%
Why-comment on design tradeoff
100%
100%
Tagged note present
0%
30%
Tagged note has actionable context
0%
30%
Comment on MAX_DISCOUNT rationale
100%
100%
Comment on promo branching logic
100%
100%
Domain concept referenced
100%
100%
Comment on inactive subscription guard
100%
80%
No code duplicated in comments
100%
100%
No sort column interpolation
100%
100%
Sort column allowlist
100%
100%
Sort direction allowlist
100%
100%
Bound params or sanitize_sql_array for WHERE
100%
100%
No user input in order() string
100%
100%
Allowlist as constant or frozen structure
100%
100%
No send or eval with user column
100%
100%
Comment on raw SQL rationale
0%
100%
Safe fallback on invalid input
100%
100%
Frozen string literal
100%
100%
Static first argument
28%
35%
Hash second argument
50%
0%
Dynamic data in hash only
100%
42%
event: key present
100%
80%
Domain-specific hash fields
100%
100%
Multiple log levels
100%
100%
No interpolation in any logger call
100%
100%
At least four log statements
100%
100%
Failure path logged at error level
100%
100%
No puts or p for logging
100%
100%
URL path versioning used
100%
100%
Both V1 and V2 namespaces present
100%
100%
V2 controller inherits from V1
0%
100%
V2 overrides only changed actions
0%
87%
Deprecation concern exists
100%
100%
Deprecation header emitted
100%
100%
Sunset header emitted
100%
100%
V1 controller includes Deprecatable
100%
100%
Backward compatibility spec present
100%
100%
Sunset timeline documented
100%
100%
V1 endpoints not removed
100%
100%
Baseline documented
100%
100%
N+1 bottleneck named
100%
100%
Regression spec written
100%
100%
Regression spec asserts fixed count
62%
100%
Owner eager loaded
100%
100%
Tasks association optimized
100%
100%
EXPLAIN ANALYZE output present
100%
100%
Seq Scan / Index Scan interpreted
100%
100%
Fix precedes regression spec claim
30%
30%
Profiling tool mentioned
0%
0%
Query count improvement quantified
100%
100%
All 8 classification attributes present
0%
100%
area values from allowed set
0%
100%
execution_order values from allowed set
0%
100%
BE | prefix on backend tickets
0%
100%
FE | prefix on frontend tickets
0%
100%
No prefix on non-area tickets
80%
100%
Five sections present in each ticket
16%
100%
Summary states outcome only
0%
87%
Technical Notes scope correct
42%
100%
Foundation/API before client sequencing
90%
100%
Draft-only output
100%
100%
target_bucket values from allowed set
0%
100%
type values from allowed set
66%
100%
Policy class replaces inline logic
100%
100%
No presence-only checks remain
100%
100%
authorize called in controller
100%
100%
Index uses policy_scope
100%
100%
Policy class inherits ApplicationPolicy
100%
100%
Admin role permitted in policy
100%
100%
Owner role permitted in policy
100%
100%
Non-owner role denied in policy
100%
100%
Guest role tested in specs
100%
100%
permit_action matchers in policy spec
100%
100%
Request spec covers multiple roles
100%
100%
implementation_notes identifies flaw
100%
100%
Ability class defined
100%
100%
Guest-user guard present
100%
100%
Finance role can manage
100%
100%
Viewer role read-only
100%
100%
Guest role blocked
100%
100%
load_and_authorize_resource used
100%
100%
Index uses accessible_by
100%
100%
Finance role tested
100%
100%
Viewer role tested
100%
100%
Guest role tested
100%
100%
cancancan gem referenced
100%
100%
No inline controller logic
100%
100%
Policy class defined
100%
100%
No inline controller auth
100%
100%
authorize called in controller
100%
100%
Index uses policy_scope
100%
100%
Scope method in policy
100%
100%
Admin role tested
100%
100%
Owner role tested
100%
100%
Other-user role tested
100%
100%
Guest role tested
100%
100%
permit_action matchers used
100%
100%
Request spec role matrix
100%
100%
Gemfile mentions pundit
100%
100%
Table of Contents