LEARNING.md indexes ten concept-to-file pointers (the spec floor was five) — the newtype pattern, exhaustive enum match, sans-IO, trait extension seams, thiserror + hot-path match-and-continue, Arc<Mutex> vs Arc<RwLock>, DashMap, str0m's single-mutation invariant, graceful shutdown, include_str!. fuzz/README.md pre-paves the layout (no hostile-bytes surface in slice 1; harnesses land at step 5 per the out-of-scope table). README's new dev-loop section documents the libopus FFI prerequisite and the manual e2e steps.
fuzz/ — cargo-fuzz harness directory (placeholder)
Status: placeholder. Not yet a cargo-fuzz project — just the directory.
Fuzz harnesses land at spearhead step 5 (PSTN trunk) alongside the
SIP/SDP/RTP wire parsers (PORT_PLAN §10 mandates continuous fuzzing of
every wire parser). Slice 1 has no hostile-bytes surface (the browser is
trusted), so no harnesses here yet — the fuzz/ dir pre-paves the
layout. Populating this directory with a real cargo-fuzz project
(fuzz/Cargo.toml + fuzz/fuzz_targets/*.rs) happens at step 5.
If you're at step 5, replace this README with that structure:
fuzz/Cargo.toml— cargo-fuzz manifest.fuzz/fuzz_targets/sip_parser.rs— fuzz the SIP parser.fuzz/fuzz_targets/sdp_parser.rs— fuzz the SDP parser.fuzz/fuzz_targets/rtp_packet.rs— fuzz the RTP packet parser.- CI job running a short fuzz burst on each PR (the cargo-fuzz integration
lands in
.github/workflows/at that point).
The hot-path "drop + observe, don't crash" policy (spec §3.8) is what the future harnesses assert against: throw arbitrary bytes at the parser, assert it returns an error or drops silently — never panics.