Why
Ruby 3.2 reached end of life on 2026-04-01. 3.4 is the only branch in normal maintenance that Rails 7.2/8.x officially supports.
This lands after Rails 7.2 rather than before, because Rails 7.1 does not officially support Ruby 3.4 (that starts at 7.2.2 / 8.0.1). Doing the framework bump first removes the constraint and makes an intermediate stop at 3.3.12 unnecessary.
Trade-off worth stating: this keeps the app on EOL Ruby until this issue lands. If that is unacceptable, split into 3.2 -> 3.3.12 early (3.3 is supported by both Rails 7.1 and 7.2) and 3.3 -> 3.4 here.
Scope — six files must move together
/.ruby-version 3.2.3 -> 3.4.10
/.tool-versions ruby 3.2.3 -> ruby 3.4.10
/backend/.ruby-version 3.2.3 -> 3.4.10
/backend/Gemfile ruby "3.2.3" -> ruby "3.4.10"
/backend/Dockerfile FROM ruby:3.2.3 -> FROM ruby:3.4.10
/backend/Gemfile.lock RUBY VERSION (regenerate: bundle lock)
Plus docs: README.md, CLAUDE.md.
Trap: .ruby-version exists at the repo root and in backend/, and CI reads both — the erb-lint job resolves the root one while standardrb, rspec and brakeman resolve backend/. Bump both in the same commit. (The prep issue makes erb-lint consistent with the others, which reduces but does not remove this.)
Notes
Ruby 3.4 extracted several stdlibs to bundled gems. Checked the current lockfile: base64, bigdecimal, drb, mutex_m, logger, benchmark, csv, stringio are all already explicit entries. The one gap is ostruct, which Mongoid 9.1 adds as an explicit runtime dep. Worth a grep -rn "OpenStruct" app/ lib/ to confirm nothing else reaches for it.
Also confirm the Heroku stack supports 3.4 before deploying; the version is picked up from the Gemfile.
Acceptance criteria
Blocked by
#883 (Rails 7.2). Blocks #886.
Part of the Ruby + Rails upgrade sequence. Ruby 3.2 reached end of life on 2026-04-01 and the backend is on Rails 7.1; the goal is Ruby 3.4.10 and Rails 8.1, in steps that each keep CI green and are independently deployable.
Why
Ruby 3.2 reached end of life on 2026-04-01. 3.4 is the only branch in normal maintenance that Rails 7.2/8.x officially supports.
This lands after Rails 7.2 rather than before, because Rails 7.1 does not officially support Ruby 3.4 (that starts at 7.2.2 / 8.0.1). Doing the framework bump first removes the constraint and makes an intermediate stop at 3.3.12 unnecessary.
Trade-off worth stating: this keeps the app on EOL Ruby until this issue lands. If that is unacceptable, split into 3.2 -> 3.3.12 early (3.3 is supported by both Rails 7.1 and 7.2) and 3.3 -> 3.4 here.
Scope — six files must move together
Plus docs:
README.md,CLAUDE.md.Trap:
.ruby-versionexists at the repo root and inbackend/, and CI reads both — theerb-lintjob resolves the root one whilestandardrb,rspecandbrakemanresolvebackend/. Bump both in the same commit. (The prep issue makeserb-lintconsistent with the others, which reduces but does not remove this.)Notes
Ruby 3.4 extracted several stdlibs to bundled gems. Checked the current lockfile:
base64,bigdecimal,drb,mutex_m,logger,benchmark,csv,stringioare all already explicit entries. The one gap isostruct, which Mongoid 9.1 adds as an explicit runtime dep. Worth agrep -rn "OpenStruct" app/ lib/to confirm nothing else reaches for it.Also confirm the Heroku stack supports 3.4 before deploying; the version is picked up from the
Gemfile.Acceptance criteria
Blocked by
#883 (Rails 7.2). Blocks #886.
Part of the Ruby + Rails upgrade sequence. Ruby 3.2 reached end of life on 2026-04-01 and the backend is on Rails 7.1; the goal is Ruby 3.4.10 and Rails 8.1, in steps that each keep CI green and are independently deployable.