Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,8 @@
`createdAtMs` rather than comparing `instanceId` values directly.
`createdAtMs` orders incarnations at millisecond granularity; destroying
and recreating the same actor identity within the same millisecond
produces two incarnations a caller cannot order by `createdAtMs` alone
see `docs/correctness.md`.
produces two incarnations a caller cannot order by `createdAtMs` alone.
See `docs/correctness.md`.

## 0.13.3 - 2026-08-18

Expand Down
178 changes: 90 additions & 88 deletions README.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions docs/api.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Public API reference

The package exports one server entry point plus database, wake-up, and browser
subpaths. TypeScript declaration files remain the source of truth for exact
generic signatures; this index explains the supported role of every export.
subpaths. The TypeScript declaration files are authoritative for exact generic
signatures. This index explains the supported role of every export.

## `solid-objects`

Expand Down
4 changes: 2 additions & 2 deletions docs/authorization.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Authorization

Actor identifiers are identifiers, not capabilities. Message, query,
destruction, subscription, and administration policies deny by default.
An actor identifier is not a capability. Message, query, destruction,
subscription, and administration policies deny by default.
Applications must authorize the current server-side subject at every entry
point.

Expand Down
4 changes: 2 additions & 2 deletions docs/benchmarks.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Benchmarks

The benchmark harness measures committed actor operations. It is intended to
show tradeoffs and catch large regressions, not to predict application capacity.
The benchmark harness measures committed actor operations. It shows tradeoffs
and catches large regressions. It does not predict application capacity.

## Idle polling

Expand Down
16 changes: 8 additions & 8 deletions docs/correctness.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,12 @@

- At-least-once execution means actor code may begin more than once. State and
staged intents from a failed turn roll back, but arbitrary external work does
not. External systems need stable idempotency keys. This clause is
observable, not decorative: `pnpm run test:at-least-once` crashes an
effect worker between the sink write and the acknowledgement, restarts
it, and shows the sink reading 2 with deduplication off then shows a
guard on the stable effect id absorbing the same duplicate, with the
sink reading 1. The state commit happens exactly once in both runs.
not. External systems need stable idempotency keys. A test shows this
clause: `pnpm run test:at-least-once` crashes an effect worker between
the sink write and the acknowledgement, restarts it, and shows the sink
reading 2 with deduplication off. It then shows a guard on the stable
effect id absorbing the same duplicate, with the sink reading 1. The
state commit happens exactly once in both runs.
- The activation fence protects the Solid Objects commit. It cannot revoke or
undo network calls, files, emails, payments, or other external effects.
- One identity processes one write operation at a time. This is the ordering
Expand All @@ -74,8 +74,8 @@
Once newer code persists a state version, older code rejects that actor.
- The application owns HTTP, WebSocket authentication, rendering, process
placement, capacity, database backups, and database failover.
- Redis and PostgreSQL notifications reduce wake-up latency but do not replace
durable polling or become a source of truth.
- Redis and PostgreSQL notifications reduce wake-up latency. They do not
replace durable polling, and they hold no authoritative state.
- The browser platform has no `AsyncLocalStorage`. Its context store covers
only the synchronous part of a callback. After the first `await` inside an
actor operation, the ambient guards (`applicationWritesForbidden()` and the
Expand Down
10 changes: 5 additions & 5 deletions docs/parity.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Design parity ledger

This ledger tracks capability parity with the Ruby `solid_objects` gem.
Parity means preserving a capability and its correctness or security boundary,
not copying a Rails API into Node.
Parity preserves a capability and its correctness or security boundary. It does
not copy a Rails API into Node.

Reference: Ruby `solid_objects` 0.14.0. The JavaScript package began at the
Ruby design's `0.12` capability generation; that version number did not imply
Expand Down Expand Up @@ -151,8 +151,8 @@ signal-consuming renderers track actors with no manual registration. No
Ruby row exists because the slot it fills is already native in Rails:
the gem's Turbo and Action Cable component surface re-renders partials
from the same committed observables. Each runtime renders with its
ecosystem's primitive; the guaranteeviews track committed state under
revision fencing and the same privacy model — is what parity preserves.
ecosystem's primitive. Parity here preserves the guarantee: views track
committed state under revision fencing and the same privacy model.

## Shared capability: the transmit family

Expand All @@ -163,7 +163,7 @@ from proposals [#47](https://github.com/cardmagic/solid-objects-ruby/issues/47)
and [#48](https://github.com/cardmagic/solid-objects-ruby/issues/48)):
`SolidObjects::Transmission.receive` is the ingest, and `Actor#transmit`
with `register_transmit` is the staging side. Identifiers differ by
runtime idiom; the wire contract is what both sides guarantee:
runtime idiom, but both sides guarantee the same wire contract:

- envelope keys are camelCase (`effectId`, `actorType`, `actorId`,
`operation`, and an optional `arguments` that defaults to an empty
Expand Down