--- id: review-wave-5 name: "Wave 5 gate: the release review" status: completed depends_on: [w5-decline-matrix, w5-e2e-server, w5-e2e-client, w5-fuzz-harness, w5-release-readiness] scope: narrow risk: low impact: phase level: review --- ## Description The wave-5 review gate, the release review that closes the plan (`docs/plans/implementation.md` §Wave 5: "then **the publish of `alkssh 0.1`**, which is the gate review that closes the plan"). The gate stays a **pure review**; the publish is its own task (`w5-publish`) executing only over a green verdict. The gate reads: - **The decline-matrix suite**, reading the coverage-audit table against `mapping.md`'s matrix table cell by cell: every row × every build it can appear in × both directions pinned; the sftp placeholder rows and the never-features explicit in every build; the matrix runner in the verification list. - **The e2e postures**, reading both directions' real-tool rows: nothing silently green (every skip reasoned with the tool/version cause), every e2e finding discharged or explicitly booked with an owner, never absorbed; the real-`sshd` client-direction rows verified against the reverse-runner shape. - **The fuzz corpus gate**, reading the sidecar's layout against the alkgit convention (detached runner, committed seeds + no-op-diff generator, the shared-library corpus replay in the verification list); the campaign logs read (no unresolved crash/OOM/timeout); the exposure shape read (no non-`doc(hidden)` surface growth). - **Release readiness**: rustdoc warning-free across builds; README/ CHANGELOG read for honesty; the packaged file list against the package policy; the manifest sanity; **the freeze inventory read against the landed code**, checking the list of surfaces the publish makes one-way (the mapping contracts, the honest-advertisement posture, the decline-matrix behavior, the fingerprint format, the russh pin's wire posture) confirmed accurate, because `w5-publish` executes immediately after this gate. - **The plan's closure conditions**, verifying the scope-authority checklist (the complete two-direction door shipped; the assembly out; no binary; single crate) verified against the landed state; the upstream asks (the wave-3 gate's item 5 lineage) verified still booked with their owners, with nothing absorbed silently through the release. Verdict: green (`w5-publish` unblocked) or findings booked (remediation; the publish waits). ## Acceptance Criteria - [x] The matrix audit table verified cell by cell against `mapping.md`; the runner in the verification list - [x] Both e2e postures verified (nothing silently green; findings discharged or booked) - [x] The fuzz corpus gate + campaign logs read clean; the sidecar convention held - [x] Release readiness verified (docs × builds, README/CHANGELOG, package policy, manifest, dry-run) - [x] The freeze inventory verified accurate against the landed code - [x] Full verification set green (`cargo test` per build + `--all-features`, clippy ×2 `-D warnings`, fmt, `cargo doc --no-deps`, the fuzz corpus gate) - [x] `taskgraph validate` clean - [x] Verdict recorded; `w5-publish` unblocked or findings booked ## References - docs/plans/implementation.md §Wave 5 (the bullets this gate reads) - docs/architecture/mapping.md §Decline matrix, docs/architecture/client.md (the two-direction contract the publish freezes) - tasks/implementation/w5-*.md (the wave's tasks + their records) - /workspace/@alkdev/alkgit/docs/plans/implementation.md §Wave 5 (the release-gate pattern: pure review, publish as its own task) ## Notes **Verdict: green.** `w5-publish` is unblocked. Every gate read was re-executed live at this commit (2026-10-30, post-`ab5236e`), and nothing was taken solely from the task records. No blocking issues; no code findings; nothing rose to booked-remediation level. Notes below. ### The matrix suite ✓ Every test name the coverage audit pins resolves in its binary (the full inventory grep-verified this session, with all 26 `dispatch_core` rows / all 8 `tunnel_mapping` + `git_mapping` + client-side rows named in the audit table exist), and `mapping.md` §Decline matrix traces cell by cell onto audit rows: the none build declines everything (`every_channel_open_declines_in_a_default_build` + the shared x11/agent/cancel/listen rows); the git build's declines (pty/shell including the gap-closed pty row, then plain exec, tunnel opens, unreachable session requests, subsystems, unknown services) and its one serve (git-parseable exec); the session build's symmetric shape (git-parseable exec declines, wrapper-unset declines, seam-unset pty/shell); the tunnel build's serve/decline split incl. the seam-unset listen forms and the `ConnectFailed` fabric reject; the sftp slot's unchanged-underlying-build row (the subsystem row can't appear where session channels decline at open, so the audit row 8's reasoning holds; the client-side placeholder pins every build); the never-features pinned in every build both directions, with the `auth-agent` open's pin-bound-unreachable record read and accepted (the russh-0.65 pre-handler decline is part of the pin per ADR-002). The runner (`scripts/matrix.sh`, the script vehicle decided + recorded) is in AGENTS.md's verification list. ### Both e2e postures ✓, with nothing silently green `tests/e2e_server.rs` (12 rows) and `tests/e2e_client.rs` (7 rows) both read: every real-tool row is check-gated with `support::skip(row, reason)` prints, covering a tool absent or short, spawn refusal, and (client fixture) never-listening with the server's `-e` log tail, so never a silent pass; every row is deadline-bounded end to end; every decline row additionally pins the door-side decline event (the e2e_server rows). The task records' findings are all e2e-graph-local flake hardening (per-row workdirs, the monotonic port allocator, the fabric settle, the event poll), corroborated by the 10-consecutive-run claims and this session's full-matrix run. The e2e_client fixture/gating decisions (tunnel+session gating for the stays-usable row, every-build rows for the feature-free ops) are recorded in the task and read honest. On this host every row ran (OpenSSH 9.6p1, git 2.43, curl 8.5, sftp present), and the matrix log carries the real-tool rows green, no skip prints fired. ### The fuzz sidecar ✓, with the convention held and logs clean Layout matches the alkgit convention (`fuzz/README.md`: thin `fuzz_target!` wrappers, the stable-clean `shared/` library, the detached runner, the nightly pin inside `fuzz/`, committed seeds + the deterministic generator, grown corpora/artifacts/coverage gitignored). `gen_fuzz_seeds.py` re-run this session was a no-op diff on the committed set. The corpus gate re-ran green (11/11, exit 0). The four final campaign logs read clean: `oom/timeout/ crash: 0/0/0`, `exiting: 0` (exec_parse 43M+ execs / fingerprint 12M+ / key_decode 5M+ / terminal_params 9M+); the two first-campaign crash logs (exec_parse exit 77, key_decode exit 77) are exactly the recorded in-task findings, the harness oracle's double-`/` strip (harness-side, fixed) and the ssh-key PPK header echo (the real finding: `decode_key_arm` now carries a crate-owned fixed message; re-ran clean). The exposure shape matches the record: one no-exposure target (fingerprint, with its fully public ingress) plus three `#[doc(hidden)]` production-surface re-exports; the root crate's package excludes the sidecar (verified in the package list) and the root workspace excludes it (workspace + package excludes in `Cargo.toml`). ### Release readiness ✓ `cargo doc --no-deps` warning-free on the default build (matrix run) **and** `--all-features`, re-run this session with exit 0 and zero warnings. README (feature graph + fail-closed posture + custody summary + the doctest-mirrored examples) and the CHANGELOG 0.1.0 founding entry both read honest and match the landed surface. The publish dry-run re-ran clean (76 files packaged, verification compile passed, upload aborted by dry run); `cargo package --list` re-verified against the package policy: exactly `src/` (20), `tests/` (+common +vectors), `docs/architecture/` (the full contract: the four spec docs + ADRs 001–006 + README + the tracker), `README`, `CHANGELOG`, both licenses, the manifests, and `scripts/matrix.sh`; none of the excluded surface (AGENTS.md, `.opencode/`, plans/research/reviews/sdd_process, tasks/, `fuzz/`) appears. Manifest sanity: version 0.1.0 (the manifest value; `w5-publish` verifies that no bump is needed), edition 2024, `rust-version` 1.89, license + both files, the pins exactly as ADR-002 records them (russh 0.65 `default-features = false` + `aws-lc-rs`; alkcall 0.10; alkvault 0.1; the optional siblings 0.8.1 / 0.1.0 / 0.4.1), the feature graph exactly ADR-003's flat shape, `default = []`. ### The freeze inventory ✓, accurate against the landed code Item by item: (1) the mapping contracts, i.e. the route-1 bridge, exec-only grammar + verdicts, parse-only dispatch + decline-before-alloc, translation bridge + exit rules 1–6, the client planes, as executed in `dispatch.rs`/`tty_map.rs`/`git_map.rs`/ `tunnel_map.rs`/`client_ops.rs` and line-by-line read green at the wave-3/4 gates; (2) the honest-advertisement posture, where `MethodSet` exactly `{PublicKey}` at the adapter's `Config` construction (`adapter.rs:135`), verified by its own unit row; (3) the decline-matrix behavior, the `OpenDeclineReason` vocabulary and decline shapes as pinned by the matrix suite; (4) the fingerprint format, `SHA256:` plus unpadded base64 via `HashAlg::Sha256` (`fingerprint.rs:29`), the single path both the auth bridge and the policy pin consume; (5) the russh pin's wire posture, 0.65.0 plus `aws-lc-rs`, `des`/`dsa` never, per `Cargo.toml`. The inventory as recorded in `w5-release-readiness.md` matches the landed code; the publish freezes exactly those surfaces. ### The plan's closure conditions ✓ The complete two-direction door shipped (server stack + all four mapping rows + the decline placeholder; dial + op rows + the `-R` leg + lifecycle primitives); the assembly stays out (no identity/ACL/fabric policy owned by the crate, seams only); no binary (no `[[bin]]` target; the package ships one lib); single crate (single-member workspace, no tracks); nothing absorbed silently, with the upstream-ask inventory verified still booked with its owners: - wave-3 gate item 5 (two asks): the alktunnels/alkcall non-detaching post-construction identity seam (the door keeps the no-detach posture, and no `set_identity`-style surface appeared in `src/` through the release), and mapping.md's correlation-miss event-vocabulary nuance. - The wave-5 fuzz finding's `ssh-key` PPK parse-echo ask, recorded in `w5-fuzz-harness.md` as booked with the russh/ssh-key owners; the actual tracker filing is owner-territory and stays listed here so it cannot be absorbed at the publish. ### Observations (non-blocking, no action required) - The packaged file list includes `tests/vectors/alpha.key`, the committed ed25519 test-fixture private key. Intentional (wave 1's fixtures, public test material, no custody posture applies) and consistent across the family's sibling crates; noted here so the published package's content is consciously accounted for. - `w5-publish`'s tag + plan-closure steps are the only remaining work; the ssh-key ask filing may ride with it if the owners want it in-flight before the release notes name the fix's provenance. ### Verification (re-run at this commit, all green, 2026-10-30) `scripts/matrix.sh`: `cargo test` × 6 builds (none / git / session / tunnel / sftp-only / --all-features, with 151 / 195 / 210 / 201 / 151 / 281 tests passed, 0 failed; all integration binaries + doctests included) · clippy (--all-targets -D warnings) ✓ · clippy (--all-features --all-targets -D warnings) ✓ · `cargo fmt --check` ✓ · `cargo doc --no-deps` ✓ (plus `--all-features` re-run ✓) · the fuzz corpus gate `cargo test --manifest-path fuzz/shared/Cargo.toml` ✓ (11/11) · `cargo publish --dry-run --allow-dirty` ✓ · `taskgraph validate` ✓ (42 tasks, no orphan tasks after the wave-5 completion statuses). ## Summary **Verdict: green, `w5-publish` unblocked.** The wave-5 release gate re-executed every read live at the gate commit: the coverage audit traced cell by cell onto `mapping.md`'s decline-matrix table with every pinned test resolving in its binary and the `sftp` no-op-feature fact + never-features verified in every build both directions; both e2e binaries read with nothing silently green (the whole suite ran on this host, so no skips fired); the fuzz sidecar held the alkgit convention with the seeds no-op, the corpus gate green, and all four final campaigns clean (the two first-campaign crashes exactly the recorded fixed findings); release readiness verified (docs warning-free × builds, README/CHANGELOG honest, the package list against policy, the dry-run clean, manifest sanity); the freeze inventory confirmed accurate against the landed code, to become one-way at the publish; the plan's closure conditions verified (two-direction door, assembly out, no binary, single crate, upstream asks still booked). One real code fix was already discharged in-task (the `ssh-key` PPK echo → crate-owned decode message). No blocking issues and no findings, and this is the plan's last review; `w5-publish` (tag `alkssh-v0.1.0`, the verification set, the publish, the plan closure) closes it.