V-4: the vault's first-view tools cover the licence bindings, and its README says the licence secrets (issue 1409)

vault_first_views lists the licence bindings' first view beside the
assignments'; vault_first_view_again asks the one its new argument `of`
names, and both when it is absent.

Builds: design 39 bus-and-switch §52, §15 to §17, B21, B42

Claude-Session: https://claude.ai/code/session_01NcbgfHb9d4T9nq5Q6WqdiJ
This commit is contained in:
2026-11-12 00:42:53 +01:00
parent 3b92e02862
commit 9cf5c1ddbd
3 changed files with 118 additions and 13 deletions
+15
View File
@@ -136,6 +136,21 @@ the declaration sealed by the vault to their machine, which the controller carri
machine's sealing key as its own node-engine stated it in its own name, in `move-in`'s first step (`sealing_key`).
A machine whose engine stated none, any other key, any other module and any other name are refused and recorded.
**A licence's two secrets, for the licence manager and the machines its bindings name** (design 39 bus-and-switch
§15 to §17, B2, B3, B8, B21, B25, B31, B32, B42; `licences.go`, `licencebindings.go`). The licence manager hands
each licence's grant and access token to the vault with `mesh-vault.licence-put`, in two steps: the licence's key, the
part (`grant` or `access`) and the generation, answered with a call and a key made for it; then the call and the value
sealed to that key. The caller's generation is the record's: the newest is kept, an older one refused, and
`secret-changed` says the name `licence.<key>.<part>` and its generation, never the value. `get` hands a grant, sealed to
the key it is asked with, with no machine guard (B3); it hands an access token only to a machine on which a consumer's binding
names that licence, by the licence's key as the manager says it. Which licence each consumer is bound to the vault
keeps in its own state `licence-bindings` (one key per consumer: licence, key, generation; deleted on a release),
learned from the manager's `binding.changed`, which it consumes, and at its start from its first view,
`anthropic-licence-manager.bindings`, asked until it answers. A first view never replaces a binding of a newer
generation, and an access token asked before the first view answered is refused, saying why. The vault never reads
the manager's state. `vault_first_views` shows this first view beside the assignments', and `vault_first_view_again`
asks one again (`of`: `mesh-delivery-assigner.assignments` or `claude-licence-manager.bindings`; absent, both).
## Taking values in: `secret-ask`, `issued`, `rotate`
Design 57's V2 (issue 675; ADR 0349 clauses 8 to 10, ADR 0277 §22–§27 and ADR 0305 with the vault in the