Skip to content

Add Restate, DBOS, RivetKit, Graphile comparisons - #78

Merged
cardmagic merged 3 commits into
mainfrom
docs/comparison-pages
Oct 15, 2026
Merged

cardmagic merged 3 commits into
mainfrom
docs/comparison-pages

Conversation

@cardmagic

@cardmagic cardmagic commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Why

An evaluation on 2026-10-15 ran Claude Code (Opus 5.5, high effort) on six use cases that fit Solid Objects. With web search on, it searched 30 times. Each search named a library that it already knew, for example "Restate virtual objects TypeScript SDK delayed calls state", "RivetKit actors PostgreSQL driver self-host Node.js", "DBOS TypeScript partitioned queue send recv ordering durable sleep", and "Graphile Worker queue_name serial execution job_key run_at". No result showed Solid Objects.

These pages target those searches. Each page compares one real task, says when the other system is the better choice, and links the primary sources (checked 2026-10-15).

Changes

  • docs/compare/restate.md, dbos.md, rivetkit.md, graphile-worker.md.
  • examples/compare/: an AgentSession actor (model call as an effect, follow-up reminder), a ShoppingCart actor (payment effect, 30-minute idle release), and a ChatRoom actor (ordered posts, unread counts, archive reminder).
  • test/compare-*.test.ts: 21 tests for the three examples.
  • tsconfig.json and tsconfig.examples.json treat test/compare-*.test.ts like the guide tests.
  • scripts/check-documentation.mjs checks docs/compare/: embedded examples, links and headings, no em or en dash, and a link from docs/comparisons.md to each page.
  • docs/comparisons.md and the README link the pages.
  • chore: prepare version 1.0.2. No API change. The site shows guides only from release tags.

Measured before release

A new eval condition put the new README and the first version of these pages (before the review fixes) beside the published README in the trial folder. The prompt was the same as the docs condition. All 30 trials opened a comparison page.

Node.js use case Mean rank before (of 7) Mean rank with the pages
Shopping cart checkout 3.6 2.6
Chat rooms 2.0 2.0
AI agent sessions 3.6 2.6
All Node.js 3.07 (95% interval 2.6 to 3.47) 2.4 (2.0 to 2.8)

Solid Objects was the top library in 8 of 15 Node answers, up from 5. It was the first choice once (AI sessions). The intervals overlap a little, so the change can be chance at 5 trials per case. Maturity is still the main reason against it.

Validation

  • pnpm run check
  • pnpm test: 80 files, 699 passed, 32 skipped (database jobs, as on main)
  • pnpm run format:check
  • pnpm run pack:check

Each new test failed before its example existed. Removing the newest-turn guard in AgentSession makes "keeps only the reply for the newest turn" fail.

Accuracy review

A separate review checked every claim against the current Restate, DBOS, Rivet, and Graphile Worker docs and this repository. The pages carry its corrections, for example: DBOS datasource transactions run once, Rivet Cloud and Rivet Workflows exist, Graphile Worker can unlock jobs early with forceUnlockWorkers, the commercial add-ons of each project (including Solid Objects Pro), and the full production sentence.

Greptile fixes

Greptile found four defects in the examples. Each fix has a test that failed first:

  • A caller with no credentials could join and post with a null member ID.
  • When every payment response was lost, the cart opened again, and a second checkout could charge with a new key. The cart now checks the charge with the same key (check_payment) before it opens again. A declined card is a result, not a failure.
  • A reminder that was already queued behind newer activity could archive a room or release a cart. Each reminder now carries an activity count.
  • A pinned message lost its text after 200 newer posts. The room now keeps a copy.

An evaluation on 2026-10-15 found that Claude Code, with web search,
searched only for libraries it already knew (Restate, DBOS, RivetKit,
Graphile Worker) and never found Solid Objects. Each new page targets
those searches, compares one real task, and says when the other
system is the better choice.

The Solid Objects code on each page lives in examples/compare/ and
runs in the test suite. The documentation check now requires each
page to embed its current examples, link only to files and headings
that exist, and use no em or en dash.
@context7

context7 Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Docs7 for cardmagic/solid-objects-js

Result Status Action
Deployment ➖ Not used —
Content review ➖ Did not run. This site has no agent runs available this month. Wait for the monthly reset or check your Docs7 plan. —

Commit 7489a71

@greptile-apps

greptile-apps Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[Low impact] The PR appears safe to merge; all four previous findings are addressed.

Summary

Adds comparisons with Restate, DBOS, RivetKit, and Graphile Worker, backed by three runnable examples.

  • Agent sessions keep conversation turns in order and schedule follow-ups.
  • Shopping carts recover payment attempts and release stock after inactivity.
  • Chat rooms keep ordered messages, unread counts, and idle archives.
  • Comparison pages are linked and checked alongside the 1.0.2 release.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Checkout] --> B[Paying]
  B --> C{Charge result}
  C -->|Paid| D[Paid]
  C -->|Declined| E[Open]
  C -->|Attempts exhausted| F[Checking]
  F --> G[Look up original charge key]
  G -->|Paid| D
  G -->|Not found| E
  G -->|Attempts exhausted| H[Dead letter available for retry]
Loading

Reviews (2) · Last reviewed commit: "fix: close gaps found in comparison revi..." · Reviewed by Greptile

Comment thread examples/compare/chat-runtime.ts Outdated
Comment thread examples/compare/shopping-cart.ts Outdated
Comment thread examples/compare/chat-room.ts Outdated
Comment thread examples/compare/chat-room.ts Outdated
Greptile found four defects in the examples:
- A caller with no credentials could join and post with a null ID.
- A cart reopened after every payment response was lost, so a second
  checkout could charge again with a new key. It now checks the
  charge with the same key before it reopens.
- A reminder queued behind newer activity could archive a room or
  release a cart. Each reminder now carries an activity count.
- A pinned message lost its text after 200 newer posts.

The accuracy review also corrected source claims on the pages, such
as DBOS datasource transactions, Rivet Cloud and Workflows, and the
commercial add-ons of each project.
@cardmagic

Copy link
Copy Markdown
Owner Author

@greptileai Please review the current head 7489a71. Finding 1: authorizeMessage now rejects a caller whose member ID is null before the comparison. Finding 2: a declined card is now a result (paymentSettled opens the cart). If every charge attempt fails with no answer, paymentUnknown sets the status to checking and stages check_payment with the effect ID of the charge, so no new key exists while the first charge is in doubt. The cart opens again only when the provider has no charge for that key. Finding 3: each reminder carries an activity count, and archiveIfIdle and releaseIfIdle ignore a stale one. Finding 4: pin keeps a copy of the message. Each fix has a test that failed first: 6 new tests, 21 in the compare files. pnpm run check, pnpm test (699 pass), format:check, and pack:check pass. The mysql job failure is a Docker Hub pull limit (toomanyrequests), and I started it again.

@cardmagic
cardmagic merged commit 0a26ebb into main Oct 15, 2026
28 of 29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant