Repository navigation
Rails 7.2.3.2 to 8.1.4 on Ruby 3.4.11 - #11
Conversation
Last app in the fleet walk (rheos/growoperative-api#55). The other four are done. This repo was already resolving to 7.2.3.2 without anyone bumping it, because the Gemfile carried a floating `gem "rails", "~> 7.1"` rather than a pin. That is why it looked one stage ahead of the fleet: it was never deliberately moved, it just drifted. Now pinned properly. Three of the five 7.2 defaults enabled one at a time, suite green after each at 75 examples. active_job.* and active_storage.* are excluded: config/application.rb picks railties individually (active_model, active_record, action_controller, action_view) and omits both, so assigning either raises NoMethodError on boot. Which namespaces are missing was confirmed by asking the running app rather than by reading the require list, which is the method that caught a mistake on onloan-api: action_view is available there despite never being required, because action_controller/railtie pulls it in. Incidental, but it had broken local dev since the 2026-08-22 Postgres migration: the foaf_db_data volume still held MySQL data (auto.cnf, ib_buffer_pool). docker-compose had moved to postgres:16 but the named volume was never removed, so Postgres refused to initdb on every start - "directory exists but is not empty" - and the db container exited every time. Removing the volume fixed it. No repo change; recorded here because the symptom looks like a broken compose file and is not. Refs rheos/growoperative-api#55 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ruby 3.2 went EOL on 2026-03-31. This repo carried a floating `ruby "~> 3.2"` rather than a pin, so it would have kept resolving to an EOL line indefinitely without ever looking out of date - the same reason its Rails constraint drifted to 7.2.3.2 unnoticed. Now pinned. Committed on its own, before the Rails 8.1 bump, so the native-extension rebuild cannot be confused with a framework regression. Three pins move: Gemfile, Dockerfile and the CI workflow. There is no .ruby-version here. Also deleted the stale foaf_bundle volume, which holds native extensions built against the old Ruby and masks the rebuilt image. No new gem declarations needed: none of the stdlib gems that left Ruby 3.4's defaults (csv, base64, mutex_m) are required anywhere here. Zero gem deltas - only RUBY VERSION moved. Suite green on Ruby 3.4.11 with Rails 7.2.4: 75 examples, 0 failures. Refs rheos/growoperative-api#55 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Final app in the fleet walk (rheos/growoperative-api#55). All NINE defaults enabled one at a time, suite green after each at 75 examples. Nine, not eight: this is the first app walked with the corrected 8.0 list, which has THREE defaults rather than the two the Rails configuring guide documents. 8.0 Regexp.timeout = 1 8.0 action_dispatch.strict_freshness = true 8.0 active_support.to_time_preserves_timezone = :zone <- the missed one 8.1 action_controller.escape_json_responses = false 8.1 active_support.escape_js_separators_in_json = false 8.1 active_record.raise_on_missing_required_finder_order_columns = true 8.1 action_controller.action_on_path_relative_redirect = :raise 8.1 action_view.render_tracker = :ruby 8.1 action_view.remove_hidden_field_autocomplete = true The third 8.0 default was adopted silently on foaf-auth, railsbackend and onloan-api because it was hand-added from the published list. It surfaced on orchardly-rails, the one app that kept the separate 8.0 stop and so generated the real defaults file. Here it was walked deliberately. Also checked for `.to_time` usage first, per the corrected playbook: none in this repo, so the setting is a no-op either way. Ran a baseline suite immediately after the version bump and before enabling any flag, so a gem-resolution break could not masquerade as a framework default. Verified beyond the suite: production boots with eager_load=true on rails 8.1.4 / ruby 3.4.11 / rack 3.2.7, Regexp.timeout reads 1.0. Refs rheos/growoperative-api#55 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review. 📝 WalkthroughWalkthroughThe project now uses Ruby 3.4.11 in CI, Docker, and the Gemfile. The Gemfile requires Rails ~> 8.1.4, and the application loads Rails 8.1 defaults. ChangesRuntime and Rails Upgrade
Priority: ⬇️ Low Estimated code review effort: 2 (Simple) | ~8 minutes Change: Other Merge Risk: ⚪ Minimal · up to The upgrade aligns the application, CI, and container builds on the new Ruby and Rails versions. No concrete merge-blocking issue is established in the supplied evidence. Security Architecture ReviewSecurity architecture risk: 🟡 Moderate · up to The upgrade affects both deployed API environments. The reviewed code shows no new public route or demonstrated authorization bypass, but the effect of the newer framework defaults on production request and transaction behavior remains unverified. Retained concerns Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
Resilience and Maintainability Implications
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
The last app in the fleet walk (rheos/growoperative-api#55). foaf-auth, railsbackend and onloan-api are all on Rails 8.1.4 / Ruby 3.4.11 in production; orchardly-rails is merged.
Three commits, ordered so any failure has one candidate cause.
1. Pin Rails to
~> 7.2.4+load_defaults 7.2This repo was already resolving to 7.2.3.2 without anyone bumping it, because the Gemfile carried a floating
gem "rails", "~> 7.1"rather than a pin. That is why it looked a stage ahead of the fleet — it was never deliberately moved, it drifted. Now pinned.Three of five 7.2 defaults adopted.
active_job.*andactive_storage.*are excluded:config/application.rbpicks railties individually (active_model, active_record, action_controller, action_view) and omits both, so assigning either raisesNoMethodErroron boot.Which namespaces are missing was confirmed by asking the running app, not by reading the require list — the method that caught a mistake on onloan-api, where
action_viewturns out to be available despite never being required, becauseaction_controller/railtiepulls it in:2. Pin Ruby to 3.4.11
Same floating-constraint problem:
ruby "~> 3.2"would have kept resolving to an EOL line indefinitely without ever looking out of date. Ruby 3.2 went EOL 2026-03-31. Three pins move (Gemfile, Dockerfile, CI); there is no.ruby-versionhere.No new gem declarations needed — none of the stdlib gems that left Ruby 3.4's defaults are required anywhere. Zero gem deltas; only
RUBY VERSIONmoved.3. Rails 8.1.4 +
load_defaults 8.1All NINE defaults walked one at a time, suite green after each. Nine, not eight — this is the first app walked with the corrected 8.0 list, which has three defaults rather than the two the Rails configuring guide documents:
The third 8.0 default was adopted silently on the three apps that went 7.2 → 8.1 directly, because it was hand-added from the published list. It surfaced on orchardly-rails, the one app that kept the separate 8.0 stop and therefore generated the real file. Here it was walked deliberately, and
.to_timeusage was checked first (none in this repo, so it is a no-op either way).Also ran a baseline suite immediately after the version bump, before any flag, so a gem-resolution break could not masquerade as a framework default.
Incidental: local dev has been broken since the Postgres migration
Not a repo change, but worth recording because the symptom looks like a broken compose file and is not. The
foaf_db_datavolume still held MySQL data (auto.cnf,ib_buffer_pool,ca-key.pem) from before 2026-08-22.docker-compose.ymlhad moved topostgres:16, but the named volume was never removed, so Postgres refused toinitdbon every start — "directory exists but is not empty" — and the db container exited immediately. Anyone runningdocker compose uphere since the migration has hit a dead database. Removing the volume fixes it.Verification
eager_load=true:rails=8.1.4 ruby=3.4.11 rack=3.2.7 regexp_timeout=1.0Merging deploys demo after CI; prod needs
confirm=deploy-prod-protocol.Refs rheos/growoperative-api#55
Summary by CodeRabbit