- Rewrote em dash prose across the whole tree outside docs/reviews/
(the historical reviews stay verbatim, matching the alktunnels and
alktty precedent): src doc comments and inline comments (587),
docs/architecture (319), docs/research + sdd_process (484), tests
(361), tasks (899), fuzz (28), README/CHANGELOG/Cargo.toml (77),
AGENTS.md (85), and the .opencode/agents prompts (109)
- Fenced content follows the precedent: comments, ASCII-diagram label
separators, and template placeholders rewritten; wire data, JSON/BAST
documents, byte diagrams, and transcripts survive verbatim; assert,
expect, panic, error-display, and format message literals rewritten
as prose; no code, fixture, or test data change
- src/rfc1928/LICENSE: the two dashes in alksocks' own provenance
header rewritten; the MIT legal text untouched
- AGENTS.md adds Project Convention 18: no em dashes in prose; varied
restructure, no spaced-hyphen substitutes, fenced prose rule, en
dash numeric ranges exempt, docs/reviews/ exempt from the greps
- tasks/*.md frontmatter: the name values rewritten by the sweep are
now quoted (a raw colon inside an unquoted YAML scalar parsed as
null); taskgraph validate reports 37 tasks, no issues
Verification: cargo test; cargo clippy --all-targets -D warnings;
cargo fmt --check; cargo doc --no-deps; fuzz corpus replay
(cargo test --manifest-path fuzz/shared/Cargo.toml); wasm check and
clippy for wasm32-unknown-unknown with -D warnings; em dash grep over
the repo returns matches only in docs/reviews/ and the bast.md BAST
JSON data fence
The UDP ASSOCIATE consumer session (POC #2's shape, consumer.md §The
associate session, ADR-003):
- `AssociateSession::associate` — open → no-auth → ASSOCIATE → reply;
the sentinel BND.ADDR is received (`relay_addr()`, RFC fidelity)
and never used for addressing (the handle is the channel). The
ASSOCIATE DST.ADDR is the vanilla-mirror unspecified address.
- `send_datagram` — frames exactly once via the crate's wire
`frame()` (the framing-once mirror; the u16 joint bound enforced
at frame time). Takes `impl ToTargetAddr` (ADR-012 posture); a
`ToTargetAddr for &TargetAddr` impl was added to the forked codec
so a `TargetAddr` value survives across sends.
- `recv_datagram` — the incremental `DatagramReader` + batched-
datagram pending queue, state persisting across calls (the POC's
reader-state finding); `Ok(None)` on channel EOF; fail-loud on a
stream end mid-frame and on undecodable frames (`WireError` → the
forked `AddrError`/`UdpHeaderError` RFC classes — the consumer
mirror of the producer stage's `UndecodableFrame` exit).
- `shutdown` — the half-close; the mux's implicit-EOF sentinel
reaches the producer's stage as EOF (association lifetime =
channel lifetime). `close()`/`Drop` own the teardown (sync reap +
structural EOF, the CONNECT/BIND posture); teardown-at-birth on
in-stream refusals; no `Clone` (compile-fail asserted).
- Typed error surface: open failures are `SocksSessionError::Open`
(ADR-049); the missing-egress 0x07 and factory-failure codes
surface from `associate` as `Rfc`.
E2E suite (`tests/consumer-associate.rs`, 8 tests over the harness):
round-trips (multiple in-order datagrams, one association, sentinel
relay address asserted), the split-datagram persistence test (a 60
KiB datagram reassembling across the call boundary + the pending-
queue drain — both halves of the persistence invariant), the empty-
payload round-trip (F-2, never EOF), shutdown → a fresh associate
succeeds immediately (the POC's test 4), Drop teardown + connection
health, the missing-egress refusal (typed 0x07, no phantom channel),
the egress-factory failure mapping, and the CONNECT+ASSOCIATE
regression guard (interleaved on one registration). Unit tests (4)
pin the reader internals over a duplex (`skip_auth`'s
handshake-free path).
Verification: cargo test 305 (7 suites, all green), clippy
--all-targets -D warnings, fmt, cargo doc --no-deps, and both
wasm32-unknown-unknown checks clean.
Batch 1 of the Phase 1 decomposition: the default, wasm-clean crate
(producer + consumer + wire + seams + params/errors), per the
architecture spec set (ADRs 001-013) and the three POCs' validated
shapes. The assembly layer (local/composed providers, front doors) is
batch 2, decomposed after review-protocol-core opens.
- foundation: crate-deps (alkcall 0.8.0 first consumption), wire-codec
(the ASSOCIATE frame + the joint bound), seam-types (the three
ADR-004 seams), params-errors (the one-way-door surface)
- harness: duplex transport + identities + in-process seams (the
alkcall 0.8.0 establishment surface proven before the producer)
- verticals: producer/consumer splits per command (CONNECT,
ASSOCIATE, BIND) — each POC's scope, producer tasks test via the
raw RFC client, consumer tasks e2e through the harness
- closing: integration suite (three-command regression, teardown
matrix, identity matrix, docs sync) + review-protocol-core (the
batch gate)
taskgraph: 8 generations, no cycles, risk path 2.55 (no high-risk
tasks). Also records the wire.md/bast.md len=0 residue (payload-level
F-2 is the operative invariant) as a doc-sync deliverable of the
wire-codec task.
Verification: cargo test (76 passed), fmt clean; taskgraph
validate/cycles/parallel/critical clean.