The monolithic open-questions.md (1310 lines, 47 OQs) was large enough to be unmanageable, with high size variance (OQ-42 at 220 lines next to OQ-06 at 8). Decomposed into one file per OQ under docs/architecture/questions/ (NNN-slug.md, mirroring the ADR convention), with open-questions.md retained as the index: theme-grouped tables plus a cross-theme Deferred/Blocked section that surfaces the 6 deferred OQs with their Blocked-on conditions inline (the safe-exit visibility surface). Per-OQ content moved verbatim; all 62 inbound links stay valid (none used anchors). README's curated OQ summary dropped (now redundant with the index tables). Also seeds tasks/architecture/ with this task plus two follow-ups found during the decompose: OQ-09/10 missing structured Blocked-on fields, and the tasks/architecture/ blocker-task half of the Safe Exit protocol being unenforced.
3.4 KiB
OQ-37: X.509 Outgoing-Only Case (Three Peer Roles)
-
Origin: ADR-030 §"Bearer tokens" (the three credential types), the discussion that X.509 is fundamentally different from Ed25519
-
Status: resolved (2026-06-28 by ADR-034)
-
Door type: One-way (how X.509 server identity integrates with the peer model)
-
Priority: medium → resolved
-
Resolution: The pre-ADR-034 framing conflated three distinct remote roles under "X.509 endpoint." ADR-034 names them and resolves the peer-model question:
- Public X.509 endpoint — a remote HTTPS /
alknet/call-over-TLS server reachable by domain, authenticated by CA verification (WebPkiServerVerifier). The local node is a client; it authenticates by bearer token. Not aPeerEntryon the client side — it is not in the call-protocol peer graph (ADR-029), gets noPeerId, and is not addressable viaPeerRef::Specific. Ops discovered viafrom_call/from_openapi/from_mcpland in the connection's Layer 2 overlay and are invoked through the connection handle. - Transport relay — iroh's DERP-equivalent (
iroh-relay). Infrastructure, not an alknet peer; noPeerEntry/PeerId. Inherited with theirohfeature; its identity is iroh's concern. - Hub / hosting node — an alknet application peer (head/worker
hub, git-hosting hub) that also exposes a public domain + X.509
for browsers. A single
PeerEntrywith mixed fingerprints (ed25519:...+SHA256:...), already supported by ADR-030. Browsers connecting to it are not alknet peers — served byalknet-http, bearer-token auth, noPeerId.
The "make
PeerEntrysymmetric" instinct is rejected.PeerEntryis for peers in the call-protocol peer graph; pure-client connections to public X.509 endpoints are not in that graph on the client side. The asymmetry reflects a real trust-model difference: known peers have stable logical identities (pin the fingerprint); public APIs don't (trust the CA, hold the connection handle directly).Client-side verifier selection rule (extends OQ-29): known peer (
PeerEntrypresent) → fingerprint pin (Ed25519ed25519:<hex>or X.509SHA256:<hex>); unknown X.509 remote (PeerEntryabsent) → CA verification. An unknown Ed25519 raw-key remote cannot be verified at all (no CA fallback) and fails closed — same model as iroh.Downstream, not blocking, recorded so they don't get lost: WebTransport relay-as-proxy (browser → proxy → P2P hub) is the remaining scope question tracked as OQ-38 (h3/WebTransport itself is now in scope, ADR-038); ADR-030 §6's fingerprint normalization already keeps the proxied path clean. On-chain / smart-contract peer discovery (relays syncing git repos via iroh gossip) is a source of
PeerEntryrecords, fits the OQ-36 repo/adapter pattern (alknet-peer-store-onchainimplementingIdentityProvider), and does not change the auth model.Not blocking the ADR-029 migration — the Ed25519 path is the primary use case and was already resolved; this ADR closes the X.509 outgoing-only remainder.
- Public X.509 endpoint — a remote HTTPS /
-
Cross-references: ADR-027, ADR-029, ADR-030, ADR-033, ADR-034, OQ-29, OQ-36, client-and-adapters.md, endpoint.md, auth.md