Skip to main content

max / quasi

Let a description draw the third stand-in state `empty` and `failed` are members and `Node::pending` was not, so the one state a screen could not say was the one that says work is under way. goingson's backups region is the site: it is `Slot::live`, so a host that swaps markup has nowhere to put a readiness attribute and needs the node. The member is `underway` rather than `pending` because `Slot::pending` is a setting and one name cannot mean both. Renaming is what the rule leaves open where `token` had to go to a supplier: `token` collided with a setting meaning the same thing on a container that could hold one, while `Slot::pending` says a region is waiting and this says what to draw in it.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01MptwXZ8k65v19rFmdGAyki
Author: Max Johnson <me@maxj.phd> · 2026-09-04 19:33 UTC
Signed with PGP, not checked
Commit: 1f1765a609fdd7a4c8391a7ced157f56f25e7b54
Parent: 7628dda
2 files changed, +25 insertions, -0 deletions
@@ -869,6 +869,19 @@
869 869 )?;
870 870 Ok(quote!(::quasi_router::Node::token(#tag)))
871 871 }
872 + Emission::Simple { member, args, body } if member == "underway" => {
873 + // The one member whose name is not its constructor's. `Node::pending`
874 + // is the third `StandIn` state, beside `empty` and `failed`, and
875 + // `pending` is a setting on `Slot`, so the member is named for what
876 + // it says instead. The body still sets on a `Node`, which is what
877 + // `offering` wants: a stand-in with a way out of it.
878 + let args = args.iter().map(self::arg).collect::<Result<Vec<_>>>()?;
879 + accrete(
880 + body,
881 + Container::Node,
882 + &quote!(::quasi_router::Node::pending(#(#args),*)),
883 + )
884 + }
872 885 Emission::Simple { member, args, body } if member == "canvas" => {
873 886 // The second member whose body does not set on a `Node`, and for
874 887 // `picture`'s reason: `Node::Canvas` holds a `Canvas`, and
@@ -100,6 +100,17 @@
100 100 /// than settings: an axis is told what sits on it and where, which is the `at`
101 101 /// member under `Container::Timeline`. It is a `Node` either way, so nothing is
102 102 /// wrapped afterwards.
103 + ///
104 + /// `underway` is the sixth, and the only one renamed rather than reshaped. It
105 + /// is `Node::pending`, the third of the three `StandIn` states beside `empty`
106 + /// and `failed`, and it cannot be spelled `pending` because `Slot::pending` is
107 + /// a setting and one name cannot mean both. Renaming is what the rule leaves
108 + /// open where `token` had to go to a supplier: `token` collided with a setting
109 + /// that meant the same thing on a container that could hold one, so a second
110 + /// spelling would have been two ways to say one thing, while `Slot::pending`
111 + /// says a region is waiting and this says what to draw in it. goingson's
112 + /// backups region is the site: it is `Slot::live`, so a swapping host has
113 + /// nowhere to put an attribute and needs the node.
103 114 const NODE_MEMBERS: &[&str] = &[
104 115 "text",
105 116 "toned",
@@ -121,6 +132,7 @@
121 132 "canvas",
122 133 "badge",
123 134 "timeline",
135 + "underway",
124 136 ];
125 137
126 138 /// The arrangements a screen may be laid out in.