Files
alknet/docs/architecture/open-questions.md
T
glm-5.2 81bde6f28f docs(arch): endpoint as pure accept-loop runner + acme-tls/1 guard relocation (ADR-083, OQ-60/61)
ADR-083: AlknetEndpoint becomes a pure accept-loop runner with a public
dispatch method. Transport construction moves out of the endpoint — the
assembly layer reads StaticConfig, builds transports from
TlsServerConfig(s), and hands pre-built quinn/iroh endpoints to the
endpoint via with_quinn/with_iroh. TCP+TLS dispatch is first-class (same
dispatch path as quinn/iroh); ADR-010 Amendment 1's duplicated-dispatch
workaround is retired. StaticConfig stays in core as the assembly-layer
config; the endpoint takes only drain_timeout.

The acme-tls/1 guard moves from dispatch_quinn to the shared dispatch
method — ACME TLS-ALPN-01 challenges arrive over TCP (CAs validate via
TCP to port 443, not QUIC), so the guard's quinn-specific location was a
latent bug once TCP+TLS exists. The guard is transport-agnostic; the
rationale (no handler, silent close) is unchanged. ADR-027 §5 amended.

OQ-60: where build_iroh_endpoint lives (assembly layer / alknet-tls
helper / transport module). build_quinn_server_config_from_rustls is
decided — it moves to alknet-tls as for_quinn() per ADR-082; only
build_iroh_endpoint is genuinely undecided.

OQ-61: multi-owner shutdown coordination. Boundary committed (endpoint
owns dispatched handlers; assembly layer owns spawned accept loops);
mechanism open.

ADR-082 amended: drops the Arc<TlsServerConfig> endpoint signature
(superseded by ADR-083); keeps its scope as the alknet-tls crate's
TlsServerConfig + accessors.

Review: zero critical issues, five warnings fixed (build_iroh_endpoint
destination contradiction, undeclared shutdown_sender, missing ADR-027
amendment marker, underspecified dispatch no-match behavior, stale
door-type timing clause).
2026-07-14 07:59:04 +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? open two med
OQ-60 Where Does Transport Construction Live? open one high
OQ-61 Multi-Owner Shutdown Coordination open 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