The most common wrong blame in debugging is attributing to a commit what a toolchain update did. crux separates the 2 suspects before searching.
2 signatures
Every observation records both. The code signature is sha256 over the HEAD tree hash: it changes exactly when committed content changes. The environment signature is sha256 over the OS, architecture & version outputs of rustc, python, node & go when present.
classification on drift
Watch detects a behavior change & compares signatures with the previous observation. Same code hash, different environment hash: cause class environment, and the search is skipped, because no commit can be responsible. Different code hash: cause class code, and blame proceeds. The classification line prints before any commit is named, so you never watch crux hunt a culprit that doesn't exist.
limits
The environment signature covers tool versions & platform. It doesn't cover locale, time zone, or free memory. Targets depending on those should pin them inside the command.
edit this page