Skip to content

SysMon 3.0.1

Choose a tag to compare

@RamenFast RamenFast released this 01 Aug 23:22
· 40 commits to main since this release

A patch release for v3.0.0, and an honest one: everything here was found by pointing two adversarial verifiers at the released binary and telling them to prove its conformance claim wrong. Most attacks bounced. Three landed.

What was wrong

v3.0.0 v3.0.1
sysmon tap -i NaN panicked — raw Rust backtrace, exit 101 exit 3, with the valid range in the fix
tap -i 0 / -i 999999 silently clamped to 0.2 / 60 refused as bad arguments — your ask is not quietly rewritten
--json on an error, on a terminal ignored: prose on stderr, nothing parseable on stdout a complete error envelope, every time
a tap reading of 0.825 printed 0.824999988079071 prints 0.825, exactly as v2.2.2 did

The third one is the subtle one. Adding event to each stream line was done by round-tripping the snapshot through serde_json::Value, which re-types every f32 as f64. The value is the same; the text is not, and a consumer displaying or diffing it would have seen numbers change for no reason anyone could explain. It is now spliced into the serialized text, so the typed serializer keeps its precision.

Also

docs/API.md claimed pause, resume and interval work against sysmon serve. They do not, and never did — serve samples on demand, so there is nothing to pause and no interval to set (drive cadence from the client with tap --interval N). The schema was right and the prose was wrong. The prose now matches, and the schema is the authority.

Removed, honestly

Nothing. Two behaviors changed and both are the point of the release: a bad --interval is now refused instead of clamped, and --json is now honored where it previously wasn't.

The harness grew

scripts/conformance.sh is 13 checks → 15, and the release cannot ship without them:

  • C13 fuzzes fourteen hostile inputs (NaN, ±inf, 0, negatives, 1e400, empty, unicode, doubled flags) and fails on any panic or any exit outside 0/2/3/4.
  • C14 checks four error paths for a complete --json envelope.

Both are mutation-proven: reverting the interval guard drops the score to 13/15 and names the panic. A check that cannot fail is not a check.

Rejected, with evidence

Not every finding was real, and the ones that weren't are worth naming. It was claimed that --help and --version must emit JSON — they are discovery output for humans, phosphor (the house exemplar) prints prose for both, and the envelope rule governs replies. It was claimed the enveloped unknown-command error is a regression — it is the v3.0.0 fix, and the old behavior printed nothing parseable at all. One "panic" was the harness's own bug: it grepped combined output, so a process listed in a probe could match the word. It reads stderr only now.

Install

# Debian / Ubuntu / Mint
sudo apt install ./sysmon_3.0.1_amd64.deb

# Fedora / RHEL (built on Mint, rpm --test verified — reports welcome)
sudo dnf install ./sysmon-3.0.1-1.x86_64.rpm

# from source
sudo apt install build-essential curl git            # apt
sudo dnf install gcc make curl git                   # dnf
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/RamenFast/sysmon && cd sysmon
cargo build --release && sudo install -m755 target/release/sysmon /usr/local/bin/

Verify: sysmon --version → sysmon 3.0.1 (v3).

SHA256SUMS covers every asset; sha256sum -c SHA256SUMS in the download directory checks them all at once.

Receipts

conformance 15/15 · cargo test --release green (unit, contract, a11y, kittest UI, live accuracy, live network) · scripts/e2e.sh green on a private Xvfb · the f32 fix verified byte-for-byte against the v2.2.2 binary.

Built with Claude on Ben's machine. GPLv3.