···9696list of children, and a parent (except the root). A node's in-memory identity is
9797its object reference; its externalizable identity is its `id`. The Node's data
9898fields are read-only โ all property mutations go through the context API. Each
9999-node maintains an eval loop that accepts operations via `node.eval()`, enabling
100100-scoped execution. `node.remove()` delegates to the `remove` context API
101101-operation, which halts the node's scope and tears down all descendants.
102102-Middleware on `remove` participates in teardown.
9999+node owns an Effection scope; `node.eval()` runs operations inline in that scope.
100100+`node.remove()` delegates to the `remove` context API operation, which halts the
101101+node's scope and tears down all descendants. Middleware on `remove` participates
102102+in teardown.
103103104104**Component.** A generator function of type `() => Operation<void>` that runs
105105within a node's Effection scope for the node's entire lifetime. Components
···240240241241### 5.3 Scoped Evaluation
242242243243-Each node maintains an **eval loop** โ a spawned child task within the node's
244244-scope that accepts and executes operations submitted via `node.eval()`. The eval
245245-loop uses a channel- based "fire and await" pattern: the caller submits an
246246-operation and waits for its result; the eval loop executes the operation in the
247247-node's scope and resolves the result.
243243+Each node owns an Effection **scope** (captured when its component task starts).
244244+`node.eval(op)` runs `op` **inline** in the caller's routine with the routine's
245245+scope temporarily repointed at the node's scope, then restored. There is no eval
246246+loop and no channel.
248247249248N-eval1. `node.eval(op)` runs `op` within the node's Effection scope and returns
250249`Result<T>`. If `op` completes successfully, the result is
···253252N-eval2. Operations yielded inside `op` see the node's scope context โ including
254253all middleware installed in the node's scope and its ancestors.
255254256256-N-eval3. The eval loop executes operations sequentially. If multiple callers
257257-submit operations concurrently, they are processed in order.
255255+N-eval3. `eval` is immediate โ it runs `op` synchronously inline โ and
256256+non-serial: it does not queue. Re-entrant and concurrent `eval` calls nest, each
257257+restoring the previous scope when it completes. The only serialization point in
258258+the system is the tree's dispatch queue (ยง7).
258259259259-N-eval4. The eval loop is spawned as a child of the node's scope. It runs
260260-alongside the component and shares the same parent scope, so middleware
261261-installed by the component is visible to operations executed via `eval`.
260260+N-eval4. Because `op` runs with the node's scope as the current scope, middleware
261261+installed by the node's component is visible to operations executed via `eval`.
262262263263### 5.4 Lifecycle
264264265265-N7. A node is created by `append()`, which spawns a new Effection child scope
266266-within the parent node's scope and runs the component within it.
265265+N7. A node is created by `append()`, which spawns a task within the parent node's
266266+scope and runs the component within it. The task captures its scope
267267+(`useScope()`) as the node's scope, so the node's scope inherits the parent's
268268+contexts.
267269268270N8. A node is destroyed by `node.remove()`, which halts the node's spawned task.
269269-This triggers structured teardown of the component, the eval loop, all
270270-middleware installed in the scope, and all descendant nodes. `remove()` does not
271271-return until teardown is complete.
271271+This triggers structured teardown of the component, all middleware installed in
272272+the scope, and all descendant nodes. `remove()` does not return until teardown is
273273+complete.
272274273275N9. When a node is destroyed, its middleware disappears automatically because
274276the Effection scope is destroyed.