From bc8970d7f3e64c1c956310ebf93cf59d7f02f7fd Mon Sep 17 00:00:00 2001 From: Lucas Carlson Date: Sun, 9 Aug 2026 09:10:37 -0700 Subject: [PATCH 1/2] docs: bring the roadmap up to 0.7.1 The roadmap still described the delivery story as of 0.5.0. Record batched refreshes, personalized state payloads, the JavaScript suite, pinned actions, and bounded lock retries as implemented; note that batch coalescing happens in the browser, so one commit still sends one Action Cable message per changed observable; and record what the delivery benchmark does and does not measure. Also record that in-process wake-up signaling cannot reach a worker process, which leaves up to polling_interval of delay on every reactive update and is the largest remaining latency term. --- docs/roadmap.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index c2fd5bb..35461f7 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -17,18 +17,25 @@ - One-shot and recurring reminders with `:latest` or `:all` catch-up - Durable observable invalidations, scalar Turbo replacement, keyed ERB components, signed component locals, and authorized replace or morph refresh +- Batched component refreshes: components sharing a signed `batch:` collapse to + one browser request per revision, served as HTML frames in a JSON envelope +- Personalized state payload broadcasts computed per subscriber under that + subscriber's authorization context, fenced by actor revision - Reconciliation read APIs - Installation doctor, authorization reference, fit guide, and legacy-state migration cookbook - Handler Active Record write isolation, same-database commit actions, ambient - transaction rejection, adapter lock/query deadlines, structured sync timeout - diagnostics, and result recovery + transaction rejection, adapter lock/query deadlines, bounded SQLite lock + retries outside those deadlines, structured sync timeout diagnostics, and + result recovery - Bounded message/process pruning, actor-type opt-in instance expiration, graceful caller shutdown, committed state snapshots, and an opt-in Minitest helper - SQLite, PostgreSQL, and MySQL integration suites - Inline RBS generation/validation, Steep, Standard Ruby, Solid Queue's exact RuboCop policy, and a warning-free Brakeman scan +- A JavaScript suite covering the browser modules, run in CI with Node's test + runner and jsdom, with every GitHub Actions reference pinned to a commit SHA ## Partially implemented @@ -36,10 +43,17 @@ role or run periodic maintenance automatically. - Wake-up strategy: in-process signaling plus durable polling and injection are implemented; PostgreSQL `LISTEN/NOTIFY` and optional Redis adapters are not. + Signaling cannot cross process boundaries, so a commit in a web process does + not wake a broadcast executor in a worker process; that delivery waits up to + `polling_interval`, 100 ms by default. This is the largest remaining term in + reactive update latency, and neither batching nor state payloads reduce it. - Realtime: scalar and dependency-driven keyed ERB component replacement or morphing, personalized refresh authorization, revision fencing, coalescing, - and reconnect convergence are implemented; application-directed Turbo - append intents are not. + reconnect convergence, batched refreshes, and personalized state payloads are + implemented; application-directed Turbo append intents are not. Batch + coalescing happens in the browser rather than the broadcast executor, so one + commit still sends one Action Cable message per changed observable even + though it costs one browser request. - Backpressure: mailbox/payload/state/result caps and fair yields exist; distributed per-actor rate limits and global admission control do not. - Administration: actor and dead-letter views plus policy hooks exist; richer @@ -51,7 +65,8 @@ 1. Add automatic supervisor role replacement and periodic dead-process cleanup. 2. Add PostgreSQL notification and optional Redis wake-up adapters with latency - benchmarks and polling-race tests. + benchmarks and polling-race tests, removing the cross-process polling delay + rather than shrinking it with a smaller `polling_interval`. 3. Add result lookup by request ID and broader deadlock retry classification. 4. Add scheduled retention and stale-process maintenance. 5. Add database/server-version checks and MySQL InnoDB verification at boot. @@ -61,7 +76,9 @@ 8. Expand security scanning and run compatibility CI across supported Rails and Ruby versions. 9. Benchmark all workloads under documented hardware/database settings and - publish adapter-specific adoption measurements. + publish adapter-specific adoption measurements. Throughput, synchronous + latency, query counts, and the three reactive delivery paths are measured on + SQLite; adapter-specific and end-to-end browser measurements are not. No production-ready claim should be made until these hardening milestones have operational soak evidence. From 3537eff5fa5b2cf7ac9bb23511feb064f564e3a8 Mon Sep 17 00:00:00 2001 From: Lucas Carlson Date: Sun, 9 Aug 2026 09:18:14 -0700 Subject: [PATCH 2/2] docs: scope the JavaScript coverage claim The suite covers state_payload.js and component_batch_refresh.js. component_refresh.js, which drives individual morph refreshes, has no tests, so claiming the suite covers the browser modules overstated it. Name the two covered modules and record the uncovered one as a known gap. --- docs/roadmap.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index 35461f7..0d7e925 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -34,8 +34,9 @@ - SQLite, PostgreSQL, and MySQL integration suites - Inline RBS generation/validation, Steep, Standard Ruby, Solid Queue's exact RuboCop policy, and a warning-free Brakeman scan -- A JavaScript suite covering the browser modules, run in CI with Node's test - runner and jsdom, with every GitHub Actions reference pinned to a commit SHA +- A JavaScript suite covering the state payload and batched refresh browser + modules, run in CI with Node's test runner and jsdom, with every GitHub + Actions reference pinned to a commit SHA ## Partially implemented @@ -58,6 +59,9 @@ distributed per-actor rate limits and global admission control do not. - Administration: actor and dead-letter views plus policy hooks exist; richer filtering, audit records, and bulk-safe tools do not. +- Browser module coverage: the state payload and batched refresh modules have + JavaScript tests; `component_refresh.js`, which drives individual morph + refreshes, does not. - Outboxes use portable status rows with polling indexes; future versions may introduce narrow ready/claimed membership tables for very large outboxes.