docs(tasks): decompose wave 4 — the client direction

Eight implementation tasks + the gate under tasks/implementation/,
folding the wave-3 gate's four booked findings in as dedicated tasks
(the gate's own disposition — wave-4 material, not wave-3 backports).

Hardening set (server-side, independent of the client chain,
scheduled first as cheap remediation):

- w4-git-exit-close: booked item 1 — the git row's status-before-close
  by construction (the seam/shape decided + recorded in-task; the
  saturated-buffer scenario pinned on the wire)
- w4-channel-not-held-rows: booked item 2 — the guard's wire rows on
  git/tty pipe/shell, per build (test-only)
- w4-tty-coverage: booked item 3 — the channel_close-fired cancel
  path + the Closed/Break no-exit-chunk rows + the write_all
  no-deadline known-limit record
- w4-router-collision: booked item 4 — the ListenRouter
  token-collision fail-closed pre-check

Client chain (sequential logistically — one client Handler impl):

- w4-dial: the russh client stack + the connection handle + the
  client Handler skeleton at fail-closed defaults, over an in-process
  fake-sshd server double
- w4-op-rows: exec/pty, direct-tcpip, git exec over the shared
  grammar, the sftp client-side decline — the POC-3 §D.3 mechanics
- w4-reverse-listen: the -R leg — forward requests + the acceptor
  registry + late-install (the wave's highest-risk task)
- w4-lifecycle: the OQ-12 primitives (cancellable handles, clean
  disconnect, no reconnect policy)

review-wave-4 depends on all eight. The gate's item 5 (upstream asks)
stays booked with its owners — no task. Plan wave-4 section carries
the decomposition record + four flagged interpretations; wave table
status updated.

Verification: taskgraph validate ✓ (35 tasks)
This commit is contained in:
glm-5.3-flash committed 2026-10-29 05:59:03 +00:00
1 parent 930d9c1996
commit dba64d65d3
10 files changed
+820 -3

No files matched your search

+63
View File
@@ -0,0 +1,63 @@
---
id: w4-tty-coverage
name: Wave 4 — tty coverage minors (wave-3 gate booked item 3)
status: pending
depends_on: [w4-channel-not-held-rows]
scope: narrow
risk: low
impact: component
level: implementation
---
## Description
Close the wave-3 gate's booked finding item 3
(`review-wave-3` §Booked findings — "minors, one ticket's worth"):
- **The `channel_close`-fired per-channel cancel path is
unexercised on the wire** — only the teardown signal is. Land the
wire row: a channel closing (client-side close on a served tty
row) fires the per-channel cancel path (the cap release + the
per-channel state teardown observed — the disjoint release sites
the gate verified per row, now wire-witnessed for this path).
- **The Closed/Break no-exit-chunk close shape has no wire row** —
land the row(s): a session ending via the Closed/Break close shape
emits **no exit chunk** (the derivation contract's close-shape
class — the absent-report posture pinned, not just the happy
paths).
- **The tty stdout `write_all` carries no deadline** — record as a
**known limit only** (module docs): backpressure is bounded, liveness
is covered by the inactivity timeout; no code change (the gate's
recorded disposition — a deadline here is a behavior change, not a
coverage minor).
Depends on `w4-channel-not-held-rows` to keep `tests/tty_mapping.rs`
single-writer (that task's rows land first; these land into the
settled file).
## Acceptance Criteria
- [ ] Wire row: the `channel_close`-fired per-channel cancel path
(cap release + state teardown observed on the wire)
- [ ] Wire row(s): the Closed/Break no-exit-chunk close shape
- [ ] The stdout `write_all` no-deadline limit recorded in module
docs (no code change)
- [ ] `cargo test` (+ per-feature + `--all-features`), clippy ×2
(`-D warnings`), fmt, `cargo doc --no-deps` pass
## References
- tasks/implementation/review-wave-3.md §Booked findings item 3
- docs/architecture/mapping.md §The exit derivation contract (the
close-shape classes; the PTY-path rule-5 limit — the docs-posture
template), src/tty_map.rs, src/channel_cap.rs (the release sites
the rows witness)
- tests/tty_mapping.rs (the per-build matrix the rows join)
## Notes
> To be filled by implementation agent
## Summary
> To be filled on completion