- docs/plans/implementation.md: five-wave decomposition of the architecture (foundations -> server stack -> server mappings || client direction -> validation & release), following the alkgit sibling pattern (decompose-implement-gate rhythm, per-wave decomposition records, review gates at wave boundaries) - scope authority: v0.1.0 publishes the crate; assembly wiring stays out; sftp decline placeholder is shipped behavior - wave 1 decomposed into eight task files under tasks/implementation/ (manifest, error model, key sources, host-key policy, fingerprint, config surface, test doubles, review gate) with recorded interpretations flagged for the gate Verification: taskgraph validate (12 tasks, no cycles); cargo test, clippy -D warnings, fmt --check green
3.5 KiB
3.5 KiB
id, name, status, depends_on, scope, risk, impact, level
| id | name | status | depends_on | scope | risk | impact | level | |||
|---|---|---|---|---|---|---|---|---|---|---|
| w1-config | Wave 1 — the config surface (serve-config, dial-config, Limits) | pending |
|
moderate | low | project | implementation |
Description
Land the pure configuration types both directions implement against — the shapes every later wave's constructors take:
- Serve-config (server direction,
mapping.md/overview.md) — the assembly-supplied serving configuration: the OQ-08 fields (shell argv and exec wrapper argv, eachOption<Vec<String>>— unset → its row declines with a clean error, never a fallback, no crate default; the wrapper form is platform-neutral), theIdentityProviderhandle (Arc<dyn IdentityProvider>— the assembly injects it; the crate never resolves identities itself), the host-key source handle (the wave-1 key-source seam), the tunnelChannelClienthandle (the route-1 bridge's family-fabric entry —Option, absent → tunnel rows decline even under the feature), and theLimits.cwd/envinNegotiateRequestare assembly-supplied serve-config values, never wire-derived (OQ-09 posture). - Dial-config (client direction,
client.md§The dial surface) — address, key source (the wave-1 seam — never static keys, never env vars), theHostKeyPolicyhandle, and the bounded-resource knobs:keepalive_interval/keepalive_max(15 s / 3 default posture per the reverse-runner evidence),inactivity_timeout, window/packet knobs. Limits— the bounded-resources budget model (overview.md's table): the in-crate max-concurrent-channels cap, exec-parse length caps (consumed by the wave-3 grammar), and the russh knob mapping with documented default postures —max_auth_attemptsdefault 10 (sized for the countingnone-probe, ADR-004 decision 6),window_size/maximum_packet_size/channel_buffer_sizeset,inactivity_timeoutset (assembly-tunable). Every session carries it; no unbounded loops, no unbounded buffers.
Types only — no russh Config construction (wave 2), no dialing
(wave 4). The OQ-08 unset-declines semantics live in the type shape
(Option fields + doc contracts), not in construction-time
validation.
Acceptance Criteria
- Serve-config carries the OQ-08 fields as
Optionwith unset-declines doc contracts; no crate default shell/wrapper IdentityProvider, host-key source, andChannelClientare injected handles; the crate holds no identity/trust policy of its own- Dial-config carries key source +
HostKeyPolicy+ the keepalive/inactivity/window knobs with the documented defaults Limitscarries the in-crate caps (channels, exec-parse) and the russh knob defaults (max_auth_attempts10, keepalive 15 s / 3 client posture)- Unit tests cover default construction and the
Option-field semantics cargo test,cargo clippy --all-targets -- -D warnings,cargo fmt --checkpass
References
- docs/architecture/overview.md §Public surface, §Bounded-resources policy
- docs/architecture/mapping.md (OQ-08 rows, the data-plane/limits section)
- docs/architecture/client.md §The dial surface
- docs/architecture/open-questions.md (OQ-08, OQ-09 resolutions)
- docs/architecture/decisions/004-auth-dispositions.md (decision 6 —
the
max_auth_attemptsdefault)
Notes
To be filled by implementation agent
Summary
To be filled on completion