Public repo 2026

agents-fyi upgrader

Moves a Rails application one release at a time, and records what the move cost.

A Ruby client of the agents-fyi service that reads an application's Gemfile.lock, asks the service what a move crosses, and applies only what the service calls mechanical. It runs the application's suite before and after the move on a working copy it owns, and records the patch, every command with its exit code, the interpreter it ran on and the decisions a machine may not make. The ladder — what each Rails release changed and which of those changes a machine may make — lives in the service, not in the client.

Documented example

A plan for a public Rails application, called live (abridged)

./bin/agents-fyi-upgrader plan --repo https://github.com/shoutsid/biddingapp --to 7.1.0 --api https://agents.shoutsid.fyi
https://github.com/shoutsid/biddingapp at eaa823724dd1c074550aa5dc887f0b7ccd1f64eb
on Rails 4.0.0.rc1, read from `rails` in Gemfile.lock
Ruby floor this move needs: 2.7.0 (Rails 7.0.0 requires it; per step below)
9 step(s): Rails 4.1 -> Rails 4.2 -> Rails 5.0 -> Rails 5.1 -> Rails 5.2 -> Rails 6.0 -> Rails 6.1 -> Rails 7.0 -> Rails 7.1

== Rails 4.1 (4.0.0 -> 4.1.0)
   requires Ruby 1.9.3 or newer
   10 documented change(s): 0 a machine can apply, 10 need a decision
   decide: render :text -> render plain: / render html: / render body: (renamed; 4.0 → 4.1, Rendering content from string) [raises by your target]
   …
   executed here: 0 — nothing this corpus executed falls inside this step's window, so the list above is Rails' own guide rather than a finding

== Rails 5.0 (4.2.0 -> 5.0.0)
   requires Ruby 2.2.2 or newer
   17 documented change(s): 5 a machine can apply, 12 need a decision
   apply:  before_filter -> before_action (renamed; 5.0, controller filters) [raises by your target]
   …
   executed here: 0 — nothing this corpus executed falls inside this step's window, so the list above is Rails' own guide rather than a finding

== Rails 7.1 (7.0.0 -> 7.1.0)
   …

What it does

  • plan splits a move into mechanical changes and decisions for a person; step executes one rung and never writes to the caller's own repository.
  • The client keeps no copy of Rails' release order, and there is no default service: a walker that quietly used its author's deployment would answer from a corpus the caller did not choose.
  • A pass is a suite green before the move and green after it, on a named interpreter, with the baseline, the commands, their exit codes and the patch in the record.
  • Exit status is part of the contract: 0 for a plan or a pass, 2 for a refusal about the move, 1 for a failure about the repository, the service or the machine. unverified exits 1.
  • preview renders the review brief a stored record would publish, with no checkout, token or push; republish re-renders delivered pull requests from their records.
  • The repository is public to read and proprietary: no use, copying or redistribution is licensed.

Built with

  • Ruby
  • Rails
  • Docker
  • Git
  • GitHub

Writing