{
  "id": "rails-rspec",
  "type": "loadout",
  "title": "Rails request specs with RSpec and FactoryBot",
  "summary": "RSpec request specs for Rails 8.1 JSON endpoints: happy path, 422 errors, missing params, owner scoping and mass assignment, with FactoryBot and rubocop-rspec.",
  "description": "Agents asked to test a Rails endpoint write a controller spec that checks the status code and stops there. The bugs that matter go untested: an unscoped find that shows another user's record, an owner_id accepted from the request body, a missing params key that turns into a 500. This loadout gives your agent RSpec rules for Rails 8.1. It uses request specs, not controller specs, with params.expect strong params and lookups scoped to the current owner. FactoryBot keeps the minimum valid record, with traits for variants. A skill lists what every endpoint's spec must cover and ships a complete, passing example. The verifier runs it in a Rails 8.1.4 API app on rspec-rails 8.0.4 in random order, runs rubocop with rubocop-rspec, and checks that removing the owner scope fails the 404 spec.\n",
  "highlights": [
    "Request specs through routing, middleware and params, not controller specs",
    "Every endpoint: happy path, 422, 400, someone else's record (404) and mass assignment",
    "params.expect strong params; ownership set from the session, never the body",
    "FactoryBot sequences and traits; build_stubbed where no database is needed",
    "Verified on Rails 8.1.4, rspec-rails 8.0.4 and rubocop-rspec 3.10.2"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "rspec-rails: request specs",
      "url": "https://rspec.info/features/8-0/rspec-rails/request-specs/request-spec/"
    },
    {
      "title": "rspec/rspec-rails",
      "url": "https://github.com/rspec/rspec-rails"
    },
    {
      "title": "FactoryBot getting started",
      "url": "https://thoughtbot.github.io/factory_bot/"
    },
    {
      "title": "Rails guides: Action Controller parameters (params.expect)",
      "url": "https://guides.rubyonrails.org/action_controller_overview.html#strong-parameters"
    },
    {
      "title": "RuboCop RSpec",
      "url": "https://docs.rubocop.org/rubocop-rspec/"
    }
  ],
  "categories": [
    "web-app"
  ],
  "stacks": [
    "ruby",
    "rails",
    "rspec"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Rules for a Rails 8.1 app tested with RSpec request specs and FactoryBot.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/AGENTS.md",
      "bytes": 1568,
      "lang": "markdown",
      "content": "# AGENTS.md: Rails app tested with RSpec\n\nA Rails 8.1 app whose tests are RSpec (`rspec-rails`) with FactoryBot. Check `Gemfile.lock` for exact versions before\nusing an API.\n\n## Commands\n- Tests: `bundle exec rspec` (random order). One file: `bundle exec rspec spec/requests/projects_spec.rb:42`.\n- Lint: `bundle exec rubocop` (rubocop-rails-omakase plus rubocop-rspec and rubocop-rspec_rails).\n- Migrations: `bin/rails db:migrate`, then commit `db/schema.rb`. The test database follows the schema\n  (`maintain_test_schema!`).\n- Done means: the new specs fail without the change and pass with it, and the whole suite and rubocop are green.\n\n## Rules\n- Every controller action has request specs (`spec/requests/`): the happy path, the validation error (422,\n  `:unprocessable_content`), missing params (400), and another user's record (404). Use the `rspec-request-spec`\n  skill.\n- Strong params with `params.expect(model: [...])`. Never permit ownership or role fields. Set them from the\n  authenticated user.\n- Scope every lookup to the current user or account (`current_user.projects.find(...)`). An unscoped `Model.find`\n  in a controller is a bug.\n- Model specs for validations and scopes use `build` or `build_stubbed`, and hit the database only when the\n  behaviour needs it.\n- FactoryBot factories hold the minimum valid record. Variants go in traits. Unique fields use `sequence`.\n- No controller specs, no `allow_any_instance_of`, no `sleep`, no real HTTP in specs.\n- Do not change `.rspec`, `spec_helper.rb` or `rails_helper.rb` to make a failing spec pass.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/CLAUDE.md",
      "bytes": 396,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n\n- Skills from this loadout live in `.claude/skills/`: `rspec-request-spec`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Rails request specs with RSpec and FactoryBot\" v1.0.0 — https://loadout.jnw-it.com/loadouts/rails-rspec/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/GEMINI.md",
      "bytes": 397,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n\n- Skills from this loadout live in `.agents/skills/`: `rspec-request-spec`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Rails request specs with RSpec and FactoryBot\" v1.0.0 — https://loadout.jnw-it.com/loadouts/rails-rspec/ -->\n"
    },
    {
      "path": "skills/rspec-request-spec/SKILL.md",
      "role": "skill",
      "description": "What every endpoint spec covers, and how to write and run it.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/SKILL.md",
        "codex": ".agents/skills/rspec-request-spec/SKILL.md",
        "cursor": ".agents/skills/rspec-request-spec/SKILL.md",
        "gemini-cli": ".agents/skills/rspec-request-spec/SKILL.md",
        "antigravity-cli": ".agents/skills/rspec-request-spec/SKILL.md",
        "copilot": ".agents/skills/rspec-request-spec/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/SKILL.md",
      "bytes": 2676,
      "lang": "markdown",
      "content": "---\nname: rspec-request-spec\ndescription: Write RSpec request specs for a Rails JSON endpoint with FactoryBot, covering the happy path, validation errors, missing params and access scoping, then run rspec and rubocop-rspec. Use when adding or changing a controller action, route or API response in a Rails app tested with RSpec.\n---\n\n# Request specs for a Rails endpoint\n\nThe references hold a complete, passing set: `projects_controller.rb`, `project.rb`, `projects_factory.rb`\n(goes in `spec/factories/projects.rb`), `projects_spec.rb` (goes in `spec/requests/`), `rails_helper.rb`,\n`spec_helper.rb` and `rubocop.yml`.\n\n## What every endpoint's spec covers\n\n1. **Happy path**, with status and the body fields that matter: `response.parsed_body`, compared with `eq` or\n   `include`.\n2. **Validation failure**: `have_http_status(:unprocessable_content)` and the error message for the field.\n3. **Missing or malformed params**: `params.expect` raises, and Rails answers 400.\n4. **Scoping**: another user's record returns 404, and the list never includes it. The spec catches an unscoped\n   `find`.\n5. **Mass assignment**: a forbidden attribute in the body (`owner_id`, `admin`, `role`) is ignored.\n6. **Side effects**: `expect { ... }.to change(Model, :count).by(n)` for creates and deletes.\n\n## How to write them\n\n- Request specs (`spec/requests/`), not controller specs. They go through routing, middleware and params parsing.\n- Use `as: :json` for JSON bodies. With `wrap_parameters`, a flat JSON body is wrapped under the model key, so test a\n  missing key with a form post.\n- Use `create` only when the database is needed, and `build` or `build_stubbed` in model and unit specs. Use a\n  factory `sequence` for unique fields and traits (`:archived`) for variants. Never use a fixed id.\n- `let` for data an example uses. Create records inside the example when their order or count is the point.\n- Follow arrange, act, assert with blank lines between, and one behaviour per example. Name examples for the\n  behaviour (\"hides another owner's project behind a 404\"), not the implementation.\n- No `sleep`, no real network and no `allow_any_instance_of`. Freeze time with `travel_to` when a time is asserted.\n\n## Run\n\n```bash\nbundle exec rspec spec/requests/projects_spec.rb\nbundle exec rspec                       # the whole suite, random order\nbundle exec rubocop app spec\n```\n\nRandom order is on (`config.order = :random`). If a spec fails only in some orders, it leaks state. Fix the leak;\ndo not pin the seed.\n\n## Done means\n\nThe new examples fail before the change and pass after it. The whole suite and rubocop (omakase, rubocop-rspec and\nrubocop-rspec_rails) are green.\n"
    },
    {
      "path": "skills/rspec-request-spec/references/projects_controller.rb",
      "role": "reference",
      "description": "Owner-scoped JSON controller with params.expect.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/references/projects_controller.rb",
        "codex": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
        "cursor": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
        "gemini-cli": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
        "antigravity-cli": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
        "copilot": ".agents/skills/rspec-request-spec/references/projects_controller.rb"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_controller.rb",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/references/projects_controller.rb",
      "bytes": 1414,
      "lang": "markdown",
      "content": "# JSON API for projects, scoped to the current owner. In a real app the owner\n# comes from authentication; here it is a header so the specs can show the scoping.\nclass ProjectsController < ApplicationController\n  before_action :require_owner\n  before_action :set_project, only: %i[show update destroy]\n\n  def index\n    render json: Project.owned_by(@owner_id).order(:name).limit(100)\n  end\n\n  def show\n    render json: @project\n  end\n\n  def create\n    project = Project.new(project_params.merge(owner_id: @owner_id))\n    if project.save\n      render json: project, status: :created, location: project\n    else\n      render json: { errors: project.errors }, status: :unprocessable_content\n    end\n  end\n\n  def update\n    if @project.update(project_params)\n      render json: @project\n    else\n      render json: { errors: @project.errors }, status: :unprocessable_content\n    end\n  end\n\n  def destroy\n    @project.destroy!\n    head :no_content\n  end\n\n  private\n    def require_owner\n      @owner_id = Integer(request.headers.fetch(\"X-Owner-Id\"))\n    rescue KeyError, ArgumentError\n      head :unauthorized\n    end\n\n    # Another owner's project is a 404, not a 403: do not confirm that it exists.\n    def set_project\n      @project = Project.owned_by(@owner_id).find_by(id: params[:id])\n      head :not_found unless @project\n    end\n\n    def project_params\n      params.expect(project: %i[name status])\n    end\nend\n"
    },
    {
      "path": "skills/rspec-request-spec/references/project.rb",
      "role": "reference",
      "description": "Model with validations and an owner scope.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/references/project.rb",
        "codex": ".agents/skills/rspec-request-spec/references/project.rb",
        "cursor": ".agents/skills/rspec-request-spec/references/project.rb",
        "gemini-cli": ".agents/skills/rspec-request-spec/references/project.rb",
        "antigravity-cli": ".agents/skills/rspec-request-spec/references/project.rb",
        "copilot": ".agents/skills/rspec-request-spec/references/project.rb"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/project.rb",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/references/project.rb",
      "bytes": 322,
      "lang": "markdown",
      "content": "class Project < ApplicationRecord\n  STATUSES = %w[active archived].freeze\n\n  validates :name, presence: true, length: { maximum: 80 }, uniqueness: { scope: :owner_id }\n  validates :status, inclusion: { in: STATUSES }\n  validates :owner_id, presence: true\n\n  scope :owned_by, ->(owner_id) { where(owner_id: owner_id) }\nend\n"
    },
    {
      "path": "skills/rspec-request-spec/references/projects_factory.rb",
      "role": "reference",
      "description": "FactoryBot factory with a sequence and a trait.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/references/projects_factory.rb",
        "codex": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
        "cursor": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
        "gemini-cli": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
        "antigravity-cli": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
        "copilot": ".agents/skills/rspec-request-spec/references/projects_factory.rb"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_factory.rb",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/references/projects_factory.rb",
      "bytes": 199,
      "lang": "markdown",
      "content": "FactoryBot.define do\n  factory :project do\n    sequence(:name) { |n| \"Project #{n}\" }\n    status { \"active\" }\n    owner_id { 1 }\n\n    trait :archived do\n      status { \"archived\" }\n    end\n  end\nend\n"
    },
    {
      "path": "skills/rspec-request-spec/references/projects_spec.rb",
      "role": "reference",
      "description": "Ten request specs covering every case.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/references/projects_spec.rb",
        "codex": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
        "cursor": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
        "gemini-cli": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
        "antigravity-cli": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
        "copilot": ".agents/skills/rspec-request-spec/references/projects_spec.rb"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_spec.rb",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/references/projects_spec.rb",
      "bytes": 3118,
      "lang": "markdown",
      "content": "require \"rails_helper\"\n\nRSpec.describe \"Projects API\" do\n  let(:owner_headers) { { \"X-Owner-Id\" => \"1\" } }\n  let(:json) { response.parsed_body }\n\n  describe \"GET /projects\" do\n    it \"lists only the current owner's projects, by name\" do\n      create(:project, name: \"Beta\")\n      create(:project, name: \"Alpha\")\n      create(:project, name: \"Not mine\", owner_id: 2)\n\n      get \"/projects\", headers: owner_headers\n\n      expect(response).to have_http_status(:ok)\n      expect(json.pluck(\"name\")).to eq(%w[Alpha Beta])\n    end\n\n    it \"rejects a request with no owner\" do\n      get \"/projects\"\n\n      expect(response).to have_http_status(:unauthorized)\n    end\n  end\n\n  describe \"GET /projects/:id\" do\n    it \"hides another owner's project behind a 404\" do\n      other = create(:project, owner_id: 2)\n\n      get \"/projects/#{other.id}\", headers: owner_headers\n\n      expect(response).to have_http_status(:not_found)\n    end\n  end\n\n  describe \"POST /projects\" do\n    it \"creates a project for the current owner\" do\n      expect {\n        post \"/projects\", params: { project: { name: \"Launch\" } }, headers: owner_headers, as: :json\n      }.to change(Project, :count).by(1)\n\n      expect(response).to have_http_status(:created)\n      expect(json).to include(\"name\" => \"Launch\", \"status\" => \"active\", \"owner_id\" => 1)\n    end\n\n    it \"ignores an owner_id in the body\" do\n      post \"/projects\", params: { project: { name: \"Sneaky\", owner_id: 2 } }, headers: owner_headers, as: :json\n\n      expect(Project.last.owner_id).to eq(1)\n    end\n\n    it \"returns 422 with errors for a duplicate name\" do\n      create(:project, name: \"Launch\")\n\n      post \"/projects\", params: { project: { name: \"Launch\" } }, headers: owner_headers, as: :json\n\n      expect(response).to have_http_status(:unprocessable_content)\n      expect(json.dig(\"errors\", \"name\")).to include(\"has already been taken\")\n    end\n\n    # JSON bodies are wrapped under \"project\" by wrap_parameters, so send a form post\n    # to reach params.expect with the key missing.\n    it \"returns 400 when the project key is missing\" do\n      post \"/projects\", params: { name: \"Flat\" }, headers: owner_headers\n\n      expect(response).to have_http_status(:bad_request)\n    end\n  end\n\n  describe \"PATCH /projects/:id\" do\n    it \"archives a project\" do\n      project = create(:project)\n\n      patch \"/projects/#{project.id}\", params: { project: { status: \"archived\" } }, headers: owner_headers, as: :json\n\n      expect(response).to have_http_status(:ok)\n      expect(project.reload.status).to eq(\"archived\")\n    end\n\n    it \"rejects an unknown status\" do\n      project = create(:project)\n\n      patch \"/projects/#{project.id}\", params: { project: { status: \"deleted\" } }, headers: owner_headers, as: :json\n\n      expect(response).to have_http_status(:unprocessable_content)\n    end\n  end\n\n  describe \"DELETE /projects/:id\" do\n    it \"deletes the owner's project\" do\n      project = create(:project)\n\n      expect { delete \"/projects/#{project.id}\", headers: owner_headers }.to change(Project, :count).by(-1)\n      expect(response).to have_http_status(:no_content)\n    end\n  end\nend\n"
    },
    {
      "path": "skills/rspec-request-spec/references/rails_helper.rb",
      "role": "reference",
      "description": "rails_helper with FactoryBot and transactional fixtures.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/references/rails_helper.rb",
        "codex": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
        "cursor": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
        "gemini-cli": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
        "antigravity-cli": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
        "copilot": ".agents/skills/rspec-request-spec/references/rails_helper.rb"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rails_helper.rb",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/references/rails_helper.rb",
      "bytes": 681,
      "lang": "markdown",
      "content": "require \"spec_helper\"\nENV[\"RAILS_ENV\"] ||= \"test\"\nrequire_relative \"../config/environment\"\nabort(\"The Rails environment is running in production mode!\") if Rails.env.production?\nrequire \"rspec/rails\"\n\n# Load the schema into the test database. Apps with a persistent test database use\n# ActiveRecord::Migration.maintain_test_schema! instead.\nActiveRecord::Schema.verbose = false\nload Rails.root.join(\"db/schema.rb\")\n\nRSpec.configure do |config|\n  config.fixture_paths = [ Rails.root.join(\"spec/fixtures\") ]\n  config.use_transactional_fixtures = true\n  config.infer_spec_type_from_file_location!\n  config.filter_rails_from_backtrace!\n  config.include FactoryBot::Syntax::Methods\nend\n"
    },
    {
      "path": "skills/rspec-request-spec/references/spec_helper.rb",
      "role": "reference",
      "description": "spec_helper with random order and verified doubles.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/references/spec_helper.rb",
        "codex": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
        "cursor": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
        "gemini-cli": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
        "antigravity-cli": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
        "copilot": ".agents/skills/rspec-request-spec/references/spec_helper.rb"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/spec_helper.rb",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/references/spec_helper.rb",
      "bytes": 396,
      "lang": "markdown",
      "content": "RSpec.configure do |config|\n  config.expect_with :rspec do |expectations|\n    expectations.include_chain_clauses_in_custom_matcher_descriptions = true\n  end\n  config.mock_with :rspec do |mocks|\n    mocks.verify_partial_doubles = true\n  end\n  config.shared_context_metadata_behavior = :apply_to_host_groups\n  config.disable_monkey_patching!\n  config.order = :random\n  Kernel.srand config.seed\nend\n"
    },
    {
      "path": "skills/rspec-request-spec/references/rubocop.yml",
      "role": "reference",
      "description": "RuboCop config: omakase plus RSpec plugins.",
      "skill": "rspec-request-spec",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/rspec-request-spec/references/rubocop.yml",
        "codex": ".agents/skills/rspec-request-spec/references/rubocop.yml",
        "cursor": ".agents/skills/rspec-request-spec/references/rubocop.yml",
        "gemini-cli": ".agents/skills/rspec-request-spec/references/rubocop.yml",
        "antigravity-cli": ".agents/skills/rspec-request-spec/references/rubocop.yml",
        "copilot": ".agents/skills/rspec-request-spec/references/rubocop.yml"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rubocop.yml",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/rails-rspec/latest/skills/rspec-request-spec/references/rubocop.yml",
      "bytes": 251,
      "lang": "yaml",
      "content": "inherit_gem:\n  rubocop-rails-omakase: rubocop.yml\n\nplugins:\n  - rubocop-rspec\n  - rubocop-rspec_rails\n\nAllCops:\n  NewCops: enable\n  Exclude:\n    - \"db/schema.rb\"\n    - \"vendor/**/*\"\n\nRSpec/MultipleExpectations:\n  Max: 3\nRSpec/ExampleLength:\n  Max: 12\n"
    }
  ],
  "requires": {
    "tools": [
      "ruby",
      "bundle"
    ],
    "env": [],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": true,
    "scripts": [],
    "notes": "bundle install downloads Rails, RSpec, FactoryBot and RuboCop gems from rubygems.org. The specs use an in-memory SQLite database and make no network calls."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "antigravity-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://loadout.jnw-it.com/loadouts/rails-rspec/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/rails-rspec.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T20:59:33Z",
    "commit": "08c3710727a4d6fc320a98ecf32bdc0a780eaa6c",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 11 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 11 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 10 files, 1 skill in .claude/skills/",
          "Codex CLI: 9 files, 1 skill in .agents/skills/",
          "Cursor: 9 files, 1 skill in .agents/skills/",
          "Gemini CLI: 10 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 9 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 9 files, 1 skill in .agents/skills/"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "n/a",
        "summary": "No MCP servers in this loadout",
        "details": []
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network yes (listing says yes)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "1 reference between files resolves for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "11 files, 11.2 KB total; largest skills/rspec-request-spec/references/projects_spec.rb 3.0 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The rspec-request-spec skill's controller, model, factory and request spec run in a Rails 8.1.4 API app on rspec-rails 8.0.4 and FactoryBot 6.5.1: ten examples pass in random order, rubocop (omakase, rubocop-rspec, rubocop-rspec_rails) is clean, and removing the owner scope from the lookup fails the",
        "details": [
          "Applied 19 loadout files at every agent's paths",
          "✓ place the skill's files: bash -c R=.agents/skills/rspec-request-spec/references; mkdir -p spec/requests spec/factories && cp $R/project.rb app/models/ && cp $R/projects_controller.rb app/controllers/ && cp $R/projects_factory.rb spec/factories/projects.rb && cp $R/projects_spec.rb spec/requests/ && cp $R/rails_helper.rb $R/spec_helper.rb spec/ && cp $R/rubocop.yml .rubocop.yml && echo placed",
          "✓ bundle install (pinned gems): bash -c export BUNDLE_PATH=\"${BUNDLE_PATH:-$HOME/.cache/agent-loadout-verify/bundle}\"; bundle install --quiet && echo bundled",
          "✓ rspec (random order): bash -c export BUNDLE_PATH=\"${BUNDLE_PATH:-$HOME/.cache/agent-loadout-verify/bundle}\"; bundle exec rspec",
          "✓ rubocop with rubocop-rspec: bash -c export BUNDLE_PATH=\"${BUNDLE_PATH:-$HOME/.cache/agent-loadout-verify/bundle}\"; bundle exec rubocop app spec",
          "✓ an unscoped lookup fails the scoping spec: bash -c export BUNDLE_PATH=\"${BUNDLE_PATH:-$HOME/.cache/agent-loadout-verify/bundle}\"; sed -i 's/Project.owned_by(@owner_id).find_by(id: params\\[:id\\])/Project.find_by(id: params[:id])/' app/controllers/projects_controller.rb && grep -q 'Project.find_by(id:' app/controllers/projects_controller.rb && bundle exec rspec; test $? -ne 0 && echo caught",
          "Covers: Request specs for index, show, create, update and destroy with FactoryBot sequences and traits",
          "Covers: 422 with :unprocessable_content and field errors; 400 from params.expect; 401 without an owner",
          "Covers: Another owner's record is a 404 and never listed; owner_id in the body is ignored",
          "Covers: rubocop-rails-omakase with rubocop-rspec and rubocop-rspec_rails plugins"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/rspec-request-spec/SKILL.md",
          "target": ".claude/skills/rspec-request-spec/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_controller.rb",
          "target": ".claude/skills/rspec-request-spec/references/projects_controller.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_controller.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/project.rb",
          "target": ".claude/skills/rspec-request-spec/references/project.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/project.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_factory.rb",
          "target": ".claude/skills/rspec-request-spec/references/projects_factory.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_factory.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_spec.rb",
          "target": ".claude/skills/rspec-request-spec/references/projects_spec.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_spec.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rails_helper.rb",
          "target": ".claude/skills/rspec-request-spec/references/rails_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rails_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/spec_helper.rb",
          "target": ".claude/skills/rspec-request-spec/references/spec_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/spec_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rubocop.yml",
          "target": ".claude/skills/rspec-request-spec/references/rubocop.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rubocop.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/rails-rspec/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/rspec-request-spec/SKILL.md",
          "target": ".agents/skills/rspec-request-spec/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_controller.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_controller.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/project.rb",
          "target": ".agents/skills/rspec-request-spec/references/project.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/project.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_factory.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_factory.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_spec.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_spec.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rails_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rails_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/spec_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/spec_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rubocop.yml",
          "target": ".agents/skills/rspec-request-spec/references/rubocop.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rubocop.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/rails-rspec/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/rspec-request-spec/SKILL.md",
          "target": ".agents/skills/rspec-request-spec/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_controller.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_controller.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/project.rb",
          "target": ".agents/skills/rspec-request-spec/references/project.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/project.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_factory.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_factory.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_spec.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_spec.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rails_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rails_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/spec_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/spec_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rubocop.yml",
          "target": ".agents/skills/rspec-request-spec/references/rubocop.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rubocop.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/rails-rspec/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/rspec-request-spec/SKILL.md",
          "target": ".agents/skills/rspec-request-spec/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_controller.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_controller.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/project.rb",
          "target": ".agents/skills/rspec-request-spec/references/project.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/project.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_factory.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_factory.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_spec.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_spec.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rails_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rails_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/spec_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/spec_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rubocop.yml",
          "target": ".agents/skills/rspec-request-spec/references/rubocop.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rubocop.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/rails-rspec/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/rspec-request-spec/SKILL.md",
          "target": ".agents/skills/rspec-request-spec/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_controller.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_controller.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/project.rb",
          "target": ".agents/skills/rspec-request-spec/references/project.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/project.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_factory.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_factory.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_spec.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_spec.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rails_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rails_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/spec_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/spec_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rubocop.yml",
          "target": ".agents/skills/rspec-request-spec/references/rubocop.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rubocop.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/rails-rspec/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/rspec-request-spec/SKILL.md",
          "target": ".agents/skills/rspec-request-spec/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_controller.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_controller.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_controller.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/project.rb",
          "target": ".agents/skills/rspec-request-spec/references/project.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/project.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_factory.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_factory.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_factory.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/projects_spec.rb",
          "target": ".agents/skills/rspec-request-spec/references/projects_spec.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/projects_spec.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rails_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/rails_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rails_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/spec_helper.rb",
          "target": ".agents/skills/rspec-request-spec/references/spec_helper.rb",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/spec_helper.rb",
          "role": "reference"
        },
        {
          "path": "skills/rspec-request-spec/references/rubocop.yml",
          "target": ".agents/skills/rspec-request-spec/references/rubocop.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/rails-rspec/1.0.0/skills/rspec-request-spec/references/rubocop.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/rails-rspec/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/rails-rspec/source.zip"
}