Skip to content

ci: verify the supported Rails and Ruby span - #17

Merged
cardmagic merged 3 commits into
mainfrom
agent/compatibility-ci
Aug 10, 2026
Merged

ci: verify the supported Rails and Ruby span#17
cardmagic merged 3 commits into
mainfrom
agent/compatibility-ci

Conversation

@cardmagic

Copy link
Copy Markdown
Owner

Roadmap milestone 8, the compatibility half.

The gap

solid_objects.gemspec advertises Rails >= 8.0 on Ruby >= 3.3, but CI ran exactly one combination: Ruby 3.3 with whatever Rails resolved newest. Rails 8.0 had never been exercised, so the supported range was a claim rather than a tested guarantee. This is the kind of gap that surfaces as a user bug report instead of a test failure.

The change

A compatibility job over Ruby 3.3 and 3.4 against Rails 8.0 and 8.1, four combinations, with fail-fast: false so one failure does not hide the others. The release job now depends on it.

Pinning works through RAILS_VERSION in the Gemfile, which constrains the six Rails libraries the gemspec depends on. No new development dependency: Appraisal would have done this too, but an environment variable and six gem lines are less machinery for the same result. It also works locally:

RAILS_VERSION=8.0 bundle install && RAILS_VERSION=8.0 bundle exec rake test

I ran exactly that before opening this: Rails 8.0 passes, 301 runs, 0 failures. So this PR does not fix a latent incompatibility, it converts an untested claim into a verified one.

On Ruby 4.0

Not in the matrix. I have been developing this gem on Ruby 4.0.5 locally while CI ran 3.3, so it demonstrably works, but the gemspec does not advertise it and adding it would widen the support claim rather than verify the existing one. Recorded in the roadmap as the remaining gap.

Roadmap

Records compatibility CI under "Implemented and tested" and reduces milestone 7 to the security-scanning half, noting Ruby 4.0 is still absent, per the requirement added in #15.

Compatibility

No library change. RAILS_VERSION is unset in normal use, so bundle install behaves exactly as before.

Validation

bundle exec rake                                    # 301 runs, 0 failures
RAILS_VERSION=8.0 bundle exec rake test             # 301 runs, 0 failures

Standard Ruby, RuboCop, RBS, Steep, and Brakeman clean.

The gemspec advertises Rails 8.0 or newer on Ruby 3.3 or newer, but CI ran exactly one combination, so the range was a claim rather than a tested guarantee. Add a matrix over Ruby 3.3 and 3.4 against Rails 8.0 and 8.1, pinned through RAILS_VERSION in the Gemfile, and make the release job depend on it. Verified locally that the suite passes against Rails 8.0, which had never been exercised.
@greptile-apps

greptile-apps Bot commented Aug 10, 2026

Copy link
Copy Markdown

Greptile Summary

The PR adds a Rails/Ruby compatibility matrix, makes releases depend on it, and pins Rails families through RAILS_VERSION. It also prevents expired synchronous SQLite deadlines from producing a negative condition-variable wait and adds regression coverage.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
.github/workflows/ci.yml Adds the four-combination compatibility matrix and gates releases on its success.
Gemfile Applies an optional compatible-version constraint to the six Rails libraries when RAILS_VERSION is set.
lib/solid_objects/database_adapters/sqlite.rb Avoids passing a non-positive interval to the condition-variable wait after a synchronous deadline expires.
test/integration/synchronous_invocation_test.rb Adds regression coverage for an already-expired retry deadline.
CHANGELOG.md Consolidates the compatibility and SQLite retry changes into the existing Unreleased section.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Matrix["Ruby 3.3 / 3.4 × Rails 8.0 / 8.1"] --> Pin["Set RAILS_VERSION"]
  Pin --> Bundle["Resolve pinned Rails libraries"]
  Bundle --> Tests["Run test suite"]
  Tests --> Release["Permit release job"]
Loading

Reviews (2): Last reviewed commit: "docs: merge the unreleased changelog sec..." | Re-trigger Greptile

Comment thread CHANGELOG.md Outdated
Comment on lines +5 to +10
- Run compatibility CI across the span the gemspec advertises: Ruby 3.3 and 3.4
against Rails 8.0 and 8.1. The suite previously ran on one combination, so
`>= 8.0` was a claim rather than a tested guarantee. Set `RAILS_VERSION` to
pin a Rails line locally.

## Unreleased

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Duplicate Unreleased sections

The new compatibility entry creates a second consecutive Unreleased section, splitting current changes between identical headings and making release-note generation ambiguous.

Suggested change
- Run compatibility CI across the span the gemspec advertises: Ruby 3.3 and 3.4
against Rails 8.0 and 8.1. The suite previously ran on one combination, so
`>= 8.0` was a claim rather than a tested guarantee. Set `RAILS_VERSION` to
pin a Rails line locally.
## Unreleased
- Run compatibility CI across the span the gemspec advertises: Ruby 3.3 and 3.4
against Rails 8.0 and 8.1. The suite previously ran on one combination, so
`>= 8.0` was a claim rather than a tested guarantee. Set `RAILS_VERSION` to
pin a Rails line locally.
Prompt To Fix With AI
This is a comment left during a code review.
Path: CHANGELOG.md
Line: 5-10

Comment:
**Duplicate Unreleased sections**

The new compatibility entry creates a second consecutive `Unreleased` section, splitting current changes between identical headings and making release-note generation ambiguous.

```suggestion
- Run compatibility CI across the span the gemspec advertises: Ruby 3.3 and 3.4
  against Rails 8.0 and 8.1. The suite previously ran on one combination, so
  `>= 8.0` was a claim rather than a tested guarantee. Set `RAILS_VERSION` to
  pin a Rails line locally.
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, main already carried an unreleased section from the wake-up adapter and I added a second. Merged into one so release notes stay unambiguous.

A synchronous lock retry computed its wait from the remaining deadline, which can go negative between the expiry check and the wait, raising ArgumentError instead of the SyncEnqueueTimeout the caller expected. Skip the wait when no interval remains. The new compatibility matrix surfaced this on its first run.
@cardmagic

Copy link
Copy Markdown
Owner Author

@greptileai review

@cardmagic
cardmagic merged commit 8dafd92 into main Aug 10, 2026
21 checks passed
@cardmagic
cardmagic deleted the agent/compatibility-ci branch August 10, 2026 13:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant