- The route-1 bridge (ADR-006 decision 1, the POC-3 stage-C recipe
re-landed as contract): per accepted `direct-tcpip` /
`direct-streamlocal` open, the target/substrate are constructed from
the SSH open arguments and the spawned task runs
`TunnelSession::open_direct` over the held `Arc<ChannelClient>` →
accept only after the fabric open succeeds → `take_halves()` pumped
against the taken channel (`pump_bidi`) — the open hook returns fast;
a fabric failure answers the explicit `ConnectFailed` reject (the
wave-2 stub's reason surviving as the real decline; the stub retired
from the direct rows, kept on `forwarded-tcpip` for w3-tunnel-listen).
- The cap across the fabric window (recorded): the admission is taken
at the hook and held across the fabric open; a fabric failure
releases the count inside the spawned task — the admitted-but-
rejected shape no `channel_close` can ever fire for. `ChannelCap`
became a mutex-backed `Arc`: admissions stay packet-loop-only,
releases have exactly two disjoint sites (close hook, bridge task),
both saturating.
- The identity ride recorded (the `w2-auth-bridge` parked item): the
alkhub `hub_leg.rs` one-time-set precedent is a serving-side set; the
client-side `take_call_connection()` seam is rejected for this door
(one-shot detach of the shared assembly handle's open surface — a
fortiori the relay note's "wrong for hubs"); the identity the fabric's
`AccessControl::check` consults is the dial identity (CF-005), the
composition is assembly policy, and the door structurally refuses
anonymous serving (`no-identity`, unreachable on the wire). Upstream
ask booked for the gate.
- The OQ-11 runtime-Unix gate: `direct-streamlocal` compiles wherever
`tunnel` compiles; off-Unix a clean open-decline before any fabric
call (dial-call witness at zero), on-Unix the real bridge.
- Decline classes recorded: policy → `AdministrativelyProhibited`
(unfeatured/cap/`no-identity`); cannot-bridge → `ConnectFailed`
(failed fabric open, absent handle under the feature, invalid
target, off-Unix streamlocal); the event vocabulary gains
`invalid-target` and `unix-unavailable`.
- The optional dep lands: `alktunnels 0.4.1` (pin re-verified against
crates.io — max stable, MIT OR Apache-2.0, rust_version 1.88, alkcall
0.10.1 exact), wired `tunnel = ["dep:alktunnels"]`, `local` never
enabled.
- The fabric double (`tests/tunnel_mapping.rs`): the POC-3 §C.4
in-process recipe — `ChannelsAdapter` + `InstallChannelZero` + the
alktunnels openables + a hand-rolled dial/dial-fail seam (in-process
duplex targets keyed by the rendered string; the smoke's dial is real
TCP). Rows: both-substrate serve round trips, fabric-failure,
cap refusal + release + recovery, the fabric-ACL composed-gate
witness, the CF-006 identity witness, the OQ-11 gate, and the
`ssh -L` + curl real-tool smoke (conditional-skip posture, ran green).
Verification: `cargo test` rows green per feature build (default,
tunnel, git, session, git+session, tunnel+git, tunnel+session,
--all-features); `cargo clippy --all-targets -- -D warnings` ×2
(default + --all-features) clean; `cargo fmt --check`; `cargo doc
--no-deps` 0 warnings; `taskgraph validate` (26 tasks).
- new private channel_cap module: per-session active-channel count;
admit (check+increment at accept sites) / has_room / saturating
release, single-writer (inline packet-loop hooks), unit-tested
- handler wires the cap at every channel_open_* hook: the session
accept path admits-and-counts at the accept point; the tunnel rows
cap-gate before the seam stub (a counted-but-unopened stub would
leak the cap); x11 never consumes a count; the count releases
through the new channel_close hook
- dispatch::cap_exceeded_open_decline -> AdministrativelyProhibited
(the assembly's policy ceiling; OpenSSH MaxSessions parity)
- bounded-resources contract rows: cap reached -> clean decline,
close -> recovery open succeeds (wire-order deterministic),
zero cap refuses without poisoning, exhausted cap answers the
tunnel row with the cap reason; max_auth_attempts verified
behaviorally (within-ceiling failures keep the advertisement, the
past-ceiling attempt is the NoMoreAuthMethodsAvailable teardown);
window/packet/buffer/inactivity knobs recorded as covered by the
config-mapping tests
- max_exec_command_len stays carried, not enforced (wave-3 grammar)
Verification: cargo test (default), --features session / git /
tunnel / --all-features, clippy --all-targets (-D warnings, also
--all-features), fmt --check, cargo doc --no-deps - all green