- 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
8.2 KiB
id, name, status, depends_on, scope, risk, impact, level
| id | name | status | depends_on | scope | risk | impact | level | ||
|---|---|---|---|---|---|---|---|---|---|
| implementation/core-integration-suite | Core: cross-cutting integration suite + docs sync | completed |
|
moderate | medium | phase | implementation |
Description
The batch-1 closing task: the cross-cutting integration suite that pins the whole protocol core's behavior in one place, plus the docs sync that records what landed. The per-command tasks own their verticals; this task owns the cross-cutting invariants and the spec-vs-implementation reconciliation.
Deliverables:
- Cross-cutting integration tests (
tests/):- One registration, all three commands (the POC #2/#5
regression guard, now complete): CONNECT + ASSOCIATE + BIND all
served on the same
channels/socks5/subop, interleaved sessions on one connection. - Concurrency: multiple concurrent sessions of mixed command types over one channels connection (the mux/demux under load; the POCs tested sequentially; this pins concurrency).
- Teardown semantics matrix: client half-close ends a CONNECT data plane cleanly (the producer's pump exits, the connection stays healthy); ASSOCIATE EOF ends the association; BIND client-gone teardown releases the accept; a fresh session succeeds immediately after each teardown (no connection poisoning).
- Identity/scope matrix:
socks5:open-only (CONNECT + ASSOCIATE yes, BIND 0x02),socks5:bind-only (BIND yes, CONNECT/ASSOCIATE FORBIDDEN at the open gate), both-scopes (everything); the two-grants-never-implied posture (ADR-006) pinned end to end. - The readiness contract re-pinned at the integration level (the producer-associate task owns the unit-level test; this pins it under concurrent load).
- One registration, all three commands (the POC #2/#5
regression guard, now complete): CONNECT + ASSOCIATE + BIND all
served on the same
- Docs sync (the architecture-sync check):
docs/architecture/README.mdCurrent State + the doc statuses reflect the landed core (the rfc1928 doc's "remaining layers follow the decomposition phase" line updated).- Any spec drift the implementation surfaced (naming, shapes, the wire.md/bast.md residue already fixed in the wire-codec task) reconciled in the same change, never silently diverged.
lib.rscrate docs updated to describe the landed surface (producer + consumer + wire + seams), pointing at the specs.
- Full verification sweep (the batch gate's input):
cargo test,cargo test --all-features(features are still empty, so verify the flag combination compiles), clippy--all-targets -- -D warnings,cargo fmt --check, both wasm checks, andcargo doc --no-deps(docs changed).
Notes
- The identity-matrix spec drift, reconciled (the one real drift
the implementation surfaced): this task's Description row 2
expected a
socks5:bind-only identity to serve BIND ("BIND yes, CONNECT/ASSOCIATE FORBIDDEN at the open gate"). The landed ADR-006- implementation pin the open op's
required_scopes = ["socks5:open"]unconditionally (the single op, all three commands; ADR-001); a bind-only identity fails closed at the open gate for every command (FORBIDDEN, the establisher never runs, no phantom channel), and a BIND-capable deployment grants both scopes explicitly. The suite pins the landed posture (identity_matrix_bind_only_fails_closed_at_the_open_gate), producer- and consumer-side; ADR-006 §Consequences now states the asymmetry explicitly (never implied, in either direction). The task's phrasing was a Phase-0-era guess at the gate shape, not a spec row the code contradicted: the spec (ADR-006 + producer.md) and the implementation already agreed.
- implementation pin the open op's
- Test-shape notes: the suite rides the established
tests/harness.rstopologies (the raw producer-side topology, where the producer's serving side allocates channel ids; and the consumer-side topology, where the consumer allocates; the mux/demux is pinned in both allocation directions). The mixed-command concurrency tests box the per-command round-trip futures into oneVec<RoundTrip>(Pin<Box<dyn Future>>; the three async fns have distinct opaque types, so a shared boxed type is thejoin_allvehicle). The BIND client-gone row uses a parked accept factory so the quiet-wait exit is the only possible end (the deterministic client-gone probe). - Readiness contract under load: the integration-level pin
reuses the producer-associate unit test's hot-
Ok(None)egress shape across concurrent associations (with a CONNECT interleaved), so the stage's re-park tolerance must hold concurrently, not just sequentially.
Summary
Landed the batch-1 closing task: tests/core-integration.rs, nine
cross-cutting integration tests pinning the whole protocol core end
to end over the channels harness (the alkcall 0.8.0 establishment
surface, both topology directions):
- One registration, all three commands (the POC #2/#5
regression guard, complete): CONNECT + ASSOCIATE + BIND opened
back to back on the one
channels/socks5/subop, all three live simultaneously, each exercised mid-life of the others; a teardown ends only its own session (mux/demux isolation). - Concurrency: nine concurrent mixed-command sessions over one channels connection (the raw topology), six through the typed consumer sessions (the consumer-side topology, the other allocation direction), then a fresh round-trip of each command after the burst; no channel entry leaks on either side.
- The teardown matrix (wire.md §Sentinels and lifecycle): a client half-close ends a CONNECT data plane cleanly (the producer's pump exits); channel EOF ends the association; the BIND client-gone teardown releases the parked accept; fresh sessions of every command succeed immediately after each teardown (no connection poisoning).
- The identity/scope matrix (ADR-006 end to end): open-only → CONNECT + ASSOCIATE serve, BIND refused 0x02 at the command gate (CONNECT still serves after); bind-only → fail-closed at the open gate for all commands (the reconciled posture, above); both-scopes → everything, granted explicitly; the CF-006 identity witness asserted per row.
- The readiness contract re-pinned under concurrent load: a
hot-
Ok(None)egress across concurrent associations (with a CONNECT interleaved) does not starve the datagram stage's channel branch.
Docs sync (the architecture-sync check): docs/architecture/README.md
Current State rewritten: "the protocol core is implemented," the
landed per-module inventory, tests/core-integration.rs named as the
batch-1 pin, batch 2 (local/composed) as the follow; the
"remaining layers follow the decomposition phase" residue gone.
consumer.md §Wiring reconciled to the landed signatures
(&ChannelClient constructors, impl ToTargetAddr datagrams, the
Option-shaped recv_datagram (None is the channel-EOF
association end, never an empty datagram). ADR-006 §Consequences now
states the grant asymmetry explicitly. src/lib.rs crate docs
rewritten to describe the landed surface (rfc1928 fork, wire codec,
params, seams, producer, consumer) pointing at the specs and the
integration suite.
Verification: cargo test 302 green (118 lib + 38 connect + 39
associate + 40 bind + 40 integration + 30 differential + 37
rfc1928 + 3 doctests), cargo test --all-features green (the empty
features local/composed compile), cargo clippy --all-targets -- -D warnings clean, cargo fmt --check clean, both wasm checks
(check + clippy -D warnings on wasm32-unknown-unknown) clean,
cargo doc --no-deps clean. The batch boundary holds: no
local/composed code exists; the default crate is protocol-only.
References
- docs/architecture/wire.md §Sentinels and lifecycle (the teardown matrix's normative source)
- docs/architecture/decisions/006-access-control.md (the identity matrix)
- POC regression guards:
udp_composed_egress_round_trip-adjacent tests in/workspace/alksocks-udp-poc, test 7 in/workspace/alksocks-bind-poc - docs/sdd_process.md (the architecture-sync-check posture)
Notes
Filled by the implementation agent: see the Notes above.
Summary
Filled on completion: see the Summary above.