Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ benchmarks/audio/
.codex-loop/
.codex-plan-loop/
*.tsanalysis.json
*.tspeaks
15 changes: 10 additions & 5 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -1127,24 +1127,29 @@ Automation: auto

The RT contract is machine-verified, but the crate's *input* surface has
never been hardened: the artifact JSON loader (`src/core/preanalysis.rs`),
the WAV reader (`src/io/wav.rs`), and the public batch API have no fuzz
coverage, and there is no enforced policy that arbitrary input produces
`Err`, never a panic. For a library embedded in a shipping app — and a
the WAV reader (`src/io/wav.rs`), the desktop app's binary peaks-cache
loader (`desktop/src/waveform/cache.rs`), and the public batch API have no
fuzz coverage, and there is no enforced policy that arbitrary input
produces `Err`, never a panic. For a library embedded in a shipping app — and a
prerequisite for any 1.0 — "does not panic on hostile or degenerate input"
must be a tested property, not an intention. This stage touches no DSP.

### Primary Files

- New: `fuzz/` (cargo-fuzz targets), a soak harness in `qa/`
- Audited in place: `src/core/preanalysis.rs` (JSON load path),
`src/io/wav.rs`, `src/lib.rs` (param validation), `src/error.rs`,
`src/io/wav.rs`, `desktop/src/waveform/cache.rs` (`.tspeaks` binary
load path), `src/lib.rs` (param validation), `src/error.rs`,
engine constructors in `src/engine/`
- CI: `.github/workflows/ci.yml` (bounded fuzz on PRs, longer cron run)

### Work

- Fuzz targets: artifact JSON from arbitrary bytes; WAV parsing from
arbitrary bytes; the batch `stretch()` API driven by arbitrary params ×
arbitrary bytes; the `.tspeaks` binary peaks cache from arbitrary bytes
(its reader is already written to reject-not-panic, with a unit-test
corruption matrix — the fuzzer's job is to prove that property holds);
the batch `stretch()` API driven by arbitrary params ×
degenerate audio (NaN/Inf/denormal samples, zero-length, one sample,
extreme rates and sample rates).
- No-panic policy: every public entry point returns `Err` on invalid
Expand Down
Loading
Loading