Skip to content

Fleet Studio B2b · slice 5 — Shared-peer control: request->approve handshake #1545

Description

@jeonghun-jj-lee

Important

Problem — A shared peer (a different operator's machine) can't be controlled: there is no request→approve flow routed to the peer's lifecycle-admin authority, and no pending-request surface. Self-owned control (the #1540 fast-path) doesn't cover the cross-operator case.
Approach — A control-request that routes to wherever the target's lifecycle-admin authority is held; a pending-request surface on that authority machine; approve → issueLifecycleGrant("control") + deliver the token. The requester side reuses slice 4's Request-control affordance; enforcement reuses slice 1's grant model. A headless shared target is approved from its authority holder's UI.
Scope — in: request routing + pending-request surface + approve/deny → control grant issuance for shared peers. · out: the self-owned path (slice 1); the write plane (slice 2).
Assumptions — #1541 provides the lifecycle-admin authority + grant issuance; #1544 provides the Request-control affordance + a pending-requests view in Fleet Manager.

Warning

Deliberate-review corrections (2026-09-24) — these BIND over any stale text below.

Acceptance Criteria

  • A shared peer's control request routes to that peer's lifecycle-admin holder and is denied until approved.
  • The authority machine sees a pending request and can approve or deny it.
  • Approval mints a control grant + delivers the token; the requester can then Enable control.
  • A headless shared target's request is approvable from its lifecycle-admin holder's UI — the target renders nothing.
  • Deny (or no response) leaves the requester without control — fail-closed.

Testing Decisions

Extend fleet_two_peer_e2e with a shared (non-self-owned) path. Reuse the grant-issuance unit suite (fleet_control_lifecycle). Add request-routing and approve/deny tests. Extends #1541's grant model and #1544's Request-control surface — the cross-slice edges.

Key Decisions

  • The request routes to the lifecycle-admin authority, not the target when the target is headless — this is what makes headless shared control possible.
  • Approval is the explicit target-side authority act (the evaluateObserveBootstrap shared path extended to control), never automatic.

Constraints & Invariants

  • The shared path never borrows the self-owned fast-path (no privilege bleed).
  • Headless target enforces only — approval renders on the authority machine.
  • Fail-closed — no approval, no control.

Prior Art

Read first (modules): fleet_observe_bootstrap (the shared-path decision to extend to control), fleet_control_lifecycle (issueLifecycleGrant / readmitPeer), and the outputs of slice 1 (authority seeding) + slice 4 (Request-control affordance + pending-requests view).

Source

Notes

Cross-operator authority → HITL. The deferrable slice — self-owned control (#1541→slice 2→slice 4) is fully usable without it.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    hitlNeeds human review before merge

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions