Access Control

Exact invites bootstrap access; short-lived Access Leases authorize every open; revocation fences access at advancing epochs.

Life of an authorization

flowchart TD Share["tubo share pipe/x
(provisions Exact Authority)"] --> Invite["one-time invite (10 min TTL)"] Invite -->|redeem once + possession proof| Accept["accepted relationship
(durable binding, epoch N)"] Accept -->|renewal per open| Lease["Access Lease (minutes, epoch N)"] Lease -->|receiving-boundary verify| Open["Pipe open → Session"] Revoke["tubo revoke pipe-access"] -.->|epoch N → N+1| Accept Revoke -.-> Lease

What each credential can and cannot do

CredentialLifetimeCanCannot
Exact invite10 minutes, one usebootstrap one accepted relationshipopen a Pipe, renew, outlive redemption
Accepted bindinguntil revokedrenew short leases per open; survive restartsauthorize anything by itself
Access Leaseminutesauthorize one Pipe open for one subjectbe replayed, swapped across Pipes or subjects, outlive expiry

Revocation

# An invite that was never redeemed (JTI or the full token)
$ tubo revoke invite <token>          # fenced at the redemption boundary

# An already-accepted invite (its Pipe is resolved from redemption evidence)
$ tubo revoke invite <jti>

# All access to a Pipe: advances the authorization epoch
$ tubo revoke pipe-access pipe/myapi

Determinism

Exactly one authoritative accepted relationship exists per (Pipe, recipient). A newer invite for the same pair replaces it; the same recipient retrying never regresses it; a different recipient fails closed. Obsolete invite revocations are harmless; revoking the current invite's JTI fences renewal.