Skip to content

Design account-wide devices: the Relay keeps no device list - #1473

Merged
nedtwigg merged 7 commits into
mainfrom
issue-331-account-device-directory
Nov 1, 2026
Merged

nedtwigg merged 7 commits into
mainfrom
issue-331-account-device-directory

Conversation

@nedtwigg

@nedtwigg nedtwigg commented Oct 30, 2026 •

Copy link
Copy Markdown
Member

Design only: this adds the account-wide devices design under ## Future in docs/specs/remote-security-model.md, folding the old Revocation propagation item into it as one design in the remote-trust-followups scope, and stages its protocol-v1 messages as stage 10 of docs/specs/remote-api.md's remote-api-remainder. No code changes.

  • The Relay keeps no device list. Each Burrow stays the authority on its own paired phones. Each stage is a new caller of BurrowService.revoke (shipped in Revoke a paired phone live, and keep an owner-local access log #1459) under a requester of its own.
  • Stage 1: passkey removal reaches the ACL. Hosted's account page already removes a passkey from the Relay; the Burrow will send the credential ids its records hold, the Relay will name which ones its account no longer has, and the Burrow revokes them by passkey target.
  • Stage 2: list and revoke from Pocket on each reachable paired Burrow over protocol-v1, by the shipped deviceIdFor id, behind a fresh presence proof.
  • A stage-1 revocation needs no passkey assertion. Revocation fails safe: a forged revocation can deny access but never grant it, unlike approving a connection, which fails dangerously. The reasoning is in the paired rationale file.

Refs #331

🤖 Generated with Claude Code

nedtwigg and others added 2 commits October 30, 2026 13:20
Issue #331 asked for an account-wide device list. The root constraint is
the trust model: the ACL lives only on each Burrow and the Relay never
sees a Client static or lists a deliveryId, so no Relay-held directory
can name a Burrow's records without reversing those rules.

Record the design under remote-security-model.md ## Future as part of
remote-trust-followups, built on the Burrow-local revocation entry point:
the managed identities stay the passkey (account-wide, Relay-held) and the
ACL record (per Burrow), never merged; stage 1 makes Hosted's existing
passkey removal reach every Burrow's ACL as a revoke-only answer to the
credential ids the Burrow asks about; stage 2 lists and revokes records
from Pocket over protocol-v1 on reachable Burrows, behind a fresh proof.
Whether stage 1 carries a passkey assertion is left for a decision, with
the reasoning in the rationale.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ned decided a Relay-named revocation needs no passkey assertion:
revocation fails safe, unlike approving a connection, which fails
dangerously. State it as the rule and move the reasoning to the
rationale.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Deploying mouseterm with  Cloudflare Pages  Cloudflare Pages

Latest commit: b41f7f1
Status: ✅  Deploy successful!
Preview URL: https://c0e5aa67.mouseterm.pages.dev
Branch Preview URL: https://issue-331-account-device-dir.mouseterm.pages.dev

View logs

nedtwigg and others added 2 commits October 30, 2026 22:33
Take #1459's Revocation propagation text, since BurrowService.revoke now exists, and keep this branch's Account-wide devices design after it. Resolve scripts/spec-word-budgets.json by taking the larger budget per spec, then ratchet docs/specs/remote-security-model.md, since both sides added words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Revocation shipped (#1459) as BurrowService.revoke with a Client-static
or passkey target, a REVOCATION_REQUESTERS member, and a revoked log
entry. Point the design at it instead of describing a hypothetical one:
stage 1 is the passkey target's first non-test caller, stage 2 revokes by
the shipped deviceIdFor id as dor remote revoke does (dropping the
invented per-response index), and last seen is the access log's. Revocation
propagation now points at the stages rather than restating the caller.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@dormouse-bot dormouse-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new section has two cross-spec links that a reader following them would find broken or circular; details inline.

Comment thread docs/specs/remote-security-model.md Resolved
Comment thread docs/specs/remote-security-model.md Resolved
Review found two broken links in the design. Revocation propagation and
Account-wide devices pointed at each other as prerequisite and stager,
though they are one design: fold the former into the latter, list it once
in the remote-trust-followups scope, and repoint every link to the
removed heading (the Reserved line under Revocation, and security.md's
passkey-removal accepted risk). Stage 2's protocol-v1 messages pointed at
remote-api.md's Future, which had no stage for them and whose shipped
scope is terminal-only: add stage 10 there, owning only the wire half and
pointing back for what the list carries and what a revoke proves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@dormouse-bot dormouse-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merged with current main, remote-security-model.md no longer fits the budget this push lowered to 6550. main added a clause to the running-Burrow revocation bullet in 4573922 (the VS Code broker-window case), so the merged spec is 6559 words and pnpm lint:specs fails with 6559 words exceeds its 6550-word budget. The PR head alone passes, which is why the drop looked safe. Merging main and running node scripts/spec-lint.mjs --ratchet docs/specs/remote-security-model.md lands on 6600; suggestion inline.

Comment thread scripts/spec-word-budgets.json Resolved
nedtwigg and others added 2 commits October 31, 2026 17:27
Main's 4573922 added a clause to the running-Burrow revocation bullet, so the merged spec is 6559 words, over the 6550 this branch set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nedtwigg
nedtwigg marked this pull request as ready for review November 1, 2026 20:43
@nedtwigg
nedtwigg merged commit 79f21bc into main Nov 1, 2026
14 checks passed
@nedtwigg
nedtwigg deleted the issue-331-account-device-directory branch November 1, 2026 20:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants