You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The branch added an API and documented none of it. The changelog, the
architecture guide, the pruning note, and the roadmap entry the issue
quotes now say what exists, including that a result is stored for sync
delivery only and that a pruned message still answers nil.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/architecture.md
+11-1Lines changed: 11 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -424,6 +424,16 @@ outer commit, and callers timing out on work they indirectly block.
424
424
waiting and immediately returns a `MessageReference`. Runtime workers process
425
425
it normally.
426
426
427
+
A caller that loses that reference rebuilds one. `SolidObjects.client.find_by`
428
+
answers a request id, which is unique across the table, and
429
+
`reference.find_by` answers an idempotency key, which is unique per instance.
430
+
Each lookup runs the authorization hook the original call ran, against the
431
+
stored operation and arguments, and answers `nil` for an absent row, an
432
+
unregistered actor, and a refused caller alike, so it cannot be used to ask
433
+
whether a request id exists. `MessageReference#outcome` reports the status, the
434
+
result, the persisted error, the rejection, and the attempt count. A result is
435
+
stored for `sync` delivery only.
436
+
427
437
An executing caller receives an inline after-commit callback error even though
428
438
the turn committed. An independently waiting caller observes the durable
429
439
result and may return before that callback raises in the worker. Completed
@@ -867,7 +877,7 @@ All backends use unique identity and sequence constraints, short transactions, a
867
877
12.**How are leases renewed?** Conditional database update by instance, owner, generation, and unexpired lease.
868
878
13.**How does graceful shutdown work?** Stop claims, finish current turn within timeout, release cached leases, stop heartbeat, mark process stopped.
869
879
14.**How does synchronous invocation work across processes?** The caller first tries to claim and execute the actor locally. If another process owns it, a wake-up adapter prompts a durable result query and bounded polling remains the fallback.
870
-
15.**What happens after caller timeout?** A committed message continues and its eventual result can be recovered with the timeout's authorized message reference. An enqueue timeout leaves no message. Running Ruby code is not preempted.
880
+
15.**What happens after caller timeout?** A committed message continues and its eventual result can be recovered with the timeout's authorized message reference, or with `find_by` from the request id or the idempotency key when that reference is gone. An enqueue timeout leaves no message. Running Ruby code is not preempted.
871
881
16.**How are results cleaned up?**`prune_messages` deletes eligible terminal history in bounded batches after global or per-actor retention. It previews by default and preserves live work, dead letters, retry links, and unfinished outboxes.
872
882
17.**How are large mailboxes managed?** The implemented controls are the per-actor mailbox cap, payload caps, and fair activation yields; rate and global admission controls remain roadmap work.
873
883
18.**How are completed messages pruned?** Operators schedule the dry-run-reviewed `prune_messages --execute` command. Solid Objects does not run deletion automatically.
0 commit comments