docs: record the supervised-bus cycle (v0.8) and retire the OnceLock idiom

ROADMAP gains a v0.8 entry: the smarm 415effb lifetime change as root cause,
the description/instantiation split, the tree shape, the accepted per-call
resolution cost, and what stays open (RegistryName newtype, PubSub's
unprotectable const, dynamic session actors, hammer.sh's missing feature
matrix). The v0.7 "unreproduced test failure" open item is closed out and
pointed at it — it was this hang, hidden because hammer.sh builds with default
features while the failure needs --all-features load.

README and the two module headers still taught the v0.5 rules: in-runtime-only
construction, the non-static Arc<OnceLock<..>> cell, and "a relay must never
hold a PubSub clone". None of those are true any more; they are replaced by
what actually holds now, with a note on what changed for anyone who learnt the
old shape.

session.rs also gains an honest note that its session actors are the last
lifetime in urus implied by a drop rather than stated — they are dynamic, so a
fixed ChildSpec list cannot hold them, and the trigger is at least a command
now rather than a refcount.
This commit is contained in:
Claude
2026-08-20 15:01:44 +00:00
parent 9eaa85b9df
commit e02527a606
4 changed files with 126 additions and 33 deletions
+11 -4
View File
@@ -22,10 +22,17 @@
//! the transport is the point. Its exits: explicit leave, rejected
//! (re)join, TTL expiry, buffer cap, pubsub relay death, or the
//! registry's control sender dropping — which is exactly the shutdown
//! chain (conns die -> router `Arc`s drop -> registry's inbox closes
//! -> registry exits -> control senders drop -> every parked session
//! wakes on the closed control arm, terminates, and exits; `AllDone`
//! composes without links).
//! chain (the supervisor shuts the registry down after the endpoint
//! has drained -> the registry's state drops -> control senders drop
//! -> every parked session wakes on the closed control arm,
//! terminates, and exits; `AllDone` composes without links).
//!
//! Note this is the last lifetime in urus implied by a drop rather
//! than stated: sessions are dynamic (one per key), so a fixed
//! `ChildSpec` list cannot hold them. The trigger is now a command
//! rather than a refcount, which is what the v0.8 cycle was about, but
//! a dynamic supervisor (OTP's `simple_one_for_one`) is the honest
//! shape if smarm grows one.
//!
//! As-landed decisions (veto by diff):
//! - **Every attach calls `ch.join()` again** on the same instance —