Designs 51, 32: name the manifest-reads grant and who holds the old-form window

The upgrade and security review asked that each window's caller be
granted the event through its invokes, that an away node be held by the
assigner rather than the old-form window, and that a node-engine not yet
serving manifest-reads keep a window open by name.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
This commit is contained in:
2026-11-04 09:46:46 +01:00
parent f47744a8b6
commit 48fa0a5a48
2 changed files with 25 additions and 10 deletions
@@ -521,7 +521,11 @@ value it holds under the old name to the new name in its own state, without the
the node-engine seat's event `mesh.seat.node-engine.event.manifest-reads-changed`, said when a node's stated the node-engine seat's event `mesh.seat.node-engine.event.manifest-reads-changed`, said when a node's stated
capabilities change and when it returns after being away (ADR 0618 §4), as for the old seat name (design 51), and capabilities change and when it returns after being away (ADR 0618 §4), as for the old seat name (design 51), and
on it reads that node's stated capabilities through the seat's verb `manifest-reads` (ADR 0618 §3) and its applied on it reads that node's stated capabilities through the seat's verb `manifest-reads` (ADR 0618 §3) and its applied
builds through `node_haves`, never a watch of the node-engine's have state (ADR 0596). ADR 0618 does not cover a builds through `node_haves`, never a watch of the node-engine's have state (ADR 0596). mesh-config declares
`seat:node-engine.manifest-reads` in its `invokes`: that is the grant the grants part composes, and with it the
grants part grants mesh-config the subscription to the event's subject (its unit row is in design 51). A
node-engine that does not yet serve `manifest-reads` counts as stating nothing: the window stays open and
the seat's verb `renames` names the node. ADR 0618 does not cover a
returned node that applies the module's new build only after its return event, since that build changes what the returned node that applies the module's new build only after its return event, since that build changes what the
module reads, not what the node-engine states: such a node closes the window on the next `delivered`, whichever module reads, not what the node-engine states: such a node closes the window on the next `delivered`, whichever
delivery says it. A node holding a window open delivery says it. A node holding a window open
@@ -84,7 +84,10 @@ applies the new build, with no other delivery: `distribution` also wakes on the
`mesh.seat.node-engine.event.manifest-reads-changed`, which each node-engine says when the capabilities it states `mesh.seat.node-engine.event.manifest-reads-changed`, which each node-engine says when the capabilities it states
change and when its node returns after being away (ADR 0618 §4), and on it reads that node's stated capabilities change and when its node returns after being away (ADR 0618 §4), and on it reads that node's stated capabilities
through the seat's verb `manifest-reads` (ADR 0618 §3), and its applied build through `node_haves`, never a watch of through the seat's verb `manifest-reads` (ADR 0618 §3), and its applied build through `node_haves`, never a watch of
the node-engine's have state (ADR 0596). A returned node that then applies the build whose node-engine reads the new the node-engine's have state (ADR 0596). `distribution` declares `seat:node-engine.manifest-reads` in its `invokes`:
that is the grant the grants part composes, and with it the grants part grants `distribution` the subscription to
the event's subject. A node-engine that does not yet serve `manifest-reads` counts as stating nothing: the window stays
open and `registry_old_name` names the node. A returned node that then applies the build whose node-engine reads the new
names says the event again, as its stated capabilities change, so ADR 0618 covers every node of this window and no names says the event again, as its stated capabilities change, so ADR 0618 covers every node of this window and no
`delivered` is waited for. `cargo-package-registry` stays `delivered` is waited for. `cargo-package-registry` stays
named, without a holder, until a build module publishes cargo packages. named, without a holder, until a build module publishes cargo packages.
@@ -385,10 +388,14 @@ that was away is held, never handed a form it cannot read. This is a window like
reads each node's stated capabilities through the node-engine seat's verb `manifest-reads` (ADR 0618 §3) at its start, reads each node's stated capabilities through the node-engine seat's verb `manifest-reads` (ADR 0618 §3) at its start,
and wakes on the seat's event `mesh.seat.node-engine.event.manifest-reads-changed`, said when a node's stated and wakes on the seat's event `mesh.seat.node-engine.event.manifest-reads-changed`, said when a node's stated
capabilities change and when the node returns after being away (ADR 0618 §4), never on a watch of the node-engine's capabilities change and when the node returns after being away (ADR 0618 §4), never on a watch of the node-engine's
have state (ADR 0596) and never on a timer. Its tool `builder_old_form` lists whether the have state (ADR 0596) and never on a timer. The builder declares `seat:node-engine.manifest-reads` in its `invokes`:
window is open and the nodes whose node-engine does not yet state the capability, and drops a retired node from it by that is the grant the grants part composes, and with it the grants part grants the builder the subscription to the
hand, recorded as a hand act; a node holding it open for seven days is the builder's finding naming the node, cleared event's subject. A node-engine that does not yet serve `manifest-reads` counts as stating nothing: the window stays
when the window closes. Closing it says so in the build log and emits `old-form-closed` (the time, the nodes that held open and names the node. Only a present node-engine that has not updated holds this window; a node away is held by the
assigner instead and is not listed as holding it. Its tool `builder_old_form` lists whether the window is open and the
present nodes whose node-engine does not yet state the capability, and drops a retired node from it by hand, recorded
as a hand act; a present node holding it open for seven days is the builder's finding naming the node, cleared when
the window closes. Closing it says so in the build log and emits `old-form-closed` (the time, the nodes that held
it last, the nodes dropped by hand) on the builder's own family beside `numbered`; a waiter on a build's end does not it last, the nodes dropped by hand) on the builder's own family beside `numbered`; a waiter on a build's end does not
wake on it. wake on it.
@@ -480,9 +487,11 @@ test).
source other than the publish target) the floor finding is written and cleared once it answers, and with source other than the publish target) the floor finding is written and cleared once it answers, and with
`bridge_tags` still silent after the by-digest publish, the build stays unnumbered until the forge bridge's health `bridge_tags` still silent after the by-digest publish, the build stays unnumbered until the forge bridge's health
clears (no timer runs), and is then numbered and published by version; `builder_floor_again` asks the three clears (no timer runs), and is then numbered and published by version; `builder_floor_again` asks the three
sources at once and records the hand act; the node-engine's done key stays in the old form while one node's sources at once and records the hand act; the node-engine's done key stays in the old form while one present node's
node-engine lacks the capability and is written in the new form once every node states it, `builder_old_form` node-engine lacks the capability, or does not serve `manifest-reads`, and is written in the new form once every
naming that node meanwhile and dropping it by hand with a hand act; a present node gaining the capability closes present node states it, `builder_old_form` naming that node meanwhile and dropping it by hand with a hand act; with
one node away whose node-engine lacks the capability, the new form is written, the assigner holds that node's want,
and `builder_old_form` does not list it (ADR 0618 §1, §2); a present node gaining the capability closes
that window on its `manifest-reads-changed` event with no `delivered` and no timer (ADR 0618 §2, §4), while a node that window on its `manifest-reads-changed` event with no `delivered` and no timer (ADR 0618 §2, §4), while a node
away is held by the assigner from builds in the new form (ADR 0618 §1), with `old-form-closed` emitted away is held by the assigner from builds in the new form (ADR 0618 §1), with `old-form-closed` emitted
and its build-log line written, and a waiter on a build's end does not wake on it; with the image's own seat silent and its build-log line written, and a waiter on a build's end does not wake on it; with the image's own seat silent
@@ -508,7 +517,9 @@ test).
the seat it came through and that seat's holder; a change of the seat's holder composes the declaration again with the seat it came through and that seat's holder; a change of the seat's holder composes the declaration again with
the new holder named and recreates no container. the new holder named and recreates no container.
- **The grants part, unit** (a case of its composition test): a node-engine's subscriptions hold the status view's - **The grants part, unit** (a case of its composition test): a node-engine's subscriptions hold the status view's
`settled` family beside the backup holder's word, and nothing more. `settled` family beside the backup holder's word, and nothing more; the subscriptions of `distribution`, the builder
and mesh-config, each declaring `seat:node-engine.manifest-reads` in `invokes`, hold the subject
`mesh.seat.node-engine.event.manifest-reads-changed`, and no other module's subscriptions hold it.
- **Checker.** A changed build module invoking a verb no running holder serves is not run, and the verdict names the - **Checker.** A changed build module invoking a verb no running holder serves is not run, and the verdict names the
modules composed from their manifests instead, and the verb. modules composed from their manifests instead, and the verb.
- **Vault.** Reverting the milestone's merge mints the build modules' credentials again; the bootstrap's one-off - **Vault.** Reverting the milestone's merge mints the build modules' credentials again; the bootstrap's one-off