diff --git a/tasks/implementation/review-wave-5.md b/tasks/implementation/review-wave-5.md index 3fb03cc..6d5e970 100644 --- a/tasks/implementation/review-wave-5.md +++ b/tasks/implementation/review-wave-5.md @@ -1,7 +1,7 @@ --- id: review-wave-5 name: Wave 5 gate — the release review -status: pending +status: completed depends_on: [w5-decline-matrix, w5-e2e-server, w5-e2e-client, w5-fuzz-harness, w5-release-readiness] scope: narrow risk: low @@ -52,20 +52,20 @@ Verdict: green (`w5-publish` unblocked) or findings booked ## Acceptance Criteria -- [ ] The matrix audit table verified cell by cell against +- [x] The matrix audit table verified cell by cell against `mapping.md`; the runner in the verification list -- [ ] Both e2e postures verified (nothing silently green; findings +- [x] Both e2e postures verified (nothing silently green; findings discharged or booked) -- [ ] The fuzz corpus gate + campaign logs read clean; the sidecar +- [x] The fuzz corpus gate + campaign logs read clean; the sidecar convention held -- [ ] Release readiness verified (docs × builds, README/CHANGELOG, +- [x] Release readiness verified (docs × builds, README/CHANGELOG, package policy, manifest, dry-run) -- [ ] The freeze inventory verified accurate against the landed code -- [ ] Full verification set green (`cargo test` per build + +- [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) -- [ ] `taskgraph validate` clean -- [ ] Verdict recorded; `w5-publish` unblocked or findings booked +- [x] `taskgraph validate` clean +- [x] Verdict recorded; `w5-publish` unblocked or findings booked ## References @@ -79,8 +79,180 @@ Verdict: green (`w5-publish` unblocked) or findings booked ## Notes -> To be filled by the reviewing agent +**Verdict: green.** `w5-publish` is unblocked. Every gate read was +re-executed live at this commit (2026-10-30, post-`ab5236e`) — 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 — 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 — the gap-closed pty row, 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 — 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 ✓ — 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 — tool absent/short, spawn +refusal, and (client fixture) never-listening with the server's `-e` +log tail — 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) — the matrix log +carries the real-tool rows green, no skip prints fired. + +### The fuzz sidecar ✓ — convention held, 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 — fully public ingress) + 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, exit 0, 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, no bump), 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 — 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 — `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:` + 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 + +`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 — 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 — 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 — 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 -> To be filled on completion \ No newline at end of file +**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 — 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 — this is the plan's +last review; `w5-publish` (tag `alkssh-v0.1.0`, the verification +set, the publish, the plan closure) closes it. \ No newline at end of file