docs: OQ-SK-04 restructured as the conditional decision tree it is

The root question is 'does wasm make sense for alksocks?', not 'how
do we get wasm': Case 1 (wasm wanted) -> fork-first, PR as courtesy,
carry regardless; Case 2 (wasm unwanted) -> plain dependency on the
router.rs native path, no fork (the alkhttp precedent, strictly
better when its premise holds). Decision inputs written: (a) is
there a planned sandboxed (wasm) consumer of the SOCKS5 service,
(b) is the fork genuinely minimal (POC #4 checks). Fork-first is a
conditional preference, not a general one — do not carry a fork for
an invariant's sake. AGENTS.md conventions 4/17 aligned.
This commit is contained in:
2026-09-12 11:00:56 +00:00
parent 766e489f99
commit a628715106
2 changed files with 86 additions and 74 deletions
+15 -12
View File
@@ -90,11 +90,13 @@ implementation agents.
(`rt`, `sync`, `io-util`, `macros`, `time`) — **do NOT use `features
= ["full"]`** — and keep socket/platform I/O feature-gated. Note:
`fast-socks5` itself uses `tokio::net` and `socket2` unconditionally;
the resolved posture (OQ-SK-04) is fork-first: vendor the needed
subset and feature-gate native-net pieces (the alkhttp crate shows a
native-only crate is possible, but wasm-clean remains the preferred
posture here). Run the wasm check whenever a non-backend module
changes.
the posture is conditional (OQ-SK-04): if wasm matters for this
crate, the path is fork-first (vendor the `T`-generic subset, gate
native-net pieces — see OQ-SK-04 Case 1); if wasm does not matter,
ride the native `router.rs` path with a plain dependency (Case 2 —
the alkhttp precedent). The root question — does wasm make sense
here — is the OQ to settle; do not carry a fork for an invariant's
sake. Run the wasm check whenever a non-backend module changes.
5. **Wire format is stable** — the SOCKS5 protocol itself is RFC 1928
(fixed); this crate's wire surface is the ALPN + the channel open-op
@@ -227,13 +229,14 @@ implementation agents.
One ALPN per protocol. The ALPN string is wire-stable once
published — decide via ADR before the first consumer.
17. **Upstream is ours — fork-first, PR as courtesy.** We own
`fast-socks5` (`/workspace/fast-socks5`, v1.0.0, MIT) and alkcall.
For changes this crate needs upstream, the preferred posture is:
make the change as a minimal fork and use it — offer it upstream
as a PR and merge upstream if they want it, but never wait on
approval (see `docs/research/phase-0.md` OQ-SK-04's resolved
posture). For alkcall (the actively co-developed substrate) the
17. **Upstream is ours — fork-first where it pays, asks for alkcall.**
We own `fast-socks5` (`/workspace/fast-socks5`, v1.0.0, MIT) and
alkcall. For fast-socks5, the posture is conditional (OQ-SK-04):
if wasm matters for this crate (Case 1), make the change as a
minimal fork and use it — offer it upstream as a PR and merge
upstream if they want it, but never wait on approval; if wasm does
not matter (Case 2), ride the native path with a plain dependency,
no fork. For alkcall (the actively co-developed substrate) the
alk* precedent still applies: file asks early and land them there
rather than working around them locally — the alktunnels precedent
(the E-01/E-02 sweep, filed from its Phase 0 and landed in alkcall