solid_objects 0.14.1 → 0.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3b9abc40f188e1ea4964cfffca89e030990948c937a8aca0ec32c19830da272
4
- data.tar.gz: 57707f08fc468d705202bbc3f20ddd60bfed4cd3d9153c58b7a06c981051ef93
3
+ metadata.gz: 0c919699e07e7e1bd517a9fe0fa748558262c0cfe8483bcb992f8b85f65cb857
4
+ data.tar.gz: 30a29702722638f5168664ecbb69f174564419f7308cc7596d71e9066baa2e76
5
5
  SHA512:
6
- metadata.gz: 203477264f47ba941dd4a29b08e00ce5e8ccce298fce361beeaed73f54d3fb1edbbd46f05733e44eaacb366301fc1a6128f084024976268e42ce302d6a7aab76
7
- data.tar.gz: 1f82eeb81cd282bbf0cdabc3e4346376b21f5688997440a3f6790f3332f2762764d3a3e3a48778629702c0604480e4e0a6380a677d76a106d9f439c466302cf4
6
+ metadata.gz: b8eee4e1bd40b39d67c3a74b2860a0f874336285d7291dcc740b578f8b4a8fedd3d1323e716c47df71f3615faef832519cbd3541f505f9e0c00b413f01a9e9e5
7
+ data.tar.gz: 2b808b25de0a30d05da80b24451f1c12139c3be6bf90f4fb760f754d42b775e22cb60339e75ec8c750f341f89e6f50cbb05f809d6cea936070183a0b2cb8a3e8
data/CHANGELOG.md CHANGED
@@ -1,5 +1,88 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.3 - 2026-08-29
4
+
5
+ - Cut one of the three full state copies a committed turn made. The executor
6
+ built the after image twice, once to answer whether the state changed and
7
+ once for the committed row, and a synchronous query built a third for the
8
+ mutation guard. One image now answers all three. Measured on SQLite,
9
+ committed throughput rises 4.8% at 13 KB of state, 3.1% at 116 KB, and 10.2%
10
+ at 1 MB. `benchmark/state_size.rb` is the scenario and `docs/benchmarks.md`
11
+ holds the numbers. The guard now compares the image taken after the
12
+ observables are read, so a query whose observable mutates state also fails
13
+ with `InvalidActor`.
14
+ - Stop building an encoded string that `Serialization.dump` discarded. The
15
+ method encoded every value to measure it, while most call sites pass no
16
+ `max_bytes`. It now encodes only when a limit applies. That encoding was also
17
+ the only check that a string held valid bytes, so `normalize` now checks the
18
+ encoding of every string and key it visits. A value it rejects raises
19
+ `InvalidPayload` at the call that staged it, as before, rather than a
20
+ `JSON::GeneratorError` from inside the commit transaction.
21
+ - Add `warn_state_bytes`, a soft threshold that defaults to 64 KB and must not
22
+ exceed `max_state_bytes`. A commit above it reports
23
+ `solid_objects.state.large` with the actor identity, the `byte_count`, and
24
+ the threshold. The event carries no application state, and it reports after
25
+ the commit. `max_state_bytes` keeps its 5 MB default, which measurement shows
26
+ is a limit rather than an operating point. The setting, the event, and its
27
+ payload match `warnStateBytes` in solid-objects-js, which defaults to 128 KB,
28
+ because the Node curve falls later than this one.
29
+ - Report a committed turn without letting a subscriber fail it. Every event
30
+ the executor emitted after its commit ran outside a rescue, so a subscriber
31
+ that raised turned a committed turn into a failed one: the runtime skipped
32
+ `message.completed`, tried to fail a message whose claim it had already
33
+ destroyed, and lost the worker pass. Those reports now go through
34
+ `instrument_after_commit`, which reports a raising subscriber as
35
+ `solid_objects.instrumentation.failed` and continues. This matches the
36
+ isolation `solid-objects-js` already applied to every event it emits.
37
+
38
+ - Align the use-case claims with solid-objects-js. "Is it worth installing
39
+ here?" listed long-lived workflows without a limit, while `docs/fit.md`
40
+ called a rate limiter an anti-pattern and the JS README sold per-key rate
41
+ limits. Both projects now say the same thing: a low-rate quota that a
42
+ reminder refills fits, because each check is one durable ordered message; a
43
+ limiter that every request touches does not; and a workflow fits when one
44
+ entity owns the mutable state and its mailbox holds the step order. A durable
45
+ execution engine that replays named steps from a step log remains a different
46
+ tool.
47
+ - Name Solid Objects Pro in `docs/fit.md` for the high-QPS cases the guide
48
+ rejects, and map its three capabilities onto them: grouped operations,
49
+ ephemeral operations, and reactive projections. The README already pointed
50
+ there; the fit guide stopped at "anti-pattern".
51
+ - Title the README "Solid Objects Ruby", matching "Solid Objects JS" in the
52
+ Node package, and give both the same two badges. The CI badge now pins
53
+ `?branch=main`, and a RubyGems version badge sits beside it. The gem name,
54
+ the module, and the published metadata do not change.
55
+
56
+ ## 0.14.2 - 2026-08-25
57
+
58
+ - Rewrite the first screen around the objection a reader actually has. The
59
+ README led with a counter incrementing an integer, which invites the reply
60
+ that one line of SQL already does it. It now leads with the ticket sale from
61
+ the homepage: 100 seats, a hold, a ten-minute expiry that frees the seat, and
62
+ a live count. That is the smallest example needing three things from one
63
+ number, and the three things are the argument.
64
+ - Answer "why not just use transactions?" in the first screen rather than at
65
+ line 1245 of a 1370-line file. The section concedes `with_lock` first, then
66
+ argues scope rather than discipline: any `expires_at` or `scheduled_at`
67
+ column is evidence the critical section already outlived the lock, and what
68
+ follows it is a sweeper and a race. The comparisons table gains the row
69
+ people actually reach for.
70
+ - Add "Is it worth installing here?", which names who should not install this,
71
+ and point readers with high-QPS reads or hot identities at
72
+ [Solid Objects Pro](https://solidobjects.pro/).
73
+ - Fix the reactive example, which could not run. A scalar observable raises
74
+ unless it is declared `broadcast: :value`, and a component dependency must
75
+ itself be a declared observable. The example now declares both. The reactive
76
+ section also claimed a fragment is re-rendered once per change; the turn
77
+ records the broadcast atomically, while delivery retries and is at least
78
+ once.
79
+ - Cut the README from 1370 to about 580 lines by moving reference material into
80
+ `docs/`, and add `CONTRIBUTING.md`. Reminders now have their own guide at
81
+ `docs/reminders.md`, `docs/operations.md` gains the configuration defaults
82
+ table, the worker-count flags, the upgrade sequence and the extension
83
+ component contract, and `docs/architecture.md` gains `register_effect` and
84
+ `register_commit_action` with their signatures.
85
+
3
86
  ## 0.14.1 - 2026-08-24
4
87
 
5
88
  - Register application actors in every process that boots the application.