Skip to content

Prepare version 1.0.0 - #91

Merged
cardmagic merged 5 commits into
mainfrom
release/1.0.0
Oct 13, 2026
Merged

cardmagic merged 5 commits into
mainfrom
release/1.0.0

Conversation

@cardmagic

Copy link
Copy Markdown
Owner

Summary

This pull request prepares solid_objects 1.0.0. Version 1.0 freezes the public API under semantic versioning. It makes no claim of measured scale.

No tag is in this pull request. The tag follows after the maintainer approves the release text.

Changes

  1. Breaking: a schedule call with no operation fails the turn. A turn that called schedule(at:, key:) and then called no operation on the result stored no reminder and gave no error. The turn now fails with SolidObjects::ScheduleWithoutOperation, a NonRetryableError. The message becomes a dead letter after one attempt, and the turn commits no state and no reminder. The turn can keep the result and call the operation later. solid-objects-js has the same change.
  2. A json check in the doctor and at boot. The json gem 3.x removed an option that Active Support older than 8.1.4 passes to the decoder. bin/rails solid_objects:doctor now reports this as a failure of its json check, and the boot prints a warning. Both decode one document with Active Support and do not compare version numbers. The gemspec has no json pin.
  3. Status and versioning documents. docs/versioning.md is new. The README gives the status at the top and names the projects that Solid Objects is not. The gem summary and description start with the problems that the gem solves. Each "pre-1.0" statement is replaced.
  4. Version 1.0.0, with the changelog section and Gemfile.lock.

Compatibility

  • API: one breaking change, item 1. Correct code such as schedule(at: time).expire does not change.
  • Schema: no change. No migration.
  • Configuration: no change.
  • Security: no change to authorization.

What version 1.0 does not claim

The benchmarks are development measurements. Longer soak tests are open work. The project has one maintainer, and no production use by other people is known. docs/roadmap.md keeps the hardening milestones.

Validation

  • bundle exec rake: 956 runs, 4001 assertions, 0 failures, 0 errors, 28 skips. Standard, RuboCop, RBS, Steep, and Brakeman pass.
  • New tests failed before the code change and pass after it: test/integration/schedule_without_operation_test.rb (6), test/unit/json_compatibility_test.rb (6), two tests in test/integration/doctor_test.rb, and two tests in test/unit/gem_specification_test.rb.

A turn that called schedule and then called no operation on the result
stored no reminder and gave no error. The hold or the timeout that the
author intended did not exist, and nothing reported it. Three fresh
agent sessions found this mistake in a published sample.

The turn now fails with ScheduleWithoutOperation. The error is not
retryable, because a retry cannot change the actor code. The turn can
keep the result and call the operation later in the same turn.

BREAKING CHANGE: a turn with a schedule call that has no operation
after it becomes a dead letter. Correct code does not change.
The json gem 3.x removed an option that Active Support older than
8.1.4 passes to the decoder. Each JSON column then raises
"unknown keyword: quirks_mode", and the cause is not clear from the
error.

The doctor now has a json check, and the boot prints a warning. Both
decode one document with Active Support. They do not compare version
numbers, so they stay correct when Rails or json changes. The gemspec
does not pin json, because a pin would stop applications on a Rails
release that supports json 3.
Version 1.0 promises a stable public API under semantic versioning.
docs/versioning.md gives the promise and what is outside it.

The README now gives the status at the top: the release date, one
maintainer, one first-party production application, and no production
use by other people. It also names the projects that Solid Objects is
not, because search results mix them. The gem summary and description
start with the problems that the gem solves.

Version 1.0 makes no claim of measured scale. The benchmarks are
development measurements, and longer soak tests are open work.
@context7

context7 Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Docs7 for cardmagic/solid-objects-ruby

Result Status Action
Deployment ➖ Not used —
Content review ➖ Did not run. This site has no agent runs available this month. Wait for the monthly reset or check your Docs7 plan. —

Commit a46bb8e

@greptile-apps

greptile-apps Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Medium impact] The PR appears safe to merge; the previous finding is fixed and no new blocking issue remains.

Summary

Prepares solid_objects 1.0.0 and defines the public API promise.

  • Actor turns fail when a scheduled reminder has no operation.
  • Rails checks whether Active Support can decode JSON.
  • Solid Objects 1.0 sets a stable public API promise.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Read observable] --> B[Compare state and staged work]
  B --> C{Reader changed either?}
  C -->|No| D[Continue turn]
  C -->|Yes| E[Raise QueryMutatedState]
  E --> F[Restore state and clear staged work]
  F --> G[Dead letter without retry]
Loading

Reviews (2) · Last reviewed commit: "fix: catch a bare schedule call in an ob..." · Reviewed by Greptile

Comment thread lib/solid_objects/executor.rb
The check for a schedule call with no operation ran directly after the
operation. An observable that called schedule only after the state
changed was read later, so the turn committed with no reminder and no
error. The open call stayed on the retained actor and made the next
turn fail, although that turn did nothing wrong.

The projection guard now counts an open schedule call as staged work.
The turn that reads the observable fails with QueryMutatedState, and
the failure path clears the open call.
@cardmagic

Copy link
Copy Markdown
Owner Author

@greptileai Please review the current head a46bb8e. The projection guard now includes the open schedule calls, so a schedule call with no operation in an observable fails that turn with QueryMutatedState, and the failure path clears the open call. Two tests failed before the change and pass now: the turn that reads the observable fails after one attempt, and the next turn of the same actor does not fail. Full bundle exec rake passes: 958 runs, 0 failures.

@cardmagic
cardmagic merged commit a44035c into main Oct 13, 2026
44 checks passed
@cardmagic
cardmagic deleted the release/1.0.0 branch October 13, 2026 21:03
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