Skip to content

Commit 0e65004

Browse files
committed
docs: state the at-least-once cost of the drain
A second Greptile pass flagged that a drained sibling's effect row stays pending and later redelivers, a duplicate outbound request. The duplicate is the documented at-least-once design: completing the sibling would take over another worker's claim, skipping it would break ordering, and the JS runtime behaves the same, so the docs now state the trade explicitly instead of leaving it implied. The concurrency race test already pins the behavior: order holds, replays apply nothing, and every effect completes.
1 parent 0b8ae6d commit 0e65004

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

docs/transmission.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ delivers every undelivered sibling for its actor up to its own mailbox
6060
sequence, oldest first. The receiving side dedups on `transmit:<effectId>`,
6161
so a redelivered envelope applies once.
6262

63+
Delivery is at-least-once by design, and the drain accepts redundant sends
64+
as the price of ordering without cross-worker coordination. A drained
65+
sibling's own effect row stays pending, because completing it would
66+
require taking over another worker's claim; when its own claim runs, it
67+
delivers again and the receiving side drops the replay. The same is true
68+
when two workers claim effects for one actor concurrently. Both runtimes
69+
share this behavior, and the Ruby suite pins it with a race test: order
70+
holds, duplicates apply nothing, and every effect completes.
71+
6372
## Retry budget and offline tolerance
6473

6574
A raised delivery follows the effect retry policy: `max_attempts` (default

0 commit comments

Comments
 (0)