Skip to content

docs: name Solid Objects a virtual actor library - #83

Merged
cardmagic merged 4 commits into
mainfrom
docs/agent-discoverability
Oct 8, 2026
Merged

cardmagic merged 4 commits into
mainfrom
docs/agent-discoverability

Conversation

@cardmagic

@cardmagic cardmagic commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Why

An agent asked "does Ruby have a virtual actor library" answered no. The architecture guide already called Solid Objects a database-backed virtual actor runtime, but the README, the gem metadata, and the website did not use the category. A frozen baseline of 80 agent runs (two environments, 20 prompts, two runs each) found the project in 15 of 64 suitable runs before this change.

What changes

  • The README opening, the gemspec summary, and the gemspec description name the category: a SQL-backed virtual actor library for Ruby on Rails.
  • The gem homepage is https://solidobjects.dev/ruby. The old value, the site root, redirects to the Node page.
  • docs/virtual-actors.md is the category guide. It gives the short answer, the definition, an example, fit and poor-fit criteria, comparisons with sources checked on October 7, 2026, and an Orleans concept map.
  • docs/agents.md is a consumer guide for coding agents. It covers fit, package identity, installation, authorization, the runtime process, effect idempotency, verification, and troubleshooting.
  • examples/quickstart/ and rake quickstart prove the published recipe against the built gem in a new Rails app. A new quickstart CI job runs it, and the release job now waits for it.
  • context7.json limits Context7 indexing to the consumer documentation.
  • docs/operations.md corrects the json 3.0.2 note. Only Active Support 8.1.3.1 and earlier fail; Active Support 8.1.4 decodes correctly.
  • AGENTS.md adds the release step that refreshes the site snapshot and the Context7 index.

Effects

  • API: none. Runtime code does not change.
  • Correctness and security: none. The guides keep deny-by-default authorization and state at-least-once delivery, no cross-actor transactions, and pre-1.0 status. The quickstart grants only the message and query policies, for a local demo.
  • Compatibility: the gem metadata changes on the next release.
  • CI: the release job now depends on the quickstart job, which needs rubygems.org access.

How the quickstart proves the artifact

rake quickstart builds the gem, runs rails new --minimal --skip-bundle with SQLite, copies the built .gem into vendor/cache, and runs bundle install --local. It confirms that the Gemfile has no path:, that the Gemfile.lock checksum equals the built gem's SHA-256, and that the loaded solid_objects/version.rb is inside the temporary bundle path. It runs the generator, the migrations, and the doctor. Eight bin/rails runner processes hold the same event while solid_objects start runs, and exactly one hold commits. A due reminder waits while the runtime is stopped and releases the hold once after the restart. The check fails when a TicketSale sample in the README or docs/ differs from the actor that it runs.

Observed failures before the fixes

  • test/unit/gem_specification_test.rb: Expected /virtual actors?/i to match "Cloudflare Durable Objects, ported to Rails". and expected "https://solidobjects.dev/ruby", actual "https://solidobjects.dev". The packaging test failed with to include "docs/agents.md" when the guide was moved aside.
  • rake quickstart before the recipe existed: quickstart proof failed: examples/quickstart/README.md exists (QuickstartSmoke::Failure). Each key assertion was also shown to fail when its condition breaks: installing the published gem instead of the built one, skipping the restart, and leaving the runtime running.

Validation

  • bundle exec rake: 873 runs, 3310 assertions, 0 failures, 0 errors, 28 skips (PostgreSQL and MySQL suites without a database URL). Standard, RuboCop, RBS, Steep, and Brakeman are clean.
  • bundle exec rake quickstart: passed on Ruby 4.0.5 and Ruby 3.3.9 (local runs, not hosted CI).
  • bundle exec rake build: the built gem contains docs/agents.md and docs/virtual-actors.md, and its metadata homepage is https://solidobjects.dev/ruby.
  • git diff --check: clean.

Roadmap: no change. This changes documentation positioning and adds an onboarding proof. It does not change a runtime capability.

Release and CI fix

  • chore: prepare version 0.17.1 moves the changelog into a dated 0.17.1 section.
  • ci: pin json 2 for Rails before 8.1: the compatibility matrix now resolves json 3.0.2, because rubocop 1.91.0 and standard 1.57.0 no longer hold json below 3. With json 3.0.2, Active Support 7.1.6 and 8.0.5.1 fail to encode and decode (unknown keyword: quirks_mode), and only Active Support 8.1.4 works. main fails the same way today. The matrix now pins json 2.x for Rails 7.1, 7.2, and 8.0, the configuration that the guide now prescribes. The Rails 7.1 suite passes locally with the pin: 873 runs, 0 failures.

An agent asked "does Ruby have a virtual actor library" answered no.
The architecture guide already used that category, but the README,
the gem metadata, and the website did not. A baseline of 80 agent
runs found the project in 15 of 64 suitable runs.

Name the category where people and agents look first:

- The README opening and the gemspec summary and description call
  Solid Objects a SQL-backed virtual actor library for Ruby on Rails.
- The gem homepage links to https://solidobjects.dev/ruby. The site
  root redirects to the Node page.
- docs/virtual-actors.md answers the category question. It has the
  definition, an example, fit and poor-fit criteria, comparisons with
  checked sources, and an Orleans concept map.
- docs/agents.md gives coding agents setup, authorization, effect
  idempotency, verification, and troubleshooting steps.
- context7.json limits Context7 to the consumer documentation.

Add examples/quickstart and `rake quickstart`. The check builds the
gem, installs it into a new Rails app from vendor/cache, and proves by
checksum and load path that the app loads the built gem. It then
proves that eight concurrent holds give one winner, and that a due
reminder waits while the runtime is stopped and runs after a restart.
It fails when a TicketSale sample in the README or docs/ drifts from
the actor that it runs. CI runs it, and the release job waits for it.

Correct docs/operations.md: json 3.0.2 breaks only Active Support
8.1.3.1 and earlier. Active Support 8.1.4 decodes correctly.
@greptile-apps

greptile-apps Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Medium risk] Rebrands the gem and adds documentation and a quickstart test.

The PR appears safe to merge; all three previous findings are fixed and no new blocking issue was found.

What we checked:

  • CI applies the JSON pin: The compatibility job updates the lockfile before installing. Rails 7.1, 7.2, and 8.0 therefore receive the new json constraint.

Summary

Solid Objects is now described as a SQL-backed virtual actor library for Rails. The PR adds consumer guides, a clean-install quickstart, and a CI check required before release.

  • All three previous findings are addressed.
  • Older Rails compatibility jobs now pin json to 2.x.
  • The version and changelog prepare release 0.17.1.
  • No new actionable issues were found.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[Build gem] --> B[Create temporary Rails app]
  B --> C[Install built gem locally]
  C --> D[Check checksum and loaded files]
  D --> E[Install tables and demo policies]
  E --> F[Check concurrent holds]
  F --> G[Stop runtime and wait for reminder]
  G --> H[Restart runtime and check recovery]
  H --> I[Release can proceed]
Loading

Reviews (2) · Last reviewed commit: "test: check that the transmission policy..." · Reviewed by Greptile

Comment thread examples/quickstart/smoke.rb Outdated
Comment thread examples/quickstart/smoke.rb Outdated
Comment thread examples/quickstart/smoke.rb Outdated
The compatibility matrix runs bundle lock --update. On October 3 it
still resolved json 2.21.2, because rubocop 1.88.2 and standard
1.56.0 held json below 3. rubocop 1.91.0 and standard 1.57.0 allow
json 3, so the matrix now resolves json 3.0.2, and every Rails 7.1,
7.2, and 8.0 job fails with "unknown keyword: quirks_mode". main
fails the same way today.

The break is in Active Support, not in Solid Objects. Local checks
with json 3.0.2 show that Active Support 7.1.6 and 8.0.5.1 fail to
encode and decode, 8.1.3.1 fails to decode, and only 8.1.4 works.
An application on those Rails lines must pin json 2.x, so the matrix
now pins it too and tests the configuration that the guide
prescribes. The Rails 7.1 suite passes with the pin: 873 runs, 0
failures.

Correct the json note in docs/operations.md, docs/agents.md, the
quickstart README, and context7.json. The earlier note named only the
8.1 releases before 8.1.4.
Review feedback on #83. The recipe promises that four policies stay
denied, but the smoke check verified only three. Add
authorize_transmission to DENIED_POLICIES. With the generator template
changed to grant transmissions, rake quickstart now fails with
"authorize_transmission stays denied"; with the real template it
passes.

Remove two guards that cannot fire: __dir__ is never nil when Ruby
loads the file, and initialize sets @root before call runs. Name the
Integer values that the two proof methods return instead of untyped.
@cardmagic

Copy link
Copy Markdown
Owner Author

@greptileai Please review the latest commit 9f11cdf. It answers all three findings: DENIED_POLICIES now includes authorize_transmission (rake quickstart fails with "authorize_transmission stays denied" when the template grants it), the two guards that cannot fire are gone, and both proof methods return Hash[Symbol, Integer]. The branch also adds 7d2202f, which pins json 2.x for the Rails 7.1, 7.2, and 8.0 compatibility jobs and documents the json 3 requirement, and 143297c, which prepares 0.17.1.

@cardmagic
cardmagic merged commit 7e19e64 into main Oct 8, 2026
43 checks passed
@cardmagic
cardmagic deleted the docs/agent-discoverability branch October 8, 2026 06:49
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