The coverage review found `InvalidLength {declared, have}` is a
zombie: `DatagramReader::feed` never returns `Err` — it buffers
partial frames indefinitely, and the truncated-stream contract is
carried by `is_mid_datagram` (the codec diagnostic) plus
`TunnelIoError::TruncatedDatagram` (the session surface). The
variant's doc claimed it was the truncated-stream error; no spec
(ADR-003, wire.md, bast.md) names it, and no external consumer
exists (verified 2026-09-08 per ADR-005's N-3 amendment), so the
API window is open — removed before the first consumer pins it.
Also removes the `unreachable!` arm its removal strands in the
`local` adapter's recv mapping (a no-panic path; single-variant
destructure now), and records the planned-shape correction in the
completed wire-codec task doc.
Verified: cargo test (--all-features and default), clippy
--all-targets -D warnings, fmt --check, wasm32 check + clippy — all
clean.
alktunnels
Arbitrary bidirectional tunnels over alkcall
channels: TCP, UDP, unix sockets, and other stream or datagram
substrates — in the ssh -L / ssh -D / ssh -R sense, without SSH.
A producer/consumer protocol crate riding alkcall channels the same
way alktty does (alk/tty is the
sibling precedent): the producer half registers the alk/tunnel open
op and pumps bytes between the channel and the substrate; the consumer
half is the typed session (TunnelSession) that opens tunnel channels
and owns teardown.
A tunnel is a resource, not an address
Open-op params identify a produced resource + substrate:
{ "resource": "postgres-primary", "substrate": "tcp" }
The producer owns the backing — the consumer never learns an address.
Rich addressing (SOCKS5 ATYP, per-datagram remotes) enters only
through the -D/dynamic composition path, inside the tunnel payload,
never in the wire (ADR-001).
- Wire format:
docs/architecture/wire.md(+ the BAST document atdocs/architecture/bast.md) - Open-op params: ADR-001; codec: ADR-003; ALPN: ADR-002
- Producer shapes: ADR-004; consumer session: ADR-005; ACL: ADR-006
- The full spec set:
docs/architecture/(overview, wire, producer, consumer, six ADRs, OQ tracker)
Status
v0.1.0 — the v1 protocol implementation, Phase-2 complete (spec:
docs/architecture/; reviews: docs/reviews/). The wire surface
(params, ALPN, codec) is one-way-door stable from this point; the
API surface becomes ABI-stable at the first external consumer.
Features
| Feature | Contents | wasm |
|---|---|---|
| (default) | params, wire codec, open-op spec, establisher shapes, TunnelSession — protocol only |
yes |
local |
TCP/UDP/unix dial + listen helpers (real sockets) | no |
Verification
cargo test # default crate (wasm-clean)
cargo test --features local # + real-socket suites
cargo clippy --all-targets -- -D warnings
cargo fmt --check
cargo check --target wasm32-unknown-unknown # the wasm-clean guard
License
MIT OR Apache-2.0