Renames the written-usage rule into practice across the contract surface: docs/ (architecture, research, plans, sdd), tasks/ (all 43 task files, taskgraph validate passes), AGENTS.md, README.md, CHANGELOG.md, and the .opencode/agents/ prompts. Every replacement is a sense-preserving rewrite (colons, semicolons, commas, parentheses, sentence splits, varied), never a mechanical swap; no spaced hyphens were substituted. Enum fields, frontmatter, tables, wire data, and cited identifiers survive verbatim; en dashes inside numeric ranges keep their meaning. Verification: taskgraph validate (43 tasks), repo grep clean (single exempt hit: the verification command's own search pattern in AGENTS.md), cargo test, clippy --all-targets -D warnings, fmt --check, doc all green.
13 KiB
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 |
|
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, 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-
sshdclient-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-publishexecutes 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
- 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 testper build +--all-features, clippy ×2-D warnings, fmt,cargo doc --no-deps, the fuzz corpus gate) taskgraph validateclean- Verdict recorded;
w5-publishunblocked 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 insrc/through the release), and mapping.md's correlation-miss event-vocabulary nuance. - The wave-5 fuzz finding's
ssh-keyPPK parse-echo ask, recorded inw5-fuzz-harness.mdas 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.