Files
alkssh/tasks/implementation/w1-config.md
T
glm-5.3-flash 0b1bc284fa docs(plans): add wave-based implementation plan; decompose wave 1
- 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
2026-10-28 06:13:26 +00:00

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
w1-manifest
w1-key-sources
w1-host-key-policy
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, each Option<Vec<String>> — unset → its row declines with a clean error, never a fallback, no crate default; the wrapper form is platform-neutral), the IdentityProvider handle (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 tunnel ChannelClient handle (the route-1 bridge's family-fabric entry — Option, absent → tunnel rows decline even under the feature), and the Limits. cwd/env in NegotiateRequest are 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), the HostKeyPolicy handle, 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_attempts default 10 (sized for the counting none-probe, ADR-004 decision 6), window_size/maximum_packet_size/channel_buffer_size set, inactivity_timeout set (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 Option with unset-declines doc contracts; no crate default shell/wrapper
  • IdentityProvider, host-key source, and ChannelClient are 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
  • Limits carries the in-crate caps (channels, exec-parse) and the russh knob defaults (max_auth_attempts 10, 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 --check pass

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_attempts default)

Notes

To be filled by implementation agent

Summary

To be filled on completion