[INFO] fetching crate papertowel 0.3.8...
[INFO] testing papertowel-0.3.8 against beta-2026-04-21 for beta-1.96-2
[INFO] extracting crate papertowel 0.3.8 into /workspace/builds/worker-6-tc2/source
[INFO] removed /workspace/builds/worker-6-tc2/source/rust-toolchain.toml
[INFO] started tweaking crates.io crate papertowel 0.3.8
[INFO] removed 0 missing tests
[INFO] finished tweaking crates.io crate papertowel 0.3.8
[INFO] tweaked toml for crates.io crate papertowel 0.3.8 written to /workspace/builds/worker-6-tc2/source/Cargo.toml
[INFO] validating manifest of crates.io crate papertowel 0.3.8 on toolchain beta-2026-04-21
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+beta-2026-04-21" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate papertowel 0.3.8 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" "+beta-2026-04-21" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] a294391a3a75e702f36b7a2e9ef7c27b4200fbd74541e19bbf0f173add89c485
[INFO] running `Command { std: "docker" "start" "-a" "a294391a3a75e702f36b7a2e9ef7c27b4200fbd74541e19bbf0f173add89c485", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "a294391a3a75e702f36b7a2e9ef7c27b4200fbd74541e19bbf0f173add89c485", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "a294391a3a75e702f36b7a2e9ef7c27b4200fbd74541e19bbf0f173add89c485", kill_on_drop: false }`
[INFO] [stdout] a294391a3a75e702f36b7a2e9ef7c27b4200fbd74541e19bbf0f173add89c485
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-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" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 4c4c364e62247cdec7447854c4bc481765133ff21a9f60f782c0c47bca72d053
[INFO] running `Command { std: "docker" "start" "-a" "4c4c364e62247cdec7447854c4bc481765133ff21a9f60f782c0c47bca72d053", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.184
[INFO] [stderr]    Compiling aho-corasick v1.1.4
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling hashbrown v0.17.0
[INFO] [stderr]    Compiling bstr v1.12.1
[INFO] [stderr]    Compiling option-ext v0.2.0
[INFO] [stderr]    Compiling winnow v0.7.15
[INFO] [stderr]    Compiling toml_datetime v0.6.11
[INFO] [stderr]    Compiling serde_spanned v0.6.9
[INFO] [stderr]    Compiling chrono-tz v0.10.4
[INFO] [stderr]    Compiling toml_write v0.1.2
[INFO] [stderr]    Compiling clap_builder v4.6.0
[INFO] [stderr]    Compiling chrono v0.4.44
[INFO] [stderr]    Compiling crossbeam-deque v0.8.6
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling tokio-macros v2.7.0
[INFO] [stderr]    Compiling papertowel v0.3.8 (/opt/rustwide/workdir)
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling tracing-log v0.2.0
[INFO] [stderr]    Compiling jobserver v0.1.34
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling dirs-sys v0.5.0
[INFO] [stderr]    Compiling console v0.16.3
[INFO] [stderr]    Compiling mio v1.2.0
[INFO] [stderr]    Compiling socket2 v0.6.3
[INFO] [stderr]    Compiling fs2 v0.4.3
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling rand_core v0.9.5
[INFO] [stderr]    Compiling cc v1.2.60
[INFO] [stderr]    Compiling dirs v6.0.0
[INFO] [stderr]    Compiling indexmap v2.14.0
[INFO] [stderr]    Compiling rand_chacha v0.9.0
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling indicatif v0.18.4
[INFO] [stderr]    Compiling rand v0.9.3
[INFO] [stderr]    Compiling tokio v1.51.1
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling openssl-sys v0.9.112
[INFO] [stderr]    Compiling libz-sys v1.1.28
[INFO] [stderr]    Compiling libssh2-sys v0.3.1
[INFO] [stderr]    Compiling libgit2-sys v0.18.3+1.9.2
[INFO] [stderr]    Compiling clap v4.6.0
[INFO] [stderr]    Compiling toml_edit v0.22.27
[INFO] [stderr]    Compiling globset v0.4.18
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling tracing-subscriber v0.3.23
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling ignore v0.4.25
[INFO] [stderr]    Compiling toml v0.8.23
[INFO] [stderr]    Compiling git2 v0.20.4
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 55.16s
[INFO] running `Command { std: "docker" "inspect" "4c4c364e62247cdec7447854c4bc481765133ff21a9f60f782c0c47bca72d053", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "4c4c364e62247cdec7447854c4bc481765133ff21a9f60f782c0c47bca72d053", kill_on_drop: false }`
[INFO] [stdout] 4c4c364e62247cdec7447854c4bc481765133ff21a9f60f782c0c47bca72d053
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-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" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 083d4796cbe38d87d954eef062d113fb7d7ef278b74aecb9490ce0142768b210
[INFO] running `Command { std: "docker" "start" "-a" "083d4796cbe38d87d954eef062d113fb7d7ef278b74aecb9490ce0142768b210", kill_on_drop: false }`
[INFO] [stderr]    Compiling bstr v1.12.1
[INFO] [stderr]    Compiling predicates-core v1.0.10
[INFO] [stderr]    Compiling papertowel v0.3.8 (/opt/rustwide/workdir)
[INFO] [stderr]    Compiling float-cmp v0.10.0
[INFO] [stderr]    Compiling termtree v0.5.1
[INFO] [stderr]    Compiling normalize-line-endings v0.3.0
[INFO] [stderr]    Compiling difflib v0.4.0
[INFO] [stderr]    Compiling assert_cmd v2.2.0
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling wait-timeout v0.2.1
[INFO] [stderr]    Compiling fastrand v2.4.1
[INFO] [stderr]    Compiling git2 v0.20.4
[INFO] [stderr]    Compiling predicates-tree v1.0.13
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling globset v0.4.18
[INFO] [stderr]    Compiling predicates v3.1.4
[INFO] [stderr]    Compiling ignore v0.4.25
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 23.61s
[INFO] running `Command { std: "docker" "inspect" "083d4796cbe38d87d954eef062d113fb7d7ef278b74aecb9490ce0142768b210", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "083d4796cbe38d87d954eef062d113fb7d7ef278b74aecb9490ce0142768b210", kill_on_drop: false }`
[INFO] [stdout] 083d4796cbe38d87d954eef062d113fb7d7ef278b74aecb9490ce0142768b210
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-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" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] 094c5646134bb8d154c301f12f677736b70a31fb52c177594db6c9c112e92374
[INFO] running `Command { std: "docker" "start" "-a" "094c5646134bb8d154c301f12f677736b70a31fb52c177594db6c9c112e92374", kill_on_drop: false }`
[INFO] [stderr]    Compiling papertowel v0.3.8 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 16.65s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/papertowel-1bcfe96d7fd0cd70)
[INFO] [stdout] 
[INFO] [stdout] running 406 tests
[INFO] [stdout] test cli::grade::tests::grade_args_defaults ... ok
[INFO] [stdout] test cli::profile::tests::handle_show_returns_ok ... ok
[INFO] [stdout] test cli::report::tests::ai_probability_is_higher_for_more_findings ... ok
[INFO] [stdout] test cli::report::tests::build_summary_counts_correctly ... ok
[INFO] [stdout] test cli::report::tests::ai_prob_color_yellow_and_green_paths ... ok
[INFO] [stdout] test cli::report::tests::category_label_covers_all_variants ... ok
[INFO] [stdout] test cli::report::tests::category_label_covers_comment_structure_readme_metadata ... ok
[INFO] [stdout] test cli::report::tests::empty_findings_produces_no_finding_output ... ok
[INFO] [stdout] test cli::profile::tests::handle_create_returns_ok ... ok
[INFO] [stdout] test cli::report::tests::gha_report_escapes_cr_and_lf ... ok
[INFO] [stdout] test cli::report::tests::gha_report_escapes_percent_in_description ... ok
[INFO] [stdout] test cli::learn::tests::handle_show_no_baseline_prints_message ... ok
[INFO] [stdout] test cli::report::tests::gha_report_with_line_range_emits_line_annotation ... ok
[INFO] [stdout] test cli::report::tests::empty_findings_with_color_uses_ansi_path ... ok
[INFO] [stdout] test cli::report::tests::github_actions_report_emits_error_annotations ... ok
[INFO] [stdout] test cli::report::tests::sarif_empty_findings_produces_empty_results ... ok
[INFO] [stdout] test cli::report::tests::sarif_includes_suggestion_as_fix ... ok
[INFO] [stdout] test cli::report::tests::sarif_report_contains_results_and_rules ... ok
[INFO] [stdout] test cli::report::tests::json_report_is_valid_json ... ok
[INFO] [stdout] test cli::report::tests::sarif_report_is_valid_sarif_json ... ok
[INFO] [stdout] test cli::report::tests::sarif_severity_maps_correctly ... ok
[INFO] [stdout] test cli::report::tests::text_report_groups_by_file ... ok
[INFO] [stdout] test cli::report::tests::text_report_repo_root_displays_as_friendly_label ... ok
[INFO] [stdout] test cli::report::tests::text_report_with_line_range_and_suggestion_covers_location_paths ... ok
[INFO] [stdout] test cli::report::tests::text_report_with_medium_and_low_color_covers_badge_paths ... ok
[INFO] [stdout] test cli::report::tests::text_summary_with_color_and_med_low_findings ... ok
[INFO] [stdout] test cli::scan::tests::effective_ci_settings_ci_flag_implies_medium_and_github_format ... ok
[INFO] [stdout] test cli::scan::tests::effective_ci_settings_ci_flag_preserves_explicit_json_format ... ok
[INFO] [stdout] test cli::scan::tests::effective_ci_settings_ci_flag_respects_explicit_fail_on ... ok
[INFO] [stdout] test cli::scan::tests::effective_ci_settings_no_ci_flag_no_env ... ok
[INFO] [stdout] test cli::scan::tests::effective_ci_settings_explicit_fail_on_preserved ... ok
[INFO] [stdout] test cli::report::tests::sarif_includes_line_range_when_present ... ok
[INFO] [stdout] test cli::report::tests::sarif_includes_papertowel_summary_properties ... ok
[INFO] [stdout] test cli::report::tests::text_report_with_color_enabled_runs_without_error ... ok
[INFO] [stdout] test cli::profile::tests::handle_list_returns_ok ... ok
[INFO] [stdout] test cli::learn::tests::handle_learn_on_empty_dir_returns_ok ... ok
[INFO] [stdout] test cli::learn::tests::handle_show_with_existing_baseline_prints_fields ... ok
[INFO] [stdout] test cli::hook::tests::install_refuses_to_overwrite_foreign_hook ... ok
[INFO] [stdout] test cli::hook::tests::uninstall_refuses_to_remove_foreign_hook ... ok
[INFO] [stdout] test cli::learn::tests::print_baseline_shows_commit_stats_section ... ok
[INFO] [stdout] test cli::hook::tests::uninstall_removes_papertowel_hook ... ok
[INFO] [stdout] test cli::hook::tests::install_force_overwrites_foreign_hook ... ok
[INFO] [stdout] test cli::scrub::tests::wants_all_detectors_when_list_is_empty ... ok
[INFO] [stdout] test cli::scrub::tests::wants_only_named_detector_when_list_is_set ... ok
[INFO] [stdout] test cli::tests::parses_clean_and_profile_commands ... ok
[INFO] [stdout] test cli::tests::parses_mcp_subcommands ... ok
[INFO] [stdout] test cli::tests::parses_scan_command_with_options ... ok
[INFO] [stdout] test cli::tests::parses_scrub_command_with_detectors ... ok
[INFO] [stdout] test cli::hook::tests::install_creates_executable_hook ... ok
[INFO] [stdout] test cli::tests::parses_wring_subcommands ... ok
[INFO] [stdout] test cli::tests::run_from_learn_repo_command_returns_ok ... ok
[INFO] [stdout] test cli::tests::run_from_learn_show_command_returns_ok ... ok
[INFO] [stdout] test cli::tests::run_from_profile_create_returns_ok ... ok
[INFO] [stdout] test cli::tests::run_from_profile_list_returns_ok ... ok
[INFO] [stdout] test cli::tests::run_from_profile_show_returns_ok ... ok
[INFO] [stdout] test cli::hook::tests::uninstall_noop_when_no_hook ... ok
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout]  No changes made
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout] test cli::scrub::tests::handle_empty_dir_returns_ok ... ok
[INFO] [stdout] test cli::tests::run_from_wring_drip_dispatches_drip_handler ... ok
[INFO] [stdout] test cli::tests::run_from_wring_queue_dispatches_queue_handler ... ok
[INFO] [stdout] test cli::tests::run_from_wring_status_returns_ok ... ok
[INFO] [stdout] test cli::wring::tests::handle_drip_no_daemon_attempts_tick_on_current_dir ... ok
[INFO] [stdout] test cli::wring::tests::handle_queue_returns_ok_on_current_branch ... ignored, requires local git workspace with commit history; run with --include-ignored
[INFO] [stdout] test cli::wring::tests::handle_queue_with_from_branch_returns_ok ... ignored, requires local git workspace with commit history; run with --include-ignored
[INFO] [stdout] test cli::wring::tests::handle_status_without_config_prints_init_message ... ok
[INFO] [stdout] test cli::wring::tests::handle_unlock_stale_returns_ok ... ok
[INFO] [stdout] /tmp/.tmpmUlklI/slop.rs
[INFO] [stdout]  [recipe] 6 replacements
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout]  1 file would change · 6 recipe
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout] test cli::scrub::tests::dry_run_does_not_modify_files ... ok
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] test cli::hook::tests::install_idempotent_when_already_installed ... ok
[INFO] [stdout] test config::tests::discover_falls_back_to_start_when_no_marker ... ok
[INFO] [stdout] test cli::scan::tests::handle_returns_ok_on_empty_directory ... ok
[INFO] [stdout] test config::tests::config_roundtrips_toml ... ok
[INFO] [stdout] test config::tests::discover_finds_root_by_git_dir ... ok
[INFO] [stdout] test config::tests::discover_finds_root_by_papertowel_toml ... ok
[INFO] [stdout] test config::tests::global_config_missing_file_returns_default ... ok
[INFO] [stdout] test config::tests::missing_config_returns_default ... ok
[INFO] [stdout] test config::tests::no_ignore_patterns_returns_none_matcher ... ok
[INFO] [stdout] test config::tests::global_config_is_loaded_from_file ... ok
[INFO] [stdout] test config::tests::papertowelignore_file_is_respected ... ok
[INFO] [stdout] test config::tests::inline_exclude_pattern_ignores_vendor ... ok
[INFO] [stdout] test config::tests::non_ignored_path_passes_through ... ok
[INFO] [stdout] test detection::coraline::tests::collect_candidate_files_falls_back_to_filesystem_scan ... ok
[INFO] [stdout] test config::tests::partial_toml_uses_defaults_for_missing_sections ... ok
[INFO] [stdout] test config::tests::resolve_config_finds_ignore_from_subdirectory ... ok
[INFO] [stdout] test detection::coraline::tests::collect_candidate_files_uses_coraline_manifest_when_available ... ok
[INFO] [stdout] test detection::coraline::tests::coraline_dir_with_no_manifest_falls_back_to_filesystem ... ok
[INFO] [stdout] test detection::finding::tests::finding_confidence_boundary_values_accepted ... ok
[INFO] [stdout] test detection::finding::tests::finding_constructor_rejects_empty_description ... ok
[INFO] [stdout] test detection::finding::tests::finding_constructor_rejects_empty_id ... ok
[INFO] [stdout] test config::tests::discover_finds_root_by_papertowelignore ... ok
[INFO] [stdout] test detection::finding::tests::finding_constructor_rejects_invalid_confidence ... ok
[INFO] [stdout] test detection::finding::tests::finding_constructor_validates_fields ... ok
[INFO] [stdout] test detection::finding::tests::line_range_contains_expected_lines ... ok
[INFO] [stdout] test detection::finding::tests::line_range_rejects_invalid_bounds ... ok
[INFO] [stdout] test detection::finding::tests::line_range_single_line ... ok
[INFO] [stdout] test detection::finding::tests::severity_ordering ... ok
[INFO] [stdout] test detection::grading::tests::empty_findings_perfect_score ... ok
[INFO] [stdout] test detection::grading::tests::grade_from_slop_score_boundaries ... ok
[INFO] [stdout] test detection::grading::tests::grade_meets_minimum ... ok
[INFO] [stdout] test detection::grading::tests::grade_ordering_lower_is_better ... ok
[INFO] [stdout] test detection::grading::tests::grade_parse_roundtrip ... ok
[INFO] [stdout] test detection::finding::tests::line_range_zero_start_rejected ... ok
[INFO] [stdout] test detection::coraline::tests::resolve_backend_prefers_coraline_when_present ... ok
[INFO] [stdout] test detection::coraline::tests::scan_repo_filesystem_skips_files_inside_ignored_dirs ... ok
[INFO] [stdout] test detection::language::tests::from_extension_maps_known_extensions ... ok
[INFO] [stdout] test detection::language::tests::from_extension_maps_remaining_variants ... ok
[INFO] [stdout] test detection::language::tests::hash_comments_only_for_python ... ok
[INFO] [stdout] test detection::language::tests::is_analysable_true_for_known_languages ... ok
[INFO] [stdout] test detection::language::tests::line_comment_prefix_python_is_hash ... ok
[INFO] [stdout] test detection::scoring::tests::classify_maps_to_expected_severity ... ok
[INFO] [stdout] test detection::scoring::tests::score_breakdown_total_sums_components ... ok
[INFO] [stdout] test domain::commands::tests::output_format_defaults_to_text ... ok
[INFO] [stdout] test domain::commands::tests::severity_threshold_defaults_to_medium ... ok
[INFO] [stdout] test domain::errors::tests::io_error_with_path_mentions_path ... ok
[INFO] [stdout] test domain::queries::tests::profile_list_query_defaults_to_including_builtins ... ok
[INFO] [stdout] test learning::baseline::tests::comment_density_threshold_lower_bound ... ok
[INFO] [stdout] {
[INFO] [stdout]   "summary": {
[INFO] [stdout]     "total_findings": 0,
[INFO] [stdout]     "by_severity": {},
[INFO] [stdout]     "by_category": {},
[INFO] [stdout]     "ai_probability": 0.0
[INFO] [stdout]   },
[INFO] [stdout]   "findings": []
[INFO] [stdout] }
[INFO] [stdout] test learning::baseline::tests::comment_density_threshold_scales_with_density ... ok
[INFO] [stdout] test cli::scan::tests::handle_json_format_returns_ok ... ok
[INFO] [stdout] test learning::baseline::tests::load_returns_none_when_file_absent ... ok
[INFO] [stdout] test learning::baseline::tests::comment_density_threshold_upper_bound ... ok
[INFO] [stdout] test learning::learner::tests::baseline_reflects_comment_density ... ok
[INFO] [stdout] test learning::learner::tests::commit_stats_default_is_zero ... ok
[INFO] [stdout] test learning::learner::tests::error_on_empty_dir ... ok
[INFO] [stdout] test learning::learner::tests::extract_baseline_skips_unreadable_file_and_continues ... ok
[INFO] [stdout] test learning::baseline::tests::save_and_load_roundtrip ... ok
[INFO] [stdout] test learning::learner::tests::extract_baseline_zero_total_lines_produces_zero_slop_rate ... ok
[INFO] [stdout] test detection::language::tests::doc_comment_pattern_compiles_for_all_variants ... ok
[INFO] [stdout] /tmp/.tmpKoG7u4/slop.rs
[INFO] [stdout]  [recipe] 5 replacements
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout]  1 file changed · 5 recipe
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout] test cli::scrub::tests::live_run_replaces_slop_vocabulary ... ok
[INFO] [stdout] test learning::learner::tests::is_conventional_commit_recognises_types ... ok
[INFO] [stdout] test learning::learner::tests::extract_commit_stats_returns_none_for_non_git_dir ... ok
[INFO] [stdout] test learning::learner::tests::is_wip_message_recognises_wip ... ok
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] test learning::learner::tests::non_analysable_files_are_skipped ... ok
[INFO] [stdout] test learning::learner::tests::short_files_are_skipped_for_density_averaging ... ok
[INFO] [stdout] test learning::learner::tests::zero_comment_lines_produces_zero_doc_ratio ... ok
[INFO] [stdout] test learning::learner::tests::slop_hits_are_counted ... ok
[INFO] [stdout] test profile::persona::tests::built_in_profiles_are_valid ... ok
[INFO] [stdout] test cli::scan::tests::handle_fail_on_none_does_not_exit ... ok
[INFO] [stdout] test learning::learner::tests::extract_commit_stats_counts_wip_messages ... ok
[INFO] [stdout] test profile::persona::tests::is_valid_hhmm_rejects_non_numeric_parts ... ok
[INFO] [stdout] test profile::persona::tests::is_valid_hhmm_rejects_missing_colon ... ok
[INFO] [stdout] ::notice title=papertowel summary::0 finding(s) — AI probability 0%
[INFO] [stdout] test profile::persona::tests::profile_roundtrips_toml ... ok
[INFO] [stdout] test profile::persona::tests::default_impls_are_sane ... ok
[INFO] [stdout] test profile::persona::tests::save_and_load_profile_file ... ok
[INFO] [stdout] test cli::scan::tests::handle_github_actions_format_returns_ok ... ok
[INFO] [stdout] test profile::persona::tests::validate_rejects_active_hours_wrong_delimiter ... ok
[INFO] [stdout] test profile::persona::tests::validate_rejects_empty_timezone ... ok
[INFO] [stdout] test profile::persona::tests::validate_rejects_zero_commits_per_session ... ok
[INFO] [stdout] test profile::persona::tests::validate_rejects_empty_name ... ok
[INFO] [stdout] test profile::persona::tests::validate_rejects_empty_active_hours ... ok
[INFO] [stdout] test learning::learner::tests::extract_commit_stats_on_repo_with_commits ... ok
[INFO] [stdout] test recipe::matcher::tests::whole_word_boundary_respected ... ok
[INFO] [stdout] test profile::persona::tests::validate_rejects_invalid_time_range_format ... ok
[INFO] [stdout] test recipe::matcher::tests::word_matching_works ... ok
[INFO] [stdout] test recipe::scrubber::tests::scrubber_no_change_when_no_matches ... ok
[INFO] [stdout] test recipe::scrubber::tests::scrubber_compiles_recipes ... ok
[INFO] [stdout] test recipe::loader::tests::load_from_temp_directory ... ok
[INFO] [stdout] test recipe::scrubber::tests::scrubber_transforms_phrases ... ok
[INFO] [stdout] test recipe::types::tests::parse_minimal_recipe ... ok
[INFO] [stdout] test recipe::scrubber::tests::scrubber_transforms_words ... ok
[INFO] [stdout] test recipe::scrubber::tests::scrubber_normalizes_spacing ... ok
[INFO] [stdout] test recipe::loader::tests::exclude_filter_works ... ok
[INFO] [stdout] test scrubber::architecture::tests::layer_indicators_include_common_patterns ... ok
[INFO] [stdout] test scrubber::architecture::tests::metrics_trait_ratio_calculates ... ok
[INFO] [stdout] test recipe::types::tests::parse_regex_pattern ... ok
[INFO] [stdout] test scrubber::architecture::tests::metrics_anemic_ratio_calculates ... ok
[INFO] [stdout] test scrubber::architecture::tests::metrics_trait_ratio_empty ... ok
[INFO] [stdout] test scrubber::comments::tests::analyze_comments_returns_zero_density_for_code_only ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_file_flags_overdocumented_source ... ok
[INFO] [stdout] test scrubber::comments::tests::comment_line_range_returns_none_for_code_only ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_file_processes_real_file ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_in_text_flags_tutorial_heavy_comments ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_in_text_produces_high_severity_when_very_dense ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_in_text_returns_empty_for_file_below_min_non_empty_lines ... ok
[INFO] [stdout] test scrubber::comments::tests::analyze_comments_returns_zero_density_for_empty_content ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_in_text_skips_light_commenting ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_in_text_returns_empty_when_density_below_threshold ... ok
[INFO] [stdout] test scrubber::comments::tests::detect_in_text_produces_medium_severity_when_phrase_hits_at_threshold ... ok
[INFO] [stdout] test scrubber::comments::tests::transform_file_honors_dry_run ... ok
[INFO] [stdout] test scrubber::comments::tests::rust_attributes_are_not_treated_as_comment_lines ... ok
[INFO] [stdout] test scrubber::comments::tests::transform_text_deduplicates_consecutive_blank_lines ... ok
[INFO] [stdout] test scrubber::comments::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::comments::tests::transform_file_writes_changes_when_not_dry_run ... ok
[INFO] [stdout] test scrubber::comments::tests::transform_text_drops_repeated_non_tutorial_prefix ... ok
[INFO] [stdout] test scrubber::comments::tests::transform_text_normalize_prefix_returns_none_for_empty_body ... ok
[INFO] [stdout] test scrubber::comments::tests::transform_text_removes_tutorial_noise_and_keeps_safety_notes ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::below_min_commit_count_skipped ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::cadence_cv_handles_same_timestamp_commits ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::below_min_commit_count_returns_empty ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::cadence_cv_handles_single_commit ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::conventional_prefix_detection ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::conventional_prefix_all_types_accepted ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::conventional_prefix_with_scope_accepted ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::detect_repo_delegates_to_with_config ... ok
[INFO] [stdout] test recipe::types::tests::parse_phrase_with_suggestion ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::detect_repo_on_invalid_path_returns_error ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::empty_commits_returns_zero_metrics ... ok
[INFO] [stdout] test profile::persona::tests::invalid_probability_rejected ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::messy_commits_not_detected ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::recovery_terms_are_counted ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::signal_below_threshold_produces_no_finding ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::detect_repo_returns_empty_when_below_min_commit_count ... ok
[INFO] [stdout] test scrubber::comments::tests::analyze_comments_reports_density ... ok
[INFO] [stdout] test scrubber::comments::tests::transform_text_removes_consecutive_duplicate_comment_prefix ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::three_signal_finding_is_high_severity ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::two_commit_sample_returns_non_zero_cadence ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::uniform_cadence_and_messages_detected ... ok
[INFO] [stdout] test scrubber::idiom_mismatch::tests::idiom_detector_flags_cross_language_rust_file ... ok
[INFO] [stdout] test scrubber::idiom_mismatch::tests::detect_file_reads_real_file ... ok
[INFO] [stdout] test scrubber::idiom_mismatch::tests::idiom_detector_high_severity_when_foreign_hits_gte_six ... ok
[INFO] [stdout] test scrubber::idiom_mismatch::tests::idiom_detector_ignores_idiomatic_rust ... ok
[INFO] [stdout] test scrubber::idiom_mismatch::tests::idiom_detector_ignores_non_rust_files ... ok
[INFO] [stdout] test scrubber::idiom_mismatch::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::doc_comment_directive_is_recognised ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::filter_findings_keeps_findings_without_line_range ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::empty_content_produces_no_directives ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::ignore_file_directive_detected_in_hash_comment ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::ignore_file_directive_detected_in_rust_comment ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::filter_findings_removes_suppressed ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::ignore_next_line_suppresses_correct_line ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::is_empty_returns_false_when_lines_suppressed ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::is_empty_returns_false_when_file_ignored ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::multiple_ignore_next_line_directives ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::detect_repo_returns_empty_when_signal_count_below_two ... ok
[INFO] [stdout] test scrubber::lexical::tests::corpus_contains_key_reference_phrase ... ok
[INFO] [stdout] test scrubber::lexical::tests::build_line_range_no_offsets_returns_none ... ok
[INFO] [stdout] test scrubber::lexical::tests::detect_in_text_flags_clustered_slop ... ok
[INFO] [stdout] test scrubber::lexical::tests::detect_in_text_returns_empty_for_sparse_terms ... ok
[INFO] [stdout] test scrubber::lexical::tests::detect_file_reads_and_processes_content ... ok
[INFO] [stdout] test scrubber::lexical::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::parse_file_reads_from_disk ... ok
[INFO] [stdout] test scrubber::maintenance::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::maintenance::tests::detect_repo_delegates_to_with_config ... ok
[INFO] [stdout] test scrubber::maintenance::tests::hollow_repo_produces_medium_severity_with_many_code_files ... ok
[INFO] [stdout] test scrubber::maintenance::tests::maintenance_detector_flags_hollow_repo_shape ... ok
[INFO] [stdout] test scrubber::maintenance::tests::maintenance_detector_ignores_active_repo_shape ... ok
[INFO] [stdout] test scrubber::metadata::tests::detect_repo_delegates_to_with_config ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::medium_severity_when_exactly_two_signals ... ok
[INFO] [stdout] test scrubber::maintenance::tests::no_extension_file_and_git_dir_do_not_panic ... ok
[INFO] [stdout] test scrubber::metadata::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::metadata::tests::metadata_detector_ignores_sparse_docs ... ok
[INFO] [stdout] test detection::language::tests::fn_pattern_compiles_for_all_variants ... ok
[INFO] [stdout] test scrubber::metadata::tests::metadata_detector_flags_policy_bundle ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::detect_repo_returns_medium_severity_when_generic_hits_below_high_threshold ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::detect_repo_delegates_to_with_config ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::high_severity_when_generic_hits_and_repetitions_are_high ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::name_detector_flags_generic_repetitive_names ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::git_directory_and_non_file_entries_are_skipped ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::name_detector_ignores_specific_names ... ok
[INFO] [stdout] test scrubber::commit_pattern::tests::three_signals_produces_high_severity_finding_via_detect_repo ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::repo_without_readme_produces_zero_repetitions ... ok
[INFO] [stdout] test scrubber::promotion::tests::detect_repo_delegates_to_with_config ... ok
[INFO] [stdout] test scrubber::promotion::tests::detect_repo_produces_medium_severity_with_fewer_hits ... ok
[INFO] [stdout] test scrubber::promotion::tests::detect_repo_skips_files_without_extension ... ok
[INFO] [stdout] test scrubber::promotion::tests::promotion_detector_flags_showcase_stack ... ok
[INFO] [stdout] test scrubber::promotion::tests::promotion_detector_ignores_balanced_repo ... ok
[INFO] [stdout] test scrubber::ignore_directives::tests::directive_inside_normal_text_is_not_matched ... ok
[INFO] [stdout] test scrubber::prompt::tests::detect_file_reads_real_file ... ok
[INFO] [stdout] test scrubber::promotion::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::name_credibility::tests::missing_cargo_toml_name_returns_error ... ok
[INFO] [stdout] test scrubber::metadata::tests::high_severity_when_four_files_and_eight_hits ... ok
[INFO] [stdout] test scrubber::prompt::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::prompt::tests::prompt_detector_flags_leakage_markers ... ok
[INFO] [stdout] test scrubber::readme::tests::detect_in_text_handles_blank_heading_in_readme ... ok
[INFO] [stdout] test scrubber::readme::tests::detect_file_reads_real_file ... ok
[INFO] [stdout] test scrubber::readme::tests::high_severity_when_section_and_phrase_thresholds_exceeded ... ok
[INFO] [stdout] test scrubber::readme::tests::readme_detector_flags_template_bundles ... ok
[INFO] [stdout] test scrubber::readme::tests::transform_file_honors_dry_run ... ok
[INFO] [stdout] test scrubber::readme::tests::transform_file_writes_when_not_dry_run ... ok
[INFO] [stdout] test scrubber::readme::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::readme::tests::transform_text_removes_template_phrases_and_empty_sections ... ok
[INFO] [stdout] test scrubber::readme::tests::transform_text_collapses_consecutive_blank_lines ... ok
[INFO] [stdout] test scrubber::readme::tests::transform_text_handles_empty_content ... ok
[INFO] [stdout] test scrubber::prompt::tests::prompt_detector_ignores_clean_text ... ok
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] test cli::tests::run_from_scan_command_returns_ok ... ok
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout]  No changes made
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] test scrubber::security::tests::sec001_sql_injection_python_single_quote ... ok
[INFO] [stdout] test cli::scan::tests::handle_severity_filter_returns_ok ... ok
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] /tmp/.tmpKvmVfY/lib.rs
[INFO] [stdout]  [HIGH] structure — function count: 8, length CV: 0.00, docstring coverage: 0%, pub fraction: 100%
[INFO] [stdout]  at /tmp/.tmpKvmVfY/lib.rs:1
[INFO] [stdout]  → Vary function lengths, docstring styles, and visibility to reduce structural uniformity.
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout]  1 findings · HIGH 1 · AI likelihood 40%
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] test scrubber::security::tests::sec001_sql_injection_go ... ok
[INFO] [stdout] test scrubber::security::tests::sec003_go_short_decl ... ok
[INFO] [stdout] test scrubber::security::tests::sec003_no_false_positive_on_placeholder ... ok
[INFO] [stdout] test scrubber::security::tests::sec003_hardcoded_password ... ok
[INFO] [stdout] test cli::scan::tests::handle_with_saved_baseline_uses_comment_config ... ok
[INFO] [stdout] test scrubber::security::tests::sec003_hardcoded_api_key ... ok
[INFO] [stdout] test cli::scan::tests::handle_returns_ok_with_rust_file ... ok
[INFO] [stdout] test scrubber::security::tests::sec008_no_path_traversal_fixed_path ... ok
[INFO] [stdout] test scrubber::security::tests::sec005_tls_skip_verify_go ... ok
[INFO] [stdout] test scrubber::security::tests::sec006_jwt_alg_none ... ok
[INFO] [stdout] test scrubber::security::tests::sec004_md5_typescript ... ok
[INFO] [stdout] test scrubber::readme::tests::readme_detector_ignores_repo_specific_content ... ok
[INFO] [stdout] test scrubber::security::tests::sec007_dangerous_inner_html ... ok
[INFO] [stdout] test scrubber::security::tests::sec004_sha1_python ... ok
[INFO] [stdout] test scrubber::security::tests::sec009_logging_password ... ok
[INFO] [stdout] test scrubber::security::tests::sec008_path_traversal_request_param ... ok
[INFO] [stdout] test scrubber::security::tests::sec002_exec_dynamic ... ok
[INFO] [stdout] test scrubber::security::tests::sec001_sql_injection_python ... ok
[INFO] [stdout] test scrubber::security::tests::sec015_todo_in_auth ... ok
[INFO] [stdout] test scrubber::security::tests::sec013_ssrf_user_url ... ok
[INFO] [stdout] test scrubber::security::tests::sec005_tls_skip_verify_python ... ok
[INFO] [stdout] test scrubber::security::tests::sec012_pickle_loads ... ok
[INFO] [stdout] test scrubber::security::tests::sec012_yaml_load_unsafe ... ok
[INFO] [stdout] test scrubber::security::tests::sec014_hardcoded_iv_zero ... ok
[INFO] [stdout] test scrubber::security::tests::sec010_debug_true_python ... ok
[INFO] [stdout] test scrubber::security::tests::sec011_math_random_token ... ok
[INFO] [stdout] test scrubber::structure::tests::analyze_structure_returns_zero_metrics_for_empty ... ok
[INFO] [stdout] test scrubber::structure::tests::analyze_structure_with_zero_length_functions_returns_zero_cv ... ok
[INFO] [stdout] test scrubber::structure::tests::detect_in_text_with_no_matching_functions_returns_empty ... ok
[INFO] [stdout] test scrubber::structure::tests::python_uniform_functions_detected ... ok
[INFO] [stdout] test scrubber::structure::tests::medium_severity_when_two_signals_present ... ok
[INFO] [stdout] test scrubber::structure::tests::detect_file_delegates_to_detect_file_for_language ... ok
[INFO] [stdout] test scrubber::structure::tests::go_uniform_functions_detected ... ok
[INFO] [stdout] test scrubber::structure::tests::detect_file_for_language_reads_real_file ... ok
[INFO] [stdout] test scrubber::structure::tests::below_min_function_count_skips_analysis ... ok
[INFO] [stdout] test scrubber::structure::tests::low_cv_detected_for_identical_length_functions ... ok
[INFO] [stdout] test scrubber::structure::tests::csharp_public_functions_mark_pub_fraction ... ok
[INFO] [stdout] test scrubber::structure::tests::unclosed_brace_in_rust_file_does_not_panic ... ok
[INFO] [stdout] test scrubber::structure::tests::typescript_export_functions_mark_pub_fraction ... ok
[INFO] [stdout] test scrubber::structure::tests::two_or_more_signals_produces_a_finding ... ok
[INFO] [stdout] test scrubber::structure::tests::high_severity_when_all_three_signals_present ... ok
[INFO] [stdout] test scrubber::structure::tests::varied_functions_not_detected ... ok
[INFO] [stdout] test scrubber::tests::tests::detect_file_reads_real_file ... ok
[INFO] [stdout] test scrubber::structure::tests::detect_file_for_language_cpp_reads_real_file ... ok
[INFO] [stdout] test scrubber::tests::tests::below_min_test_count_produces_no_finding ... ok
[INFO] [stdout] test scrubber::tests::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::structure::tests::zig_pub_functions_mark_pub_fraction ... ok
[INFO] [stdout] test scrubber::tests::tests::csharp_xunit_and_should_lines_are_counted ... ok
[INFO] [stdout] test scrubber::tests::tests::go_test_shape_detected ... ok
[INFO] [stdout] test scrubber::tests::tests::go_fatal_fail_require_assert_lines_are_counted ... ok
[INFO] [stdout] test scrubber::tests::tests::medium_severity_when_assert_density_below_high_threshold ... ok
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] test scrubber::tests::tests::detect_file_for_language_csharp_reads_real_file ... ok
[INFO] [stdout] test scrubber::tests::tests::python_assert_equal_and_assert_called_lines_are_counted ... ok
[INFO] [stdout] test cli::scan::tests::handle_with_git_repo_exercises_repo_detectors ... ok
[INFO] [stdout] test scrubber::tests::tests::zig_test_shape_detected ... ok
[INFO] [stdout] test scrubber::tests::tests::empty_content_returns_no_findings ... ok
[INFO] [stdout] test scrubber::workflow::tests::detect_repo_returns_medium_severity_when_below_high_threshold ... ok
[INFO] [stdout] test scrubber::tests::tests::python_test_shape_detected ... ok
[INFO] [stdout] test scrubber::tests::tests::typescript_test_shape_detected ... ok
[INFO] [stdout] test scrubber::workflow::tests::detect_repo_delegates_to_with_config ... ok
[INFO] [stdout] test scrubber::workflow::tests::detector_name_is_stable ... ok
[INFO] [stdout] test scrubber::workflow::tests::workflow_detector_produces_high_severity_for_large_burst ... ok
[INFO] [stdout] test scrubber::tests::tests::detect_in_text_for_language_cpp_uniform_tests ... ok
[INFO] [stdout] test wringer::archaeology::tests::inject_before_entry_returns_zero_for_empty_dir ... ok
[INFO] [stdout] test scrubber::workflow::tests::workflow_detector_flags_template_burst ... ok
[INFO] [stdout] test wringer::archaeology::tests::collect_rs_files_skips_git_and_target ... ok
[INFO] [stdout] test scrubber::workflow::tests::workflow_detector_ignores_small_real_setup ... ok
[INFO] [stdout] test wringer::archaeology::tests::relative_to_returns_error_when_outside_root ... ok
[INFO] [stdout] test scrubber::tests::tests::unknown_language_config_covers_test_prefix_predicate ... ok
[INFO] [stdout] test wringer::drip::tests::builder_methods_set_fields ... ok
[INFO] [stdout] test wringer::drip::tests::new_returns_error_when_no_config_file ... ok
[INFO] [stdout] test wringer::drip::tests::pending_count_counts_only_future_uncompleted ... ok
[INFO] [stdout] test wringer::config::tests::config_roundtrips_toml ... ok
[INFO] [stdout] test wringer::config::tests::to_spec_produces_matching_worktree_spec ... ok
[INFO] [stdout] test scrubber::tests::tests::test_shape_detector_flags_repeated_template_style ... ok
[INFO] [stdout] test wringer::drip::tests::tick_skips_already_completed_entries ... ok
[INFO] [stdout] test wringer::lock::tests::lock_file_is_created_with_metadata ... ok
[INFO] [stdout] test wringer::drip::tests::tick_skips_future_entries ... ok
[INFO] [stdout] test wringer::drip::tests::tick_returns_zero_stats_when_no_entries ... ok
[INFO] [stdout] test wringer::messages::tests::apply_entropy_short_circuit_fires_when_forced ... ok
[INFO] [stdout] test wringer::messages::tests::conventional_message_strips_nested_prefix ... ok
[INFO] [stdout] test wringer::messages::tests::conventional_style_uses_scope_prefix ... ok
[INFO] [stdout] test wringer::lock::tests::read_lock_info_reports_active_state ... ok
[INFO] [stdout] test wringer::lock::tests::stale_lock_recovery_does_not_remove_active_lock ... ok
[INFO] [stdout] test wringer::lock::tests::stale_lock_recovery_removes_unlocked_file ... ok
[INFO] [stdout] test wringer::messages::tests::humanize_queue_plan_updates_entry_messages ... ok
[INFO] [stdout] test wringer::messages::tests::entropy_injection_changes_message_when_rates_are_high ... ok
[INFO] [stdout] test wringer::messages::tests::humanize_queue_plan_wrapper_works ... ok
[INFO] [stdout] test wringer::messages::tests::infer_scope_produces_two_part_scope ... ok
[INFO] [stdout] test wringer::messages::tests::inject_typo_drop_path_covered ... ok
[INFO] [stdout] test wringer::messages::tests::mixed_style_produces_valid_message ... ok
[INFO] [stdout] test wringer::messages::tests::inject_typo_short_string_returns_unchanged ... ok
[INFO] [stdout] test wringer::messages::tests::lazy_style_picks_short_message ... ok
[INFO] [stdout] test wringer::messages::tests::normalize_subject_empty_string_returns_fallback ... ok
[INFO] [stdout] test wringer::messages::tests::random_capitalization_empty_string_returns_empty ... ok
[INFO] [stdout] test wringer::messages::tests::inject_typo_swap_path_covered ... ok
[INFO] [stdout] test wringer::messages::tests::split_action_uses_refactor_verb ... ok
[INFO] [stdout] test wringer::messages::tests::summarize_subject_adds_suffix_for_squash ... ok
[INFO] [stdout] test wringer::messages::tests::wip_frequency_one_fires_wip_branch ... ok
[INFO] [stdout] test wringer::messages::tests::random_capitalization_uppercase_path_covered ... ok
[INFO] [stdout] test wringer::messages::tests::squash_action_uses_feat_verb ... ok
[INFO] [stdout] test wringer::queue::tests::file_touch_counts_accumulates_per_file ... ok
[INFO] [stdout] test wringer::queue::tests::group_into_sessions_splits_on_large_gap ... ok
[INFO] [stdout] test wringer::queue::tests::next_active_time_empty_windows_returns_plus_one_hour ... ok
[INFO] [stdout] test wringer::lock::tests::second_lock_acquire_is_rejected ... ok
[INFO] [stdout] test wringer::archaeology::tests::zero_rates_injects_nothing ... ok
[INFO] [stdout] test wringer::archaeology::tests::both_rates_one_creates_four_commits ... ok
[INFO] [stdout] test wringer::queue::tests::replay_action_classifies_many_roots_as_split ... ok
[INFO] [stdout] test wringer::queue::tests::replay_action_classifies_multi_commit_group_as_squash ... ok
[INFO] [stdout] test wringer::queue::tests::squash_groups_merges_overlapping_files ... ok
[INFO] [stdout] test wringer::queue::tests::squash_groups_splits_on_non_overlapping_files ... ok
[INFO] [stdout] test wringer::queue::tests::replay_action_classifies_single_module_as_replay ... ok
[INFO] [stdout] test wringer::archaeology::tests::dead_code_rate_one_creates_two_commits ... ok
[INFO] [stdout] test scrubber::structure::tests::uniform_functions_detected ... ok
[INFO] [stdout] test scrubber::tests::tests::test_shape_detector_ignores_varied_tests ... ok
[INFO] [stdout] test wringer::archaeology::tests::todo_rate_one_creates_two_commits ... ok
[INFO] [stdout] test wringer::worktree::tests::initialize_worktree_creates_worktree_and_branch ... ok
[INFO] [stdout] test wringer::worktree::tests::remove_worktree_returns_false_when_missing ... ok
[INFO] [stdout] test wringer::queue::tests::build_queue_plan_produces_entries_for_pending_commits ... ok
[INFO] [stdout] test wringer::queue::tests::collect_pending_commits_returns_commits_from_branch ... ok
[INFO] [stdout] test wringer::worktree::tests::status_reports_nonexistent_worktree ... ok
[INFO] [stdout] test wringer::worktree::tests::initialize_worktree_is_idempotent ... ok
[INFO] [stdout] test wringer::worktree::tests::initialize_worktree_uses_existing_branch_when_present ... ok
[INFO] [stdout] test wringer::queue::tests::queue_plan_roundtrips_json ... ok
[INFO] [stdout] test wringer::queue::tests::collect_pending_commits_stops_at_sync_oid ... ok
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout]  No changes made
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout] test cli::tests::run_from_scrub_command_returns_ok ... ok
[INFO] [stdout] test scrubber::tests::tests::medium_severity_when_prefix_ratio_below_threshold ... ok
[INFO] [stdout] test detection::language::tests::fn_pattern_matches_expected_syntax ... ok
[INFO] [stdout] No findings. AI likelihood 0%
[INFO] [stdout] test cli::scan::tests::handle_with_severity_low_and_medium_filters ... ok
[INFO] [stdout] test wringer::worktree::tests::remove_worktree_prunes_existing_worktree ... ok
[INFO] [stdout] ./src/recipe/types.rs
[INFO] [stdout]  [ LOW] comment — Obvious getter documentation
[INFO] [stdout]  at ./src/recipe/types.rs:158
[INFO] [stdout]  → Omit if purpose is clear from signature
[INFO] [stdout]  [ LOW] comment — Obvious getter documentation
[INFO] [stdout]  at ./src/recipe/types.rs:236
[INFO] [stdout]  → Omit if purpose is clear from signature
[INFO] [stdout] 
[INFO] [stdout] ./src/wringer/archaeology.rs
[INFO] [stdout]  [ MED] security — TODO or FIXME comment inside authentication or authorisation logic. AI frequently stubs out security checks and marks them for later — which in practice means never.
[INFO] [stdout]  at ./src/wringer/archaeology.rs:22
[INFO] [stdout]  → Implement the security check now; never ship a TODO inside auth/authz code. If this is intentional, track it in the issue tracker and add a test that will fail until it is addressed.
[INFO] [stdout] 
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout]  3 findings · MED 1 LOW 2 · AI likelihood 10%
[INFO] [stdout] ────────────────────────────────────────────────────
[INFO] [stdout] test cli::tests::run_from_clean_command_returns_ok ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 404 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 3.18s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/papertowel-8fa127dad89cdfd8)
[INFO] [stdout] 
[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] [stderr]      Running tests/integration.rs (/opt/rustwide/target/debug/deps/integration-74e09c5679537c59)
[INFO] [stdout] 
[INFO] [stdout] running 8 tests
[INFO] [stdout] test scan_slop_repo_exits_zero_without_fail_on ... ok
[INFO] [stdout] test scan_slop_repo_fail_on_medium_exits_nonzero ... ok
[INFO] [stdout] test scan_clean_repo_exits_zero ... ok
[INFO] [stdout] test scan_template_repo_exits_zero_without_fail_on ... ok
[INFO] [stdout] test scan_template_repo_produces_readme_findings ... ok
[INFO] [stdout] test scan_slop_repo_json_is_valid ... ok
[INFO] [stdout] test scan_slop_repo_produces_output ... ok
[INFO] [stdout] test scan_clean_repo_fail_on_medium_exits_zero ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.66s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests papertowel
[INFO] [stdout] 
[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] running `Command { std: "docker" "inspect" "094c5646134bb8d154c301f12f677736b70a31fb52c177594db6c9c112e92374", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "094c5646134bb8d154c301f12f677736b70a31fb52c177594db6c9c112e92374", kill_on_drop: false }`
[INFO] [stdout] 094c5646134bb8d154c301f12f677736b70a31fb52c177594db6c9c112e92374
