Files
alkssh/tasks/implementation/review-wave-5.md
T

13 KiB
Raw Permalink Blame History

id, name, status, depends_on, scope, risk, impact, level
id name status depends_on scope risk impact level
review-wave-5 Wave 5 gate — the release review completed
w5-decline-matrix
w5-e2e-server
w5-e2e-client
w5-fuzz-harness
w5-release-readiness
narrow low phase 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 — 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 — the coverage-audit table read 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 — both directions' real-tool rows read: 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 — the sidecar's layout read 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 × 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 — 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 — 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 — nothing absorbed silently through the release.

Verdict: green (w5-publish unblocked) or findings booked (remediation; the publish waits).

Acceptance Criteria

  • 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 discharged or booked)
  • The fuzz corpus gate + campaign logs read clean; the sidecar convention held
  • 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 + --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

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) — 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

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.