CtrlK
BlogDocsLog inGet started
Tessl Logo

igmarin/rails-agent-skills

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

1.20x
Quality

98%

Does it follow best practices?

Impact

95%

1.20x

Average score across 35 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-8/

{
  "context": "Tests whether the agent correctly implements the Builder (with attribute whitelisting) and Domain Entity (with frozen ATTRIBUTES, SQL query constants, self.fetcher wiring, and sanitize_sql for search) layers, plus FactoryBot hash factories for API response test data.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Builder initializer attributes",
      "description": "Builder is initialized with an `attributes:` keyword argument stored as an instance variable",
      "max_score": 7
    },
    {
      "name": "Builder attribute filtering",
      "description": "Builder#build uses slice (or equivalent whitelist filter) to restrict output to only the specified attributes — does NOT return all fields from the raw response",
      "max_score": 10
    },
    {
      "name": "Builder response parsing",
      "description": "Builder#build accesses response structure keys (schema/columns and data array) to map rows rather than assuming a flat array",
      "max_score": 7
    },
    {
      "name": "Entity ATTRIBUTES constant",
      "description": "Animal class defines ATTRIBUTES as a frozen array (using .freeze) containing string field names",
      "max_score": 8
    },
    {
      "name": "Entity DEFAULT_QUERY constant",
      "description": "Animal class defines a DEFAULT_QUERY string constant containing a SQL SELECT statement",
      "max_score": 7
    },
    {
      "name": "Entity SEARCH_QUERY constant",
      "description": "Animal class defines a SEARCH_QUERY string constant with a parameterized SQL query (containing a placeholder such as ? or :param)",
      "max_score": 7
    },
    {
      "name": "Entity self.fetcher wiring",
      "description": "Animal defines a self.fetcher class method that instantiates Builder with ATTRIBUTES and Fetcher with the client and builder",
      "max_score": 9
    },
    {
      "name": "sanitize_sql usage",
      "description": "Animal's find/search method uses ActiveRecord::Base.sanitize_sql (or sanitize_sql_array) to construct parameterized queries — does NOT use string interpolation for user input",
      "max_score": 10
    },
    {
      "name": "FactoryBot hash factory",
      "description": "spec/factories/shelter_api/animal_response.rb defines a FactoryBot factory (not a model factory) that produces a hash matching the API response structure",
      "max_score": 10
    },
    {
      "name": "Factory in correct directory",
      "description": "The FactoryBot factory file is located under spec/factories/shelter_api/ (module-namespaced directory), not in spec/factories/ root",
      "max_score": 8
    },
    {
      "name": "ShelterApi module namespace",
      "description": "Both Builder and Animal classes are defined inside the ShelterApi module namespace (matching the existing client.rb and fetcher.rb)",
      "max_score": 8
    },
    {
      "name": "No raw interpolation in queries",
      "description": "Animal's search/find method does NOT use Ruby string interpolation (#{...}) to embed user-supplied values directly into SQL query strings",
      "max_score": 9
    }
  ]
}

README.md

tile.json