Vault: enrolment token and node account, signing for enrolment, a node's two logins and their rotation, own hand-out of a login

The vault serves the verbs enrolment-token, node-account, rotate-node, node-account-confirm and abandon, keeps the state
node-logins, and says rotation-begun, node-account-ready and rotation-done (ADR 0587 §3, §5, §8; ADR 0583 §1-§7 and
insights; ADR 0561 §4, §5). Only mesh-enrolment asks the first two and sign for an enrolment; a rotation needs a hand act
read back from mesh-hand-acts by its id, runs one at a time with the bus node last, and is ready only when the loaded list
holds the new login and done when it lacks the old one. A node's login is handed to that node's engine alone, sealed to
the key it stated. The key of a node that leaves the placement is deleted. Accounts kept for an enrolment or a node are
marked and never retired as unwanted.

Subtasks 774/S43 to S50 in one commit: they share enrolment.go, noderotation.go, tools.go and the manifest, and could not
be cut apart without a commit that does not build. New tests: 3 unit functions (table-style flows) and the one
integration test of S50; mesh-vault stays at 134 unit and 2 integration tests, within the module budget of 500 and 50, so
none was merged or deleted. The integration test's player gained a mesh/ask answer.

(issue 774, 774/S43, 774/S44, 774/S45, 774/S46, 774/S47, 774/S48, 774/S49, 774/S50)
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
This commit is contained in:
2026-11-02 01:42:19 +01:00
parent 98e08c0dd0
commit 049bd176c3
16 changed files with 2182 additions and 20 deletions
+19 -5
View File
@@ -21,7 +21,13 @@
"account-hashed",
"own-replaced",
"account-issued",
"signed"
"signed",
"rotation-begun",
"node-account-ready",
"rotation-done"
],
"invokes": [
"seat:mesh-hand-acts.hand-acts"
],
"reads": [
"node-engine.have",
@@ -37,7 +43,8 @@
"history": 2
},
"signers",
"bound"
"bound",
"node-logins"
],
"receives": {
"secret": "${dir:grants}/mesh.json"
@@ -156,7 +163,8 @@
"MESH_VAULT_ROOT": "${dir:root}",
"MESH_VAULT_STORE": "${dir:store}",
"MESH_VAULT_STATE": "${dir:state}",
"MESH_VAULT_SECRET_ASK_CALLERS": "node-tools"
"MESH_VAULT_SECRET_ASK_CALLERS": "node-tools",
"MESH_VAULT_ENROLMENT_CALLERS": "mesh-enrolment"
}
}
]
@@ -182,7 +190,8 @@
"own_take_switch",
"vault_signers",
"vault_signed",
"signers_reassert"
"signers_reassert",
"node_logins"
],
"claims": [
{
@@ -199,7 +208,12 @@
"move-asks",
"own",
"issue-account",
"sign"
"sign",
"enrolment-token",
"node-account",
"rotate-node",
"node-account-confirm",
"abandon"
]
}
]