Session: pool bring-up — ten pinned principals and their grants, ratified before activation #30

Closed
opened 2026-09-03 18:14:55 +00:00 by larandar · 1 comment
Owner

Proposal

Provision the durable drone pool once: ten UUID-pinned principals with reserved names, one immutable AssignmentGrant each, and a human ratification of the realized mapping before any of it becomes active.

Session review boundary

One PR, one verdict over the whole bring-up: name reservation, principal creation, grant issuance, collision and retry behaviour, and the ratification gate. This is a one-time act with a large blast radius and no steady-state loop in it — the checkout/return cycle is a separate Session with a different reviewer question.

Design

Provisioning creates identity and authority, and nothing else. It creates no per-drone Forgejo account, no standing Forge token, and no active lease; pool membership makes all ten eligible for allocation and allocates none of them.

The name is reserved before the principal is created, in the form swarm-alpha-drone-<word>-<word>-<word>-<word>, and the returned UUID is pinned to that name and slot without a rename pass. The ordering is the point: a create-then-name flow has a window in which a principal exists under a name nothing reserved, and a retry across that window is how one slot becomes two principals. A retry therefore adopts matching name/slot metadata, and on collision denies or re-reserves rather than duplicating.

The realized name/UUID/grant-ID/version/digest mapping is presented for ratification before activation. Per the freeholder ruling on Ting/Ting#2 Q4, ratification is presence, not channel: activation blocks on a freeholder act at a keyboard, never on a notification having been sent.

Tasks

  • Reserve names before creation, and pin the returned UUID to name and slot without renaming.
  • Provision exactly ten principals, idempotently under retry.
  • Deny or re-reserve on collision; never duplicate a principal.
  • Issue one distinct immutable AssignmentGrant per slot, delegated to the swarm-alpha/queen seat.
  • Present the realized mapping and block activation on a freeholder act.
  • Prove bring-up creates no Forge account, standing token, or active lease.

Specification Delta

Requirement: bring-up creates eligibility, never an active credential

Scenario: the pool is provisioned

  • GIVEN an empty pool and a declared swarm-alpha/queen seat
  • WHEN bring-up runs to completion and is ratified
  • THEN ten UUID-pinned principals exist, each with one immutable grant
  • AND no Forgejo account, standing token, or active lease was created

Requirement: a name is reserved before a principal exists

Scenario: provisioning is retried mid-flight

  • GIVEN a reserved name whose principal creation may already have succeeded
  • WHEN provisioning retries
  • THEN it adopts the principal matching that name and slot
  • AND no second principal is created for the slot
  • AND a mismatched collision is denied or re-reserved

Requirement: activation waits for a person

Scenario: the mapping is realized but unratified

  • GIVEN a realized name/UUID/grant mapping
  • WHEN no freeholder has acted on it
  • THEN the pool is not active and no slot may be allocated
  • AND delivery of a notice does not by itself satisfy this

OpenSpec

OpenSpec 30 — agent identity pool lifecycle, which projects from ratified OpenSpec 61 v0.1.4. This Session is its bring-up half; #31 is the other.

Structural parent

Ting/Ting#2 — Epic: agent identity pool lifecycle. Session split ratified there as Q3 (2026-09-03).

## Proposal Provision the durable drone pool once: ten UUID-pinned principals with reserved names, one immutable `AssignmentGrant` each, and a human ratification of the realized mapping before any of it becomes active. ## Session review boundary One PR, one verdict over the whole bring-up: name reservation, principal creation, grant issuance, collision and retry behaviour, and the ratification gate. This is a one-time act with a large blast radius and no steady-state loop in it — the checkout/return cycle is a separate Session with a different reviewer question. ## Design Provisioning creates identity and authority, and nothing else. It creates no per-drone Forgejo account, no standing Forge token, and no active lease; pool membership makes all ten eligible for allocation and allocates none of them. The name is reserved **before** the principal is created, in the form `swarm-alpha-drone-<word>-<word>-<word>-<word>`, and the returned UUID is pinned to that name and slot without a rename pass. The ordering is the point: a create-then-name flow has a window in which a principal exists under a name nothing reserved, and a retry across that window is how one slot becomes two principals. A retry therefore adopts matching name/slot metadata, and on collision denies or re-reserves rather than duplicating. The realized name/UUID/grant-ID/version/digest mapping is presented for ratification before activation. Per the freeholder ruling on [Ting/Ting#2](https://jo.et0.pw/Ting/Ting/issues/2#issuecomment-15365) Q4, ratification is **presence, not channel**: activation blocks on a freeholder act at a keyboard, never on a notification having been sent. ## Tasks - [ ] Reserve names before creation, and pin the returned UUID to name and slot without renaming. - [ ] Provision exactly ten principals, idempotently under retry. - [ ] Deny or re-reserve on collision; never duplicate a principal. - [ ] Issue one distinct immutable `AssignmentGrant` per slot, delegated to the `swarm-alpha/queen` seat. - [ ] Present the realized mapping and block activation on a freeholder act. - [ ] Prove bring-up creates no Forge account, standing token, or active lease. ## Specification Delta ### Requirement: bring-up creates eligibility, never an active credential #### Scenario: the pool is provisioned - **GIVEN** an empty pool and a declared `swarm-alpha/queen` seat - **WHEN** bring-up runs to completion and is ratified - **THEN** ten UUID-pinned principals exist, each with one immutable grant - **AND** no Forgejo account, standing token, or active lease was created ### Requirement: a name is reserved before a principal exists #### Scenario: provisioning is retried mid-flight - **GIVEN** a reserved name whose principal creation may already have succeeded - **WHEN** provisioning retries - **THEN** it adopts the principal matching that name and slot - **AND** no second principal is created for the slot - **AND** a mismatched collision is denied or re-reserved ### Requirement: activation waits for a person #### Scenario: the mapping is realized but unratified - **GIVEN** a realized name/UUID/grant mapping - **WHEN** no freeholder has acted on it - **THEN** the pool is not active and no slot may be allocated - **AND** delivery of a notice does not by itself satisfy this ## OpenSpec [OpenSpec 30 — agent identity pool lifecycle](https://jo.et0.pw/Ting/Vedanta/wiki/OpenSpec-30-agent-identity-pool-lifecycle), which projects from ratified [OpenSpec 61](https://jo.et0.pw/Ting/Ting/wiki/OpenSpec-61-forge-identity-lifecycle-contract) v0.1.4. This Session is its bring-up half; [#31](https://jo.et0.pw/Ting/Vedanta/issues/31) is the other. ## Structural parent [Ting/Ting#2](https://jo.et0.pw/Ting/Ting/issues/2) — Epic: agent identity pool lifecycle. Session split ratified there as Q3 (2026-09-03).
Author
Owner

Delivered by PR #38, merged into fastlane at 7b9b5ba. All three leaves closed: #32, #33, #34.

src/pool.rs carries reserve-before-create with adopt-on-retry, ten UUID-pinned principals with one immutable grant each, and the ratification gate. Gate green: fmt, clippy -D warnings, full workspace suite.

What this Session does not give you. PoolDirectory has no Kanidm implementation — the state machine is complete and nothing drives it against a real directory. That waits on sa-vedanta, which is flake-ops#98's owner act. Closing this record says the bring-up logic is written and tested, not that a pool exists.

Delivered by [PR #38](https://jo.et0.pw/Ting/Vedanta/pulls/38), merged into `fastlane` at `7b9b5ba`. All three leaves closed: [#32](https://jo.et0.pw/Ting/Vedanta/issues/32), [#33](https://jo.et0.pw/Ting/Vedanta/issues/33), [#34](https://jo.et0.pw/Ting/Vedanta/issues/34). `src/pool.rs` carries reserve-before-create with adopt-on-retry, ten UUID-pinned principals with one immutable grant each, and the ratification gate. Gate green: fmt, clippy `-D warnings`, full workspace suite. **What this Session does not give you.** `PoolDirectory` has no Kanidm implementation — the state machine is complete and nothing drives it against a real directory. That waits on `sa-vedanta`, which is [flake-ops#98](https://jo.et0.pw/lar.ad/flake-ops/issues/98)'s owner act. Closing this record says the bring-up logic is written and tested, not that a pool exists.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
Ting/Vedanta#30
No description provided.