feat(config): land the configuration surface (serve-config, dial-config, Limits)
- ServeConfig: OQ-08 shell_argv / exec_wrapper_argv as
Option<Vec<String>> with unset-declines doc contracts (no crate
default shell/wrapper); OQ-09 session_cwd/session_env
(assembly-supplied, never wire-derived); injected
Arc<dyn IdentityProvider> + Arc<dyn HostKeySource> handles;
optional Arc<ChannelClient> route-1 handle (absent -> tunnel rows
decline even under the tunnel feature); Limits.
- DialConfig: address + injected Arc<dyn KeySource> and
Arc<dyn HostKeyPolicy> handles + Limits.
- Limits: the bounded-resources budget model both directions carry —
in-crate caps (max_concurrent_channels 64, max_exec_command_len
8192) and the russh-knob mapping with documented postures
(max_auth_attempts 10 per ADR-004 decision 6; window 2 MiB /
packet 32 KiB / buffer 100; inactivity 600 s always-set shape;
keepalive Some(15 s)/3 client posture).
- Types only: no russh Config construction (wave 2), no dialing
(wave 4); no construction-time validation — unset-declines lives
in the type shape (error.rs no-config-error contract).
Verified: cargo test (36), cargo test --all-features, clippy
(all-targets, -D warnings, default + all-features), fmt --check.