Releases: atomdrift-project/scan
Releases · atomdrift-project/scan
Release list
v2.4.0
Dependency scanning
- Fetching on by default (--fetch=all); every fetched dependency gets its own verdict, not a slice of its parent's.
- Worker mode scans all resolvable dependencies; interactive scans stay gated to fresh releases — now including correctly-dated Go pseudo-versions.
Correctness
- Never posts a verdict it didn't compute — an unreached dependency no longer gets an invented "benign" that would bless a bad package.
Scale & speed
- Files up to 16 GiB (streamed — a 16 GiB sample scans on an 8 GiB host).
- Lockfile-heavy scans faster: registry JSON no longer YARA-scanned (~20s saved on 851 records).
- Worker count back to physical (non-E) cores — better throughput on hybrid CPUs.
LLM (optional)
- Legacy --interpret flag was renamed to --llm
- Now auto-picks the largest model served.
Project
- Rust 1.94, moved to GitHub, dependency updates.
v2.3.0 (migrated from Codeberg)
Features
- --format=interpret: print the LLM prompt locally; no LLM call. Works with scan and ps.
- SCAN_FORMAT env var sets default output format.
- SCAN_NO_ANALYSIS_CACHE=1 disables all analysis caches.
- Reports record provenance: registry sidecars, fetch URLs, embedded file id/sha256.
- Machine formats now emit all files; --show only filters the terminal view.
Fixes
- Trait floor read the wrong JSON key and never fired on current cleave reports.
- Crit-5 traits now escalate a benign model verdict to hostile, not suspicious.
- Benign archive members no longer inherit their container's hostile verdict.
- Hostile transitive dependencies now surface at the archive root, not just the manifest.
- Unparseable PURLs no longer produce bloom-filter keys.
- All PURL spellings normalize to one canonical form.
- FreeBSD worker stop no longer hangs or orphans the scanning child.
Optimizations
- 30-60 MB lower peak RSS via jemalloc arena cap.
- 800 MB less retained worker memory: dependency reports kept as text, not parsed trees.
- Capped uploader sha set; prune stale cache versions.
- Worker shutdown drain: 60s to 15s.
v2.2.1
- Performance improvements: fixed intermittent purl/url hangs
- New --registry-map FILE flag
v2.2.0
Features
- Bloom-filter matching — scans consult bloom filters before doin work: known-good & known-bad, known-good samples are skipped by default. Tune with --mode: fast (bloom only), balanced default), or slow (always full scan).
- Dependency fetchin by default — interactive scans fetch and scan a sample's declared dependencies and install-command packages
- Renamed CLI to atomscan (avoids clashing with avast's scan); fs→path, pkg→purl (old names aliased).
- New "purl" subcommand: purl npm/left-pad@1.3.0 scans a package straight from its PURL.
- New "url" subcommand to scan a remote URL
- Adaptive --interpret templates
- Auto-refreshes rules/models when stale (--no-update to disable); --hopper upload in server mode; --show=all keeps all archive members.
- Handles registry records, provenance, and local references, including offline registry maps.
Fixes
- Recalibrated thresholds (hostile L25, suspicious L3000); confident-but-opaque ML "hostile" held at suspicious, not cleared.
- Fixed bloom bucket loading, progress-bar glitches, FreeBSD build, and tar.gz extraction.
- Removed obsolete flags (--slow-rule-ms, --models-repo, --no-update-check).
Performance
- Caches fetched-dependency analysis by content hash, skipping repeat disassembly across scans.
- Parallel dependency fetching and scanning.
v2.1.2
- Sync with cleave 2.1.2: which allows building under rust 1.94 again
- interpret: use / instead of !! in paths to avoid confusing the LLM
v2.1.0
Highlights for operators:
- Experimental --fetch feature to fetch and scan remote dependencies
- New "pkg" and "url" subcommands to scan remote samples directly.
- Hopper upload — --hopper/--upload pushes refreshed scan data upstream.
- Faster scans — dropped tract (CPU hotspot) for a leaner model engine; parallelized ps and specialist startup; dynamic admission sizing.
- v8 model migration — more reliable model releases, models pulled via git, per-file typing.
- Leaner output — slimmer JSON payloads from workers.
- Broader worker support — added SUSE, Void, and Fedora (on top of illumos, FreeBSD, Arch, etc)
- cleave v2.1.0 - which has it's own changelog: https://codeberg.org/atomdrift/cleave/releases/tag/v2.1.0
v2.0.0
Since the last official release — v1.2.1
- Now generally available, running ONNX-only inference (pure Rust, no XGBoost/LightGBM) on the
new azoth model. - Rethought severity — scored as false positives per 100M files instead of a 1–9 scale;
"suspicious" is now a bounded middle ground. - LLM interpretation and tiny output, on top of a new analysis engine (cleave 2.0 / filefacts).
- Signed model and trait updates delivered as compressed bundles, replacing the old git-based
updater. - Steadier under load — memory-aware scheduling, smallest-job-first ordering, and larger thread
stacks that fix archive crashes. - Much deeper diagnostics — crash dumps, worker census, thread dumps, breadcrumbs.
- Rebrand — litmus is now Atomdrift Scan.
Since 2.0.0-rc.5:
- LLM second opinion — a new --interpret mode sends tricky samples to a local LLM for a verdict
and one-line reason, then blends it with the ML score. Fails silently if the model is
unreachable. - Smarter job ordering — the worker now runs the smallest job first instead of
first-in-first-out, so quick scans stop waiting behind slow archives. - Better diagnostics — worker census, thread dumps, crash dumps, and tracing breadcrumbs for
debugging stuck or aborted scans. - New output — --format=tiny for LLM context; cleaner, more readable v7 JSON.
- Internal cleanup — core scan engine refactored and admission control simplified.
v2.0.0-rc.5
Features
- Added R2-backed model updates with sha256 verification, staged load validation, atomic install, and update/
check support. - Added signed model publishing via compat-tested .tar.zst bundles for azoth.
- Updated to cleave 2.0.0-rc.5, filefacts 0.9.5, and stng 1.6.0 for newer package, PE/CLR, archive, and string
signals. - Added crash-time in-flight analysis dumps to identify likely files behind stack-overflow aborts.
- Added trait-floor escalation: confident high-severity cleave findings can raise a model-benign verdict to
suspicious. - Added severity-fraction aggregate features for sparse high-risk finding clusters.
Performance
- Replaced git-based model and trait updates with compressed R2 bundles.
- Removed old git updater code and rollback paths; model bundles are validated before going live.
- Model publishing now reuses cleave’s manifest generator with cached compatibility validation.
Bugfixes
- Suspicious verdicts are now capped at level 20000, preventing very loose grid hits from becoming suspicious.
- Raised max CLI severity level to 25000 while keeping suspicious bounded.
- Preserves rare anti-analysis metrics like AST depth capping for model features.
- Validation output now reports level and decision threshold, making model failures easier to triage.
- Removed a temporary benign-sample validation waiver so validation reflects current model behavior.
v2.0.0-rc.4
Severity levels & verdicts
- Severity levels are now expressed as false positives per 100M benign files (default L50); the old 1–9
scale is gone - Each model bundle ships its own default level; -l still overrides
- Every file reports l: the strictest level at which it fires
- "Suspicious" now means a file fires above the hostile budget but within the calibrated grid — no
separate calibration - Output shows the matched level and raw route scores; calibrated percentages were dropped (they saturate
to 1.0)
Models
- ONNX is now the only model format; LightGBM and XGBoost loaders removed
- validate fails bundles with feature-layout drift instead of silently scoring zeros; features are matched
by name, so reordered specs can't misalign - Archive routing treats tar.gz as tar, matching training labels
- New validate --skip-traits checks a model independently of trait updates
Worker
- Memory-aware admission: large archives run one at a time instead of co-residing and exhausting RAM
- Analyses share one thread pool with larger stacks, fixing overflows under concurrent deep archives
- Oversized results post the verdict without the raw report rather than losing the analysis
- New heartbeat API reports liveness, load, queue depth, and throughput even while busy
- Native FreeBSD deploy support; correct CPU detection on illumos/Solaris
- bench_hopper: a local mock server for benchmarking the worker end to end
Other
- Daily zero-telemetry update check; a hosted manifest also pins the matching models ref
- scan accepts files and directories together in one run
- Dependency updates
v2.0.0-rc.3
Features:
- The big change is feature extraction. litmus now computes the full set of fields the latest azoth model wants
- The ML JSON output is now unambiguous. Schema v=5 replaces the old oclass/oprob and threshold pair with a single self-consistent
Fixes:
- Repaired the json→model plumbing: reading the ff/m/ms fields out of filefacts had broken.
- scan.rs lost ~350 lines in the process; same behavior, less machinery.
Operational:
- The WORKERS knob is honored across all worker scripts (alpine, bastille, debian, macos, omnios, openbsd), with better update logging.
- scan-no-deadlock now emits logs so a hang is diagnosable.