review 008 resolution: - AH-1: door_auth_middleware on extras doors resolves Authorization: Basic base64(user:pass) — password field as the token (GitHub-PAT shape, git-lfs / git smart-HTTP clients) — through the same IdentityProvider::resolve_from_token backend as Bearer; no new trait method, resolve-fails -> None fallback preserved. Bearer surfaces stay Bearer-only: the gateway endpoints, /openapi.json, /healthz, the MCP nest, and the WS upgrade path never resolve Basic. The 'Bearer-only is the auth mechanism' doc line flips (ADR-073). - AH-2 ride-along: extras door route tables are static — the merged router owns the decoy fallback, a second fallback panics at construction; documented on with_extra_routes and ADR-046 §1. docs: ADR-073, ADR-046 §1/§4 amendment, ADR-004 presentation table, review 008 marked resolved; new server::* re-exports; dep:base64 behind the server feature. Verification: cargo test (449 pass, incl. door Basic resolve-through and gateway-stays-Bearer-only pins), test --all-features (528), clippy --all-targets -D warnings, fmt --check, fuzz corpus replay (21/21), cargo doc.
alkhttp fuzzing
cargo-fuzz targets for the HTTP surface's hand-rolled parse paths. The
design and operating rules live in docs/plans/fuzzing.md (adopted
from alkcall's docs/research/fuzzing.md); this README is the
operational cheat-sheet.
Layout
fuzz_targets/— nightly-onlyfuzz_target!binaries (thin wrappers).shared/— stable-toolchain library holding the invariant logic; the corpus replay tests run here on plaincargo test.corpus/<target>/— committed seeds (regenerate withpython3 fuzz/gen_fuzz_seeds.py).artifacts/— gitignored crash/oom/timeout artifacts + campaign logs.
Targets
| Target | Drives |
|---|---|
sse_parser |
SseParser::feed + the FWD-17 envelope mapping (src/adapters/forward.rs) — the SSE frame parser every subscription forwards through |
ws_chunk_framing |
WriteChunkWalk (the write pump's chunk walk) (src/websocket/byte_adapter.rs) |
spec_import |
OpenAPISpec::from_str/from_yaml/from_json, the YAML normalization boundary, CompiledInputSchema compile/harden/validate, FromMCP::build_spec (src/adapters/openapi_spec.rs, input_validation.rs, from_mcp/mod.rs) |
ws_session_opseq |
stateful op sequences over the WS byte adapter's generic pumps (run_read_pump/run_write_pump over the mock socket flavor) — interleavings, close timing, loud-gate mapping, backpressure |
retry_throttle |
the inlined RetryAfterMiddleware's throttle map: capacity bound, eviction policy, ceiling clamp, refresh contraction, Retry-After parse partition |
Running a campaign — always detached
Agent sessions must never run fuzzing in the foreground (an OOM in a target can take down the session host; see docs/plans/fuzzing.md §2). Use the detached runner:
fuzz/run-detached.sh sse_parser
# poll:
tail -n 50 fuzz/artifacts/sse_parser-*.log
ls fuzz/artifacts/sse_parser/
pgrep -f "cargo fuzz run sse_parser"
FUZZ_RUNTIME_SECS=1800 fuzz/run-detached.sh sse_parser for a longer
campaign. The runner pins -fork=1 -rss_limit_mb=2048 -malloc_limit_mb=2048 -timeout=25 and detaches via setsid + nohup.
Corpus replay (the standing fuzz gate)
cargo test --manifest-path fuzz/shared/Cargo.toml
Replays every committed seed through the same invariant functions the fuzzer runs, on stable, no nightly needed. Part of the release verification checklist (AGENTS.md).
Toolchain notes
rust-toolchain.toml pins nightly for this subtree only (llvm-tools
required by cargo-fuzz); the crate itself stays on stable at MSRV 1.88.
cargo fuzz build must be run with the fuzz dir as CWD or trust the
toolchain file (rustup resolves per directory).
Run campaigns before releases and after touching src/adapters/forward.rs
(the SSE parser), src/websocket/byte_adapter.rs (the WS chunk walk),
or the import adapters (src/adapters/openapi_spec.rs,
input_validation.rs, from_mcp/).