CtrlK
BlogDocsLog inGet started
Tessl Logo

igmarin/rails-agent-skills

Curated library of AI agent skills for Ruby on Rails development. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and workflow automation.

98

1.38x
Quality

99%

Does it follow best practices?

Impact

98%

1.38x

Average score across 26 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-5/

{
  "context": "Tests whether the agent implements proper error handling in a Ruby service object: rescuing specific exception types, logging errors, returning structured error hashes, validating inputs early, and handling partial failures gracefully.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Early input validation",
      "description": "The service raises (or returns an error) before reaching business logic when required input is missing or invalid — validation happens at the start of the `call` method",
      "max_score": 12
    },
    {
      "name": "Specific rescue clauses",
      "description": "The `call` method rescues at least one specific exception class (e.g. `ActiveRecord::RecordInvalid`, `ArgumentError`) rather than only `StandardError`",
      "max_score": 10
    },
    {
      "name": "StandardError rescue",
      "description": "A `rescue StandardError` (or equivalent catch-all) is present as a fallback to prevent any exception escaping",
      "max_score": 8
    },
    {
      "name": "Error logged",
      "description": "Each rescue block calls a logging method (e.g. `log_error`, `Rails.logger.error`, or similar) — NOT just silently rescuing",
      "max_score": 10
    },
    {
      "name": "Error hash returned",
      "description": "Each rescue block returns a hash with `success: false` (not re-raises the exception)",
      "max_score": 12
    },
    {
      "name": "No exception leakage",
      "description": "No rescue block calls `raise` or `raise e` — exceptions are fully absorbed and converted to error hashes",
      "max_score": 10
    },
    {
      "name": "Partial success response",
      "description": "When some items succeed and others fail, the response includes BOTH successful results AND failure details in the same response hash (partial success pattern)",
      "max_score": 10
    },
    {
      "name": "Frozen string literal",
      "description": "Service file begins with `# frozen_string_literal: true`",
      "max_score": 8
    },
    {
      "name": "Response format consistency",
      "description": "All return paths (success, partial success, error) use the `{ success: ..., response: { ... } }` structure",
      "max_score": 10
    },
    {
      "name": "Backtrace logged for unexpected errors",
      "description": "The catch-all `rescue StandardError` logs a backtrace (e.g. passes `include_backtrace: true` or logs `e.backtrace`)",
      "max_score": 10
    }
  ]
}

README.md

tile.json