Skip to content

Design: generic invite delegation — iroh tickets and links for worlds and groups #5751

Open

Description

@dezren39

Design: generic invite delegation — iroh tickets and links for worlds and groups

Extends #2146 (program sessions / routing). Cross-links: #5684 (identity / login / delegation), #835 (scope bits + session-frame wiring), #5675 (discovery — invites are the private counterpart of discovery).

The ruling this implements (Drew, 2026-11-04)

  • Anonymous public program sessions are the norm: a participant with an iroh ID (IRID) who was not specifically invited can join public sessions. Anonymous does not mean no token — an iroh ID is the minimum identity, always.
  • Both modes get built: public-by-default AND invite-gating, because we need a way to invite-gate. Gating is a property a world/group can choose, not the platform's default posture.

The model: an invite is a delegation object

An invite is a signed, self-contained delegation from an inviter to whoever redeems it:

  • Target: a world, or a group — joining the group grants access to everything the group fronts (a group can front a set of worlds; one redemption, many worlds).
  • Inviter: an IRID, plus the authority source that makes this invite valid (see below).
  • Terms: uses (one-time / N uses / bearer-link until revoked), expiry, and optional constraints (role granted on join — tying into id(world): F14.6 builder and moderator authority through session frames (F12.3 remainder) #835's scope bits; the invite grants at most what its terms say).
  • Carriers — one object, three envelopes: an iroh ticket containing the details (iroh-native is the primary form), a plain URL, and an ID protocol URL. The carrier differs; the delegation object inside is identical.

Redemption = exercising a delegation

  • Accepting an invite is recorded as an action delegated from the inviter: the join is journaled with its full provenance (who invited, under which authority source, which ticket/link, when).
  • One-time tickets self-invalidate on redemption. Link invites are bearer capabilities — anyone holding the link can join, like a Discord invite link but more capable: scoped to a target and role, expiring, use-counted, and revocable (revoking a link kills future redemptions; already-redeemed memberships are separate state, removed by group/world operations, not by invite revocation).
  • Redemption must verify offline-capable: the ticket is signed, so a world/group node can validate it against the inviter's key and the authority chain without a home server round-trip.

Where invite power comes from

Open questions for the design pass

  • Ticket encoding: postcard per id: design: Wire format & transport adapters — postcard schema, non-UDP carriers, relays/proxies #5674's wire format work; what's the size budget for a ticket that must survive being pasted into chat?
  • Delegation depth: can a redeemer re-invite (chain length caps)? Under open delegation presumably yes within scope; under moderator grant?
  • Link leakage: a bearer link posted publicly is indistinguishable from intended distribution — rotation UX and per-link join auditing are the mitigations; anything stronger?
  • Group-fronted worlds added after a redemption: does an existing group member automatically gain the new world (group = live set) or is access snapshotted at join? (Recommendation to evaluate: live set — that's the point of fronting — with per-world sensitivity filters from id: design: Querying local and remote ID servers v1 #5675 still applying.)

Non-goals

  • No zero-identity access paths, ever — every join, public or gated, is an IRID acting.
  • No central invite registry service; tickets are self-verifying objects.

Activity

  1. developing-today commented on Nov 5, 2026

    @developing-today
    Contributor
  2. added
    queue/queuedHas a queued task in the Supabase agent queue
    task/triageQueue packet kind: verify, reproduce, and route this item
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 5, 2026
  3. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done (triage)

    Triage findings for issue #5751 (task 10162)

    Verified current (2026-11-05, fresh gh reads): issue #5751 is OPEN, filed 2026-11-05T01:17:11Z, carrying only task/triage + queue/queued at claim time — no hard-stop labels (held, user/owned, do-not-merge, do-not-auto-edit), no competing PR or branch owns this work, and no implementation issue referencing issue #5751 exists yet (search of 5751 in:body returns only sibling design issues #5959, #5989, #5969 cross-linking it). The design in the body is current and implements Drew's 2026-11-04 ruling (public-by-default program sessions plus optional invite-gating; an invite is a signed delegation object with three carriers: iroh ticket, plain URL, ID protocol URL).

    Routing: this is a design pass first, implementation second. The issue's own open questions are the work, and they cannot be answered independently of its dependencies:

    1. Issue design(id): identity, login & delegation — simplicity-first key custody, security-code recovery, and pseudo-login identities #5684 (OPEN, priority/high, kind/design, queued) — identity, login & delegation. The invite chain rules (delegation depth, re-invite caps, "never grant more than your own authority") are defined there; issue Design: generic invite delegation — iroh tickets and links for worlds and groups #5751's moderator-grant and open-delegation sources inherit them. Design pass for issue Design: generic invite delegation — iroh tickets and links for worlds and groups #5751 runs after, or jointly with, the delegation model in issue design(id): identity, login & delegation — simplicity-first key custody, security-code recovery, and pseudo-login identities #5684.
    2. Issue id: design: Wire format & transport adapters — postcard schema, non-UDP carriers, relays/proxies #5674 (OPEN, parked) — wire format & transport adapters (postcard schema). Ticket encoding and the pasted-into-chat size budget for issue Design: generic invite delegation — iroh tickets and links for worlds and groups #5751 are answered there.
    3. Issue id(world): F14.6 builder and moderator authority through session frames (F12.3 remainder) #835 (OPEN, in progress / claimed) — scope bits + session-frame wiring. The invite-power scope and the role granted on join tie into its scope-bit work; that work is already owned, so issue Design: generic invite delegation — iroh tickets and links for worlds and groups #5751 must consume its outcome, not duplicate it.
    4. Issue id: design: Querying local and remote ID servers v1 #5675 (OPEN, queued) — discovery / ID-server querying. Per-world sensitivity filters referenced by the group-fronted-worlds question live there.

    Scoped next action (named, per the no-silent-design rule): a design pass on issue #5751 that records decisions on its four open questions (ticket encoding + size budget; delegation depth / re-invite caps; bearer-link leakage mitigations; group-fronted worlds as a live set vs. join-time snapshot, evaluating the body's live-set recommendation), gated on the issue #5684 delegation model and the issue #5674 wire format. Only after those decisions land does an implementation issue get filed — filing one now would scope against undecided chain rules and an undecided ticket encoding. No code change is made in this triage, and the issue stays open as the design track.

    Labels: routed as triaged + waiting-dependency to mirror this ordering.

  4. added
    status/triagedTriaged and routed (see agent note)
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

status/triagedTriaged and routed (see agent note)status/waiting-dependencyWaiting on a dependencytask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions