docs: port architecture specs + 45 ADRs from alknet, renumbered
Port the call + channels architecture documentation from the alknet mono-repo into docs/architecture/, renumbered as alkcall ADR-001..045. Renumbering map (alknet -> alkcall): Core: 001,002,004,006,007,011,065,070,092,014,050,091 -> 001-012 Call: 005,064,012,023,015,022,024,016,049,017,028,029,030,032,066,069,067,068 -> 013-030 Shared: 003,009,013 -> 031-033 Channels: 071,093,072,073,074,075,076,094,079,080,081,089 -> 034-045 3 superseded/reversed ADRs kept for historical trail: - ADR-013 (irpc foundation, superseded by ADR-014) - ADR-023 (peer-scoped filtering, superseded by ADR-024) - ADR-077 (TTY inside channels, reversed by ADR-035 — not ported, TTY-only) Ported docs (11 spec files + README + open-questions): - call-README.md, call-protocol.md, operation-registry.md, client-and-adapters.md - channels-README.md, channels-overview.md, channels-wire.md, channels-connection.md, channels-adapter.md, channel-operations.md, channel-client.md - README.md (index with doc table, ADR table grouped by category, key principles) - open-questions.md (lean — 30 OQs, renumbered OQ-01..030; includes new OQ-22 for the pub/sub gap) Cross-reference rewriting: - All ADR-NNN references rewritten single-pass (no chaining bug) - Markdown link paths fixed - Title lines aligned with filenames - Non-ported ADR refs (052, 082, 086, etc.) left as-is with README note The open-questions.md includes OQ-22 (new): the call protocol pub/sub gap — subscribe exists but pub does not, needed for channels channel/resources/subscribe fan-out. This is the next ADR to write (alkcall ADR-046).
This commit is contained in:
81
docs/architecture/open-questions.md
Normal file
81
docs/architecture/open-questions.md
Normal file
@@ -0,0 +1,81 @@
|
||||
---
|
||||
status: draft
|
||||
last_updated: 2026-08-12
|
||||
---
|
||||
|
||||
# Open Questions
|
||||
|
||||
Open questions are tracked here, organized by theme. Each question has a
|
||||
status, priority, and (when resolved) a resolution citing the ADR.
|
||||
|
||||
**Status values**: `open`, `resolved`, `deferred(scope)`, `deferred(unclear)`,
|
||||
`partially resolved`, `dissolved`.
|
||||
|
||||
## Call Protocol
|
||||
|
||||
| OQ | Title | Status | Priority | Resolution |
|
||||
|----|-------|--------|----------|------------|
|
||||
| OQ-01 | Call protocol scope within a connection | resolved | medium | ADR-015 — stream model, multiplexing |
|
||||
| OQ-02 | Operation path format and routing scope | resolved | medium | `/{service}/{op}` is the correct design |
|
||||
| OQ-03 | Batch operation semantics | resolved | low | Correlated call.requested events |
|
||||
| OQ-04 | Session-scoped operation registries | resolved | medium | ADR-019 — OperationEnv trait layering |
|
||||
| OQ-05 | Abort cascade semantics for nested calls | resolved | high | ADR-020 |
|
||||
| OQ-06 | Privilege model and authority context | resolved | high | ADR-017 |
|
||||
| OQ-07 | Handler identity registration path and composition authority | resolved | high | ADR-018 |
|
||||
| OQ-08 | Operation error schemas | resolved | high | ADR-016 |
|
||||
| OQ-09 | Safe vault operations for call protocol exposure | resolved | high | ADR-010 — none exposed |
|
||||
| OQ-10 | ~~Remote-safe marking shape~~ | dissolved | medium | ADR-024 — remote_safe/trusted_peer retired |
|
||||
| OQ-11 | OperationAdapter error type (AdapterError variants) | resolved | medium | DiscoveryFailed, SchemaParse, Transport, Unauthorized, SamePeerCollision |
|
||||
| OQ-12 | from_call re-import trigger | resolved | low | ADR-028 — manual free function |
|
||||
| OQ-13 | from_call namespace collision | resolved | low | Same-peer = error; cross-peer dissolved (ADR-024) |
|
||||
| OQ-14 | CallClient TLS client-auth | resolved | high | quinn client-auth; key-type-aware verification |
|
||||
| OQ-15 | PeerRef::Any routing policy | resolved | low | Insertion-order first-match |
|
||||
| OQ-16 | services/list-peers re-export semantics | resolved | low | Opt-in; services/list is own-ops-only |
|
||||
| OQ-17 | Multi-hop federation | deferred(scope) | low | One-hop model is the commitment; multi-hop is a feature extension |
|
||||
| OQ-18 | PeerId — crypto identity vs stable logical id | resolved | high | ADR-025 — PeerId = Identity.id (stable) |
|
||||
| OQ-19 | Persistent peer registry | resolved | medium | ADR-025 — core trait + in-memory default; persistence adapters separate |
|
||||
| OQ-20 | ~~API key asymmetry~~ | dissolved | medium | PeerEntry supports multiple credential paths |
|
||||
| OQ-21 | X.509 outgoing-only case | resolved | medium | Three remote roles; PeerEntry asymmetry correct |
|
||||
|
||||
## Call Protocol — Pub/Sub (NEW)
|
||||
|
||||
| OQ | Title | Status | Priority | Resolution |
|
||||
|----|-------|--------|----------|------------|
|
||||
| OQ-22 | Call protocol pub/sub primitive — pub to go with sub | open | high | Not yet resolved. The call protocol has `subscribe` (consumer → producer: "send me a stream") but no `pub` (producer pushes to subscribers it didn't directly receive a call.requested from). Surfaced during channels spec work — `channel/resources/subscribe` (ADR-037) needs fan-out. See §"Pub/Sub Gap" below. |
|
||||
|
||||
### Pub/Sub Gap
|
||||
|
||||
The call protocol's `StreamingHandler` / `invoke_streaming()` path
|
||||
(ADR-021) is point-to-point: a `call.requested` arrives, the handler
|
||||
produces a stream of `call.responded` events back to that one caller.
|
||||
There is no mechanism for a producer to push events to subscribers that
|
||||
it didn't directly receive a `call.requested` from.
|
||||
|
||||
The first consumer that needs this is the channels `channel/resources/
|
||||
subscribe` operation (ADR-037): the hub aggregates worker resources and
|
||||
needs to push live updates to N browser subscribers when any worker's
|
||||
resource set changes. Each browser's `subscribe` arrives on the hub's
|
||||
channel 0, but the worker resource changes arrive on separate worker
|
||||
connections. The hub needs to fan-out.
|
||||
|
||||
**Blocked on**: An ADR specifying the pub primitive's shape — topic-based
|
||||
fan-out vs. producer-side push to existing subscriptions. This is the
|
||||
next ADR to write (alkcall ADR-046).
|
||||
|
||||
## Channels
|
||||
|
||||
| OQ | Title | Status | Priority | Resolution |
|
||||
|----|-------|--------|----------|------------|
|
||||
| OQ-23 | Full channel-level flow-control windowing | deferred(scope) | low | Bounded-buffer decided (ADR-040); full windowing blocked on HOL-blocking deployment observation |
|
||||
| OQ-24 | Channels add/strip API shape | open | low | Whether the 8-byte header add/strip is built into the read/write path or a standalone utility. The contract (ADR-035) is decided; the function surface is not |
|
||||
|
||||
## Core Types
|
||||
|
||||
| OQ | Title | Status | Priority | Resolution |
|
||||
|----|-------|--------|----------|------------|
|
||||
| OQ-25 | BiStream type definition | resolved | high | ADR-005 — trait, Connection parameter |
|
||||
| OQ-26 | AuthContext resolution timing | resolved | high | ADR-003 — hybrid resolution |
|
||||
| OQ-27 | ALPN string naming convention | resolved | medium | ADR-004 — alknet/ prefix |
|
||||
| OQ-28 | Dynamic handler registration | resolved | low | ADR-019 — curated static, overlays dynamic |
|
||||
| OQ-29 | Handler-level auth resolution observability | resolved | medium | set_identity() on Connection for observability |
|
||||
| OQ-30 | Dynamic resource ownership | resolved | high | ADR-011 — OwnershipProvider, resource_id_path |
|
||||
Reference in New Issue
Block a user