Files
alknet/docs/architecture/open-questions.md
T
glm-5.2 34729c7846 docs(arch): resolve OQ-59 (fingerprint stays in core) + ADR-084 (aws-lc-rs crypto provider)
OQ-59 resolved to Option A: fingerprint.rs stays in alknet-core. The
client-side FingerprintPinVerifier in alknet-call uses fingerprint
functions and must not depend on alknet-tls (which would pull TLS setup
infra into client-only deployments). The rustls dep in core is narrow —
production fingerprint code uses only sha2 + manual DER parsing; the
rustls::sign usage is a test helper only. alknet-tls re-exports the
fingerprint functions for convenience.

ADR-084: aws-lc-rs as the TLS crypto provider on all server + client
config paths. Records the decision that was already in the code (to
match iroh's tls-aws-lc-rs feature) but had no ADR. FIPS-capable, broad
platform support, consistent across quinn/iroh/TCP+TLS/client. Switching
to ring or process-default requires a new ADR. ADR-082's
behavior-preservation invariant now references ADR-084 for the decision
record.
2026-07-14 09:53:43 +00:00

17 KiB

status, last_updated
status last_updated
draft 2026-07-14

Open Questions

Each open question lives in its own file under questions/, named NNN-slug.md (mirroring the ADR convention). This file is the index: theme-grouped tables for scannability, plus a cross-theme Deferred / Blocked section that surfaces the safe-exit deferrals with their blocking conditions inline — so "what's currently parked and why" is answerable at a glance.

Status values:

  • open — Needs to be resolved now. Has a clear path to resolution.
  • resolved — Decided. The resolution is stated cleanly, without caveats about how it could be changed later.
  • deferred(scope) — Cannot be resolved yet. The information doesn't exist. Has a concrete blocking condition (e.g., "blocked on: alknet-agent crate spec"). Not a failure — scope management.
  • partially resolved — Some aspects decided, others deferred or open.
  • dissolved — The question was reframed out of existence (e.g., superseded by an ADR that retires the premise). Kept for reference.

Door type classifications follow ADR-009 — they describe reversal cost (how expensive it is to undo), not urgency:

  • One-way door: Reversal requires rewriting significant code or permanently closes a capability. Getting it wrong is expensive — requires ADR before implementation.
  • Two-way door: Reversal is cheap or additive. Getting it wrong is recoverable — decide, implement, revert if needed.

Door type is separate from whether a decision is made. A two-way door is a decision you make now and can revert later, not a decision to defer. See ADR-009 §"What this framework is NOT."

By Theme

Core Types

OQ Title Status Door Pri
OQ-01 BiStream Type Definition resolved one high
OQ-02 AuthContext Resolution Timing resolved one high

ALPN and Routing

OQ Title Status Door Pri
OQ-03 ALPN String Naming Convention resolved one med
OQ-04 Dynamic Handler Registration at Runtime vs Static at Startup resolved two low

Transport and Endpoint

OQ Title Status Door Pri
OQ-05 Multi-Connectivity Endpoint resolved one high
OQ-06 Server-Side ALPN vs Client-Side ALPN resolved one low

Call Protocol

OQ Title Status Door Pri
OQ-07 Call Protocol Scope Within a Connection resolved two med

Security

OQ Title Status Door Pri
OQ-08 Vault Integration Point resolved one med

Deferred Questions

OQ Title Status Door Pri
OQ-09 WASM Target Boundaries deferred one low
OQ-10 Git Adapter Scope — Smart Protocol Only or Full Server? deferred two low

alknet-core

OQ Title Status Door Pri
OQ-11 Handler-Level Auth Resolution Observability resolved two med
OQ-12 TLS Identity Provisioning in AlknetEndpoint resolved one high
OQ-13 Operation Path Format and Routing Scope resolved two med
OQ-14 Batch Operation Semantics resolved two low
OQ-55 AlknetClient / Client Establishment Extraction deferred(scope) two med
OQ-59 Should fingerprint.rs Stay in Core or Move to alknet-tls? resolved two med
OQ-60 Where Does Transport Construction Live? resolved one high
OQ-61 Multi-Owner Shutdown Coordination dissolved two med

alknet-call

OQ Title Status Door Pri
OQ-15 Call Protocol Client and Adapter Contract resolved one high
OQ-16 Safe Vault Operations for Call Protocol Exposure resolved one high
OQ-17 Abort Cascade Semantics for Nested Calls resolved one/two high
OQ-18 Privilege Model and Authority Context resolved one/two high
OQ-19 Session-Scoped Operation Registries and Agent-Written Operations resolved one/two med

alknet-vault

OQ Title Status Door Pri
OQ-20 Salt/KDF and Encryption Key Derivation Method resolved one/two high
OQ-21 Remote Vault Administration resolved one med
OQ-22 Key Rotation Mechanism resolved one/two med
OQ-23 Handler Identity Registration Path and Composition Authority resolved one/two high
OQ-24 Operation Error Schemas resolved one/two high

Call Client and Adapters

OQ Title Status Door Pri
OQ-25 Remote-Safe Marking Shape for CallClient Peer-Scoped Filtering (Dissolved by ADR-029) dissolved one/two med
OQ-26 OperationAdapter Error Type (AdapterError Variants) resolved two med
OQ-27 from_call Re-Import Trigger resolved two low
OQ-28 from_call Namespace Collision Behavior resolved two low
OQ-29 CallClient TLS Client-Auth and Remote-Identity Verification resolved one/two high
OQ-30 PeerRef::Any Routing Policy resolved two low
OQ-31 services/list-peers Re-Export Semantics resolved two low
OQ-32 Multi-Hop Federation deferred(scope) one/two low
OQ-33 PeerId — Cryptographic Identity vs Stable Logical Identifier resolved one/two high
OQ-34 Persistent Peer Registry (Cross-Node State Storage) resolved one/two med

Storage and Adapters

OQ Title Status Door Pri
OQ-35 API Key Identity vs Peer Identity (Dissolved) dissolved one med
OQ-36 Concrete Persistence Adapter Shapes resolved two med

TLS Identity

OQ Title Status Door Pri
OQ-37 X.509 Outgoing-Only Case (Three Peer Roles) resolved one med

alknet-http

OQ Title Status Door Pri
OQ-38 WebTransport Standalone Relay Service Scope open one/two low
OQ-39 to_openapi Published-Spec Versioning resolved one/two med
OQ-40 reqwest Client Config and Connection Pooling resolved two low
OQ-41 Stream Operators Library deferred(scope) two low

Runtime-Spawned Resources and Ownership

OQ Title Status Door Pri
OQ-42 Dynamic Resource Ownership for Runtime-Spawned Resources resolved one high

alknet-tty

OQ Title Status Door Pri
OQ-43 TtyControl as a Clone trait object resolved one med
OQ-44 Terminal Modes (TTY modes) deferred(scope) two low
OQ-45 Flow Control for High-Throughput stdout resolved two low
OQ-46 Runner API Surface deferred(scope) two low
OQ-47 Stdin Closure Canonical Signal resolved two low

alknet-docker

OQ Title Status Door Pri
OQ-48 Network and Volume Operation Surface deferred(scope) two low
OQ-49 Image Build (buildkit) Scope deferred(scope) two low
OQ-50 Docker System Events Subscription resolved two low
OQ-51 Container Create Options Surface deferred(scope) two med

alknet-hub

OQ Title Status Door Pri
OQ-52 CallConnection::wait_for_close() for supervision loop open two med
OQ-53 BackoffConfig default policy open two low
OQ-54 Inbound worker on_worker_connected hook placement resolved two low
OQ-58 Worker Registration Flow open one high

alknet-channels

OQ Title Status Door Pri
OQ-56 Full Channel-Level Flow-Control Windowing deferred(scope) two low
OQ-57 Two-Pump Helper Extraction to alknet-core deferred(scope) two low

Deferred / Blocked

The safe-exit visibility surface. These questions are parked because the information needed to resolve them does not exist yet — each has a concrete blocking condition. They are not failures; they are scope management. See ADR-009 §"Safe Exit: Deferred Decisions." This section exists so "what's currently blocking the architect" is answerable at a glance, not by filtering the tables above.

OQ-09: WASM Target Boundaries

  • Blocked on: A concrete server-side WASM use case, or a deliberate confirmation that WASM stays a client-side design constraint. Tracked as architecture/oq-09-wasm-server-use-case in tasks/architecture/.
  • Priority: low
  • Amendment (2026-07-09): The Connection door is now open via Connection::from_stream (ADR-065) — a Connection can be constructed from any wasm-compatible stream. What remains closed is the accept-loop runtime (tokio::spawn does not run on WASM; PendingRequestMap/CallAdapter use tokio channels). The blocking condition (a concrete server-side WASM use case) is unchanged.
  • Full file: OQ-09

OQ-10: Git Adapter Scope — Smart Protocol Only or Full Server?

  • Blocked on: Speccing the alknet-git crate — resolve this when that crate is specified, not deferred past it. Tracked as architecture/oq-10-git-adapter-spec in tasks/architecture/.
  • Priority: low
  • Full file: OQ-10

OQ-32: Multi-Hop Federation

  • Blocked on: A concrete use case for multi-hop federation. The one-hop model covers all current use cases (head→worker, runner→hub).
  • Priority: low
  • Full file: OQ-32

OQ-41: Stream Operators Library

  • Blocked on: A handler that needs stream operators and finds the existing combinators (Box::pin(stream::iter(...)), async_stream::stream!, futures::stream) insufficient. The operators library is a convenience, not a prerequisite for any handler.
  • Priority: low
  • Full file: OQ-41

OQ-44: Terminal Modes (TTY modes)

  • Blocked on: a concrete mode-control use case (a deployment that needs to set echo/raw/canonical/etc. modes on a PTY, beyond the backend's defaults).
  • Priority: low
  • Full file: OQ-44

OQ-46: Runner API Surface

  • Blocked on: a concrete runner-policy use case that forces the API surface (job management, log persistence, task graph integration).
  • Priority: low
  • Full file: OQ-46

OQ-48: Network and Volume Operation Surface

  • Blocked on: a concrete use case for network or volume management over the call protocol. Dev containers use the default bridge network; hosted services declare networks/volumes in docker compose.
  • Priority: low
  • Full file: OQ-48

OQ-49: Image Build (buildkit) Scope

  • Blocked on: a concrete use case for building images over the call protocol. The current use cases pull pre-built images, not build them.
  • Priority: low
  • Full file: OQ-49

OQ-51: Container Create Options Surface

  • Blocked on: v1 implementation — the create input JSON Schema is finalized when register_docker_ops is written and tested against bollard's Config struct. An architectural decision (ADR-060 §5), not a deferral past implementation.
  • Priority: medium
  • Full file: OQ-51

OQ-55: AlknetClient / Client Establishment Extraction

  • Blocked on: a second transport's real dial existing (not just a second QUIC dial). The dial is transport-specific (QUIC, HTTP, TCP+TLS, WebTransport, raw TCP); we have one shape implemented (QUIC — CallClient::connect and ChannelClient::connect_quic). Extracting a QUIC-shaped connector now would bake QUIC in as the establishment shape — the same welding ADR-065 unwound on the server side. The blocking condition is met when a non-QUIC dial (SSH raw-TCP, HTTP-wrapped call, TCP+TLS) exists, so the transport-polymorphic dial+TLS seam is extractable from two different transport implementations. Note: the client APIs are already transport-agnostic — CallClient::spawn_dispatch and ChannelClient::from_connection (ADR-080) take a pre-established Connection. What is deferred is the shared dial, not the client protocol surface.
  • Priority: medium
  • Full file: OQ-55

OQ-56: Full Channel-Level Flow-Control Windowing

  • Blocked on: a real deployment observes head-of-line blocking on a saturated channel where the bounded-buffer's stop-reading mitigation is insufficient (e.g., a high-throughput file transfer over a tunnel that saturates a channel and causes frequent demux stalls affecting other channels). The intended use cases (TTY, SSH, tunnels) are not high-throughput in the HOL-blocking sense; the trigger requires a high-throughput use case.
  • Priority: low
  • Full file: OQ-56

OQ-57: Two-Pump Helper Extraction to alknet-core

  • Blocked on: a second two-pump handler existing (the tunnel handler is the first; SSH direct-tcpip will be the second), so the shape convergence is observable. Extracting the helper from one consumer would bake in a shape that the second might not fit. The shutdown-on-completion contract is decided (ADR-078); only the helper extraction is deferred.
  • Priority: low
  • Full file: OQ-57