How do I read the EK9 fuzz HTML dashboard?
← Fuzzing and Mutation Testing · Ref: Q752
The -fuzz6 flag generates an interactive HTML dashboard at fuzz-report/index.html . Summary cards (including the programs-per-second rate) sit at the top, followed by sections on the pipeline, error coverage, the generation strands and crashes.
PHASE PENETRATION FUNNEL AND PHASE DISTRIBUTION
The funnel shows what fraction of the generated programs survive to each compilation phase (PARSING, SYMBOL_DEFINITION, TYPE_HIERARCHY_CHECKS, PRE_IR_CHECKS, etc.); the distribution shows where programs stop. A healthy fuzzer produces files that exercise all phases, not just the parser.
ERROR CODE COVERAGE
A grid with one cell per compiler error code. Green cells were triggered (darker means more frequent), grey cells never were. You can search the grid and filter it to triggered or untriggered codes. An Untriggered Error Code Analysis section groups the missing codes by phase, which reveals gaps in the fuzzer's grammar coverage.
CONVERGENCE AND STRANDS
Error Coverage Convergence shows how error coverage grows over the run. The Error-Strand Discovery Heatmap, the strand comparison charts and the Adaptive Weight Timeline show which generation strands found which errors and how their weights moved.
CONSTRUCT COVERAGE
Which EK9 constructs (classes, records, traits, functions, services...) the generated programs exercised.
CRASH AND LIMITATION BREAKDOWN
Summary cards for compiler crashes and for known limitations (expected failures from unimplemented features), with the crash rate. The crash files themselves are saved in ./fuzz-crashes/.
READING THE DASHBOARD
- All error codes triggered = good fuzzer coverage.
- Files reaching deep phases = grammar generator working well.
- Zero crashes after long runs = compiler is robust.
- Surviving error code gaps = improve generator for those constructs.
See Q749 for fuzzing overview. See Q751 for output formats. See Q627 for profiling dashboard (similar HTML pattern). See Q321 for quality report dashboard.
Example
defines module qa.fuzzingandmutation.htmldashboard <?- Code with multiple error paths that produce a rich distribution in the fuzz heatmap. Different branches exercise different compiler phases and error detection logic. -?> defines trait Measurable measurement() as pure <- rtn as Float: 0.0 label() as pure <- rtn as String: String() defines class Sensor as open sensorName as String: String() currentReading as Float: 0.0 Sensor() -> initialName as String this.sensorName :=? initialName reading() as pure <- rtn as Float: this.currentReading updateReading() -> newReading as Float this.currentReading: newReading operator $ as pure <- rtn as String: `${this.sensorName}: ${this.currentReading}` default operator ? defines function summariseSensors() -> sensors as List of Sensor <- summary as String: "No sensors" count <- length sensors zero <- 0 if count > zero total <- 0.0 for sensor in sensors total: total + sensor.reading() avg <- total / #^count summary: `${count} sensors, avg ${avg}` defines program FuzzHtmlDashboardDemo() stdout <- Stdout() alpha <- Sensor("alpha") beta <- Sensor("beta") gamma <- Sensor("gamma") alpha.updateReading(23.5) beta.updateReading(19.8) gamma.updateReading(27.1) sensors <- [alpha, beta, gamma] for sensor in sensors stdout.println($sensor) stdout.println(summariseSensors(sensors))
Other ways to ask this
- What does the fuzz-report/index.html show?
- How do I interpret EK9 fuzz statistics?
- What are error code heatmaps in the fuzz report?
Coming from another language?
Java: Jazzer provides basic crash reports, no HTML dashboard. Python: Atheris writes crash files only, visualisation requires custom tools. Rust: cargo-fuzz has no built-in dashboard. Go: go test -fuzz writes to testdata, no visualisation. EK9: built-in interactive HTML dashboard with an error code coverage grid, charts and crash counts generated by -fuzz6.
Keywords: throughput, report, dashboard, fuzz, error, crash, html, heatmap, phase, statistics, code, visualisation