Skip to content

Commit a27e817

Browse files
committed
docs: state the 1.0 status and its limits
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.
1 parent 0d99e6e commit a27e817

12 files changed

Lines changed: 106 additions & 24 deletions

‎AGENTS.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,9 @@ release commit directly to `main`.
6969
snapshot from the tag. The `check:release` step of the site refuses a
7070
snapshot that is not the latest published tag.
7171

72-
Before 1.0, a feature or a behavior change gets a minor version, and a fix gets
73-
a patch version.
72+
From 1.0, versions follow `docs/versioning.md`. A fix gets a patch version. An
73+
addition gets a minor version. A change that breaks the public API gets a
74+
major version.
7475

7576
The Context7 refresh workflow refreshes the index after each push to `main` that
7677
changes the documentation. Confirm that its run succeeded.

‎README.md‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ stable identity, and its state lives in the SQL database that your app already
1111
uses. [Virtual actors in Ruby on Rails](docs/virtual-actors.md) explains the
1212
model and when to use it.
1313

14+
**Status.** Version 1.0: the public API follows semantic versioning and does
15+
not break before 2.0. [Versioning](docs/versioning.md) gives the limits of the
16+
promise. First public release: August 6, 2026. One maintainer.
17+
18+
**Production use.** One first-party application with more than 100,000 users
19+
runs it in production. That is a count of users, not a measure of load. No
20+
production use by other people is known. The [benchmarks](docs/benchmarks.md)
21+
are development measurements, and longer soak tests are open work.
22+
23+
**It is not** Solid Queue, SolidJS, or the `service_actor` gem, and it is not
24+
affiliated with Rails or Cloudflare.
25+
1426
In a shopping cart, paying twice at the same time is a big problem. The payment provider might time out, and your Rails site could be restarting before recovery finishes.
1527

1628
To deal with this safely, you often need logic scattered between 7-10 files like database row locks, Redis locks, delayed jobs, retries, and cleanup code to keep that process straight. They are not all large, but they must agree about the same payment state and failure rules. That coordination is the difficult part.
@@ -193,9 +205,11 @@ explanations remain in `docs/`. The README stops here.
193205

194206
## Status and license
195207

196-
Solid Objects Ruby is a pre-1.0 early release. Its correctness core is tested
197-
against SQLite, PostgreSQL, and MySQL, but the project makes no production-ready
198-
claim. That requires more hardening and operational soak evidence. Expect breaking changes.
208+
Version 1.0 promises a stable public API. Its correctness core is tested
209+
against SQLite, PostgreSQL, and MySQL. It makes no claim of measured scale:
210+
the [benchmarks](docs/benchmarks.md) are development measurements, and longer
211+
soak tests are open work. [Versioning](docs/versioning.md) says what a release
212+
can change.
199213

200214
Solid Objects is released under the [MIT License](MIT-LICENSE). It is an
201215
independent project and is not affiliated with, sponsored by, or endorsed by

‎docs/agents.md‎

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,22 @@ bin/rails solid_objects:doctor
6969
```
7070

7171
The generator adds an initializer and copies migrations into the application.
72-
The doctor checks the configuration, the tables, and one real actor round trip.
72+
The doctor checks the `json` gem, the configuration, the tables, and one real
73+
actor round trip.
7374

74-
Install the current release. `bundle add solid_objects` selects it. Do not pin
75-
a version that you remember from earlier work; the API changed between
76-
releases. The current version is on <https://rubygems.org/gems/solid_objects>.
75+
Install the current release. `bundle add solid_objects` selects it. Do not use
76+
an API that you remember from a 0.x release; the API changed between 0.x
77+
releases. From version 1.0, the public API follows
78+
[semantic versioning](versioning.md). The current version is on
79+
<https://rubygems.org/gems/solid_objects>.
7780

7881
The generated policies deny every call. Do step 5 before you call an actor.
7982

8083
The `json` gem 3.x works only with Active Support 8.1.4 or newer. On Rails
8184
7.1, 7.2, 8.0, or 8.1 before 8.1.4, pin `gem "json", "~> 2"` in the
8285
`Gemfile`. Without the pin, Active Support raises an `ArgumentError`, such as
83-
`unknown keyword: quirks_mode`, for every JSON column.
86+
`unknown keyword: quirks_mode`, for every JSON column. The doctor reports this
87+
problem as a failure of its `json` check, and the boot prints a warning.
8488

8589
[Installing and upgrading](operations.md#installing-and-upgrading) has the
8690
details.
@@ -184,7 +188,7 @@ Avoid these mistakes:
184188

185189
| Mistake | Correct form |
186190
| --- | --- |
187-
| `schedule(at: deadline)` with no operation after it | `schedule(at: deadline, key: buyer).expire(buyer:)`. `schedule` stages a reminder only when you call an operation on its result |
191+
| `schedule(at: deadline)` with no operation after it | `schedule(at: deadline, key: buyer).expire(buyer:)`. A `schedule` call with no operation after it fails the turn with `SolidObjects::ScheduleWithoutOperation` |
188192
| `reject "room full"` | `reject(:room_full, "The room is full")` |
189193
| `id` inside an actor | `actor_id`. An actor has no `id` method |
190194
| `register_effect(:name) { \|context, arguments\| ... }` | `register_effect(:name) { \|arguments, context\| ... }`. The arguments come first |
@@ -278,6 +282,7 @@ When you explain Solid Objects to a user, state these limits:
278282
- There are no transactions across actor identities.
279283
- Fencing stops a stale activation from a commit, but its code can continue to
280284
run.
281-
- The gem is pre-1.0 and makes no production-ready claim.
285+
- Version 1.0 promises a stable public API. It makes no claim of measured scale,
286+
and no production use by other people is known.
282287

283288
The [correctness contract](correctness.md) is the source for each guarantee.

‎docs/guides/expiring-reservations.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ See [the transactional outbox guide](transactional-outbox.md).
164164
- Delivery is at least once. Each operation must be safe to run again.
165165
- There are no transactions across actors. A reservation that spans two shows needs its own design.
166166
- One busy show runs its calls one at a time. Many shows run at the same time.
167-
- The gem is pre-1.0 and makes no production-ready claim.
167+
- Version 1.0 promises a stable public API. It makes no claim of measured scale.
168168

169169
## More information
170170

‎docs/guides/ordered-jobs.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ You do not assign sequence numbers. The actor mailbox gives the order.
221221
- Delivery is at least once. Each operation must be safe to run again.
222222
- The gem provides no transactions across actors. A transfer between two accounts needs its own design, for example one SQL transaction on normal tables.
223223
- One busy account runs its entries one at a time.
224-
- The gem is pre-1.0 and makes no production-ready claim.
224+
- Version 1.0 promises a stable public API. It makes no claim of measured scale.
225225

226226
## More information
227227

‎docs/guides/race-conditions.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ Delivery is at least once, so an effect can run more than once. See [effect idem
224224
- Delivery is at least once, not exactly once. Write each operation so that it can run again.
225225
- There are no transactions across actors. A change that must touch two events atomically needs one SQL transaction on normal tables.
226226
- One busy event runs its calls one at a time. Many events can run at the same time.
227-
- The gem is pre-1.0 and makes no production-ready claim.
227+
- Version 1.0 promises a stable public API. It makes no claim of measured scale.
228228

229229
## More information
230230

‎docs/guides/transactional-outbox.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ One successful turn commits the actor state, the staged effects, the same-databa
145145
- Solid Objects requires Ruby 3.3 or newer and Rails 7.1 or newer.
146146
- Delivery is at least once. Each effect handler must deduplicate with `context.id`.
147147
- Solid Objects provides no transactions across actors.
148-
- The gem is pre-1.0 and makes no production-ready claim.
148+
- Version 1.0 promises a stable public API. It makes no claim of measured scale.
149149

150150
## More information
151151

‎docs/roadmap.md‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
[observability](observability.md).
1010

1111
- Rails engine, install generator, migration, and CLI
12+
- A stable public API from version 1.0, with the limits in
13+
[versioning](versioning.md)
14+
- A turn that calls `schedule` and then calls no operation on the result fails
15+
with `ScheduleWithoutOperation`, which is not retried, matching JavaScript.
16+
Before 1.0 such a call stored no reminder and gave no error.
17+
- A `json` check in `solid_objects:doctor` and a warning during the boot, for
18+
the `json` gem 3.x on an Active Support release that cannot decode with it.
19+
The check decodes one document and does not compare version numbers. This
20+
surface is Rails-only.
1221
- Explicit actor registry, references, JSON state, and state migrations
1322
- Queries, observable projections, and personalized payloads reject state mutation
1423
and staged durable work with `QueryMutatedState`, matching JavaScript. Query
@@ -245,5 +254,6 @@
245254
latency, query counts, and the three reactive delivery paths are measured on
246255
SQLite; adapter-specific and end-to-end browser measurements are not.
247256

248-
No production-ready claim should be made until these hardening milestones have
249-
operational soak evidence.
257+
Version 1.0 freezes the public API under [semantic versioning](versioning.md).
258+
It does not complete these hardening milestones. The project makes no claim of
259+
measured scale until they have operational soak evidence.

‎docs/versioning.md‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Versioning
2+
3+
From version 1.0.0, Solid Objects follows
4+
[Semantic Versioning](https://semver.org/).
5+
6+
## The promise
7+
8+
The public API is the set of classes, methods, generators, commands, and
9+
configuration options that `README.md` and the files in `docs/` describe.
10+
11+
| Release | What it can change |
12+
| --- | --- |
13+
| Patch, for example 1.0.1 | Corrections of defects. No new behavior |
14+
| Minor, for example 1.1.0 | New behavior. Code that uses the public API continues to work |
15+
| Major, for example 2.0.0 | A change that breaks code that uses the public API |
16+
17+
## Outside the promise
18+
19+
- Classes, methods, and constants that the documentation does not describe.
20+
- The database schema. A minor release can add tables, columns, and indexes,
21+
and it supplies a migration for each change.
22+
[Installing and upgrading](operations.md#installing-and-upgrading) gives the
23+
steps.
24+
- The text of error messages and log lines. The error classes are part of the
25+
public API.
26+
- The timing of background work, where no configuration option sets it.
27+
- A correction of behavior that is different from the
28+
[correctness contract](correctness.md). A patch release can make such a
29+
correction.
30+
31+
## What version 1.0 does not claim
32+
33+
Version 1.0 is a promise about the API. It is not a claim of measured scale.
34+
The [benchmarks](benchmarks.md) are development measurements and do not
35+
guarantee capacity. Longer soak tests are open work. The project has one
36+
maintainer, and no production use by other people is known.
37+
38+
## Releases before 1.0
39+
40+
The 0.x releases changed the API between minor versions. `CHANGELOG.md` lists
41+
each change.

‎docs/virtual-actors.md‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ State and mailboxes live in the SQLite, PostgreSQL, or MySQL database that the
1212
Rails application already uses. Redis and a separate actor service are not
1313
necessary.
1414

15-
Solid Objects is a pre-1.0 release. It makes no production-ready claim. Read
15+
Solid Objects 1.0 promises a stable public API. It makes no claim of measured
16+
scale. Read
1617
[Compatibility and maturity](#compatibility-and-maturity) before you choose it.
1718

1819
## What a virtual actor is
@@ -198,9 +199,9 @@ matrix.
198199
InnoDB. MySQL works through `mysql2` or `trilogy`.
199200
- SQLite is correct for the same contract, but it is best for development and
200201
modest single-host workloads.
201-
- Pre-1.0. Expect changes that break compatibility. The correctness core has tests against all
202-
three databases. The project has no production-ready claim and no measured
203-
scale claim.
202+
- Version 1.0: the public API follows [semantic versioning](versioning.md). The
203+
correctness core has tests against all three databases. The project makes no
204+
claim of measured scale, and no production use by other people is known.
204205

205206
The [roadmap](roadmap.md) records what is tested, what is partial, and what is
206207
next. For TypeScript and Node.js, use the

0 commit comments

Comments
 (0)