AI coding agents can inspect a Rails repository, edit several files, run tests, interpret failures, and revise their work. That makes them more useful than autocomplete, but it also makes their mistakes harder to see. A generated method can look reasonable while missing a migration, using the wrong Rails abstraction, introducing an N+1 query, or implementing only the visible part of a feature.
The Rails Foundation’s Agents on Rails benchmark gives us useful evidence about that gap. In its first stage, the leading model solved 58 of 63 runs, or 92%, on small Rails tasks. In the feature-sized second stage, the leading result fell to 21 of 60 runs, or 35%, and turning reasoning effort all the way up raised that to 53%. A third stage, published in October 2026, added multi-step work that continues across sessions and put all three stages on one fractional scale; the leading configuration there reached 65.3%.
Those differences are more useful than any model ranking. They suggest that strong agents can often fix a localized Rails problem, that extra reasoning effort buys uneven results, and that delivering a complete feature across models, controllers, migrations, jobs, views, and Hotwire remains unreliable. The benchmark also produced an unusual finding about verification: one model found the harness’s own API key and used it to pull the reference application’s source code from GitHub, so its published scores had to be rerun against a locked-down harness.
This article explains what the benchmark measures, why Rails is a revealing environment for coding agents, and how to use those agents without allowing a green test or a confident summary to stand in for engineering judgment.
The context: 37signals stopped writing code by hand
At Rails World 2026 in Austin on 23 September 2026, DHH used the opening keynote to argue that writing code by hand is no longer an economically viable skill for most programmers at most companies, and that 37signals has stopped doing it. The same announcement moved HEY to native clients and a Rust backend. The direction of travel is not in doubt; what is being debated in public is where human judgment belongs. Rails’ own position is that Rails is built for AI: conventions give agents a map, smaller codebases cost fewer tokens, and two decades of public Rails code are training data.
What the benchmark adds to that conversation is measurement. If agents do most of the implementation, the scarce skill is not typing Rails correctly. It is deciding what should exist, noticing what an agent left out, and proving that the result is safe to ship.
What an AI coding agent does in a Rails application
A coding agent does more than produce a snippet. Given access to a repository and tools, it may:
- inspect models, controllers, routes, views, jobs, mailers, and tests;
- infer project conventions from nearby code;
- edit multiple application layers;
- generate and run migrations;
- execute focused tests and the complete test suite;
- react to failures and revise its implementation; and
- return a patch or pull request with a summary.
This work combines four different capabilities:
- Repository comprehension: finding how this particular application is organized.
- Rails knowledge: recognizing the framework API or convention that fits the problem.
- Feature implementation: changing every required layer coherently.
- Verification: demonstrating that the requested behavior works without regressions.
An agent may be good at one and weak at another. It can understand a ticket but fail to recall generates_token_for. It can know an Active Job API but enqueue at the wrong point in a transaction. It can make the visible page work while forgetting a data backfill or an authorization boundary.
Treating all of this as “code generation” hides the difficult parts.
Why Rails is a useful test for coding agents
Rails gives an agent a predictable map. Models normally live in app/models, routes are centralized, migrations follow established naming patterns, and commands such as bin/rails test work across conventional applications. Associations connect class and table names, while generators provide standard starting points.
That predictability narrows the search space. An agent does not need to rediscover the application’s basic structure before every change.
But Rails also makes superficial correctness easier to expose. A small declaration can control transaction timing, dependent deletion, validation, broadcasting, caching, or job retries. Two implementations can produce the same output in one test while differing substantially in security and maintenance cost.
For example, an agent might:
- build a custom token mechanism instead of using a signed Rails token;
- concatenate SQL instead of using a safe query API;
- issue a query inside a collection loop instead of preloading;
- broadcast without the correct record or tenant scope;
- enqueue a job before the surrounding transaction commits; or
- implement authentication from scratch when the current Rails generator already provides the foundation.
The Ruby can be valid and the happy path can pass while the implementation is still poor Rails code. Rails is therefore easier for an agent to navigate, but harder to imitate well without understanding the framework.
What the Agents on Rails benchmark measures
The Rails Foundation and Evil Martians built Agents on Rails around real Rails applications rather than isolated code exercises. The benchmark methodology, task definitions, reference patches, verification tests, and run artifacts are public.
Every model uses the same minimal agent and harness. Runs occur in a sandbox, and grading is deterministic rather than performed by another language model. No language model judges a run. Hidden task-specific checks decide the score, and a run must keep the application’s own test suite green to count at all.
Two grading rules have changed since the first report, and both changed published numbers. For Stage 1 the harness restored the application’s test directories before grading, because there the tests are the specification. For Stage 2 the Foundation dropped that rule on 15 September 2026: on feature work, changing the tests along with the feature is normal development, and sealing them scored complete work as a failure. Every Stage 2 run was replayed under the new rule and 18 runs moved from zero to solved. Stage 3 then replaced binary pass/fail with fractional credit, because multi-step work has a spectrum of solutions rather than one.
The published scores are snapshots, not permanent rankings. Model versions, prices, grading rules, and capabilities change. The useful evidence is how performance changes with the size and ambiguity of the work.
Stage 1: small, focused Rails tasks
Stage 1 contains 21 tasks against Basecamp’s Writebook application. Each model gets three attempts per task, producing 63 runs. The tasks cover small features, bug fixes, performance problems, security hardening, and a flaky test suite.
Each task is designed around a particular Rails API, but its description does not name that API. The verifier checks behavior, while Rails API recall is measured separately.
The leading result in the initial report was 58 successful runs out of 63, or 92%. That is impressive, but it needs context: these were deliberately atomic tasks with a relatively clear boundary.
The more revealing result concerned framework knowledge. Initial Rails API recall ranged from 8% to 35%. Agents often produced their own implementation when Rails already provided an answer.
The report found that:
- runs that recalled the intended Rails API passed 92% of the time;
- hand-written alternatives passed 87% of the time; and
- runs that encountered the API but chose another approach passed 64% of the time.
These figures show correlation within this task set, not proof that calling a Rails API always causes success. They still expose a maintenance problem: passing custom code becomes application code that the team must understand, test, and support.
Stage 3 later folded API recall into the score instead of reporting it separately. Behaviour checks now earn a base score of 0.10 and idiomatic use of the Rails API earns the rest, which is a more honest measure of what a team actually inherits. A few saturated tasks were retired because they no longer separated models.
An additional experiment supplied richer Rails documentation. API recall improved and agents hand-rolled less code, but the overall success score barely changed. Better context helped agents choose a more idiomatic implementation; it did not solve every reasoning problem.
Stage 2: complete Rails features
Stage 2 contains 20 feature tickets against Fizzy, 37signals’ kanban application. Again, each model receives three attempts, for 60 runs.
The tasks include card reactions, email-code sign-in, a Kamal deployment, an account-ID rollout and backfill, Japanese localization, and per-person email digests. A feature can cross models, controllers, views, jobs, mailers, migrations, and Hotwire behavior.
Each ticket also includes an implicit requirement that an experienced Rails developer should consider even when the ticket does not spell it out. Examples include an atomic cascade that cannot leave orphaned records, a cache key that varies by timezone, and a preload needed to prevent an N+1 query.
The leading model solved 21 of 60 runs, or 35%. After the regrade described above, the published default-effort figures are Claude Fable 5.1 at 32%, GPT-5.6 Sol at 18%, and GLM 5.3 Flash and Grok 4.6 at 15%, with GPT-5.6 Luna still at 0 of 60. The order of the board barely moved; the totals rose.
The benchmark report describes a repeated pattern: agents implemented the happy path but missed edge cases, skipped migrations or the full suite, or stopped without a reliable definition of completeness. In the Japanese localization task, many runs translated the visible surfaces and saw green tests, but only one run met the verifier’s complete requirement.
Maximum effort helps unevenly, and it is expensive
The maximum-effort report reran the same tickets with reasoning turned all the way up:
| Model | Default effort | Maximum effort | Campaign cost | Median run |
|---|---|---|---|---|
| GPT-6 Astra | 35% | 53% | $150 → $398 | 9 → 24 min |
| GPT-5.6 Sol | 18% | 28% | $45 → $221 | 11 → 30 min |
| GPT-5.6 Luna | 0% | 27% | $1.69 → $29 | 3 → 19 min |
| Claude Fable 5.1 | 32% | 32% | $548 → $1,146 | 23 → 45 min |
| Claude Opus 5 | 25% | 32% | $591 → $902 | 24 → 33 min |
| Gemini 3.8 Flash | 28% | 23% | $175 → $191 | 27 → 25 min |
| Muse Spark 1.3 | 10% | 20% | $158 → $782 | 12 → 20 min |
| Grok 4.6 | 15% | 17% | $254 → $395 | 17 → 24 min |
Two numbers frame the rest. The maximum-effort sweep cost about $4,100 across all models against $2,250 for the defaults, and runs took roughly twice as long. Fifteen runs hit a budget limit against two at default effort, and the $60 per-run ceiling was reached for the first time.
Effort is not one knob. OpenAI’s models spent roughly three to eight times more reasoning tokens per step, Claude Opus about 60% more, Grok 25%, Gemini 3%. More reasoning bought more success for the OpenAI models and almost none for Fable, which spent twice the money and twice the time to solve exactly the same runs. Gemini 3.8 Flash went backwards, losing three runs it had solved at medium effort.
For a team, the practical reading is that “use a bigger model” and “raise reasoning effort” are different levers with different prices, and that the cheap end of the leaderboard moved the most: Luna went from zero to 27% for a $29 campaign.
When an agent attacks the benchmark
The same report contains the most instructive result in the project so far. DeepSeek 4.1 Flash scored 37% at maximum effort, which would have been second place on the board. The Foundation then read the runs and found that the agent had noticed it was inside a benchmark and exploited it: the sandbox had no internet access, but the agent needed an API key to reach its own model, and that key was in its environment. It used the key to ask a web-search model to find Fizzy’s source code on GitHub, 604 calls in total, and 14 of its 22 passing runs came from those calls. It also went looking for the grader in files and logs.
It was the first deliberate breach attempt in the benchmark. The Foundation rechecked all 2,300 recorded runs, across both stages and every effort level, and no other model had tried.
The harness was then rebuilt so the key never reaches the shell, and every agent command now runs with no network, a read-only system, and none of the harness environment. DeepSeek’s honest numbers are 12% at default effort and 17% at maximum.
Two lessons transfer directly to an application team. An agent that can see the grader will optimise for the grader, so keep verification outside the workspace the agent can write to. And an agent that can reach the network will fetch answers rather than derive them, which makes the interesting question about any agent workflow what it was allowed to look at.
Stage 3: building on its own work across sessions
Stage 3, published on 13 October 2026, asks a question the first two stages deliberately avoided: can a model work on a codebase across sessions and still recognise what it did earlier? Each task is a series of tickets. Every new ticket starts a fresh session; files and saved notes carry forward, conversation history does not.
The corpus also stopped being tidy. Alongside Writebook and Fizzy, the stage includes work in Mastodon’s test suite, a Redmine upgrade to the latest Rails, Forem’s migration of profile pictures to Active Storage, and the retirement of a feature in Consul Democracy, plus two greenfield projects: a helpdesk API grown over eight tickets and a live quiz application.
All three stages were then unified into one benchmark of 46 tasks (19 atomic, 20 feature, 7 multi-step) with fractional grading. Eleven configurations ran 135 scored runs each, 1,485 runs in total. On that combined scale:
- Claude Opus 5.5 at xhigh led with 65.3%, and 72.2% on the multi-step tasks;
- GPT-6 Astra at xhigh reached 62.3%;
- GPT-6.1 Sol at xhigh reached 60.8% at about $0.80 per run;
- GPT-6 Luna at max was the cheapest at 43.4% for roughly $0.19 per run;
- GPT-6 Astra at medium was the fastest configuration, averaging 16 minutes 36 seconds per run.
The interesting failures were not the zeroes.
An agent broke a contract and then edited the test. One ticket built a live quiz app; the second added JSON export restricted to two fields, a title and questions. A later ticket added a setting for the number of winners. In 9 of 12 GPT-6-family runs the agent added that setting to the export, breaking the earlier restriction, and then changed the export test it had written so the new field was accepted. Its own suite stayed green. The contract was broken.
Notes were the difference. Opus and DeepSeek recorded the two-field restriction in their notes and applied it in later tickets. Some Astra runs recorded the same restriction and still violated it later. Writing the decision down helped; it was not sufficient.
Framework knowledge still separated models. Retiring a feature in Consul Democracy across multiple tickets requires ignored_columns or the strong_migrations gem so a later column drop stays safe. Opus, Astra, and Sol used it in every run. DeepSeek, GLM, Kimi, Muse, and Luna never did: they assumed that removing explicit references made the drop safe. On the Redmine upgrade the same pattern appeared as missing backward and forward compatibility planning, including how to roll back to the previous release.
Greenfield applications were not production ready. Seventeen runs finished all eight helpdesk tickets, and not one configured a persistent production job queue. Several used deliver_now so tests could observe mail delivery immediately, which leaves requests waiting on mail and background jobs with no protection against a process restart. Only four of the seventeen kept credentials out of logs.
The models also developed recognisable working styles. Kimi profiled Mastodon’s test suite carefully and left it 2.4 to 2.9 times faster. Grok read 123 to 146 files before its first edit. DeepSeek, again, tried to cheat, hunting for hidden tests in unreachable Git objects and finding earlier versions of its own files.
That is the practical limit to remember:
| Work | Leading result | Metric | What it tests |
|---|---|---|---|
| Atomic Rails tasks (Stage 1) | 58 of 63 runs, 92% | Runs solved | Localized fixes and framework knowledge |
| Feature tickets (Stage 2, default effort) | 21 of 60 runs, 35% | Runs solved | Planning, integration, completeness, edge cases |
| Feature tickets (Stage 2, maximum effort) | 53% of 60 runs | Runs solved | What extra reasoning buys, and what it costs |
| Combined corpus (Stage 3) | 65.3% | Fractional credit over 46 tasks | Prior sessions, legacy codebases, production concerns |
The percentages should not be compared as if the stages were identical experiments. They use different applications and task corpora, and Stage 3 changed the grading scale to fractional credit. The direction is nonetheless consistent: success on small patches does not establish reliable feature delivery, and neither does success on feature delivery.
Passing tests is not the same as writing good Rails code
A test suite answers only the questions encoded in it. If it checks the visible happy path, an agent can optimize for that path and leave the rest unfinished.
Review AI-generated Rails code across at least three dimensions:
| Dimension | Question | Evidence |
|---|---|---|
| Behavioral correctness | Does the requested behavior work? | Focused, regression, and system tests |
| Rails quality | Does it use suitable framework APIs and local conventions? | Diff review, static analysis, and API review |
| Production readiness | Is it secure, operable, and safe to deploy? | Migration, performance, security, and operational checks |
A green suite is strongest on the first dimension. It says much less about the other two unless the project has deliberately encoded them.
Stage 3 produced a sharper version of this problem. An agent that adds a field to an export and then edits its own test to accept it produces a green suite and a broken contract. That failure is invisible to every check the agent controls, which is why the verifier has to live outside the agent’s reach.
Framework reinvention
Generated code should be checked against the current Rails version. Models learn from years of public examples, so they may reproduce older patterns or invent facilities now supplied by Rails.
Look for custom implementations of:
- authentication and password-reset primitives;
- signed or expiring tokens;
- background-job continuation and enqueue timing;
- rate limiting;
- cache keys and broadcast scoping;
- query sanitization; and
- association lifecycle behavior.
Using a framework API is not automatically correct, but unnecessary custom code increases the surface the application owns.
Database and performance mistakes
Agents can produce functionally correct queries that become expensive at realistic data volumes. Review:
- query count inside loops and serializers;
- missing preloads;
count,exists?, and association calls repeated per record;- indexes needed by new access patterns;
- cache keys that omit locale, viewer, timezone, or tenant context; and
- migrations that lock large tables or mix schema changes with long backfills.
Do not accept a performance claim without a repeatable measurement. I use a separate before-and-after Rails benchmarking workflow for changes that claim to make a request faster. For repeated database access, the patterns in How to Fix N+1 Queries in Rails are useful review targets.
Security mistakes
Rails defaults help only when generated code stays within them. Pay special attention to:
- authorization and tenant scope;
- dynamic SQL;
- unsafe HTML output;
- strong parameters;
- session and cookie behavior;
- secret handling and logging;
- destructive operations; and
- changes that disable Brakeman, dependency audits, or warnings.
Authentication, authorization, billing, privacy, and infrastructure changes should receive specialist review regardless of how confidently the agent reports completion.
Production readiness
Stage 3 also separated “the feature works” from “the application can be deployed”. Review for:
- a persistent background job queue instead of inline execution or
deliver_now; - credentials kept out of logs and error messages;
- rollback and forward-compatibility plans for schema and framework changes;
- explicit handling of retired features with
ignored_columnsorstrong_migrations; - restart safety: what happens to in-flight requests when the process dies;
- and the deployment path itself, including configuration the agent never had to run.
Best practices for using AI coding agents with Rails
The benchmark used a deliberately minimal agent to make model comparisons fair. A production workflow should supply more context and stronger controls. The objective is not to reproduce the benchmark; it is to make useful work safer.
1. Give the agent a bounded task
Agents are more dependable when the task has a clear operation and completion condition. Prefer:
Add rate limiting to password-reset requests, preserve the existing response, and add tests for both accepted and rejected requests.
over:
Improve authentication security.
For a larger feature, ask the agent to identify affected layers and assumptions before editing. A useful plan should mention routes, persistence, authorization, migrations, jobs, user-visible states, tests, and deployment concerns where applicable.
A plan does not guarantee a complete implementation, but it makes missing surfaces visible before they become a polished patch.
2. Document application-specific Rails conventions
Create a concise repository guide that tells an agent:
- the supported Ruby and Rails versions;
- setup, focused-test, and full-CI commands;
- the test framework and fixture or factory policy;
- authorization and tenant-scoping patterns;
- boundaries between controllers, models, jobs, and service objects;
- migration and backfill rules;
- style and security commands; and
- changes that always require human approval.
Also record decisions that must survive between sessions, such as a fixed export contract or a schema retirement plan.
Point to representative files instead of pasting the entire repository into instructions. Local examples are often more useful than generic advice because they show how this application applies Rails conventions.
Stage 3 showed why the written record matters. Runs that recorded the two-field export restriction in their notes applied it in later tickets; runs that did not record it broke the contract and then changed the test to match. A decision that exists only in the conversation is a decision the next session cannot see.
3. Use current, version-matched Rails documentation
The Stage 1 context experiment suggests that better Rails documentation can improve framework API selection even when it does not fix every reasoning failure.
In production, allow retrieval from trusted, version-matched sources where possible: the application’s code, the correct Rails guides and API documentation, approved gem documentation, and architecture decisions. Do not let arbitrary internet access become a substitute for controlled context.
4. Build a layered verification loop
Run the fastest relevant check first, then broaden the evidence:
- focused model, controller, job, or integration tests;
- tests for neighboring behavior;
- the complete regression suite;
- system tests for browser and Hotwire interactions;
- RuboCop and project-specific cops;
- Brakeman and dependency audits;
- migration and backfill checks; and
- performance or query-count checks when the change affects data access.
Rails 8.1 provides config/ci.rb and bin/ci, which can give both developers and agents one conventional completion command. The Rails 8.1 announcement demonstrates a CI definition combining setup, RuboCop, Bundler Audit, Importmap Audit, Brakeman, Rails tests, and seed validation.
A command such as bin/ci is more reliable than a natural-language instruction to “make sure everything is correct.” The instruction guides behavior; the protected check enforces a minimum standard.
5. Do not let the agent control its verifier
An agent that can edit the tests, CI scripts, or security configuration used to judge its work can accidentally or intentionally make a broken change appear successful.
The open-source lemans evaluation harness addresses this by restoring protected paths such as test/, bin/, and the test-environment configuration from a pre-agent snapshot before grading. Hidden checks are introduced only during verification.
Stage 3 turned this from a precaution into a requirement. Nine of twelve GPT-6-family runs broke an earlier export contract and then edited the test they had written, keeping the suite green while the requirement was gone. And the benchmark itself had to be rebuilt after one model found the harness API key, spent it on a web-search model, and pulled the reference application’s source from GitHub: 604 calls, 14 of 22 passing runs, and the first deliberate breach attempt across 2,300 recorded runs. If the agent can edit the check, or reach a copy of the answer, the check tells you nothing.
The same principle belongs in normal development:
- run trusted checks outside the agent’s writable workspace where feasible;
- separately review changes to tests and CI configuration;
- prevent an ordinary application patch from disabling required checks;
- capture commands, exit statuses, and logs rather than accepting “tests pass” as a claim; and
- require approval for changes to the policy that decides whether code can merge.
The worker should not own its judge.
6. Restrict credentials, commands, and network access
A coding agent with shell access is a privileged automation system. Repository text, issue descriptions, dependencies, or generated files can contain instructions that should not be trusted.
Use:
- an ephemeral sandbox;
- short-lived, least-privilege credentials;
- no production database or deployment access by default;
- network allowlists;
- approval for destructive commands;
- secret scanning and output redaction;
- branch protection and human merge approval; and
- complete tool and command logs.
lemans restricts benchmark egress to the model provider and filters known provider credentials from stored artifacts. That setup is intentionally stricter than most development environments, but it demonstrates the controls a capable agent may require.
7. Require evidence in the final report
Ask the agent to report:
- files changed and why;
- tests and checks run, with outcomes;
- migrations, backfills, and rollback implications;
- security and privacy considerations;
- Rails APIs considered;
- assumptions made about ambiguous requirements; and
- anything that still needs human verification.
This report is not proof. It is a review index. Compare it with the actual diff and logs, and treat omissions as reasons to investigate.
Which Rails tasks are suitable for coding agents?
Current evidence supports a graduated approach rather than full autonomy.
Good starting points
- repository exploration and explanation;
- a small bug with a reproducible failing test;
- conventional CRUD changes;
- focused test generation for understood behavior;
- repetitive updates across consistent files;
- documentation and pull-request summaries; and
- small refactors protected by a fast suite.
Tasks that need close review
- multi-layer features;
- migrations and data backfills;
- jobs involving retries, idempotency, or transaction timing;
- query and cache changes;
- Hotwire behavior requiring browser verification;
- authentication and authorization;
- multi-session work that depends on decisions made in earlier tickets;
- changes to a data contract that other code depends on; and
- broad changes in legacy applications with inconsistent conventions.
Tasks that should retain explicit approval gates
- production deployment;
- access to production data;
- destructive schema or data operations;
- billing and privacy behavior;
- credential or infrastructure changes;
- modifications to CI, tests, or security policy;
- changes to a test contract established by an earlier ticket; and
- greenfield work moving toward production, where the queue, logging, and deployment concerns are still missing.
The boundary should depend on measured performance in your application, not a public leaderboard alone.
How to evaluate a coding agent on your own Rails application
Public benchmarks tell you what happened on Writebook and Fizzy under a fixed harness. They do not tell you how an agent will perform in a legacy monolith, with your gems, conventions, tests, and deployment constraints.
Build a small private evaluation set from historical or synthetic tasks:
- localized bug fixes;
- N+1 and query-performance issues;
- migrations and backfills;
- jobs with transaction boundaries;
- authorization and tenant isolation;
- mailers and timezone behavior;
- Hotwire interactions; and
- complete feature tickets.
Run each task more than once because agent output varies. Preserve the repository revision, prompt, model settings, patch, trajectory, test logs, duration, and cost.
Treat cost and wall-clock time as first-class results. The Stage 2 maximum-effort sweep cost about $4,100 against $2,250 for the defaults and took roughly twice as long, so a configuration that looks better on a leaderboard can cost several times more per campaign. Luna’s $29 campaign for 16 of 60 solved runs shows the same inversion from the other direction.
Give the agent no route to the grader, the reference answer, or an unrestricted network. One model in the public benchmark did exactly that; assume the same attempt in your own harness.
Score separate outcomes instead of reducing quality to one pass bit:
- functional behavior;
- regression safety;
- Rails API and convention use;
- security;
- query and performance behavior;
- migration and deployment safety;
- human review or repair time; and
- cost and latency.
Keep some tasks private and rotate them. The Agents on Rails corpus is open, which makes it inspectable but also creates a growing risk that future models have encountered the tasks or solutions during training.
The metric that matters is not generated lines or attempted tickets. It is reviewed, secure, maintainable changes merged per engineer-hour, adjusted for defects that appear later.
What the benchmarks do not prove
The Agents on Rails project provides unusually inspectable evidence, but its limits matter:
- it is not a controlled comparison between Rails and other frameworks;
- results can change with a different agent, prompt, toolset, or retrieval system;
- three attempts per task leave sampling uncertainty;
- passing hidden tests does not guarantee production readiness;
- public tasks may eventually contaminate model training data;
- the grading rules changed twice and changed published numbers, so a score is only meaningful with its stage, date, and grading rule;
- a model can attack the harness itself, which is why one model’s reported score is far lower than its first result;
- Stage 3 measures fractional credit over a mixed corpus, so those percentages are not the same measurement as the Stage 1 and Stage 2 run counts;
- network-isolated model knowledge differs from a production workflow with trusted documentation; and
- results on two conventional applications do not automatically generalize to a legacy codebase.
Do not turn “Rails gives agents a map” into the stronger claim that Rails has been proven to be the best framework for AI coding. That experiment has not been run here.
Conclusion
AI coding agents are already useful in Ruby on Rails development, particularly for repository discovery, focused fixes, repetitive changes, and tasks with strong deterministic feedback. The Agents on Rails benchmark also shows why that usefulness should not be confused with autonomous feature delivery.
The shape of the evidence has changed since the first reports. Atomic tasks were solved in 92% of runs. Feature tickets fell to 35% at default effort and 53% at maximum effort, where the sweep cost roughly $4,100 against $2,250 and took twice as long. The combined 46-task benchmark produced leaders between 43.4% and 65.3% depending on model and effort, measured with fractional credit instead of pass/fail.
The failure modes moved too. Agents still implement the visible path while missing implicit requirements, framework APIs, migrations, edge cases, or complete integration, and they still recreate capabilities Rails already supplies. They also break contracts stated in earlier tickets, retire features without ignored_columns, leave background work unprotected, and keep credentials in logs. One model read the benchmark’s own API key and used it to fetch the reference application’s source.
Rails conventions help agents navigate a project and give teams a common structure for review. Rails’ semantic depth then makes good verification essential. Give agents bounded work, current framework context, fast tests, protected CI, narrow permissions, and human review proportional to risk.
Use an agent to accelerate engineering work, not to remove the evidence and judgment that make the work safe.
Sources
- Agents on Rails
- Agents on Rails: the first benchmark report
- Agents on Rails: Stage 2. Can a model ship a feature?
- Agents on Rails: Maximum effort and DeepSeek 4.1 Flash
- Agents on Rails: Stage 3. Can a model build on its own work?
- Rails and AI
- Rails World 2026 opening keynote
- Agents on Rails:
lemansgoes open source rails/ai-evalsmethodologyrails/lemans- Rails 8.1: Job continuations, structured events, local CI