Repository navigation
Release 1.3.0
audit v1.3.0
A release focused on fitting audit into real workflows — CI pipelines, pull requests, and the human triage loop — plus closing the loop after a scan with auto-fixes, a triage UI, and cost
visibility, and inbound-report triage.
✨ Highlights
CI / pull-request workflow
- Diff-aware scanning —
audit run --base <ref>(PR mode, merge-base) or--since <ref>(incremental) constrains Recon to the changed files plus their blast radius
(callers/callees/importers). A PR scan costs cents instead of dollars. - Baseline & delta —
audit baselinesnapshots a run's findings into a committable file;--baseline <path>then suppresses known issues and reports NEW / FIXED / STILL-PRESENT.
Findings are matched by a line-shift-robust fingerprint (vuln_class+ normalized path + sink-code hash), so reformatting and code movement don't resurface old noise. - SARIF + exit-code gating —
audit report --format sarifemits SARIF 2.1.0 for the GitHub Advanced Security tab, GitLab SAST, and other triage tooling. Becauseauditproduces
reachability traces, each result carries acodeFlowsentry (entry-point → sink), richer than typical single-location SAST output, pluspartialFingerprintsfor cross-run dedupe.
--fail-on <severity>exits4when a finding crosses the threshold — and with a baseline, only new findings can trip the gate.
Close the loop after the report
- Auto-fix (Stage 9, opt-in) —
audit fixgenerates a minimal patch and a regression test for each confirmed and reachable finding. Each fix is produced inside a throwaway git
worktree, so your working tree is never touched; patches are saved for review.--applylands them on a branch (clean tree required) and--open-propens a draft PR viagh.
Human-in-the-loop by design — it never auto-merges. - Interactive triage viewer —
audit report --serveopens a local web UI (127.0.0.1) reading straight from SQLite: filter by severity / reachability / status, inspect the call chain,
and mark findings confirm / false-positive / won't-fix. Export your suppressions straight to a baseline. - Cost observability —
audit statsbreaks spend down by stage and model, with token usage, prompt-cache hit ratio, and cost-per-confirmed / cost-per-reachable finding — so you can
tunestages.yamlwith data instead of guesswork.--jsonfor automation.
Bug-bounty / VDP triage
audit triage --report <path>— ingest an inbound researcher submission, reproduce it against the real code, run it through the same adversarial Validate stage (skeptical,
different model) and reachability Trace gate, and dedupe it against your known issues (--against <run-id>/--baseline). Outcomes one verdict — accept / reject / duplicate /
needs_info / not_reproduced — with the trace attached. The reachability gate is decisive: a confirmed-but-unreachable claim is recommendedreject(real defect, but out of scope), giving
triagers the "can't reach this, likely invalid" signal that cuts through low-quality reports. Supports stdin (--report -), JSON output, and live-target reproduction.
🛠Improvements
- Added
audit --version(-V). - All CLI output now flows through a single logger, including a new chrome-free
log.printfor tables and machine output, keeping piped JSON/SARIF artifacts clean. - Fixed the live progress line flooding the terminal when activity text exceeded the terminal width (it now clamps to one row).
📝 Notes
- Auto-fix requires a git repository;
--applyrequires a clean working tree, and--open-propens a draft PR and never merges. - New CLI exit code:
4=--fail-ongate tripped (distinct from2usage /3budget abort). - Diff mode and triage dedupe assume a git repo.