Skip to content

docs(spec): B1.4 — wallet owner_id on the wire (for review)#40

Open
frahlg wants to merge 1 commit into
mainfrom
b1.4-spec
Open

docs(spec): B1.4 — wallet owner_id on the wire (for review)#40
frahlg wants to merge 1 commit into
mainfrom
b1.4-spec

Conversation

@frahlg

@frahlg frahlg commented Jun 12, 2026

Copy link
Copy Markdown
Member

Summary

Design spec for B1.4 — the first slice that touches the live relay + agent. For your review before I write any code.

Goal: make owner_id the base58 Solana wallet address, accepted alongside legacy X25519-hex, without changing the Noise-KK X25519 transport or its vectors.

The core finding

owner_id has a triple role today, all the same string (the owner's X25519 pub hex): relay routing label, the Noise-KK key the agent pins, and the agent's paired-owner entry. To make it a wallet address, the KK pin must be decoupled from the routing label — the agent learns the X25519 transport key from a wallet-signed binding (B1.2) instead of hex-decoding owner_id.

Key design decisions (please sanity-check)

  • Binding travels in the offer via a new opaque Binding field on SignalMsg — the relay re-marshals a typed struct (drops unknown fields), so it needs that one field to forward it; it never reads it (stays blind). The KK responder needs the initiator static before msg0, and the offer is the only client→agent message that precedes Noise — so the offer is the right carrier.
  • Both forms (Fork 2): owner_id matching ^[0-9a-f]{64}$ → legacy path, byte-identical to today (no binding). Otherwise → wallet path (base58, binding required, no silent fallback).
  • Attach needs no extra nonce: KK already authenticates the X25519 key holder; the binding's wallet sig proves the wallet authorized that key. Pairing is where a fresh wallet auth sig (over the SAS nonce) proves wallet control when first pinning a base58 owner.

Open questions I'd like your call on

  1. Pairing-auth scope — fold the wallet auth-over-nonce into B1.4, or split to a follow-up once attach-by-wallet works e2e?
  2. Legacy default — keep hex owner_id indefinitely for legacy identities (my rec), or nudge a re-key?
  3. Binding caching — cache one self-signed binding in owner.json (my rec) vs re-sign per attach.

Note

Deploying the new mir-signal (the one-line Binding field) is live-infra — your hand, health-gated redeploy as before.

No code in this PR — spec only. Approve / redirect and I'll write the implementation plan + B1.4.0.

🤖 Generated with Claude Code

… pin via binding)

Design for making owner_id the base58 Solana wallet address, accepted alongside
legacy X25519-hex, without changing the Noise-KK X25519 data plane. Decouples
owner_id's triple role (routing label / KK pin / agent pin) — the agent learns
the X25519 transport key from a wallet-signed binding (B1.2) carried in an opaque
SignalMsg field the blind relay forwards. Both-forms acceptance, re-pair to
upgrade. For review before implementation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

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.

1 participant