Skip to content

id: keyset/authorization log — device keys, revocation, bindings as signed records (identity substrate) #2380

Open

Description

@dezren39

Follow-up from the key-recovery investigation on #2060 (doc: investigations/key-recovery.md in the ID program workspace, §1/§3/§7). Parent epic: #2056.

Problem

pkgs/id identity is a single Iroh Ed25519 secret key (src/local.rs: SecretKey::generate() / open_with_key); the public key IS the account (invites name it directly, src/invite.rs). There is no indirection for device keys, revocation, IdP bindings, or rotations — so a lost key is a lost identity and a second device is a second account.

Proposal

Design (then implement) a signed keyset/authorization log as the identity substrate: an identity identifier plus an append-only chain of signed records — device-key enrolment/revocation, hosted IdP claim bindings (#2044 §4.3 option 1), guardian sets (see social-recovery follow-up), and key rotations. Group membership and directory records bind to the identity, not to one key. Keyset-admin operations (add/revoke device, change guardians) are narrower-scoped than everyday signing.

Acceptance

  • Design doc section or ADR covering record formats, fold/verification rules, and the identity identifier derivation.
  • Enrolment + revocation of a second device key via QR/invite-style pairing (src/qr.rs, src/invite.rs surfaces exist).
  • Existing group-encryption per-device sessions (src/encryption/) consume device keys from the keyset.
  • Old single-key accounts migrate via a genesis keyset record signed by the existing key.

Activity

  1. added
    kind/featureNew feature or capability request
    priority/normalOrdinary priority (the default)
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    on Oct 29, 2026
  2. developing-today commented on Oct 29, 2026

    @developing-today
    Contributor
  3. added
    effort/mMedium: expected under 1 day of work
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 29, 2026
  4. added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  5. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triaged (still live, design-first; follow-up enqueued)

    Fresh verification (2026-11-03T16:35Z, gh, current main):

    Scoping / ordering:

    1. Design first — acceptance item 1 (record formats, fold/verification rules, identity identifier derivation) gates everything else. Enqueued as queue task 8502 (small_fix: produce the ADR, then scope the implementation packets).
    2. Then, in order: enrolment/revocation of a second device key via the existing qr.rs/invite.rs surfaces → src/encryption/ per-device sessions consuming keyset device keys → genesis keyset migration for existing single-key accounts.
    3. No external blocker: the IdP-binding record type should follow id: investigate: Cloudflare Workers edition — isolates + Durable Objects + per-user SQLite fit for ID #2044 §4.3 option 1 as the issue states; guardian-set records depend on the separate social-recovery follow-up, so the ADR should reserve the record type without blocking device-key enrolment on it.

    Triage task 7904 completes as triaged; the fix path is task 8502.

  6. 37 remaining items

  7. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: task 8502
    • Found via: monitor reconciliation
    • Task: claim-evaporated repair — the queue claim on task 8502 ended without complete/park/block, its lease expired, and the task returned to queued unclaimed while this issue still carried claimed labels. Labels reset to the truth: queue/queued + status/needs-triage. Checkpoint stage at evaporation: handed_off.
    • Expectation: the next lane to claim task 8502 posts a fresh pickup note.
  8. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 4, 2026
  9. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  10. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: picked_up (resume)
    task: 8502 (repo-health-code-pilot; openchamber-scheduled-lane 7b47536b-c162-444c-be8a-3a9538cc4cb5)
    state: claimed; fresh verification: #2380 OPEN, no related open PR found, no hard-stop labels present; issue is assigned to Drew. Resuming the saved design-first checkpoint: ADR record-format choices require Drew input before finalization.
    next: confirm the decision blocker from current issue/context, then escalate and block if still genuinely Drew-owned.

  11. added
    user/escalatedQueue or user escalation state
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 4, 2026
  12. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: blocked (escalated)
    task: 8502 (repo-health-code-pilot; openchamber-scheduled-lane 7b47536b-c162-444c-be8a-3a9538cc4cb5)
    state: blocked; reason class: escalated-to-user.
    blocker: Drew must select or approve the keyset/authorization-log record format and signing/fold rules before the ADR is finalized. The saved resume checkpoint identifies this as Drew input; #2380 currently has no recorded decision.
    resume: when Drew records the decision or asks the worker to propose a default for review, continue the ADR and implementation packet scoping. No branch/worktree was created.

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

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/mMedium: expected under 1 day of workkind/featureNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)queue/blockedQueue or user escalation statesource/creatorFiled by the new-issue-creator jobstatus/blockedQueue or user escalation statetask/triageQueue packet kind: verify, reproduce, and route this itemuser/escalatedQueue or user escalation state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions