review: the fix-round gate closed — every review-002 finding verified, batch 2 opens
The closing checkpoint (tasks/implementation/review-fix-round-002.md): each review-002 finding verified closed against the landed tree, the full verification sweep green, conventions re-swept, and the gate condition (ADR-014 accepted, no major finding) holds. Per-finding verification (all nine checklist points): - C-1: the take-guard verified — a second await_inbound returns the spent shape Ok(None), the re-read structurally impossible (the plane owns the stream); pinned by the double-read + reply1-twice tests. D-1's one-reader decision recorded (option (a), BindReply1 cut). - C-3 closed: the builder's explicit bind_policy is the substrate-free gate; the presence reading is only the backward-compat default; the pump handler's identity-derived gate byte-identical. - D-2 closed: the full builder chain through .register(...) serves all three commands end to end (RegisterMode::ProducerBuilder + the integration test, identity witness asserted). - N-1/N-4 coherent: the cut list gone (zero references), keep-notes current, the Refused vocabulary honest at all five sites + the harness's minimal producer, wire untouched, provenance extended. - D-3 resolved (declare side): the channel:open_failed ErrorDefinition declared, schema pinned drift-free against the typed parse table. - N-8 re-run: 96.30% regions / 97.28% lines; every named line covered; the residual attributed (accept_bi log arm, fork accepted-uncovered, test panic-guards) — no new load-bearing gaps. - N-5/N-6 verified: the shared module compiles into both crates via the crate-root mount + extern-crate-self alias; open_and_negotiate single-sources the teardown-at-birth prologue. - C-2 decided: ADR-014 accepted (option 1 — teardown-governed phases), the spec lines carry the posture. - Cross-cutting sweep green: test 375 green (+ all-features, local, composed), clippy -D warnings clean, fmt clean, doc clean, both wasm checks clean, publish dry-run completes; no unwrap/expect/panic in non-test code (mechanically attributed across src/); no local/ composed code exists (the batch boundary holds). One gate-round finding, F-1 (minor), fixed in this change: the review-numbering collision — "review 002 R-1/R-2/R-4" cited the batch-1 gate review's findings (tasks/implementation/ review-protocol-core.md) under a name that now means the general review; reworded to "the gate review's R-N" at all six sites (producer.rs, consumer.rs, egress.rs, the review doc). Review 002 marked resolved; the next general review doc is 003-*. Verification: cargo test (375 green), --all-features + --features local/composed green, clippy --all-targets -D warnings clean, fmt --check clean, doc clean, both wasm checks clean, publish dry-run completes, llvm-cov 96.30% regions / 97.28% lines attributed.
This commit is contained in:
1 parent
07b8a74241
commit
431920ddef
5 files changed
+222
-20
No files matched your search
@@ -1,6 +1,8 @@
|
||||
---
|
||||
status: open
|
||||
last_updated: 2026-09-24
|
||||
status: resolved
|
||||
last_updated: 2026-09-25 (the fix round verified closed — the
|
||||
review-fix-round-002 gate; every finding closed or
|
||||
re-dispositioned, F-1 fixed in the gate change)
|
||||
reviewed_artifacts:
|
||||
- src/lib.rs
|
||||
- src/wire.rs
|
||||
@@ -152,7 +154,8 @@ what makes this one inconsistent rather than a design choice:
|
||||
|
||||
- `Socks5ChannelSession`: the full conversation is consumed by the
|
||||
constructor; `into_inner` is the only taking method and carries
|
||||
the `SpentSessionError` guard (review 002 R-2's shape).
|
||||
the `SpentSessionError` guard (the gate review's R-2 shape —
|
||||
`tasks/implementation/review-protocol-core.md`).
|
||||
- `AssociateSession`: `send_datagram`/`recv_datagram` are a proper
|
||||
state machine (reader state, spent-stream `Io`/`None` shapes);
|
||||
no re-entry ambiguity.
|
||||
@@ -393,7 +396,7 @@ setters — only `.dial` rides `builder_shape_round_trips`), harness:
|
||||
**Problem**: `producer.md` §Wiring presents
|
||||
`producer.register(&core, ®istry, auth, None)?` as *the* assembly
|
||||
shape — the spec'd entry point — and the landed doc (producer.md
|
||||
`Wiring`, reconciled by review 002 R-4) names exactly this
|
||||
`Wiring`, reconciled by the gate review's R-4) names exactly this
|
||||
signature. No test exercises it: the harness re-implements the
|
||||
registration via `register_socks5_openable` directly (same
|
||||
delegation, different call path), and the builder test drives only
|
||||
@@ -731,7 +734,7 @@ without this note.
|
||||
# Part B — Non-findings (verified correct, recorded to bound the re-review)
|
||||
|
||||
- **The seam contracts hold under adversarial reading.** Re-derived
|
||||
independently of review 002: the readiness contract's R-1
|
||||
independently: the readiness contract's R-1
|
||||
yield-guard is correct and necessary (the zero-yield unit test
|
||||
reproduces the hazard without it); ownership-rides-the-handle has
|
||||
no `_` bindings anywhere in non-test code (swept); the accept
|
||||
@@ -858,6 +861,13 @@ N-7 is recorded-only (no action — the review's own
|
||||
recommendation); its bound-re-litigation note lives in the review
|
||||
itself.
|
||||
|
||||
**Resolved 2026-09-25** (`tasks/implementation/
|
||||
review-fix-round-002.md` — the closing gate): every finding closed
|
||||
or re-dispositioned; the one gate-round finding (F-1, the
|
||||
review-numbering collision on the R-citations — the R-findings
|
||||
belong to the batch-1 gate review) fixed in the gate change. The
|
||||
batch-2 gate is open (ADR-014 accepted; no major finding remains).
|
||||
|
||||
## References
|
||||
|
||||
- `docs/reviews/001-rfc1928-full-review.md` (the fork review — the
|
||||
|
||||
+2
-1
@@ -107,7 +107,8 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// The spent-session marker (review 002 R-2): [`Socks5ChannelSession
|
||||
/// The spent-session marker (the gate review's R-2,
|
||||
/// tasks/implementation/review-protocol-core.md): [`Socks5ChannelSession
|
||||
/// ::into_inner`] / [`AssociateSession::into_inner`] return it when
|
||||
/// the pipe/stream was already taken — reachable only by calling
|
||||
/// twice on a session whose inner is gone. Carries nothing: a spent
|
||||
|
||||
+4
-3
@@ -41,9 +41,10 @@
|
||||
//!
|
||||
//! The readiness-contract behavioral tests (an instant-`Ok(None)`
|
||||
//! egress must not starve the datagram stage — including the
|
||||
//! zero-yield shape, review 002 R-1) live in the producer module's
|
||||
//! test suite, next to the stage they pin. This module carries the
|
||||
//! error→reply-code mapping tables, the sync-lift factory
|
||||
//! zero-yield shape, the gate review's R-1,
|
||||
//! tasks/implementation/review-protocol-core.md) live in the producer
|
||||
//! module's test suite, next to the stage they pin. This module
|
||||
//! carries the error→reply-code mapping tables, the sync-lift factory
|
||||
//! constructor, and the compile-shape assertions.
|
||||
|
||||
use std::future::Future;
|
||||
|
||||
+4
-2
@@ -383,7 +383,8 @@ where
|
||||
// and the runtime's other tasks on a current-thread
|
||||
// scheduler (an instantly-ready branch that yields
|
||||
// nothing wins every poll — the readiness contract's POC
|
||||
// #2 finding, hardened by review 002 R-1).
|
||||
// #2 finding, hardened by the gate review's R-1
|
||||
// (tasks/implementation/review-protocol-core.md)).
|
||||
reply = egress.next_reply() => {
|
||||
match reply {
|
||||
Ok(Some(frame)) => {
|
||||
@@ -1242,7 +1243,8 @@ mod tests {
|
||||
.expect("clean");
|
||||
}
|
||||
|
||||
/// The readiness contract's zero-yield bound (review 002 R-1): an
|
||||
/// The readiness contract's zero-yield bound (the gate review's
|
||||
/// R-1, tasks/implementation/review-protocol-core.md): an
|
||||
/// egress whose `next_reply` is a pure `async { Ok(None) }` —
|
||||
/// instantly ready AND yielding no poll boundary — must still not
|
||||
/// starve the stage's channel branch. The stage's `Ok(None)`
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
id: review-fix-round-002
|
||||
name: "Review — the review-002 fix round before batch 2"
|
||||
status: pending
|
||||
status: completed
|
||||
depends_on: [implementation/fix-bind-reply2-reentry, implementation/fix-producer-gate-policy, implementation/fix-rfc1928-posture, implementation/fix-hygiene-residue, implementation/fix-coverage-residue, implementation/fix-test-helper-consolidation, architecture/adr-014-idle-timeout-posture]
|
||||
scope: narrow
|
||||
risk: low
|
||||
@@ -65,17 +65,17 @@ when C-2's ADR is accepted and no major finding remains.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] Each review-002 finding verified closed (or explicitly
|
||||
- [x] Each review-002 finding verified closed (or explicitly
|
||||
re-dispositioned with a reason) — the per-finding checklist
|
||||
above
|
||||
- [ ] `cargo llvm-cov` re-run and attributed (no new load-bearing
|
||||
- [x] `cargo llvm-cov` re-run and attributed (no new load-bearing
|
||||
gaps)
|
||||
- [ ] The full verification sweep green, including
|
||||
- [x] The full verification sweep green, including
|
||||
`cargo publish --dry-run --allow-dirty`
|
||||
- [ ] Convention compliance re-swept (no unwrap/expect/panics
|
||||
- [x] Convention compliance re-swept (no unwrap/expect/panics
|
||||
outside tests; comment posture; wasm-clean)
|
||||
- [ ] ADR-014 accepted — the batch-2 gate condition holds
|
||||
- [ ] Findings recorded; the gate to batch 2 opens
|
||||
- [x] ADR-014 accepted — the batch-2 gate condition holds
|
||||
- [x] Findings recorded; the gate to batch 2 opens
|
||||
|
||||
## References
|
||||
|
||||
@@ -89,8 +89,196 @@ when C-2's ADR is accepted and no major finding remains.
|
||||
|
||||
## Notes
|
||||
|
||||
> Agent fills this during implementation.
|
||||
> Filled by the review agent (2026-09-25).
|
||||
|
||||
### The per-finding verification (the task's numbered order)
|
||||
|
||||
1. **C-1 closed correctly.** The take-shape landed as the review's
|
||||
first sketch: `BindSession::await_inbound` takes the inner stream
|
||||
before reading reply#2 (`inner.take()` — consumer.rs:792-803); a
|
||||
second call hits the `None` arm → the spent shape `Ok(None)`
|
||||
(consumer.rs:793-795). The returned `BindDataPlane` **owns** the
|
||||
stream (the `TakenInner` pairing posture; the session stays the
|
||||
teardown owner) — the re-read is structurally impossible, not
|
||||
just guarded. A failed read restores the inner (the phase is
|
||||
consumed on success only — the post-failure re-call re-reads
|
||||
against the already-ended session, EOFs, never a live data-plane
|
||||
re-read). Pinned by
|
||||
`double_await_inbound_returns_the_spent_shape_and_bytes_survive`
|
||||
(tests/consumer-bind.rs:497 — the second call `Ok(None)` + the
|
||||
first plane's echo intact + a fresh session round-trips) and
|
||||
`reply1_twice_is_a_view_and_the_reader_yields_one_plane`
|
||||
(tests/consumer-bind.rs:583). **D-1's reader decision is
|
||||
recorded**: option (a) — the session's `await_inbound` is the one
|
||||
normative reply#2 reader; `BindReply1::await_inbound` is cut,
|
||||
`reply1()` is a documented view (`bind_addr` + `raw_mut`) —
|
||||
recorded in the fix task's Notes and the module docs
|
||||
(consumer.rs:574-579, 762-765).
|
||||
2. **C-3 closed.** The substrate-free entry's BIND gate is the
|
||||
builder's explicit `bind_policy` (`.bind_policy(bool)` —
|
||||
producer.rs:736-739, resolved once at `build()`,
|
||||
`self.bind_policy.unwrap_or(self.accept.is_some())` —
|
||||
producer.rs:741-748); "factory wired" no longer implies "BIND
|
||||
permitted" (the presence reading is only the backward-compat
|
||||
default). Pinned by
|
||||
`builder_bind_policy_false_refuses_bind_while_connect_associate_
|
||||
serve` (explicit-closed ⇒ 0x02, factory un-called, CONNECT +
|
||||
ASSOCIATE still serve) and
|
||||
`builder_default_bind_policy_follows_accept_presence` (the
|
||||
default both ways). The pump handler's identity-derived gate is
|
||||
byte-identical (producer.rs:181-185) — the identity matrix
|
||||
(`pump_handler_resolves_the_bind_gate_from_the_opener_identity`)
|
||||
stayed green untouched.
|
||||
3. **D-2 closed.** The spec'd assembly shape is exercised end to
|
||||
end: the harness's `RegisterMode::ProducerBuilder` arm
|
||||
(tests/harness.rs:581-610) wires the full
|
||||
`.dial().egress().accept()` chain through
|
||||
`Socks5Producer::register(...)`, and
|
||||
`producer_builder_registers_and_serves_all_three_commands`
|
||||
(tests/core-integration.rs:996) serves CONNECT + ASSOCIATE + BIND
|
||||
over the topology with the identity witness asserted (the
|
||||
builder-delegated establisher ran).
|
||||
4. **N-1/N-4 landed coherently.** The cut list is gone
|
||||
(`auth_method_enums!`, `StandardAuthentication` + `allow_no_auth`,
|
||||
`skip_auth_this_is_not_rfc_compliant`, `CheckResult`'s
|
||||
`Option`/`Result` impls — swept: zero references anywhere); the
|
||||
keep list carries current notes (`ConnectError`'s
|
||||
stream.rs note records the fired trigger + the keep disposition;
|
||||
`transfer`/`wait_on_tcp` differential-suite-consumed; `Bug`
|
||||
upstream-verbatim). The refusal vocabulary is honest at all five
|
||||
sites — `SocksServerError::Refused(&'static str)` ("Refused: {0}")
|
||||
at the command gate + the four seam refusals (producer.rs
|
||||
237/269/309/502/560) plus the harness's minimal producer
|
||||
(tests/harness.rs:294); `Bug`'s upstream-verbatim display intact.
|
||||
The wire bytes are untouched (every reply-code assertion stayed
|
||||
green unchanged). Provenance extended-not-replaced: the
|
||||
`server.rs` module doc's owned-changes paragraph,
|
||||
`rfc1928.md`'s "owned-code post-fork changes" list + the
|
||||
`last_updated` line; `src/rfc1928/LICENSE`'s generic
|
||||
post-fork clause needed no change.
|
||||
5. **D-3 resolved (the declare side).** `socks5_open_spec` declares
|
||||
the `channel:open_failed` `ErrorDefinition` (params.rs:139-151 —
|
||||
the alktty-ported `{reason, message}` schema, the reason enum
|
||||
exactly `SocksEstablishmentReason`'s parse table), doc-vs-code
|
||||
drift gone. Pinned by
|
||||
`open_spec_declares_the_open_failed_error_definition`
|
||||
(params.rs:256-292), which cross-checks every declared enum value
|
||||
through the typed parse table — the schema and the typed
|
||||
vocabulary cannot drift.
|
||||
6. **N-8 coverage re-run and attributed.** `cargo llvm-cov` on the
|
||||
final tree: **96.30% regions / 96.43% functions / 97.28% lines**
|
||||
(5142 covered / 140 missed). Every N-8-named line is covered
|
||||
(verified against `--show-missing-lines`: the stage's failure
|
||||
exits, both `split`s, the spent arms, the mid-batch `Err` arm,
|
||||
`into_inner`'s `Ok`, the plane passthroughs, `read_reply2`'s
|
||||
version pin, the quiet-wait `Err(_)` arm, the Domain-peer
|
||||
fallback, the `Debug`/`Display` renders). The residual uncovered
|
||||
lines are exactly the task's recorded set: producer.rs 188-189
|
||||
(the `accept_bi` substrate-failure log arm — untestable outside
|
||||
alkcall's test surface), `rfc1928/client.rs` 217-219 +
|
||||
internals (the review-001/002 accepted-uncovered posture),
|
||||
`rfc1928/mod.rs` 136-141 / `target_addr.rs` 132/151/180 (the
|
||||
fork's pre-existing residue), plus test-module panic-guard
|
||||
branches (coverage-of-tests noise) and consumer.rs 937 (the
|
||||
spent-shape diagnostic closure — evaluates only on `Err`, the
|
||||
spent shape is `Ok(None)` by design; cosmetic, not chased).
|
||||
No new load-bearing gaps introduced.
|
||||
7. **N-5/N-6 consolidation verified.** The shared module
|
||||
(tests/common/mod.rs, 314 lines) compiles into both crates via
|
||||
the crate-root `#[cfg(test)] #[path]` mount + the
|
||||
`extern crate self` alias (lib.rs:73-82) and harness's
|
||||
name-preserving re-exports — the lib tests and the integration
|
||||
suite build against the same copy; no `tests/harness.rs` import
|
||||
from `src/`. The deliberately-distinct shapes stayed test-local
|
||||
(`HotNoneEgress`/`PureHotNoneEgress`/the drop-witness egresses);
|
||||
the constructor prologue is single-sourced
|
||||
(`open_and_negotiate`, consumer.rs:85-108 — the
|
||||
teardown-at-birth invariant in one place; N-6).
|
||||
8. **C-2 decided.** ADR-014 exists
|
||||
(docs/architecture/decisions/014-idle-timeout-posture.md, status
|
||||
Accepted, 2026-09-24), deciding **option 1** explicitly (the
|
||||
protocol layer never times out; every phase teardown-governed),
|
||||
with the ADR-007 same-regime relationship stated, the doors'
|
||||
accept-path obligations recorded pre-batch-2, and the
|
||||
revisit-trigger written. The spec lines carry the posture
|
||||
(wire.md §UDP ASSOCIATE's association-lifetime bullet + the
|
||||
no-in-band-vocabulary bullet; producer.md §The Open Handler +
|
||||
the local-backend section + the decision table).
|
||||
9. **Cross-cutting sweep green** (below); the batch boundary holds
|
||||
(no `local`/`composed` code exists — the features are declared
|
||||
empty in Cargo.toml per ADR-009, no `cfg(feature)` in `src/`).
|
||||
|
||||
### Findings (this review round)
|
||||
|
||||
No correctness, security, or coverage findings. One minor doc
|
||||
residue, **fixed in this review change** (the `F-1` treatment):
|
||||
|
||||
- **F-1 [minor] — review-numbering collision**: three code
|
||||
comments/docs and two sites in the review doc cited
|
||||
"review 002 R-1/R-2/R-4", but those R-findings belong to the
|
||||
batch-1 gate review (`tasks/implementation/review-protocol-core.md`
|
||||
— the unnumbered inline review); "review 002" now unambiguously
|
||||
means the C/S/D/N general review this task gates. An operator (or
|
||||
a later sweep) following "review 002 R-1" would land in the wrong
|
||||
document. Fixed at all six sites (producer.rs ×2, consumer.rs,
|
||||
egress.rs, the review doc ×2) — reworded to "the gate review's
|
||||
R-N (tasks/implementation/review-protocol-core.md)". Zero code
|
||||
impact; the review doc's remaining in-body `R-1`/`R-2` mentions
|
||||
ride the references section, which already names the task file.
|
||||
Also removed an empty stray `src/producer/` directory (a
|
||||
leftover, tracked by nothing).
|
||||
|
||||
### Verification (the full sweep, this tree)
|
||||
|
||||
- `cargo test`: **375 green** (145 lib + 38 associate + 41 bind +
|
||||
40 connect + 41 integration + 30 harness + 37 differential +
|
||||
3 doctests, 2 ignored).
|
||||
- `cargo test --all-features`: green (same counts); also green
|
||||
with `--features local` and `--features composed` (both empty).
|
||||
- `cargo clippy --all-targets -- -D warnings`: clean.
|
||||
- `cargo fmt --check`: clean.
|
||||
- `cargo doc --no-deps`: clean.
|
||||
- `cargo check` + `clippy -D warnings` (wasm32): clean.
|
||||
- `cargo publish --dry-run --allow-dirty`: completes.
|
||||
- `cargo llvm-cov`: 96.30% regions / 96.43% functions / 97.28%
|
||||
lines (5142 covered / 140 missed) — the per-module table:
|
||||
consumer 98.60% lines, egress 99.67%, error 100%, params 100%,
|
||||
producer 95.70%, wire 96.58%, rfc1928 96.53–99.39% (the
|
||||
accepted-uncovered fork blocks ride client.rs's 96.53%).
|
||||
- **Convention compliance re-swept**: every `unwrap`/`expect`/
|
||||
`panic!`/`todo!`/`unimplemented!` hit across all of `src/`
|
||||
(eleven files) mechanically attributed — all inside `#[cfg(test)]`
|
||||
regions; no panics in non-test code; comment posture held (doc
|
||||
comments + pinned correctness notes only); no `cfg(feature)`
|
||||
outside Cargo.toml declarations.
|
||||
|
||||
### The gate to batch 2
|
||||
|
||||
**Open.** ADR-014 is accepted (the C-2 gate condition holds); no
|
||||
major finding remains (zero findings beyond F-1, minor + fixed);
|
||||
the full sweep is green; the fix-round's shapes (the take-guard, the
|
||||
`bind_policy` gate, the `Refused` vocabulary, the declared
|
||||
`ErrorDefinition`) are the shapes batch 2's door tasks consume.
|
||||
The next general review doc is `003-*` (this checkpoint was an
|
||||
inline review in `tasks/` — it consumed none of the
|
||||
`docs/reviews/` numbering).
|
||||
|
||||
## Summary
|
||||
|
||||
> Agent fills this on completion.
|
||||
The review-002 fix round is verified closed, finding by finding
|
||||
(the task's nine-point checklist above): C-1's take-guard with the
|
||||
spent shape pinned and the data-plane bytes asserted; C-3's explicit
|
||||
`bind_policy` gate; D-2's full builder-through-`register` pin
|
||||
serving all three commands; N-1's cut list gone with the keep-notes
|
||||
current; N-4's `Refused` vocabulary at all five refusal sites (wire
|
||||
untouched); D-3's `ErrorDefinition` declared and drift-free-pinned;
|
||||
N-8's coverage re-run green (96.30%/97.28%, every named line
|
||||
covered, the residual attributed to the recorded accepted-
|
||||
uncovered set); N-5/N-6 consolidated on the shared module +
|
||||
`open_and_negotiate`; C-2 decided by accepted ADR-014 with the spec
|
||||
lines carrying the posture. One minor finding (F-1, the review-
|
||||
numbering collision on the R-citations) fixed in this change. The
|
||||
full verification sweep is green (test 375, all-features, clippy,
|
||||
fmt, doc, both wasm checks, publish dry-run, llvm-cov), conventions
|
||||
re-swept clean, the batch boundary holds, and the gate to batch 2
|
||||
opens.
|
||||
Reference in new issue
Block a user