chore: bump alkcall 0.7.1 -> 0.8.0; mark the review-008 asks landed

alkcall 0.8.0 lands both graduation upstream asks (review 008):
- U-2: the establisher → reply projection (ADR-049 amendment 3,
  Establishment::with_reply_field + open_channel_with_reply) — the
  bind-first 'bound' carrier
- U-1: flavor-form open-op ids in discovery (ADR-047 amendment 3) —
  the direct/forwarded ops reconstruct their marker through discovery
plus the bonus: in-tree ChannelRelay + HubLegTemplate (ADR-051) — the
hub re-produce machinery is upstream now; 'bound' flows end-to-end
per-hop truthful, realizing ADR-008 §6's sentence.

OQ-TN-12 resolves upstream (the composition helper a hub proxy needed
is alkcall's ChannelRelay); spec docs note the asks landed. No
alktunnels API or wire change in this bump — the graduation
implementation (tasks/tunnels) follows.

Verification: cargo test 71 passed (91 all-features), clippy
--all-targets -D warnings, fmt --check, wasm32-unknown-unknown check
+ clippy clean
This commit is contained in:
2026-09-18 13:33:06 +00:00
parent 0d6b23b7cf
commit c31dd5e100
12 changed files with 94 additions and 44 deletions

View File

@@ -4,6 +4,31 @@ All notable changes to this crate are documented here. The format is
based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
this crate adheres to [Semantic Versioning](https://semver.org/).
## [Unreleased]
Spec work for the graduation (ADRs 007/008 — the direct op, listen
metadata + the forwarded op) is committed and pinned; implementation
is decomposed in `tasks/tunnels/` and lands in the next release. The
dependency bump below is the only behavior-affecting change so far
(no wire or API change at this level yet).
### Changed
- **alkcall 0.7.1 → 0.8.0** (crates.io). The two upstream asks the
graduation ADRs depend on landed (alkcall review 008): the
establisher → reply projection (`Establishment::with_reply_field`,
ADR-049 amendment 3 — the bind-first `bound` carrier) and
flavor-form open-op ids in discovery (ADR-047 amendment 3 —
`channels/tunnel/direct`-shaped ops reconstruct their
`channel_open` marker through discovery, so hub relay wraps them as
channels, not plain forwarding stubs). Plus the bonus:
`ChannelRelay` + `HubLegTemplate` (ADR-051) — the hub re-produce
machinery the graduation's re-produce story assumed would be
assembly-layer is now in-tree, with `bound` flowing end-to-end
per-hop-truthful (ADR-051 §6, ADR-008 §6's sentence realized).
No alktunnels API or wire change in this bump; 71/91 tests pass,
wasm-clean verified.
## [0.1.0] - 2026-09-10
The initial release: the v1 tunnel protocol implementation over

4
Cargo.lock generated
View File

@@ -27,9 +27,9 @@ dependencies = [
[[package]]
name = "alkcall"
version = "0.7.1"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac26db919a1db9d72910ead8741af683bedefc625631028194b5f5e1dbd63cb6"
checksum = "8695d47cee5b5a5fe68471f04a505bc257a7e7ed9e64d827de33ff83adf4db12"
dependencies = [
"async-trait",
"bytes",

View File

@@ -19,7 +19,7 @@ default = []
local = ["tokio/net"]
[dependencies]
alkcall = "0.7.1"
alkcall = "0.8.0"
tokio = { version = "1", default-features = false, features = ["rt", "sync", "io-util", "macros", "time"] }
bytes = "1"
futures = "0.3"

View File

@@ -154,10 +154,10 @@ Questions section.
`/workspace/@alkdev/alkcall/docs/reviews/consumer-findings-ledger.md`
(CF-005/CF-006 = the identity seam, resolved in 0.7.0)
- The graduation research (the two new ADRs implement it):
`docs/research/tunnels-graduation.md`; the pending upstream alkcall
asks are filed at `/workspace/@alkdev/alkcall/docs/reviews/
008-tunnels-graduation-upstream-review.md` (flavor-form discovery
derivation; the establisher → reply `bound` projection)
`docs/research/tunnels-graduation.md`; the upstream alkcall asks
(review 008) **landed in alkcall 0.8.0** — flavor-form discovery
derivation + the establisher → reply `bound` projection, plus the
in-tree `ChannelRelay`/`HubLegTemplate` (alkcall ADR-051)
- Sibling precedent: alktty (`/workspace/@alkdev/alktty`) — the
producer/consumer-on-channels shape, wasm-clean default,
feature-gated local backend, BAST convention

View File

@@ -225,8 +225,9 @@ serving registry of its own.
- Reverse POC `docs/research/reverse-poc-summary.md` (the seed shape:
`ReverseTunnel` open_and_pump / close / join_and_reap; W3, W4)
- `docs/research/tunnels-graduation.md` (the graduation research)
- Upstream asks: `alkcall/docs/reviews/
008-tunnels-graduation-upstream-review.md`
- Upstream asks (review 008): `alkcall/docs/reviews/
008-tunnels-graduation-upstream-review.md` — landed in alkcall
0.8.0
- alkcall ADR-047 §5 (allocation — the initiator adopts), ADR-050
(`pump_bidi`), ledger
CF-005/CF-006 (identity on the reverse path)

View File

@@ -49,7 +49,8 @@ reconstructs them). Runtime was never blocked — registration sets the
ALPN explicitly and `open_channel(op_id, params, alpn)` takes the ALPN
as an argument — but discovery + hub relay are the re-produce path
(alknodes, OQ-TN-12), so the convention is pinned upstream before the
first consumer.
first consumer. **Landed in alkcall 0.8.0** (review 008 U-1, ADR-047
amendment 3).
### 2. Params: `{ substrate, target }`

View File

@@ -81,6 +81,9 @@ The open-op reply gains an **optional, additive** field:
reply fields the wrapper merges into the success output; the
`channel_id` key is wrapper-reserved). Filed in
`alkcall/docs/reviews/008-tunnels-graduation-upstream-review.md`.
**Landed in alkcall 0.8.0** (review 008 U-2, ADR-049 amendment 3:
`Establishment::with_reply_field` + the wrapper merge with the
reserved-key guard).
- `bound` is informational surface, not addressing: a consumer MUST
NOT treat it as a dial target (the producer owns the backing —
ADR-001's invariant). It exists for RFC-1928-reply-class fidelity
@@ -177,12 +180,14 @@ wire distinction beyond `bound`'s presence.
the forwarded op id, its params, and `tunnel:forwarded` are one-way
doors. The `bound` field is additive (absent = old-producer
compatible); the forwarded op is additive (old openers reject loudly).
- **Upstream coordination before the first consumer:** the
`bound`-projection ask (ADR-049 amendment 3) and the flavor-form
discovery derivation (ADR-047 amendment) land in alkcall first —
the review records both. The bind-first establisher itself is this
crate's work and does not wait on upstream (§2's `bound` is the only
upstream-gated piece).
- **Upstream coordination resolved:** the `bound`-projection ask
(ADR-049 amendment 3) and the flavor-form discovery derivation
(ADR-047 amendment) **landed in alkcall 0.8.0** (review 008, Units
12); the in-tree `ChannelRelay` + `HubLegTemplate` (ADR-051) came
with them — the hub re-produce machinery §6 assumed assembly-layer
is now upstream, and the relay passes `bound` through per-hop
truthful. The bind-first establisher is this crate's remaining
implementation work (tasks/tunnels).
- **`TargetHandle` does NOT gain a `peer` field.** The option-(i)
carrier from the graduation doc is superseded: with accept-as-open,
the peer rides the forwarded op's params; no process-local metadata

View File

@@ -184,16 +184,23 @@ OQ-TN numbering. Format per `docs/sdd_process.md`.
### OQ-TN-12: Hub re-produce composition helper
- **Origin**: OQ-TN-05's remaining thread (2026-09-05 hub model)
- **Status**: deferred(scope)
- **Status**: resolved (upstream, 2026-09-18) — alkcall 0.8.0 ships
the in-tree `ChannelRelay` + `HubLegTemplate`/`HubLegImports`
(alkcall ADR-051, review 008 Unit 3): the relay openable wraps
from_call-imported marked specs on the consumer-leg registry via
the full open-op wrapper (ACL, cap/ledger, establishment bound,
teardown), the translate hop calls the producer leg with
`forwarded_for` from the consumer's per-call identity, the
byte-forward hop is `pump_bidi` awaited inline, the spoke reply's
`channel_id` is stripped/replaced (other fields ride through —
`bound` flows end-to-end per-hop truthful), and the adopted
producer-leg entry reclaims via a `Drop` guard on every plan path.
The composition helper a hub proxy needed is upstream — this crate
composes it (OQ-TN-05's resolution stands: no tunnel-side trait).
Tracker task: `architecture/oq-tn-12-tracker` (tasks/architecture/).
- **Priority**: low
- **Blocked on**: a concrete hub-proxy consumer (a crate that
re-produces a consumed tunnel resource) — the reverse POC's hub is
the seed shape (consumer + `register_openable` on the same
connection) but does not exercise re-export; if one materializes,
decide whether a composition helper belongs in this crate or is
assembly-layer wiring of the existing surface. Tracker task:
`architecture/oq-tn-12-tracker` (tasks/architecture/).
- **Cross-references**: OQ-TN-05, ADR-004, alkcall ADR-042 (relay)
- **Cross-references**: OQ-TN-05, ADR-004, alkcall ADR-042 (relay as
amended by ADR-051), ADR-008 §6 (the hub policy sentence)
### OQ-TN-13: UDP truncation semantics at the codec boundary
@@ -258,10 +265,11 @@ OQ-TN numbering. Format per `docs/sdd_process.md`.
`tunnel:open` — structural ACL separation), dial-only (no
listen/direct-BIND form — ingress is the listen + forwarded
surface). The op-id convention needed an upstream alkcall amendment
(ADR-047's discovery derivation is `/sub`-shaped) — filed in
(ADR-047's discovery derivation was `/sub`-shaped) — filed in
`alkcall/docs/reviews/008-tunnels-graduation-upstream-review.md`
(ask #1); the runtime was never blocked (explicit ALPN marker +
explicit ALPN argument on `open_channel`).
(ask #1) and **landed in alkcall 0.8.0** (ADR-047 amendment 3:
flavor-form op ids + the explicit `channel_open_alpn` discovery
field; hub relay reconstructs the marker).
- **Cross-references**: ADR-001 (per-op amendment), ADR-002
Amendment 1, ADR-006 Amendment 1, wire.md, producer.md
@@ -275,16 +283,19 @@ OQ-TN numbering. Format per `docs/sdd_process.md`.
(2026-09-16). The `forwarded-tcpip` shape adopted over per-ask
carriers: (1) a bind-first listen establisher — establishment ends
at bind time, so the open-op reply carries the real OS-chosen
address via an additive `bound` field (ask #1; the carrier is an
upstream alkcall ask — the establisher → reply projection, filed as
the review's ask #2; ADR-049's `#[non_exhaustive]` anticipates it),
address via an additive `bound` field (ask #1; the carrier is the
establisher → reply projection filed as the review's ask #2 and
**landed in alkcall 0.8.0** as ADR-049 amendment 3,
`Establishment::with_reply_field` + `open_channel_with_reply`),
and the address-first-vs-accept-first BIND deadlock + the 10s
establishment-bound problem dissolve with the shape; (2) the
forwarded op `channels/tunnel/forwarded` (accept-as-open) — the
producer opens a channel per accept with `{channel, substrate,
peer}` in params (ask #2's carrier; the `TargetHandle.peer` option
is superseded). The accept-first listen shape stays for
accept-queue-backed resources.
accept-queue-backed resources. Bonus from the same release: the
in-tree `ChannelRelay` + `HubLegTemplate` (alkcall ADR-051) pass
`bound` through the hub per-hop truthful (ADR-008 §6 realized).
- **Cross-references**: ADR-002 Amendment 1 (the flavor-form op id),
ADR-006 Amendment 1 (`tunnel:forwarded`), ADR-005 (teardown
ownership extended to `TunnelListener`), producer.md,

View File

@@ -108,8 +108,10 @@ establisher + the forwarded op (ADR-008).
```
alktunnels (default — wasm-clean)
├── alkcall 0.7.0 (core types, channels: ChannelCore/ChannelClient/manager,
│ pump_bidi, ServingConfig identity seam — CF-005/006)
├── alkcall 0.8.0 (core types, channels: ChannelCore/ChannelClient/manager,
│ pump_bidi, ServingConfig identity seam — CF-005/006,
│ establisher reply projection + flavor-form discovery
│ derivation + ChannelRelay/HubLegTemplate — review 008/ADR-051)
├── tokio (wasm-clean subset: rt, sync, io-util, macros, time)
├── bytes, futures, serde/serde_json, thiserror, tracing, async-trait
└── (no backend deps — sockets/process live in feature-gated modules)

View File

@@ -149,11 +149,10 @@ dial:
- **The establishment phase ends at bind time**, so the open-op reply
can carry the REAL OS-chosen address: the establisher contributes
`"bound": {host, port}` (or `{path}`) to the reply — the
establisher → reply projection is an upstream alkcall ask (ADR-049
amendment 3; `Establishment` gains optional reply fields, the
`channel_id` key wrapper-reserved — see
`alkcall/docs/reviews/008-tunnels-graduation-upstream-review.md`,
ask #2). Until upstream lands, the field is simply absent.
establisher → reply projection (ADR-049 amendment 3,
`Establishment::with_reply_field`; the `channel_id` key is
wrapper-reserved). **Landed in alkcall 0.8.0** (review 008 U-2);
consumers read it via `ChannelClient::open_channel_with_reply`.
- **The pump handler for this shape is an accept dispatcher**, not
`pump_bidi`: it accepts the channel's `BiStream` (the R-02
contract), then runs the assembly-provided accept loop — each
@@ -338,6 +337,9 @@ Tunnels reach local networks — the open gate is the security boundary
§3.1 is the shape bind-first + the forwarded op adopt)
- alkcall ADR-047/049 (open ops + establishment), ADR-050 (`pump_bidi`),
ledger CF-005/CF-006 (identity precedence + per-call opener)
- Upstream asks: `alkcall/docs/reviews/
008-tunnels-graduation-upstream-review.md` (flavor-form discovery
derivation; the establisher → reply `bound` projection)
- Upstream asks (review 008): `alkcall/docs/reviews/
008-tunnels-graduation-upstream-review.md` — both landed in
alkcall 0.8.0 (flavor-form discovery derivation, ADR-047
amendment 3; the establisher → reply `bound` projection, ADR-049
amendment 3), plus the in-tree `ChannelRelay`/`HubLegTemplate`
(alkcall ADR-051)

View File

@@ -282,5 +282,6 @@ UDP substrate, one direction's wire view:
- alkcall ADR-047 (open ops), ADR-049 (establishment/typed errors),
ADR-050 (`pump_bidi`); alknet ADR-071/093 (channels wire)
- `docs/research/tunnels-graduation.md` (the graduation research the
new ops implement); the upstream asks:
new ops implement); the upstream asks (review 008) landed in
alkcall 0.8.0 — see
`alkcall/docs/reviews/008-tunnels-graduation-upstream-review.md`

View File

@@ -29,7 +29,9 @@ the research record, the ADRs are now normative:
discovery's ALPN derivation to exactly `…/sub`/`…/pub` op-id shapes
(`derive_alpn_from_op_name`) — flavor-form op ids (both new ops)
need an upstream alkcall amendment before the first consumer. Filed:
`alkcall/docs/reviews/008-tunnels-graduation-upstream-review.md`.
`alkcall/docs/reviews/008-tunnels-graduation-upstream-review.md`
(both asks landed in alkcall 0.8.0, plus the in-tree
`ChannelRelay`/`HubLegTemplate` — alkcall ADR-051).
The upstream ask ledger (§5) is now: items 12 pinned by ADR-007/008
(implementation pending the two upstream alkcall asks), item 3