feat(dispatch): land the parse-only dispatch + the fail-closed decline core (w2-dispatch-decline-core)
- src/dispatch.rs: the ExecRoute decision, the skeleton exec-parse
probe (service prefix + path shape; wave 3 replaces with the full
grammar), the wire-reason shapers (AdministrativelyProhibited for
unfeatured/never-feature opens, ConnectFailed for the tunnel seam
stub), 7 probe unit rows
- src/handler.rs: channel_open_* gates per the feature graph (session
∨ git; tunnel; x11/auth-agent never), parse-only exec_request
dispatch before any allocation, session-row routes, request-level
declines (subsystem all-names with the sftp OQ-13 and git named
classes, env per OQ-09, x11/agent, the four listen requests), the
named wave-3 seam stubs; decline-first-alloc-never structural;
module docs carry the decline-core contract incl. the inherited
auth-agent-open upstream note
- tests/dispatch_core.rs: 26 Contract-stamped decline-matrix rows per
feature build driven through the loopback harness (none / git-only /
session-only / tunnel-only / all-features + shared never-feature
rows)
- tests/common/harness.rs: extended helper vocabulary (tunnel/x11
opens, pty/env/x11/agent requests, listen requests) — discharges
the w2-loopback-harness live-rows note
- tests/loopback_harness.rs: the skeleton decline-only session-open
row cfg-pinned to the featureless builds it describes
Verification: cargo test (91 rows, default build); per-feature
dispatch_core rows (git 11 / session 10 / tunnel 4 / all 8 / sftp 3);
cargo test --all-features; cargo clippy --all-targets -- -D warnings
(and --all-features); cargo fmt --check; cargo doc --no-deps