|
17 | 17 | - One-shot and recurring reminders with `:latest` or `:all` catch-up |
18 | 18 | - Durable observable invalidations, scalar Turbo replacement, keyed ERB |
19 | 19 | components, signed component locals, and authorized replace or morph refresh |
| 20 | +- Batched component refreshes: components sharing a signed `batch:` collapse to |
| 21 | + one browser request per revision, served as HTML frames in a JSON envelope |
| 22 | +- Personalized state payload broadcasts computed per subscriber under that |
| 23 | + subscriber's authorization context, fenced by actor revision |
20 | 24 | - Reconciliation read APIs |
21 | 25 | - Installation doctor, authorization reference, fit guide, and legacy-state |
22 | 26 | migration cookbook |
23 | 27 | - Handler Active Record write isolation, same-database commit actions, ambient |
24 | | - transaction rejection, adapter lock/query deadlines, structured sync timeout |
25 | | - diagnostics, and result recovery |
| 28 | + transaction rejection, adapter lock/query deadlines, bounded SQLite lock |
| 29 | + retries outside those deadlines, structured sync timeout diagnostics, and |
| 30 | + result recovery |
26 | 31 | - Bounded message/process pruning, actor-type opt-in instance expiration, |
27 | 32 | graceful caller shutdown, committed state snapshots, and an opt-in Minitest |
28 | 33 | helper |
29 | 34 | - SQLite, PostgreSQL, and MySQL integration suites |
30 | 35 | - Inline RBS generation/validation, Steep, Standard Ruby, Solid Queue's exact |
31 | 36 | RuboCop policy, and a warning-free Brakeman scan |
| 37 | +- A JavaScript suite covering the state payload and batched refresh browser |
| 38 | + modules, run in CI with Node's test runner and jsdom, with every GitHub |
| 39 | + Actions reference pinned to a commit SHA |
32 | 40 |
|
33 | 41 | ## Partially implemented |
34 | 42 |
|
35 | 43 | - Supervisor: starts and drains thread roles, but does not replace a crashed |
36 | 44 | role or run periodic maintenance automatically. |
37 | 45 | - Wake-up strategy: in-process signaling plus durable polling and injection are |
38 | 46 | implemented; PostgreSQL `LISTEN/NOTIFY` and optional Redis adapters are not. |
| 47 | + Signaling cannot cross process boundaries, so a commit in a web process does |
| 48 | + not wake a broadcast executor in a worker process; that delivery waits up to |
| 49 | + `polling_interval`, 100 ms by default. This is the largest remaining term in |
| 50 | + reactive update latency, and neither batching nor state payloads reduce it. |
39 | 51 | - Realtime: scalar and dependency-driven keyed ERB component replacement or |
40 | 52 | morphing, personalized refresh authorization, revision fencing, coalescing, |
41 | | - and reconnect convergence are implemented; application-directed Turbo |
42 | | - append intents are not. |
| 53 | + reconnect convergence, batched refreshes, and personalized state payloads are |
| 54 | + implemented; application-directed Turbo append intents are not. Batch |
| 55 | + coalescing happens in the browser rather than the broadcast executor, so one |
| 56 | + commit still sends one Action Cable message per changed observable even |
| 57 | + though it costs one browser request. |
43 | 58 | - Backpressure: mailbox/payload/state/result caps and fair yields exist; |
44 | 59 | distributed per-actor rate limits and global admission control do not. |
45 | 60 | - Administration: actor and dead-letter views plus policy hooks exist; richer |
46 | 61 | filtering, audit records, and bulk-safe tools do not. |
| 62 | +- Browser module coverage: the state payload and batched refresh modules have |
| 63 | + JavaScript tests; `component_refresh.js`, which drives individual morph |
| 64 | + refreshes, does not. |
47 | 65 | - Outboxes use portable status rows with polling indexes; future versions may |
48 | 66 | introduce narrow ready/claimed membership tables for very large outboxes. |
49 | 67 |
|
50 | 68 | ## Next milestones |
51 | 69 |
|
52 | 70 | 1. Add automatic supervisor role replacement and periodic dead-process cleanup. |
53 | 71 | 2. Add PostgreSQL notification and optional Redis wake-up adapters with latency |
54 | | - benchmarks and polling-race tests. |
| 72 | + benchmarks and polling-race tests, removing the cross-process polling delay |
| 73 | + rather than shrinking it with a smaller `polling_interval`. |
55 | 74 | 3. Add result lookup by request ID and broader deadlock retry classification. |
56 | 75 | 4. Add scheduled retention and stale-process maintenance. |
57 | 76 | 5. Add database/server-version checks and MySQL InnoDB verification at boot. |
|
61 | 80 | 8. Expand security scanning and run compatibility CI across supported Rails and |
62 | 81 | Ruby versions. |
63 | 82 | 9. Benchmark all workloads under documented hardware/database settings and |
64 | | - publish adapter-specific adoption measurements. |
| 83 | + publish adapter-specific adoption measurements. Throughput, synchronous |
| 84 | + latency, query counts, and the three reactive delivery paths are measured on |
| 85 | + SQLite; adapter-specific and end-to-end browser measurements are not. |
65 | 86 |
|
66 | 87 | No production-ready claim should be made until these hardening milestones have |
67 | 88 | operational soak evidence. |
0 commit comments