[INFO] cloning repository https://github.com/Metbcy/bomdrift [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Metbcy/bomdrift" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FMetbcy%2Fbomdrift", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FMetbcy%2Fbomdrift'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 12074e7b20c073960be7cc58b8ba63f6e9077b02 [INFO] testing Metbcy/bomdrift against 1.100.0-beta.1+cargoflags=--release for beta-release-1.100-2 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FMetbcy%2Fbomdrift" "/workspace/builds/worker-1-tc2/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-1-tc2/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/Metbcy/bomdrift [INFO] finished tweaking git repo https://github.com/Metbcy/bomdrift [INFO] tweaked toml for git repo https://github.com/Metbcy/bomdrift written to /workspace/builds/worker-1-tc2/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/Metbcy/bomdrift on toolchain 1.100.0-beta.1 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.100.0-beta.1" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/Metbcy/bomdrift already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.100.0-beta.1" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:77db811e55d90add9212f6832c23229e3de5f1c1f9905e8cb07319ea15df73ac" "sleep" "infinity", kill_on_drop: false }` [INFO] [stdout] 7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013 [INFO] running `Command { std: "docker" "start" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }` [INFO] [stderr] Compiling proc-macro2 v1.0.106 [INFO] [stderr] Compiling unicode-ident v1.0.24 [INFO] [stderr] Compiling quote v1.0.45 [INFO] [stderr] Compiling stable_deref_trait v1.2.1 [INFO] [stderr] Compiling libc v0.2.186 [INFO] [stderr] Compiling serde_core v1.0.228 [INFO] [stderr] Compiling cfg-if v1.0.4 [INFO] [stderr] Compiling shlex v1.3.0 [INFO] [stderr] Compiling litemap v0.8.2 [INFO] [stderr] Compiling writeable v0.6.3 [INFO] [stderr] Compiling find-msvc-tools v0.1.9 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling icu_properties_data v2.1.2 [INFO] [stderr] Compiling version_check v0.9.5 [INFO] [stderr] Compiling icu_normalizer_data v2.1.1 [INFO] [stderr] Compiling smallvec v1.15.1 [INFO] [stderr] Compiling zeroize v1.8.2 [INFO] [stderr] Compiling typenum v1.20.0 [INFO] [stderr] Compiling untrusted v0.9.0 [INFO] [stderr] Compiling rustls-pki-types v1.14.1 [INFO] [stderr] Compiling zmij v1.0.21 [INFO] [stderr] Compiling crc32fast v1.5.0 [INFO] [stderr] Compiling utf8parse v0.2.2 [INFO] [stderr] Compiling anstyle v1.0.14 [INFO] [stderr] Compiling colorchoice v1.0.5 [INFO] [stderr] Compiling cc v1.2.61 [INFO] [stderr] Compiling anstyle-parse v1.0.0 [INFO] [stderr] Compiling is_ci v1.2.0 [INFO] [stderr] Compiling adler2 v2.0.1 [INFO] [stderr] Compiling utf8_iter v1.0.4 [INFO] [stderr] Compiling anstyle-query v1.1.5 [INFO] [stderr] Compiling simd-adler32 v0.3.9 [INFO] [stderr] Compiling equivalent v1.0.2 [INFO] [stderr] Compiling itoa v1.0.18 [INFO] [stderr] Compiling hashbrown v0.17.0 [INFO] [stderr] Compiling rustls v0.23.39 [INFO] [stderr] Compiling percent-encoding v2.3.2 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling generic-array v0.14.7 [INFO] [stderr] Compiling is_terminal_polyfill v1.70.2 [INFO] [stderr] Compiling miniz_oxide v0.8.9 [INFO] [stderr] Compiling option-ext v0.2.0 [INFO] [stderr] Compiling anstream v1.0.0 [INFO] [stderr] Compiling clap_lex v1.1.0 [INFO] [stderr] Compiling anyhow v1.0.103 [INFO] [stderr] Compiling webpki-roots v1.0.7 [INFO] [stderr] Compiling form_urlencoded v1.2.2 [INFO] [stderr] Compiling owo-colors v4.3.0 [INFO] [stderr] Compiling time-core v0.1.8 [INFO] [stderr] Compiling num-conv v0.2.1 [INFO] [stderr] Compiling once_cell v1.21.4 [INFO] [stderr] Compiling toml_write v0.1.2 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling heck v0.5.0 [INFO] [stderr] Compiling log v0.4.29 [INFO] [stderr] Compiling powerfmt v0.2.0 [INFO] [stderr] Compiling subtle v2.6.1 [INFO] [stderr] Compiling winnow v0.7.15 [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Compiling getrandom v0.2.17 [INFO] [stderr] Compiling is-terminal v0.4.17 [INFO] [stderr] Compiling strsim v0.11.1 [INFO] [stderr] Compiling memchr v2.8.0 [INFO] [stderr] Compiling supports-color v2.1.0 [INFO] [stderr] Compiling dirs-sys v0.5.0 [INFO] [stderr] Compiling clap_builder v4.6.0 [INFO] [stderr] Compiling time-macros v0.2.27 [INFO] [stderr] Compiling webpki-roots v0.26.11 [INFO] [stderr] Compiling supports-color v3.0.2 [INFO] [stderr] Compiling cpufeatures v0.2.17 [INFO] [stderr] Compiling bomdrift v0.9.9 (/opt/rustwide/workdir) [INFO] [stderr] Compiling base64 v0.22.1 [INFO] [stderr] Compiling directories v6.0.0 [INFO] [stderr] Compiling wait-timeout v0.2.1 [INFO] [stderr] Compiling block-buffer v0.10.4 [INFO] [stderr] Compiling crypto-common v0.1.7 [INFO] [stderr] Compiling flate2 v1.1.9 [INFO] [stderr] Compiling spdx v0.10.9 [INFO] [stderr] Compiling digest v0.10.7 [INFO] [stderr] Compiling indexmap v2.14.0 [INFO] [stderr] Compiling sha2 v0.10.9 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling deranged v0.5.8 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling time v0.3.47 [INFO] [stderr] Compiling zerovec-derive v0.11.3 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling clap_derive v4.6.1 [INFO] [stderr] Compiling zerofrom-derive v0.1.7 [INFO] [stderr] Compiling yoke-derive v0.8.2 [INFO] [stderr] Compiling zerofrom v0.1.7 [INFO] [stderr] Compiling yoke v0.8.2 [INFO] [stderr] Compiling zerovec v0.11.6 [INFO] [stderr] Compiling zerotrie v0.2.4 [INFO] [stderr] Compiling tinystr v0.8.3 [INFO] [stderr] Compiling potential_utf v0.1.5 [INFO] [stderr] Compiling clap v4.6.1 [INFO] [stderr] Compiling icu_collections v2.1.1 [INFO] [stderr] Compiling icu_locale_core v2.1.1 [INFO] [stderr] Compiling icu_provider v2.1.1 [INFO] [stderr] Compiling icu_properties v2.1.2 [INFO] [stderr] Compiling icu_normalizer v2.1.1 [INFO] [stderr] Compiling serde_spanned v0.6.9 [INFO] [stderr] Compiling toml_datetime v0.6.11 [INFO] [stderr] Compiling toml_edit v0.22.27 [INFO] [stderr] Compiling idna_adapter v1.2.1 [INFO] [stderr] Compiling idna v1.1.0 [INFO] [stderr] Compiling url v2.5.8 [INFO] [stderr] Compiling toml v0.8.23 [INFO] [stderr] Compiling rustls-webpki v0.103.13 [INFO] [stderr] Compiling ureq v2.12.1 [INFO] [stderr] Finished `release` profile [optimized] target(s) in 1m 53s [INFO] running `Command { std: "docker" "inspect" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }` [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling zerocopy v0.8.48 [INFO] [stderr] Compiling getrandom v0.3.4 [INFO] [stderr] Compiling zerocopy-derive v0.8.48 [INFO] [stderr] Compiling getrandom v0.4.2 [INFO] [stderr] Compiling autocfg v1.5.0 [INFO] [stderr] Compiling rustix v1.1.4 [INFO] [stderr] Compiling regex-syntax v0.8.10 [INFO] [stderr] Compiling bitflags v2.11.1 [INFO] [stderr] Compiling linux-raw-sys v0.12.1 [INFO] [stderr] Compiling ciborium-io v0.2.2 [INFO] [stderr] Compiling either v1.15.0 [INFO] [stderr] Compiling fastrand v2.4.1 [INFO] [stderr] Compiling same-file v1.0.6 [INFO] [stderr] Compiling cast v0.3.0 [INFO] [stderr] Compiling bit-vec v0.8.0 [INFO] [stderr] Compiling fnv v1.0.7 [INFO] [stderr] Compiling quick-error v1.2.3 [INFO] [stderr] Compiling walkdir v2.5.0 [INFO] [stderr] Compiling unarray v0.1.4 [INFO] [stderr] Compiling oorandom v11.1.5 [INFO] [stderr] Compiling anes v0.1.6 [INFO] [stderr] Compiling rand_core v0.9.5 [INFO] [stderr] Compiling itertools v0.10.5 [INFO] [stderr] Compiling bit-set v0.8.0 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling rand v0.9.4 [INFO] [stderr] Compiling rand_xorshift v0.4.0 [INFO] [stderr] Compiling serde_spanned v0.6.9 [INFO] [stderr] Compiling toml_datetime v0.6.11 [INFO] [stderr] Compiling ureq v2.12.1 [INFO] [stderr] Compiling tinytemplate v1.2.1 [INFO] [stderr] Compiling toml_edit v0.22.27 [INFO] [stderr] Compiling criterion-plot v0.5.0 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling tempfile v3.27.0 [INFO] [stderr] Compiling rusty-fork v0.3.1 [INFO] [stderr] Compiling toml v0.8.23 [INFO] [stderr] Compiling bomdrift v0.9.9 (/opt/rustwide/workdir) [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling half v2.7.1 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Compiling rand_chacha v0.9.0 [INFO] [stderr] Compiling ciborium-ll v0.2.2 [INFO] [stderr] Compiling proptest v1.11.0 [INFO] [stderr] Compiling ciborium v0.2.2 [INFO] [stderr] Compiling criterion v0.5.1 [INFO] [stderr] Finished `release` profile [optimized] target(s) in 2m 45s [INFO] running `Command { std: "docker" "inspect" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "test" "--frozen" "--release", kill_on_drop: false }` [INFO] [stderr] Finished `release` profile [optimized] target(s) in 0.31s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/build/bomdrift/d2ae6338c3ec94bf/out/bomdrift-d2ae6338c3ec94bf) [INFO] [stdout] [INFO] [stdout] running 441 tests [INFO] [stdout] test attestation::tests::missing_payload_field_errors_clearly ... ok [INFO] [stdout] test attestation::tests::malformed_base64_payload_errors ... ok [INFO] [stdout] test baseline::tests::add_suppression_full_rejects_malformed_expires ... ok [INFO] [stdout] test attestation::tests::handles_per_line_envelope_emission ... ok [INFO] [stdout] test baseline::tests::add_suppression_full_error_names_actual_root_type ... ok [INFO] [stdout] test baseline::tests::add_suppression_full_writes_object_form_with_reason_only ... ok [INFO] [stdout] test baseline::tests::add_suppression_full_idempotent_against_existing_object_entry ... ok [INFO] [stdout] test baseline::tests::add_suppression_is_idempotent ... ok [INFO] [stdout] test attestation::tests::extracts_predicate_from_well_formed_envelope ... ok [INFO] [stdout] test attestation::tests::missing_predicate_in_statement_errors ... ok [INFO] [stdout] test baseline::tests::add_suppression_creates_new_baseline ... ok [INFO] [stdout] test attestation::tests::empty_stdout_errors_clearly ... ok [INFO] [stdout] test baseline::tests::add_suppression_full_writes_object_form_with_expires_only ... ok [INFO] [stdout] test baseline::tests::add_suppression_full_writes_object_form_when_metadata_present ... ok [INFO] [stdout] test baseline::tests::add_suppression_rejects_empty_id ... ok [INFO] [stdout] test baseline::tests::maintainer_age_key_requires_both_purl_and_contributor_nonempty ... ok [INFO] [stdout] test baseline::tests::doc_kind_maps_each_json_variant_to_its_label ... ok [INFO] [stdout] test baseline::tests::empty_baseline_is_a_noop ... ok [INFO] [stdout] test baseline::tests::no_expires_object_entry_suppresses_indefinitely ... ok [INFO] [stdout] test baseline::tests::apply_drops_matched_maintainer_age_and_keeps_unmatched ... ok [INFO] [stdout] test baseline::tests::parse_comment_directive_rejects_malformed_id ... ok [INFO] [stdout] test baseline::tests::add_suppression_appends_to_existing_baseline ... ok [INFO] [stdout] test baseline::tests::parse_comment_directive_returns_none_when_no_directive ... ok [INFO] [stdout] test baseline::tests::malformed_baseline_yields_empty_keys_not_error ... ok [INFO] [stdout] test baseline::tests::add_suppression_preserves_existing_diff_output_baseline ... ok [INFO] [stdout] test baseline::tests::purl_drops_when_last_advisory_is_suppressed ... ok [INFO] [stdout] test baseline::tests::typosquat_suppression_matches_on_purl_and_closest ... ok [INFO] [stdout] test baseline::tests::typosquat_key_requires_both_purl_and_closest_nonempty ... ok [INFO] [stdout] test baseline::tests::malformed_expires_errors_strict ... ok [INFO] [stdout] test baseline::tests::parse_comment_directive_extracts_id_and_reason ... ok [INFO] [stdout] test clock::tests::parse_ymd_accepts_valid ... ok [INFO] [stdout] test baseline::tests::version_jump_suppression_matches_on_purl_and_majors ... ok [INFO] [stdout] test clock::tests::parse_ymd_rejects_malformed ... ok [INFO] [stdout] test clock::tests::parse_ymd_rejects_non_zero_padded ... ok [INFO] [stdout] test config::tests::config_baseline_path_is_dropped_when_file_missing ... ok [INFO] [stdout] test clock::tests::format_rfc3339_round_trip ... ok [INFO] [stdout] test baseline::tests::wildcard_advisory_id_suppresses_across_purls ... ok [INFO] [stdout] test config::tests::config_baseline_path_is_kept_when_file_exists ... ok [INFO] [stdout] test baseline::tests::parse_comment_directive_extracts_id_only ... ok [INFO] [stdout] test baseline::tests::suppressed_ids_alias_is_also_accepted ... ok [INFO] [stdout] test baseline::tests::vuln_with_matching_key_is_suppressed ... ok [INFO] [stdout] test config::tests::merge_keeps_explicit_cli_values ... ok [INFO] [stdout] test diff::key::tests::passes_through_when_no_version ... ok [INFO] [stdout] test diff::key::tests::handles_npm_scoped_with_at_in_namespace ... ok [INFO] [stdout] test diff::key::tests::key_falls_back_to_name_tuple ... ok [INFO] [stdout] test diff::key::tests::strips_simple_version ... ok [INFO] [stdout] test diff::key::tests::strips_subpath ... ok [INFO] [stdout] test diff::key::tests::strips_version_with_qualifiers ... ok [INFO] [stdout] test diff::tests::cardinality_symmetry ... ok [INFO] [stdout] test diff::tests::detects_added_and_removed ... ok [INFO] [stdout] test diff::tests::detects_version_change ... ok [INFO] [stdout] test diff::tests::license_change_with_version_bump_only_flags_version ... ok [INFO] [stdout] test diff::tests::license_change_without_version_bump_is_suspicious ... ok [INFO] [stdout] test diff::tests::diff_with_self_is_empty ... ok [INFO] [stdout] test diff::tests::multi_version_intersecting_license_changes_route_to_license_changed ... ok [INFO] [stdout] test diff::tests::multi_version_same_component_does_not_collapse ... ok [INFO] [stdout] test diff::tests::no_purl_components_match_by_name_and_ecosystem ... ok [INFO] [stdout] test diff::tests::no_purl_same_name_different_ecosystem_does_not_collide ... ok [INFO] [stdout] test diff::tests::single_to_multi_version_does_not_synthesize_version_changed ... ok [INFO] [stdout] test enrich::cache::tests::cache_with_overridden_ttl_expires_independently_of_const ... ok [INFO] [stdout] test config::tests::parses_diff_config ... ok [INFO] [stdout] test diff::key::tests::key_uses_purl_when_present ... ok [INFO] [stdout] test enrich::cache::tests::effective_ttl_secs_falls_back_to_default_when_none ... ok [INFO] [stdout] test enrich::cache::tests::entry_within_ttl_is_returned ... ok [INFO] [stdout] test enrich::cache::tests::corrupt_cache_file_is_treated_as_miss ... ok [INFO] [stdout] test enrich::cache::tests::expired_entry_returns_none ... ok [INFO] [stdout] test enrich::cache::tests::effective_ttl_secs_converts_hours_to_seconds ... ok [INFO] [stdout] test enrich::cache::tests::put_full_roundtrips_aliases ... ok [INFO] [stdout] test enrich::cache::tests::put_uses_temp_file_then_rename_no_torn_writes ... ok [INFO] [stdout] test enrich::cache::tests::sanitize_replaces_path_separators_with_underscore ... ok [INFO] [stdout] test enrich::epss::tests::apply_scores_takes_max_across_aliases ... ok [INFO] [stdout] test enrich::epss::tests::cache_roundtrip ... ok [INFO] [stdout] test enrich::epss::tests::collect_cves_dedups_across_components ... ok [INFO] [stdout] test enrich::cache::tests::get_returns_none_for_missing_advisory ... ok [INFO] [stdout] test enrich::cache::tests::open_unless_disabled_respects_flag ... ok [INFO] [stdout] test enrich::kev::tests::apply_kev_flips_flag_on_alias_match ... ok [INFO] [stdout] test attestation::tests::fetch_verified_sbom_invokes_cosign_on_path ... ok [INFO] [stdout] test baseline::tests::active_object_entry_suppresses ... ok [INFO] [stdout] test enrich::epss::tests::parse_epss_response_extracts_cve_to_score_map ... ok [INFO] [stdout] test enrich::kev::tests::enrich_short_circuits_when_vulns_empty ... ok [INFO] [stdout] test enrich::kev::tests::enrich_with_ttl_short_circuits_when_vulns_empty ... ok [INFO] [stdout] test attestation::tests::fetch_verified_sbom_reports_missing_cosign ... ok [INFO] [stdout] test baseline::tests::expired_object_entry_warns_and_does_not_suppress ... ok [INFO] [stdout] test enrich::kev::tests::enrich_with_url_swallows_network_failure ... ok [INFO] [stdout] test clock::tests::now_honors_source_date_epoch ... ok [INFO] [stdout] test enrich::kev::tests::parse_kev_feed ... ok [INFO] [stdout] test clock::tests::is_expired_ordering ... ok [INFO] [stdout] test clock::tests::now_is_read_per_call_not_cached ... ok [INFO] [stdout] test clock::tests::malformed_source_date_epoch_falls_back ... ok [INFO] [stdout] test enrich::license::tests::deny_fail_violation ... ok [INFO] [stdout] test enrich::kev::tests::apply_kev_leaves_unmatched_refs_alone ... ok [INFO] [stdout] test enrich::kev::tests::cache_path_resolves_to_kev_subdir_when_cache_root_is_set ... ok [INFO] [stdout] test enrich::license::tests::empty_policy_is_inactive ... ok [INFO] [stdout] test enrich::license::tests::exception_violation_synthetic_id_round_trips_distinctly ... ok [INFO] [stdout] test enrich::kev::tests::write_cache_round_trips_through_read_cache ... ok [INFO] [stdout] test enrich::kev::tests::write_cache_creates_missing_parent_dirs ... ok [INFO] [stdout] test enrich::license::tests::license_not_in_allow_list_violates ... ok [INFO] [stdout] test enrich::license::tests::spdx_and_inherits_exception_denial_from_either_side ... ok [INFO] [stdout] test enrich::license::tests::noassertion_treated_as_ambiguous ... ok [INFO] [stdout] test enrich::license::tests::spdx_and_with_denied_exception_violates_and_cites_in_compound ... ok [INFO] [stdout] test enrich::license::tests::deny_wins_over_allow_when_both_match ... ok [INFO] [stdout] test enrich::license::tests::spdx_compound_denial_wins_over_or_branches ... ok [INFO] [stdout] test enrich::license::tests::spdx_compound_without_exceptions_back_compat ... ok [INFO] [stdout] test enrich::license::tests::allow_pass_no_violation ... ok [INFO] [stdout] test enrich::license::tests::glob_expansion_matches_prefix ... ok [INFO] [stdout] test enrich::license::tests::compound_exception_violation_fingerprint_distinct_from_base_only ... ok [INFO] [stdout] test enrich::license::tests::spdx_and_with_allowed_exception_permits ... ok [INFO] [stdout] test enrich::license::tests::spdx_and_with_one_denied_branch_violates ... ok [INFO] [stdout] test enrich::license::tests::spdx_exception_in_allow_list_permits ... ok [INFO] [stdout] test enrich::kev::tests::read_cache_treats_corrupt_body_as_miss ... ok [INFO] [stdout] test enrich::license::tests::spdx_or_with_one_allowed_exception_branch_permits ... ok [INFO] [stdout] test enrich::license::tests::spdx_exception_or_branch_permits_when_sibling_path_passes ... ok [INFO] [stdout] test enrich::license::tests::spdx_or_with_both_exceptions_denied_violates ... ok [INFO] [stdout] test enrich::license::tests::spdx_exception_in_deny_list_violates_and_cites_exception ... ok [INFO] [stdout] test enrich::license::tests::spdx_exception_not_in_allow_list_fails_closed ... ok [INFO] [stdout] test enrich::license::tests::spdx_with_exception_back_compat_when_no_exception_policy ... ok [INFO] [stdout] test enrich::license::tests::spdx_with_exception_resolves_base_license ... ok [INFO] [stdout] test enrich::license::tests::version_changed_components_evaluated ... ok [INFO] [stdout] test enrich::license::tests::spdx_or_with_one_allowed_branch_permits ... ok [INFO] [stdout] test enrich::maintainer::tests::hosts_empty_changeset_short_circuits ... ok [INFO] [stdout] test enrich::maintainer::tests::iso8601_handles_non_midnight_time ... ok [INFO] [stdout] test enrich::maintainer::tests::iso8601_unix_epoch_is_zero ... ok [INFO] [stdout] test enrich::maintainer::tests::empty_changeset_short_circuits_to_empty_ok ... ok [INFO] [stdout] test enrich::license::tests::unknown_spdx_id_falls_back_to_atomic_path ... ok [INFO] [stdout] test enrich::maintainer::tests::non_github_source_urls_are_silently_skipped ... ok [INFO] [stdout] test enrich::maintainer::tests::hosts_no_source_url_skipped ... ok [INFO] [stdout] test enrich::maintainer::tests::normalize_iso8601_handles_canonical_zulu_form ... ok [INFO] [stdout] test enrich::maintainer::tests::hosts_unknown_forge_url_skipped ... ok [INFO] [stdout] test enrich::maintainer::tests::normalize_iso8601_rejects_multibyte_at_slice_point ... ok [INFO] [stdout] test enrich::maintainer::tests::normalize_iso8601_rejects_short_input ... ok [INFO] [stdout] test enrich::maintainer::tests::normalize_iso8601_strips_fractional_seconds ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_codeberg_repo_extracts_https_url ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_codeberg_repo_handles_ssh_form ... ok [INFO] [stdout] test enrich::maintainer::tests::iso8601_rejects_malformed_input ... ok [INFO] [stdout] test enrich::maintainer::tests::iso8601_round_trips_known_date ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_codeberg_repo_handles_trailing_path_and_fragment ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_first_commit_date_handles_empty_array ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_github_repo_handles_trailing_path_and_fragment ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_github_repo_handles_git_plus_and_ssh_forms ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_codeberg_repo_strips_dot_git_suffix ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_codeberg_repo_returns_none_for_non_codeberg ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_first_commit_date_falls_back_to_committed_date ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_first_commit_date_handles_empty_array ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_first_commit_date_takes_last_array_element ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_github_repo_returns_none_for_non_github ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_first_commit_date_takes_last_element_authored_date ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_top_contributor_name_returns_name_field ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_repo_handles_trailing_path_and_fragment ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_repo_strips_dot_git_suffix ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_top_contributor_name_returns_none_for_empty_array ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_link_last_page_extracts_page_number ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_link_last_page_handles_missing_header ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_repo_extracts_https_url ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_top_contributor_returns_login_field ... ok [INFO] [stdout] test enrich::cache::tests::put_then_get_roundtrips_severity ... ok [INFO] [stdout] test enrich::maintainer::tests::components_without_source_url_are_silently_skipped ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_repo_returns_none_for_non_gitlab ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_link_last_page_returns_none_when_no_last_rel ... ok [INFO] [stdout] test enrich::kev::tests::read_cache_returns_ids_when_within_ttl ... ok [INFO] [stdout] test enrich::kev::tests::read_cache_returns_none_when_file_missing ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_gitlab_repo_handles_git_plus_and_ssh_forms ... ok [INFO] [stdout] test baseline::tests::expired_entry_warning_text_is_stable ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_top_contributor_returns_none_for_empty_array ... ok [INFO] [stdout] test enrich::osv::tests::candidate_purls_skips_components_without_purl ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_github_repo_extracts_https_url ... ok [INFO] [stdout] test enrich::maintainer::tests::parse_github_repo_strips_dot_git_suffix ... ok [INFO] [stdout] test enrich::osv::tests::severity_from_detail_returns_none_when_severity_field_missing ... ok [INFO] [stdout] test enrich::maintainer::tests::percent_encode_encodes_slash_and_space ... ok [INFO] [stdout] test enrich::maintainer::tests::percent_encode_passes_through_unreserved_chars ... ok [INFO] [stdout] test enrich::osv::tests::aliases_from_detail_excludes_primary_and_sorts ... ok [INFO] [stdout] test enrich::osv::tests::merge_ids_drops_empty_vuln_lists ... ok [INFO] [stdout] test enrich::osv::tests::request_body_matches_osv_querybatch_schema ... ok [INFO] [stdout] test enrich::osv::tests::severity_from_detail_handles_ghsa_moderate_label ... ok [INFO] [stdout] test enrich::osv::tests::severity_from_detail_returns_none_when_database_specific_absent ... ok [INFO] [stdout] test enrich::osv::tests::vulnref_cves_iterates_aliases_when_primary_is_ghsa ... ok [INFO] [stdout] test enrich::tests::ghsa_label_is_case_insensitive_and_trim_tolerant ... ok [INFO] [stdout] test enrich::tests::ghsa_label_parses_canonical_forms ... ok [INFO] [stdout] test enrich::osv::tests::aliases_from_detail_handles_missing_aliases_field ... ok [INFO] [stdout] test enrich::registry::tests::pypi_parse_yanked ... ok [INFO] [stdout] test enrich::osv::tests::candidate_purls_extracts_from_added_and_version_changed_after ... ok [INFO] [stdout] test enrich::tests::severity_ordering_low_to_high ... ok [INFO] [stdout] test enrich::osv::tests::merge_ids_pairs_purls_with_response_results_in_order ... ok [INFO] [stdout] test enrich::tests::unknown_label_falls_back_to_none ... ok [INFO] [stdout] test enrich::registry::tests::cargo_parse_yanked_and_recent ... ok [INFO] [stdout] test enrich::registry::tests::npm_parse_recent_publish_and_deprecated ... ok [INFO] [stdout] test enrich::tests::severity_serializes_as_uppercase_string ... ok [INFO] [stdout] test enrich::typosquat::tests::cargo_list_loads_with_known_top_crates ... ok [INFO] [stdout] test enrich::typosquat::tests::composer_list_loads_with_known_top_packages ... ok [INFO] [stdout] test enrich::typosquat::tests::cargo_typo_flags_against_serde ... ok [INFO] [stdout] test enrich::typosquat::tests::case_insensitive_exact_match_is_not_flagged ... ok [INFO] [stdout] test enrich::osv::tests::severity_from_detail_uses_database_specific_when_present ... ok [INFO] [stdout] test enrich::osv::tests::vulnref_cves_includes_primary_when_cve_keyed ... ok [INFO] [stdout] test enrich::typosquat::tests::composer_legit_fork_under_different_vendor_does_not_flag ... ok [INFO] [stdout] test enrich::registry::tests::days_since_zero_for_now ... ok [INFO] [stdout] test enrich::registry::tests::url_encode_handles_npm_scopes ... ok [INFO] [stdout] test enrich::typosquat::tests::composer_package_typo_flags_against_symfony_console ... ok [INFO] [stdout] test enrich::typosquat::tests::exact_match_is_not_flagged ... ok [INFO] [stdout] test enrich::typosquat::tests::embedded_list_loads_thousand_names ... ok [INFO] [stdout] test enrich::typosquat::tests::axios_retry_does_not_flag_against_axios ... ok [INFO] [stdout] test enrich::typosquat::tests::gem_extension_pattern_is_not_a_squat ... ok [INFO] [stdout] test enrich::typosquat::tests::empty_changeset_yields_no_findings ... ok [INFO] [stdout] test enrich::typosquat::tests::gem_list_loads_with_known_top_gems ... ok [INFO] [stdout] test enrich::typosquat::tests::cargo_extension_pattern_is_not_a_squat ... ok [INFO] [stdout] test enrich::typosquat::tests::gem_typo_flags_against_rails ... ok [INFO] [stdout] test enrich::typosquat::tests::crossenv_flags_against_cross_env_via_jaro_winkler ... ok [INFO] [stdout] test enrich::typosquat::tests::default_cache_path_targets_typosquat_subdir_with_ecosystem_filename ... ok [INFO] [stdout] test enrich::typosquat::tests::go_extension_pattern_is_not_a_squat ... ok [INFO] [stdout] test enrich::typosquat::tests::findings_preserve_added_iteration_order ... ok [INFO] [stdout] test enrich::typosquat::tests::likely_legit_extension_requires_separator_npm ... ok [INFO] [stdout] test enrich::typosquat::tests::maven_exact_artifact_match_with_different_group_does_not_flag ... ok [INFO] [stdout] test enrich::typosquat::tests::maven_best_match_includes_distance_equal_to_max_levenshtein ... ok [INFO] [stdout] test enrich::typosquat::tests::maven_best_match_picks_closest_when_multiple_candidates_within_distance ... ok [INFO] [stdout] test enrich::typosquat::tests::maven_best_match_score_formula_matches_one_minus_dist_over_len_plus_one ... ok [INFO] [stdout] test enrich::typosquat::tests::maven_artifact_typo_flags_against_commons_lang3 ... ok [INFO] [stdout] test enrich::typosquat::tests::empty_cache_file_falls_back_to_embedded_snapshot_for_npm ... ok [INFO] [stdout] test enrich::typosquat::tests::cache_file_overrides_embedded_snapshot_for_npm ... ok [INFO] [stdout] test enrich::typosquat::tests::missing_cache_file_falls_back_to_embedded_snapshot_for_npm ... ok [INFO] [stdout] test enrich::typosquat::tests::go_legit_fork_under_different_org_does_not_flag ... ok [INFO] [stdout] test enrich::typosquat::tests::go_list_loads_with_known_top_modules ... ok [INFO] [stdout] test enrich::typosquat::tests::go_repo_typo_flags_against_cobra ... ok [INFO] [stdout] test enrich::typosquat::tests::maven_list_loads_with_known_top_coords ... ok [INFO] [stdout] test enrich::typosquat::tests::pypi_extension_pattern_is_not_a_squat ... ok [INFO] [stdout] test enrich::typosquat::tests::pep503_normalization ... ok [INFO] [stdout] test enrich::typosquat::tests::react_router_does_not_flag_against_react ... ok [INFO] [stdout] test enrich::typosquat::tests::nuget_list_loads_with_known_top_packages ... ok [INFO] [stdout] test enrich::typosquat::tests::nuget_case_insensitive_exact_match_is_not_flagged ... ok [INFO] [stdout] test enrich::typosquat::tests::nuget_typo_flags_against_newtonsoft_json ... ok [INFO] [stdout] test enrich::typosquat::tests::short_legit_names_skip_structural_rules ... ok [INFO] [stdout] test enrich::typosquat::tests::safe_axios_flags_against_axios_via_suffix_boost ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_does_not_flag_single_major_bump ... ok [INFO] [stdout] test enrich::typosquat::tests::similarity_threshold_override_widens_match_set ... ok [INFO] [stdout] test enrich::typosquat::tests::suffix_containment_requires_substantial_prefix ... ok [INFO] [stdout] test enrich::typosquat::tests::suspicious_suffix_containment_requires_strict_delta_over_legit_len ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_does_not_flag_minor_or_patch_bump ... ok [INFO] [stdout] test enrich::typosquat::tests::pypi_list_loads_with_known_top_packages ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_flags_delta_of_two ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_flags_delta_of_three ... ok [INFO] [stdout] test enrich::typosquat::tests::last_path_segment_returns_substring ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_with_default_threshold_matches_enrich ... ok [INFO] [stdout] test enrich::typosquat::tests::plain_crypto_js_flags_against_crypto_js_via_suffix_boost ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_with_high_threshold_suppresses_smaller_jumps ... ok [INFO] [stdout] test enrich::typosquat::tests::pypi_typo_flags_against_requests ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_with_threshold_one_trips_on_single_major_bump ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_plain ... ok [INFO] [stdout] test enrich::typosquat::tests::pypi_underscore_dash_equivalence_is_not_a_squat ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_pre_release_suffix ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_preserves_input_order ... ok [INFO] [stdout] test enrich::typosquat::tests::unsupported_ecosystem_components_are_ignored ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_returns_empty_for_added_only_changeset ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_rejects_leading_zero ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_returns_none_on_empty ... ok [INFO] [stdout] test model::sbom::tests::serialize_emits_canonical_string_form ... ok [INFO] [stdout] test model::sbom::tests::as_str_round_trips_each_variant ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_returns_empty_for_empty_changeset ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_returns_none_on_non_numeric ... ok [INFO] [stdout] test model::sbom::tests::display_matches_as_str_for_each_variant ... ok [INFO] [stdout] test enrich::version_jump::tests::enrich_skips_pairs_with_unparseable_versions ... ok [INFO] [stdout] test parse::cyclonedx::tests::license_flattens_expression_first ... ok [INFO] [stdout] test parse::spdx::tests::actor_strips_prefix ... ok [INFO] [stdout] test parse::spdx::tests::license_falls_back_to_declared_when_noassertion ... ok [INFO] [stdout] test parse::spdx::tests::download_location_strips_git_plus_and_filters_sentinels ... ok [INFO] [stdout] test parse::spdx::tests::license_prefers_concluded ... ok [INFO] [stdout] test parse::syft::tests::license_object_falls_back_to_value ... ok [INFO] [stdout] test parse::cyclonedx::tests::license_falls_back_to_id_then_name ... ok [INFO] [stdout] test parse::spdx::tests::license_empty_when_both_noassertion ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_round_trips_well_formed_numerics ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_v_prefix ... ok [INFO] [stdout] test parse::syft::tests::license_string_form ... ok [INFO] [stdout] test parse::syft::tests::type_to_ecosystem_handles_syft_specific_names ... ok [INFO] [stdout] test parse::tests::filter_file_components_drops_only_file_pseudo_components ... ok [INFO] [stdout] test parse::tests::detects_cyclonedx_case_insensitive ... ok [INFO] [stdout] test parse::tests::hash_alg_normalization ... ok [INFO] [stdout] test parse::syft::tests::license_object_prefers_spdx_expression ... ok [INFO] [stdout] test parse::tests::detects_cyclonedx ... ok [INFO] [stdout] test parse::tests::detects_syft ... ok [INFO] [stdout] test enrich::typosquat::tests::pep503_normalize_does_not_panic ... ok [INFO] [stdout] test diff::tests::diff_self_is_empty ... ok [INFO] [stdout] test parse::tests::filter_file_components_is_a_noop_when_none_present ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_build_metadata ... ok [INFO] [stdout] test parse::tests::parse_with_format_hint_bypasses_detection ... ok [INFO] [stdout] test parse::tests::detects_spdx ... ok [INFO] [stdout] test parse::tests::purl_ecosystem_inference ... ok [INFO] [stdout] test plugin::tests::manifest_missing_exec_field_errors ... ok [INFO] [stdout] test parse::tests::parse_with_format_none_falls_back_to_detection ... ok [INFO] [stdout] test parse::tests::rejects_unknown ... ok [INFO] [stdout] test plugin::tests::fingerprint_is_stable_and_distinct ... ok [INFO] [stdout] test plugin::tests::manifest_parses_full_toml ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_does_not_panic ... ok [INFO] [stdout] test parse::tests::parse_with_format_steers_to_chosen_parser_even_when_body_matches_a_different_format ... ok [INFO] [stdout] test plugin::tests::manifest_unknown_invoke_on_value_errors ... ok [INFO] [stdout] test plugin::tests::manifest_parses_minimum_valid_toml ... ok [INFO] [stdout] test refresh::tests::parse_cargo_json_extracts_names_in_order ... ok [INFO] [stdout] test refresh::tests::parse_nuget_json_extracts_ids_in_order ... ok [INFO] [stdout] test refresh::tests::parse_nuget_json_rejects_non_json ... ok [INFO] [stdout] test refresh::tests::parse_pypi_json_extracts_names_in_order ... ok [INFO] [stdout] test refresh::tests::parse_pypi_json_rejects_non_json ... ok [INFO] [stdout] test refresh::tests::parser_extracts_names_correctly_from_anvaka_markdown ... ok [INFO] [stdout] test plugin::tests::plugin_malformed_json_drops_findings ... ok [INFO] [stdout] test plugin::tests::plugin_nonzero_exit_drops_findings ... ok [INFO] [stdout] test refresh::tests::parser_handles_empty_input_without_crashing ... ok [INFO] [stdout] test refresh::tests::parser_skips_lines_with_non_numeric_prefix ... ok [INFO] [stdout] test refresh::tests::refresh_cargo_concatenates_pages_and_writes_cache ... ok [INFO] [stdout] test refresh::tests::refresh_composer_is_a_noop_no_cache_file_written ... ok [INFO] [stdout] test refresh::tests::refresh_all_includes_all_eight_ecosystems ... ok [INFO] [stdout] test refresh::tests::refresh_gem_is_a_noop_no_cache_file_written ... ok [INFO] [stdout] test refresh::tests::refresh_go_is_a_noop_no_cache_file_written ... ok [INFO] [stdout] test refresh::tests::refresh_maven_is_a_noop_no_cache_file_written ... ok [INFO] [stdout] test refresh::tests::refresh_propagates_fetcher_errors_with_context ... ok [INFO] [stdout] test refresh::tests::refresh_writes_parsed_npm_list_to_cache_dir ... ok [INFO] [stdout] test refresh::tests::refresh_writes_parsed_pypi_list_to_cache_dir ... ok [INFO] [stdout] test refresh::tests::refresh_writes_parsed_nuget_list_to_cache_dir ... ok [INFO] [stdout] test refresh::tests::write_list_atomically_overwrites_existing_file ... ok [INFO] [stdout] test plugin::tests::plugin_stdin_envelope_includes_protocol_version_1 ... ok [INFO] [stdout] test render::json::tests::enrichment_round_trips ... ok [INFO] [stdout] test render::json::tests::output_is_pretty_printed ... ok [INFO] [stdout] test render::json::tests::populated_diff_round_trips ... ok [INFO] [stdout] test render::markdown::dependency_churn::tests::findings_only_hides_raw_churn_but_keeps_risk_sections ... ok [INFO] [stdout] test render::markdown::dependency_churn::tests::renders_added_section ... ok [INFO] [stdout] test render::markdown::dependency_churn::tests::renders_version_change_table_columns ... ok [INFO] [stdout] test render::markdown::dependency_churn::tests::sections_are_wrapped_in_collapsible_details_with_count ... ok [INFO] [stdout] test render::markdown::footer::tests::footer_default_platform_preserves_github_shape ... ok [INFO] [stdout] test render::markdown::footer::tests::footer_omitted_when_repo_url_unset ... ok [INFO] [stdout] test render::markdown::footer::tests::footer_renders_azure_devops_shape ... ok [INFO] [stdout] test render::markdown::footer::tests::footer_renders_bitbucket_shape ... ok [INFO] [stdout] test render::markdown::footer::tests::footer_renders_gitlab_shape_when_platform_is_gitlab ... ok [INFO] [stdout] test render::markdown::footer::tests::footer_renders_when_repo_url_supplied ... ok [INFO] [stdout] test render::markdown::footer::tests::footer_strips_trailing_slash_from_repo_url ... ok [INFO] [stdout] test render::markdown::license::tests::empty_license_list_renders_as_none ... ok [INFO] [stdout] test render::markdown::license::tests::license_changed_section_includes_investigation_callout ... ok [INFO] [stdout] test render::markdown::maintainer_age::tests::maintainer_age_section_omitted_when_no_findings ... ok [INFO] [stdout] test render::markdown::maintainer_age::tests::maintainer_age_section_renders_with_table_and_xz_callout ... ok [INFO] [stdout] test render::markdown::tests::empty_changeset_says_no_changes ... ok [INFO] [stdout] test render::markdown::tests::empty_sections_are_omitted ... ok [INFO] [stdout] test render::markdown::tests::render_is_deterministic ... ok [INFO] [stdout] test render::markdown::tests::summary_only_does_not_change_no_changes_short_circuit ... ok [INFO] [stdout] test render::markdown::tests::summary_only_keeps_summary_table_and_drops_detail ... ok [INFO] [stdout] test render::markdown::tests::typosquat_summary_row_only_when_typosquats_present ... ok [INFO] [stdout] test render::markdown::tests::why_this_matters_link_appears_in_each_finding_section ... ok [INFO] [stdout] test render::markdown::typosquat::tests::typosquat_section_omitted_when_no_findings ... ok [INFO] [stdout] test render::markdown::typosquat::tests::typosquat_section_renders_with_similarity_table ... ok [INFO] [stdout] test render::markdown::typosquat::tests::typosquat_section_summary_includes_top_similarity_teaser ... ok [INFO] [stdout] test render::markdown::version_jump::tests::version_jump_section_omitted_when_no_findings ... ok [INFO] [stdout] test render::markdown::version_jump::tests::version_jump_section_renders_with_table ... ok [INFO] [stdout] test render::markdown::vulns::tests::vuln_rows_sorted_by_max_severity_across_components ... ok [INFO] [stdout] test render::markdown::vulns::tests::vuln_section_summary_includes_top_severity_teaser ... ok [INFO] [stdout] test render::markdown::vulns::tests::vulnerability_section_omitted_when_no_findings ... ok [INFO] [stdout] test render::markdown::vulns::tests::vulnerability_section_renders_with_osv_links ... ok [INFO] [stdout] test render::markdown::vulns::tests::vulnerability_section_sorts_advisories_by_severity_then_id ... ok [INFO] [stdout] test render::sarif::tests::cve_results_are_sorted_by_purl_for_determinism ... ok [INFO] [stdout] test render::json::tests::ecosystem_other_serializes_sensibly ... ok [INFO] [stdout] test render::json::tests::empty_diff_renders_valid_json ... ok [INFO] [stdout] test parse::tests::parse_pipeline_does_not_panic_on_arbitrary_json ... ok [INFO] [stdout] test render::sarif::tests::empty_diff_renders_valid_sarif_with_all_rules ... ok [INFO] [stdout] test render::sarif::tests::cve_results_carry_partial_fingerprints_stable_across_runs ... ok [INFO] [stdout] test render::sarif::tests::every_result_has_a_location_and_a_ruleid ... ok [INFO] [stdout] test render::sarif::tests::exception_driven_license_violation_fingerprint_differs_from_base ... ok [INFO] [stdout] test render::sarif::tests::fingerprint_helper_is_pure_and_hex_64_chars ... ok [INFO] [stdout] test render::sarif::tests::cve_results_emit_one_per_advisory_with_purl_property ... ok [INFO] [stdout] test render::sarif::tests::license_change_result_carries_before_after_license_arrays ... ok [INFO] [stdout] test render::sarif::tests::cve_severity_none_emits_warning_level ... ok [INFO] [stdout] test render::sarif::tests::license_violation_emits_result_with_stable_fingerprint ... ok [INFO] [stdout] test render::sarif::tests::output_is_pretty_printed ... ok [INFO] [stdout] test render::sarif::tests::plugin_findings_emit_sarif_results_with_distinct_fingerprints ... ok [INFO] [stdout] test render::sarif::tests::version_jump_fingerprint_uses_full_versions_not_majors ... ok [INFO] [stdout] test diff::tests::diff_swap_roles_when_inputs_swapped ... ok [INFO] [stdout] test render::sarif::tests::version_jump_result_carries_major_deltas ... ok [INFO] [stdout] test render::term::tests::color_off_emits_no_ansi_escapes ... ok [INFO] [stdout] test render::term::tests::empty_changeset_under_forced_color_has_no_escapes_on_neutral_line ... ok [INFO] [stdout] test render::term::tests::empty_changeset_says_no_changes ... ok [INFO] [stdout] test render::term::tests::forced_color_emits_ansi_escapes ... ok [INFO] [stdout] test render::term::tests::render_is_deterministic ... ok [INFO] [stdout] test render::sarif::tests::typosquat_result_carries_similarity_and_closest_property ... ok [INFO] [stdout] test render::term::tests::empty_sections_are_omitted ... ok [INFO] [stdout] test refresh::tests::refresh_fails_loudly_when_fetcher_returns_unparseable_body ... ok [INFO] [stdout] test render::sarif::tests::render_is_pure_byte_deterministic_across_runs ... ok [INFO] [stdout] test render::sarif::tests::two_cves_on_same_purl_get_distinct_fingerprints ... ok [INFO] [stdout] test render::term::tests::renders_added_section ... ok [INFO] [stdout] test render::term::tests::renders_removed_version_typosquat_lines ... ok [INFO] [stdout] test run::tests::any_epss_threshold_gating ... ok [INFO] [stdout] test render::term::tests::vulnerability_lines_render_advisory_ids ... ok [INFO] [stdout] test run::tests::budget_trips_when_counts_exceed_limits ... ok [INFO] [stdout] test run::tests::calibration_jsonl_format_emits_one_object_per_line ... ok [INFO] [stdout] test run::tests::calibration_license_row_includes_exception_detail ... ok [INFO] [stdout] test run::tests::calibration_pipe_format_matches_v0_7_layout ... ok [INFO] [stdout] test run::tests::fail_on_any_trips_on_each_finding_kind_and_license_changes ... ok [INFO] [stdout] test run::tests::fail_on_critical_cve_filters_on_severity_high_or_above ... ok [INFO] [stdout] test run::tests::fail_on_cve_still_trips_on_severity_none_advisories ... ok [INFO] [stdout] test run::tests::calibration_emits_epss_and_kev_rows_when_set ... ok [INFO] [stdout] test run::tests::calibration_jsonl_keeps_severity_label_as_string ... ok [INFO] [stdout] test run::tests::fail_on_kev_trips_when_any_advisory_kev_set ... ok [INFO] [stdout] test run::tests::fail_on_cve_trips_only_on_cve_findings ... ok [INFO] [stdout] test run::tests::fail_on_typosquat_ignores_license_change ... ok [INFO] [stdout] test run::tests::fail_on_license_violation_trips ... ok [INFO] [stdout] test run::tests::fail_on_none_never_trips ... ok [INFO] [stdout] test run::tests::fail_on_license_change_trips_only_on_license_changes ... ok [INFO] [stdout] test vex::apply::tests::apply_license_violations_suppresses_and_counts ... ok [INFO] [stdout] test vex::apply::tests::apply_typosquats_annotates_under_investigation ... ok [INFO] [stdout] test vex::apply::tests::apply_typosquats_suppresses_and_counts ... ok [INFO] [stdout] test vex::apply::tests::apply_version_jumps_suppresses_and_counts ... ok [INFO] [stdout] test run::tests::fail_on_typosquat_trips_only_on_typosquat_findings ... ok [INFO] [stdout] test vex::emit::tests::emission_byte_deterministic_with_source_date_epoch ... ok [INFO] [stdout] test plugin::tests::plugin_invocation_returns_findings ... ok [INFO] [stdout] test vex::apply::tests::apply_maintainer_age_suppresses_and_counts ... ok [INFO] [stdout] test vex::apply::tests::apply_noop_on_empty_index ... ok [INFO] [stdout] test vex::apply::tests::apply_vulns_suppresses_and_annotates ... ok [INFO] [stdout] test plugin::tests::two_plugins_findings_are_merged ... ok [INFO] [stdout] test vex::apply::tests::apply_accumulates_into_existing_suppressed_count ... ok [INFO] [stdout] test parse::tests::hash_alg_does_not_panic ... ok [INFO] [stdout] test parse::tests::parse_pipeline_does_not_panic_on_arbitrary_bytes ... ok [INFO] [stdout] test parse::tests::ecosystem_from_purl_does_not_panic ... ok [INFO] [stdout] test vex::emit::tests::emission_default_status_is_under_investigation ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_deprecated_round_trip ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_license_change_round_trip ... ok [INFO] [stdout] test vex::emit::tests::emission_roundtrip_via_loader ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_recently_published_round_trip ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_maintainer_set_changed_round_trip ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_maintainer_age_round_trip ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_synthetic_id_handles_bare_name_fallback ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_typosquat_round_trip ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_synthetic_id_rejects_malformed_strings ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_license_violation_round_trip_with_spdx_with_clause ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_synthetic_id_rejects_real_advisory_ids ... ok [INFO] [stdout] test vex::tests::matcher_resolves_by_alias ... ok [INFO] [stdout] test vex::tests::load_openvex_basic ... ok [INFO] [stdout] test vex::tests::vex_index_is_empty_tracks_statement_presence ... ok [INFO] [stdout] test vex::tests::matcher_versionless_product_matches_versioned_finding ... ok [INFO] [stdout] test vex::tests::under_investigation_annotates_not_suppresses ... ok [INFO] [stdout] test vex::tests::vex_status_from_openvex_round_trips_all_arms ... ok [INFO] [stdout] test vex::tests::load_cyclonedx_vex_basic ... ok [INFO] [stdout] test vex::tests::matcher_rejects_mismatched_product ... ok [INFO] [stdout] test vex::tests::unknown_format_errors_with_path ... ok [INFO] [stdout] test vex::tests::vex_effect_justification_returns_inner_for_both_variants ... ok [INFO] [stdout] test plugin::tests::plugin_timeout_drops_findings ... ok [INFO] [stdout] test vex::synthetic_id::tests::parse_version_jump_round_trip ... ok [INFO] [stdout] test vex::tests::detect_format_cyclonedx_requires_vulnerabilities_array ... ok [INFO] [stdout] test vex::tests::first_write_wins_across_multiple_files ... ok [INFO] [stdout] test parse::tests::parse_pipeline_does_not_panic_with_format_hint ... ok [INFO] [stdout] test vex::tests::vex_status_from_openvex_rejects_unknown_strings ... ok [INFO] [stdout] test enrich::version_jump::tests::extract_major_handles_unicode_without_panic ... ok [INFO] [stdout] test diff::tests::diff_is_deterministic ... ok [INFO] [stdout] test enrich::typosquat::tests::enrich_does_not_panic_on_arbitrary_components ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 441 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.87s [INFO] [stdout] [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/release/build/bomdrift/6cff3a3fe9a52c8d/out/bomdrift-6cff3a3fe9a52c8d) [INFO] [stdout] [INFO] [stderr] Running tests/cli.rs (/opt/rustwide/target/release/build/bomdrift/a28df436710509f0/out/cli-a28df436710509f0) [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 36 tests [INFO] [stdout] test diff_fail_on_cve_with_no_findings_exits_0 ... ok [INFO] [stdout] test diff_before_attestation_conflicts_with_positional_before ... ok [INFO] [stdout] test diff_fail_on_license_change_exits_2 ... ok [INFO] [stdout] test diff_fail_on_critical_cve_with_no_cve_findings_does_not_warn ... ok [INFO] [stdout] test diff_explicit_flag_overrides_config_default ... ok [INFO] [stdout] test diff_auto_detects_gitlab_when_gitlab_ci_env_is_true ... ok [INFO] [stdout] test diff_debug_calibration_prints_csv_lines_to_stderr ... ok [INFO] [stdout] test diff_missing_explicit_config_fails_usefully ... ok [INFO] [stdout] test diff_config_baseline_missing_file_does_not_error ... ok [INFO] [stdout] test diff_missing_file_fails_with_useful_error ... ok [INFO] [stdout] test diff_multi_major_delta_accepts_valid_value ... ok [INFO] [stdout] test diff_axios_fixture_pair_prints_pr_comment_markdown ... ok [INFO] [stdout] test diff_default_config_can_focus_comment_and_trip_budget ... ok [INFO] [stdout] test diff_require_attestation_demands_both_attestation_flags ... ok [INFO] [stdout] test diff_explicit_format_overrides_autodetection ... ok [INFO] [stdout] test diff_self_against_self_reports_no_changes ... ok [INFO] [stdout] test diff_sarif_output_produces_valid_sarif_with_typosquat_finding ... ok [INFO] [stdout] test diff_renders_github_footer_when_only_repo_url_env_var_is_set ... ok [INFO] [stdout] test diff_multi_major_delta_rejects_zero_and_negative ... ok [INFO] [stdout] test diff_explicit_format_cdx_succeeds_on_cdx_input ... ok [INFO] [stdout] test diff_axios_fixture_pair_renders_typosquat_section ... ok [INFO] [stdout] test diff_explicit_platform_flag_overrides_ci_env_detection ... ok [INFO] [stdout] test diff_json_output_produces_parseable_json ... ok [INFO] [stdout] test diff_fail_on_typosquat_exits_2_but_still_prints_markdown_body ... ok [INFO] [stdout] test diff_explicit_markdown_flag_is_identical_to_default ... ok [INFO] [stdout] test diff_explicit_baseline_path_missing_errors_loudly ... ok [INFO] [stdout] test diff_no_maintainer_age_flag_skips_enricher ... ok [INFO] [stdout] test diff_typosquat_similarity_threshold_surfaces_in_calibration_threshold_field ... ok [INFO] [stdout] test init_config_only_scaffolds_policy_file_without_workflows ... ok [INFO] [stdout] test diff_terminal_output_in_non_tty_falls_back_to_markdown ... ok [INFO] [stdout] test diff_cache_ttl_hours_rejects_zero_and_negative ... ok [INFO] [stdout] test refresh_typosquat_help_advertises_ecosystem_flag ... ok [INFO] [stdout] test diff_plugin_end_to_end_emits_finding_in_markdown_and_sarif ... ok [INFO] [stdout] test diff_typosquat_similarity_threshold_rejects_out_of_range ... ok [INFO] [stdout] test diff_young_maintainer_days_rejects_zero_and_negative ... ok [INFO] [stdout] test diff_typosquat_similarity_threshold_changes_calibration_row ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s [INFO] [stdout] [INFO] [stderr] Running tests/integration.rs (/opt/rustwide/target/release/build/bomdrift/f7158ff3aca9256c/out/integration-f7158ff3aca9256c) [INFO] [stdout] [INFO] [stdout] running 9 tests [INFO] [stdout] test diff_cdx_minimal_against_cdx_after ... ok [INFO] [stdout] test diff_is_deterministic_across_runs ... ok [INFO] [stdout] test render_is_deterministic_through_full_pipeline ... ok [INFO] [stderr] Running tests/real_world.rs (/opt/rustwide/target/release/build/bomdrift/7ea88ee6a2123ef3/out/real_world-7ea88ee6a2123ef3) [INFO] [stdout] test spdx_minimal_parses ... ok [INFO] [stdout] test typosquat_enricher_flags_plain_crypto_js_on_axios_fixture ... ok [INFO] [stdout] test cdx_minimal_parses ... ok [INFO] [stdout] test json_render_full_pipeline ... ok [INFO] [stdout] test axios_diff_renders_pr_comment_shape ... ok [INFO] [stdout] test syft_minimal_parses ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test every_real_world_spdx_fixture_parses_with_components ... ok [INFO] [stdout] test diff_two_unrelated_real_world_sboms_does_not_panic ... ok [INFO] [stdout] test every_real_world_cdx_fixture_parses_with_components ... ok [INFO] [stdout] test real_world_fixtures_contain_no_file_pseudo_components_after_filter ... ok [INFO] [stdout] test self_diff_of_each_real_world_sbom_is_empty ... ok [INFO] [stdout] test known_purl_types_resolve_to_canonical_ecosystem ... ok [INFO] [stdout] test render_diff_of_real_world_sboms_to_all_formats ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s [INFO] [stdout] [INFO] [stderr] Doc-tests bomdrift [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test src/clock.rs - clock::now (line 25) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s [INFO] [stdout] [INFO] [stdout] all doctests ran in 2.92s; merged doctests compilation took 2.89s [INFO] running `Command { std: "docker" "inspect" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013", kill_on_drop: false }` [INFO] [stdout] 7d9328ac06ba9c82f55bb5f1f7183568e7224678bad3ac7bb930de658e565013