[INFO] fetching crate ptuf 0.4.1...
[INFO] testing ptuf-0.4.1 against 1.98.0-beta.1 for beta-1.98-1
[INFO] extracting crate ptuf 0.4.1 into /workspace/builds/worker-5-tc2/source
[INFO] started tweaking crates.io crate ptuf 0.4.1
[INFO] finished tweaking crates.io crate ptuf 0.4.1
[INFO] tweaked toml for crates.io crate ptuf 0.4.1 written to /workspace/builds/worker-5-tc2/source/Cargo.toml
[INFO] validating manifest of crates.io crate ptuf 0.4.1 on toolchain 1.98.0-beta.1
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.1" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate ptuf 0.4.1 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.98.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-5-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-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:3d5ced03c013a94a2f102a4510f48a6e9184255caf5fd8244f58017bde7f5210" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732
[INFO] running `Command { std: "docker" "start" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732", 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" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732", 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" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "build" "--frozen" "--message-format=json", 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 serde_core v1.0.228
[INFO] [stderr]    Compiling memchr v2.8.0
[INFO] [stderr]    Compiling equivalent v1.0.2
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling zmij v1.0.21
[INFO] [stderr]    Compiling hashbrown v0.17.0
[INFO] [stderr]    Compiling winnow v1.0.2
[INFO] [stderr]    Compiling regex-syntax v0.8.11
[INFO] [stderr]    Compiling itoa v1.0.18
[INFO] [stderr]    Compiling serde_json v1.0.150
[INFO] [stderr]    Compiling powerfmt v0.2.0
[INFO] [stderr]    Compiling num-conv v0.2.2
[INFO] [stderr]    Compiling deranged v0.5.8
[INFO] [stderr]    Compiling toml_datetime v1.1.1+spec-1.1.0
[INFO] [stderr]    Compiling toml_writer v1.1.1+spec-1.1.0
[INFO] [stderr]    Compiling time-core v0.1.9
[INFO] [stderr]    Compiling unsafe-libyaml v0.2.11
[INFO] [stderr]    Compiling ryu v1.0.23
[INFO] [stderr]    Compiling indexmap v2.14.0
[INFO] [stderr]    Compiling aho-corasick v1.1.4
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling time v0.3.49
[INFO] [stderr]    Compiling toml_parser v1.1.2+spec-1.1.0
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling toml_edit v0.25.12+spec-1.1.0
[INFO] [stderr]    Compiling regex v1.12.4
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling serde_yaml_ng v0.10.0
[INFO] [stderr]    Compiling ptuf v0.4.1 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 08s
[INFO] running `Command { std: "docker" "inspect" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732", 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" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.106
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]    Compiling cfg-if v1.0.4
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling bitflags v2.11.1
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling zerocopy v0.8.48
[INFO] [stderr]    Compiling autocfg v1.5.0
[INFO] [stderr]    Compiling regex-syntax v0.8.11
[INFO] [stderr]    Compiling anstyle v1.0.14
[INFO] [stderr]    Compiling clap_lex v1.1.0
[INFO] [stderr]    Compiling bit-vec v0.8.0
[INFO] [stderr]    Compiling condtype v1.3.0
[INFO] [stderr]    Compiling fastrand v2.4.1
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling regex-lite v0.1.9
[INFO] [stderr]    Compiling unarray v0.1.4
[INFO] [stderr]    Compiling bit-set v0.8.0
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling quote v1.0.45
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling rand_core v0.9.5
[INFO] [stderr]    Compiling rand v0.9.4
[INFO] [stderr]    Compiling rand_xorshift v0.4.0
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling terminal_size v0.4.4
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling clap_builder v4.6.0
[INFO] [stderr]    Compiling regex v1.12.4
[INFO] [stderr]    Compiling ppv-lite86 v0.2.21
[INFO] [stderr]    Compiling clap v4.6.1
[INFO] [stderr]    Compiling rand_chacha v0.9.0
[INFO] [stderr]    Compiling proptest v1.11.0
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling divan-macros v0.1.21
[INFO] [stderr]    Compiling divan v0.1.21
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling serde_yaml_ng v0.10.0
[INFO] [stderr]    Compiling ptuf v0.4.1 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 29s
[INFO] running `Command { std: "docker" "inspect" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732", 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" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "test" "--frozen", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.16s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/ptuf-23b9f8a6769548a0)
[INFO] [stdout] running 1557 tests
[INFO] [stdout] test audit::record::tests::allowlist_id_is_serialised_when_set ... ok
[INFO] [stdout] test audit::record::tests::agent_label_is_always_serialised ... ok
[INFO] [stdout] test audit::record::tests::ask_decision_serialises_as_ask_label ... ok
[INFO] [stdout] test audit::record::tests::allow_record_omits_rule_id_and_severity ... ok
[INFO] [stdout] test audit::record::tests::builds_deny_record_with_severity_and_rule_id ... ok
[INFO] [stdout] test audit::record::tests::monitor_demote_flag_serialises_when_true ... ok
[INFO] [stdout] test audit::record::tests::severity_label_covers_each_variant ... ok
[INFO] [stdout] test audit::record::tests::pbt_mode_label_is_lowercase_tag ... ok
[INFO] [stdout] test audit::record::tests::pbt_severity_label_is_lowercase_tag ... ok
[INFO] [stdout] test audit::record::tests::plugin_versions_serialise_as_name_at_version_list ... ok
[INFO] [stdout] test audit::redaction::tests::does_not_touch_benign_json_field ... ok
[INFO] [stdout] test audit::redaction::tests::does_not_touch_non_sensitive_assignment ... ok
[INFO] [stdout] test audit::redaction::tests::does_not_touch_short_github_pat_lookalike ... ok
[INFO] [stdout] test audit::redaction::tests::passes_through_benign_command ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_benign_passes_through ... ok
[INFO] [stdout] test audit::record::tests::pbt_decision_label_is_stable_and_exhaustive ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redaction_of_known_tokens_shrinks_or_equals ... ok
[INFO] [stdout] test audit::redaction::tests::handles_multiple_categories_in_one_string ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redaction_does_not_explode_length ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redact_never_panics ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_aws_akid ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redact_is_idempotent ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_github_fine_grained_pat ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_aws_access_key_id ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_basic_auth_password_only ... ok
[INFO] [stdout] test audit::redaction::tests::placeholder_constant_is_stable ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_github_token ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_github_fine_grained_pat ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_json_private_key_block ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_json_refresh_token_with_spaces ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_jwt_blob ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_openai_key ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_password_in_quoted_value ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_json_client_secret_without_pem ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_pem_block ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_secret_with_double_quotes ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_private_key_assignment ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_slack_bot_token ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_stripe_live_secret ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_slack_tokens ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_stripe_webhook_signing_secret ... ok
[INFO] [stdout] test audit::redaction::tests::redacts_token_env_assignment ... ok
[INFO] [stdout] test audit::tests::audit_error_display_covers_both_variants ... ok
[INFO] [stdout] test audit::tests::audit_error_source_visible_via_dyn_error ... ok
[INFO] [stdout] test audit::tests::is_active_false_only_for_noop_sink ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_sensitive_env_assignments ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_stripe_keys ... ok
[INFO] [stdout] test audit::tests::jsonl_sink_appends_to_a_real_file ... ok
[INFO] [stdout] test audit::tests::memory_sink_captures_records_in_order ... ok
[INFO] [stdout] test audit::tests::jsonl_sink_open_reports_path_on_failure ... ok
[INFO] [stdout] test audit::tests::noop_sink_accepts_any_record ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_openai_keys ... ok
[INFO] [stdout] test audit::redaction::tests::long_input_does_not_break_replacement ... ok
[INFO] [stdout] test audit::time::tests::drops_subsecond_precision ... ok
[INFO] [stdout] test audit::time::tests::formats_known_timestamps ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_idempotent_does_not_grow_placeholders ... ok
[INFO] [stdout] test audit::time::tests::formats_unix_epoch ... ok
[INFO] [stdout] test audit::time::tests::leap_day_must_be_valid_for_year ... ok
[INFO] [stdout] test audit::time::tests::parses_half_hour_offsets ... ok
[INFO] [stdout] test audit::time::tests::parses_positive_and_negative_offsets ... ok
[INFO] [stdout] test audit::time::tests::parses_explicit_zero_offset_as_utc ... ok
[INFO] [stdout] test audit::time::tests::parses_extreme_iana_offsets ... ok
[INFO] [stdout] test audit::time::tests::pbt_rfc3339_pre_epoch_clamps_to_epoch ... ok
[INFO] [stdout] test audit::time::tests::pbt_parse_is_total_on_arbitrary_strings ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_github_tokens ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_basic_auth_redaction_keeps_user ... ok
[INFO] [stdout] test audit::time::tests::rejects_malformed_timestamps ... ok
[INFO] [stdout] test audit::writer::tests::append_record_writes_one_line_terminated_with_newline ... ok
[INFO] [stdout] test audit::writer::tests::open_append_returns_io_error_for_empty_path ... ok
[INFO] [stdout] test audit::writer::tests::open_append_returns_io_error_when_parent_is_a_regular_file ... ok
[INFO] [stdout] test audit::time::tests::pbt_rfc3339_round_trips_through_parse ... ok
[INFO] [stdout] test audit::writer::tests::open_append_creates_missing_parent_dirs ... ok
[INFO] [stdout] test audit::time::tests::pre_epoch_clamps_to_epoch_string ... ok
[INFO] [stdout] test audit::writer::tests::open_append_works_when_parent_already_exists ... ok
[INFO] [stdout] test audit::time::tests::pbt_rfc3339_truncates_subsecond ... ok
[INFO] [stdout] test audit::writer::tests::write_error_display_covers_both_variants ... ok
[INFO] [stdout] test audit::writer::tests::write_error_source_matches_variant ... ok
[INFO] [stdout] test audit::time::tests::rejects_separator_typos ... ok
[INFO] [stdout] test audit::record::tests::pbt_build_never_panics ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_access_mcp_resource_normalizes_to_access_resource ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_array_payload_is_rejected ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_command_alias_cmd_is_promoted ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_multi_token_stuffing ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_command_alias_shell_command_is_promoted ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_apply_patch_keeps_canonical_name ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_empty_body_is_rejected ... ok
[INFO] [stdout] test audit::writer::tests::open_append_returns_permission_denied_for_unwritable_parent ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_empty_commands_array_leaves_command_unset ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_empty_tool_name_is_rejected ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_input_error_display_covers_all_variants ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_legacy_pretooluse_rejects_wrong_hook_name ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_mcp_arguments_json_string_is_decoded ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_legacy_pretooluse_normalizes_to_bash ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_mcp_arguments_non_object_value_is_kept ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_mcp_resource_without_server_keeps_raw_name ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_invalid_json_is_rejected ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_mcp_tool_normalizes_to_mcp_name ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_mcp_tool_without_server_keeps_raw_name ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_missing_hook_name_with_tool_call_is_rejected ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_commands_array_is_newline_joined ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_missing_input_is_accepted ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_mcp_arguments_non_json_string_is_kept ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_missing_tool_call_is_rejected ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_read_files_file_path_normalizes_to_read ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_sdk_tool_call_command_normalizes_to_bash ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_unknown_tool_with_content_and_path_falls_back_to_write ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_unknown_tool_with_url_field_falls_back_to_webfetch ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_non_object_input_falls_back_to_raw ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_unknown_tool_without_signals_keeps_raw_name ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_tool_call_is_preferred_over_pretooluse ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_unknown_tool_with_command_field_falls_back_to_bash ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_unsupported_hook_name_is_rejected ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_web_fetch_normalizes_to_webfetch ... ok
[INFO] [stdout] test cli::copilot_input::tests::array_payload_is_rejected ... ok
[INFO] [stdout] test cli::copilot_input::tests::camel_bash_maps_to_bash_with_command ... ok
[INFO] [stdout] test cli::copilot_input::tests::camel_bash_with_bool_args_is_kept_as_raw ... ok
[INFO] [stdout] test cli::copilot_input::tests::camel_bash_with_missing_args_is_accepted ... ok
[INFO] [stdout] test cli::copilot_input::tests::camel_bash_with_object_args_is_accepted ... ok
[INFO] [stdout] test cli::copilot_input::tests::create_maps_to_write_with_content ... ok
[INFO] [stdout] test cli::copilot_input::tests::edit_maps_to_edit_with_new_string ... ok
[INFO] [stdout] test cli::copilot_input::tests::invalid_json_is_an_error ... ok
[INFO] [stdout] test cli::copilot_input::tests::non_json_args_string_is_kept_as_raw ... ok
[INFO] [stdout] test cli::copilot_input::tests::parse_problem_display_invalid_json_mentions_json ... ok
[INFO] [stdout] test cli::copilot_input::tests::parse_problem_display_missing_tool_name_mentions_field ... ok
[INFO] [stdout] test cli::copilot_input::tests::missing_tool_name_is_an_error ... ok
[INFO] [stdout] test cli::copilot_input::tests::camel_bash_with_null_args_is_accepted ... ok
[INFO] [stdout] test cli::cline_input::tests::cline_write_file_normalizes_to_write ... ok
[INFO] [stdout] test cli::copilot_input::tests::parse_problem_display_not_an_object_mentions_object ... ok
[INFO] [stdout] test cli::cline_input::tests::pbt_parse_is_total_on_arbitrary_utf8 ... ok
[INFO] [stdout] test cli::copilot_input::tests::powershell_maps_to_bash_with_shell_hint ... ok
[INFO] [stdout] test cli::copilot_input::tests::pbt_invalid_envelope_returns_err ... ok
[INFO] [stdout] test cli::copilot_input::tests::unknown_tool_passes_through_without_panic ... ok
[INFO] [stdout] test cli::copilot_input::tests::snake_payload_is_accepted ... ok
[INFO] [stdout] test cli::copilot_input::tests::view_maps_to_read_path ... ok
[INFO] [stdout] test cli::copilot_input::tests::view_without_path_field_passes_through_unchanged ... ok
[INFO] [stdout] test cli::cline_input::tests::pbt_invalid_envelope_returns_err ... ok
[INFO] [stdout] test cli::copilot_input::tests::pbt_parse_is_total_on_arbitrary_utf8 ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_redacts_json_sensitive_values ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_before_mcp_execution_builds_name ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_array_payload_is_rejected ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_at_mcp_with_extra_segments_collapses_underscores ... ok
[INFO] [stdout] test cli::copilot_input::tests::web_fetch_maps_to_webfetch ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_bash_alias_is_accepted ... ok
[INFO] [stdout] test audit::redaction::tests::pbt_pem_blob_redaction_replaces_block ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_before_mcp_execution_missing_server_is_rejected ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_before_shell_execution_reads_root_command ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_camel_case_envelope_is_accepted ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_edit_old_and_new_string_normalise ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_empty_body_is_rejected ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_invalid_json_is_rejected ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_mcp_from_metadata_builds_canonical_name ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_mcp_server_name_alias_is_accepted ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_before_read_file_reads_root_path ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_mcp_sanitises_segments ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_non_object_tool_input_wraps_as_text ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_null_tool_input_decodes_to_empty_object ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_pretooluse_missing_tool_name_is_rejected ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_mcp_at_form_normalises ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_read_uses_files_array_when_path_absent ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_read_promotes_path_to_file_path ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_input_error_display_covers_all_variants ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_non_json_tool_input_string_is_kept_as_text ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_unsupported_event_is_rejected ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_unknown_tool_passes_through ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_read_uses_paths_array_when_path_absent ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_shell_normalizes_to_bash ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_tool_input_json_string_is_parsed ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_webfetch_alias_normalises ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_write_path_and_content_normalise ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_array_payload_is_rejected ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_command_priority_keeps_command_when_present ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_command_priority_promotes_cmd_then_script ... ok
[INFO] [stdout] test cli::cursor_input::tests::cursor_mcp_without_metadata_falls_back_to_placeholder ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_execute_bash_alias ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_execute_cmd_alias ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_empty_body_is_rejected ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_input_error_display_covers_all_variants ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_invalid_json_is_rejected ... ok
[INFO] [stdout] test cli::cursor_input::tests::pbt_invalid_envelope_returns_err ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_mcp_at_form_normalizes ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_mcp_empty_extra_segment_falls_through ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_mcp_empty_segment_falls_through ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_mcp_three_segment ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_non_object_tool_input_falls_back_to_raw ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_null_tool_input_is_object ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_read_operations_path_is_extracted ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_read_paths_array_is_extracted ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_read_with_no_path_leaves_file_path_unset ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_read_path_field_is_promoted_to_file_path ... ok
[INFO] [stdout] test audit::record::tests::pbt_record_mirrors_inputs ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_missing_tool_name_is_rejected ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_unsupported_event_is_rejected ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_shell_normalizes_to_bash ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_unknown_tool_passes_through ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_write_new_content_is_promoted_when_text_absent ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_write_text_field_normalizes_to_content ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_write_uses_paths_array_when_file_path_absent ... ok
[INFO] [stdout] test cli::output::tests::cline_allow_emits_empty_object_with_zero_exit ... ok
[INFO] [stdout] test cli::kiro_input::tests::kiro_webfetch_alias_normalises ... ok
[INFO] [stdout] test cli::output::tests::cline_ask_is_demoted_to_cancel_with_zero_exit ... ok
[INFO] [stdout] test cli::cursor_input::tests::pbt_parse_is_total_on_arbitrary_utf8 ... ok
[INFO] [stdout] test cli::output::tests::cline_deny_emits_cancel_json_with_zero_exit ... ok
[INFO] [stdout] test cli::output::tests::cline_monitor_emits_empty_object_with_zero_exit ... ok
[INFO] [stdout] test cli::output::tests::copilot_allow_emits_no_stdout_with_zero_exit ... ok
[INFO] [stdout] test cli::output::tests::decision_label_covers_all_variants ... ok
[INFO] [stdout] test cli::kiro_input::tests::pbt_invalid_envelope_returns_err ... ok
[INFO] [stdout] test cli::output::tests::emit_decision_serialises_allow_for_each_hook_agent ... ok
[INFO] [stdout] test cli::output::tests::copilot_ask_is_demoted_to_deny ... ok
[INFO] [stdout] test cli::kiro_input::tests::pbt_parse_is_total_on_arbitrary_utf8 ... ok
[INFO] [stdout] test cli::output::tests::copilot_deny_emits_bare_json_with_zero_exit ... ok
[INFO] [stdout] test cli::output::tests::cursor_allow_emits_explicit_allow_with_zero_exit ... ok
[INFO] [stdout] test cli::output::tests::decision_exit_code_matrix_per_agent ... ok
[INFO] [stdout] test cli::output::tests::cursor_ask_is_preserved_with_exit_0 ... ok
[INFO] [stdout] test cli::output::tests::cursor_deny_emits_permission_json_with_exit_2 ... ok
[INFO] [stdout] test cli::output::tests::emit_decision_writes_ask_envelope_with_zero_exit ... ok
[INFO] [stdout] test cli::output::tests::emit_decision_serialization_failure_returns_one ... ok
[INFO] [stdout] test cli::output::tests::hook_codex_demotes_ask_to_deny_via_emit_decision ... ok
[INFO] [stdout] test cli::output::tests::kiro_deny_uses_exit_2_and_stderr_only ... ok
[INFO] [stdout] test cli::output::tests::kiro_monitor_writes_nothing_and_exits_zero ... ok
[INFO] [stdout] test cli::output::tests::render_hook_response_is_none_for_copilot ... ok
[INFO] [stdout] test cli::output::tests::render_hook_response_dispatches_to_codex_adapter_for_ask ... ok
[INFO] [stdout] test cli::output::tests::pi_deny_emits_decision_json_with_exit_2 ... ok
[INFO] [stdout] test cli::output::tests::render_hook_response_is_none_for_pi ... ok
[INFO] [stdout] test cli::output::tests::render_hook_response_is_none_for_kiro ... ok
[INFO] [stdout] test cli::output::tests::kiro_allow_writes_nothing_and_exits_zero ... ok
[INFO] [stdout] test cli::output::tests::kiro_ask_is_demoted_to_deny ... ok
[INFO] [stdout] test cli::output::tests::render_hook_response_is_none_for_cline ... ok
[INFO] [stdout] test cli::output::tests::render_hook_response_is_none_for_cursor ... ok
[INFO] [stdout] test cli::parse::tests::check_extra_positional_argument_is_rejected ... ok
[INFO] [stdout] test cli::parse::tests::check_requires_tool_and_command ... ok
[INFO] [stdout] test cli::parse::tests::hook_rejects_global_json ... ok
[INFO] [stdout] test cli::parse::tests::hook_requires_agent ... ok
[INFO] [stdout] test cli::parse::tests::init_rejects_two_agent_tokens ... ok
[INFO] [stdout] test cli::parse::tests::parse_global_json_before_subcommand ... ok
[INFO] [stdout] test cli::parse::tests::init_rejects_unknown_flags ... ok
[INFO] [stdout] test cli::parse::tests::parse_error_display ... ok
[INFO] [stdout] test cli::parse::tests::parse_global_json_after_subcommand_is_unknown_arg ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_extension_with_pi ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_new_agent_with_global ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_scope_global_with_pi ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_new_agent_with_kiro ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_scope_local_equals_form_with_cursor ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_scope_local_with_pi_and_root ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_rejects_cursor_flag_without_cursor_agent ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_workspace_only_with_kiro ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_rejects_invalid_scope_value ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_rejects_kiro_flag_without_kiro_agent ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_rejects_new_agent_with_workspace_only ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_rejects_pi_extension_without_pi_agent ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_rejects_scope_without_cursor_or_pi_agent ... ok
[INFO] [stdout] test cli::parse::tests::parse_global_json_then_check ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_requires_value_for_cursor_flags ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_rejects_workspace_only_with_global ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_global_with_kiro ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_scope_global_with_cursor ... ok
[INFO] [stdout] test cli::parse::tests::parses_check_with_equals_form ... ok
[INFO] [stdout] test cli::parse::tests::parses_check_with_separate_value ... ok
[INFO] [stdout] test audit::time::tests::parses_canonical_utc_timestamp ... ok
[INFO] [stdout] test cli::output::tests::pi_allow_emits_explicit_allow_with_zero_exit ... ok
[INFO] [stdout] test cli::parse::tests::parses_help_and_version ... ok
[INFO] [stdout] test cli::parse::tests::parses_hook_subcommand ... ok
[INFO] [stdout] test cli::parse::tests::parses_init_no_agent_returns_init_with_none ... ok
[INFO] [stdout] test cli::parse::tests::parses_init_with_agent_and_dry_run ... ok
[INFO] [stdout] test cli::parse::tests::parses_init_with_each_agent_token ... ok
[INFO] [stdout] test cli::output::tests::pi_ask_is_preserved_with_exit_0 ... ok
[INFO] [stdout] test cli::parse::tests::parse_init_accepts_root_and_hooks_with_cursor ... ok
[INFO] [stdout] test cli::parse::tests::parses_update_check_flag ... ok
[INFO] [stdout] test cli::parse::tests::parses_plugin_check_subcommand ... ok
[INFO] [stdout] test cli::parse::tests::parses_update_no_flags ... ok
[INFO] [stdout] test cli::parse::tests::parses_init_no_verify_flag ... ok
[INFO] [stdout] test cli::parse::tests::parses_update_force_flag ... ok
[INFO] [stdout] test cli::parse::tests::parses_init_dry_run_implies_verify_off ... ok
[INFO] [stdout] test cli::parse::tests::parses_update_skip_attestation_flag ... ok
[INFO] [stdout] test cli::parse::tests::parses_update_version_pin_separate_value ... ok
[INFO] [stdout] test cli::parse::tests::parses_update_version_pin_equals_form ... ok
[INFO] [stdout] test cli::parse::tests::plugin_check_requires_path ... ok
[INFO] [stdout] test cli::parse::tests::rejects_no_args_with_missing_subcommand_error ... ok
[INFO] [stdout] test cli::parse::tests::rejects_unknown_plugin_subcommand ... ok
[INFO] [stdout] test cli::parse::tests::update_rejects_check_with_version ... ok
[INFO] [stdout] test cli::parse::tests::rejects_unknown_hook_agent ... ok
[INFO] [stdout] test cli::parse::tests::plugin_check_rejects_extra_argument ... ok
[INFO] [stdout] test cli::parse::tests::rejects_extra_args_after_hook ... ok
[INFO] [stdout] test cli::parse::tests::update_rejects_global_json ... ok
[INFO] [stdout] test cli::parse::tests::update_rejects_positional_argument ... ok
[INFO] [stdout] test cli::parse::tests::update_rejects_unknown_flag ... ok
[INFO] [stdout] test cli::parse::tests::update_requires_value_for_version_flag ... ok
[INFO] [stdout] test cli::parse::tests::plugin_requires_a_subcommand ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_grep_maps_to_mcp_pi_grep ... ok
[INFO] [stdout] test cli::parse::tests::parses_update_combines_force_and_version ... ok
[INFO] [stdout] test cli::parse::tests::rejects_unknown_top_level_command ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_input_error_display_covers_all_variants ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_unknown_tool_sanitizes_and_accepts_name_aliases ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_write_and_edit_normalization ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_read_duplicates_path_to_file_path ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_bash_normalizes_to_bash_with_command ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_decode_args_handles_string_and_scalar_fallbacks ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_fail_closed_on_empty_invalid_and_missing_fields ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_find_ls_and_fetch_map_to_canonical_tools ... ok
[INFO] [stdout] test cli::run::tests::help_prints_usage ... ok
[INFO] [stdout] test cli::pi_input::tests::pbt_invalid_envelope_returns_err ... ok
[INFO] [stdout] test cli::pi_input::tests::pi_bash_rm_rf_denies_via_engine ... ok
[INFO] [stdout] test cli::run::tests::hook_fails_closed_for_invalid_json ... ok
[INFO] [stdout] test cli::run::tests::hook_codex_evaluates_valid_payload_through_engine ... ok
[INFO] [stdout] test cli::run::tests::check_allows_safe_command ... ok
[INFO] [stdout] test cli::run::tests::check_denies_destructive_rm ... ok
[INFO] [stdout] test cli::run::tests::hook_returns_zero_and_no_stdout_for_allow ... ok
[INFO] [stdout] test cli::run::tests::hook_codex_emits_deny_envelope_for_destructive_rm ... ok
[INFO] [stdout] test cli::run::tests::hook_emits_json_for_deny ... ok
[INFO] [stdout] test cli::pi_input::tests::pbt_parse_is_total_on_arbitrary_utf8 ... ok
[INFO] [stdout] test cli::run::tests::pbt_copilot_run_hook_fails_closed_for_arbitrary_stdin ... ok
[INFO] [stdout] test cli::run::tests::render_install_json_includes_kiro_extras_when_present ... ok
[INFO] [stdout] test cli::run::tests::render_install_outcome_for_already_present_dry_run_uses_suffix ... ok
[INFO] [stdout] test cli::run::tests::render_install_outcome_for_would_install_emits_run_advice ... ok
[INFO] [stdout] test cli::run::tests::render_install_outcome_for_installed_writes_matcher_and_command ... ok
[INFO] [stdout] test cli::run::tests::pbt_kiro_run_hook_fails_closed_for_arbitrary_stdin ... ok
[INFO] [stdout] test cli::run::tests::plugin_check_returns_one_when_yaml_is_invalid ... ok
[INFO] [stdout] test cli::run::tests::render_install_json_omits_kiro_block_for_non_kiro_adapters ... ok
[INFO] [stdout] test cli::run::tests::plugin_check_runs_and_returns_zero_on_pass ... ok
[INFO] [stdout] test cli::run::tests::render_install_outcome_surfaces_kiro_extras ... ok
[INFO] [stdout] test cli::run::tests::run_hook_fails_closed_for_invalid_utf8_stdin_payload ... ok
[INFO] [stdout] test cli::run::tests::run_hook_fails_closed_when_stdin_read_fails_under_codex_adapter ... ok
[INFO] [stdout] test cli::run::tests::run_hook_fails_closed_when_engine_construction_fails ... ok
[INFO] [stdout] test cli::run::tests::run_hook_kiro_adapter_rejects_empty_stdin_payload ... ok
[INFO] [stdout] test cli::run::tests::run_hook_routes_copilot_payload_through_normaliser ... ok
[INFO] [stdout] test cli::run::tests::run_check_fails_closed_when_engine_construction_fails ... ok
[INFO] [stdout] test cli::run::tests::run_init_already_present_returns_zero_and_idempotent_message ... ok
[INFO] [stdout] test cli::run::tests::pbt_pi_run_hook_fails_closed_for_arbitrary_stdin ... ok
[INFO] [stdout] test cli::run::tests::pbt_run_hook_fails_closed_for_arbitrary_stdin ... ok
[INFO] [stdout] test cli::run::tests::run_init_codex_explicit_dry_run ... ok
[INFO] [stdout] test cli::run::tests::run_init_cursor_dry_run_does_not_write_hooks_file ... ok
[INFO] [stdout] test cli::run::tests::run_init_auto_detect_includes_cursor ... ok
[INFO] [stdout] test cli::run::tests::run_init_explicit_copilot_writes_hook_file ... ok
[INFO] [stdout] test cli::run::tests::run_init_explicit_kiro_dry_run_writes_outcome_summary ... ok
[INFO] [stdout] test cli::run::tests::run_init_explicit_cursor_writes_hooks_file ... ok
[INFO] [stdout] test cli::run::tests::pbt_cursor_run_hook_fails_closed_for_arbitrary_stdin ... ok
[INFO] [stdout] test cli::run::tests::run_hook_fails_closed_when_stdin_read_fails ... ok
[INFO] [stdout] test cli::run::tests::run_init_no_verify_writes_without_running_verify ... ok
[INFO] [stdout] test cli::run::tests::run_renders_help_and_version_to_stdout ... ok
[INFO] [stdout] test cli::run::tests::version_prints_package_version ... ok
[INFO] [stdout] test cli::tests::hook_agent_audit_name_distinguishes_variants ... ok
[INFO] [stdout] test cli::run::tests::run_init_reports_resolve_error ... ok
[INFO] [stdout] test config::merge::tests::allowlists_concatenate_in_scope_order ... ok
[INFO] [stdout] test cli::run::tests::run_plugin_check_returns_one_when_render_writer_fails ... ok
[INFO] [stdout] test cli::run::tests::run_hook_accepts_stdin_payload_exactly_at_the_size_ceiling ... ok
[INFO] [stdout] test config::merge::tests::pack_override_higher_layer_with_none_does_not_clobber ... ok
[INFO] [stdout] test config::merge::tests::pack_overrides_are_merged_per_name ... ok
[INFO] [stdout] test config::merge::tests::audit_path_picks_highest_set_value ... ok
[INFO] [stdout] test config::merge::tests::audit_path_unset_in_top_does_not_clobber_lower_set_value ... ok
[INFO] [stdout] test cli::run::tests::run_init_verify_passes_for_copilot_via_runner_injection ... ok
[INFO] [stdout] test config::merge::tests::audit_flags_and_redaction_merge_with_later_layer_wins ... ok
[INFO] [stdout] test audit::record::tests::pbt_record_serialises_to_object ... ok
[INFO] [stdout] test config::merge::tests::plugin_paths_concatenate_across_layers_and_skip_disabled ... ok
[INFO] [stdout] test config::merge::tests::rule_overrides_merge_per_rule_id ... ok
[INFO] [stdout] test config::merge::tests::unset_scalars_in_higher_layer_do_not_clobber_lower ... ok
[INFO] [stdout] test cli::run::tests::run_hook_copilot_adapter_rejects_oversize_stdin_payload ... ok
[INFO] [stdout] test cli::run::tests::run_hook_fails_closed_when_stdin_payload_is_too_large ... ok
[INFO] [stdout] test config::merge::tests::pack_override_higher_layer_overrides_lower_for_same_name ... ok
[INFO] [stdout] test config::repo::tests::discover_finds_git_dir_on_starting_path ... ok
[INFO] [stdout] test config::schema::tests::enum_variants_parse_from_yaml_strings ... ok
[INFO] [stdout] test config::schema::tests::into_merge_layer_drops_disabled_plugins ... ok
[INFO] [stdout] test config::schema::tests::mode_rejects_removed_observe_variant ... ok
[INFO] [stdout] test config::schema::tests::mode_rejects_unknown_variant ... ok
[INFO] [stdout] test config::repo::tests::discover_walks_upwards ... ok
[INFO] [stdout] test config::schema::tests::raw_allowlist_into_allowlist_passes_fields_through ... ok
[INFO] [stdout] test config::repo::tests::discover_returns_none_if_no_git_anywhere ... ok
[INFO] [stdout] test config::repo::tests::discover_handles_git_file_for_submodules ... ok
[INFO] [stdout] test config::schema::tests::raw_config_conversions_pass_fields_through ... ok
[INFO] [stdout] test config::schema::tests::redaction_mode_rejects_unknown_variant ... ok
[INFO] [stdout] test config::scope::tests::default_layout_uses_system_env_lookup ... ok
[INFO] [stdout] test config::scope::tests::project_paths_are_none_when_no_repo_root ... ok
[INFO] [stdout] test config::scope::tests::falls_back_to_home_when_no_xdg ... ok
[INFO] [stdout] test config::scope::tests::project_paths_are_set_only_when_repo_root_is_provided ... ok
[INFO] [stdout] test config::scope::tests::ordered_paths_skips_none_and_preserves_priority ... ok
[INFO] [stdout] test config::scope::tests::ptuf_config_dir_overrides_user_path ... ok
[INFO] [stdout] test config::scope::tests::ptuf_config_dir_takes_precedence_over_xdg_and_home ... ok
[INFO] [stdout] test config::scope::tests::user_path_is_none_when_no_home_or_overrides ... ok
[INFO] [stdout] test config::scope::tests::ptuf_etc_dir_overrides_system_path ... ok
[INFO] [stdout] test config::scope::tests::system_env_var_os_reads_from_real_process_env ... ok
[INFO] [stdout] test config::tests::config_error_display_io_includes_path_and_source ... ok
[INFO] [stdout] test config::tests::config_error_display_yaml_includes_path_and_message ... ok
[INFO] [stdout] test config::tests::load_with_layout_reads_existing_files_and_merges ... ok
[INFO] [stdout] test config::scope::tests::xdg_config_home_takes_precedence_over_home ... ok
[INFO] [stdout] test config::tests::load_with_layout_with_no_files_returns_default_config ... ok
[INFO] [stdout] test config::yaml::tests::allowlist_when_compile_error_includes_entry_id ... ok
[INFO] [stdout] test cli::run::tests::run_init_verify_rolls_back_on_failure ... ok
[INFO] [stdout] test config::tests::config_error_source_maps_variants ... ok
[INFO] [stdout] test config::yaml::tests::empty_yaml_is_a_default_config ... ok
[INFO] [stdout] test config::yaml::tests::parses_allowlist_with_rules_and_expires_at ... ok
[INFO] [stdout] test cli::run::tests::run_init_verify_emits_json_when_global_json_set ... ok
[INFO] [stdout] test config::yaml::tests::load_path_returns_io_error_for_missing_file ... ok
[INFO] [stdout] test config::yaml::tests::load_path_propagates_yaml_error ... ok
[INFO] [stdout] test config::yaml::tests::load_path_reads_a_real_file ... ok
[INFO] [stdout] test config::yaml::tests::parses_rule_overrides_and_audit_enabled ... ok
[INFO] [stdout] test config::yaml::tests::rejects_invalid_allowlist_when_expression ... ok
[INFO] [stdout] test config::yaml::tests::rejects_syntactically_invalid_yaml ... ok
[INFO] [stdout] test config::yaml::tests::rejects_unknown_top_level_field ... ok
[INFO] [stdout] test config::yaml::tests::rejects_yaml_with_inconsistent_indentation ... ok
[INFO] [stdout] test config::yaml::tests::rejects_yaml_with_wrong_value_type ... ok
[INFO] [stdout] test config::yaml::tests::parses_pack_overrides ... ok
[INFO] [stdout] test config::yaml::tests::yaml_error_preserves_caller_supplied_path ... ok
[INFO] [stdout] test decision::tests::aggregate_empty_is_allow ... ok
[INFO] [stdout] test decision::tests::aggregate_picks_most_restrictive ... ok
[INFO] [stdout] test decision::tests::decision_kind_matches_variant ... ok
[INFO] [stdout] test decision::tests::decision_kind_serialises_lowercase ... ok
[INFO] [stdout] test decision::tests::decision_round_trips_through_json ... ok
[INFO] [stdout] test decision::tests::decision_serialises_deny_with_rule_id_and_reason ... ok
[INFO] [stdout] test decision::tests::decision_serialises_allow ... ok
[INFO] [stdout] test decision::tests::decision_serialises_monitor_and_ask ... ok
[INFO] [stdout] test config::yaml::tests::rejects_invalid_mode ... ok
[INFO] [stdout] test config::yaml::tests::parses_audit_path ... ok
[INFO] [stdout] test config::yaml::tests::pbt_parse_str_is_total_on_arbitrary_input ... ok
[INFO] [stdout] test config::yaml::tests::parses_minimal_config ... ok
[INFO] [stdout] test decision::tests::pbt_decision_kind_round_trips ... ok
[INFO] [stdout] test decision::tests::pbt_decision_round_trips_through_json ... ok
[INFO] [stdout] test config::merge::tests::pbt_merge_append_default_layer_is_noop ... ok
[INFO] [stdout] test decision::tests::pbt_aggregate_singleton_is_identity ... ok
[INFO] [stdout] test decision::tests::pbt_severity_round_trips ... ok
[INFO] [stdout] test decision::tests::pbt_kind_matches_variant ... ok
[INFO] [stdout] test decision::tests::severity_enum_orders_info_below_critical ... ok
[INFO] [stdout] test decision::tests::severity_is_monotonic ... ok
[INFO] [stdout] test engine::builder::tests::engine_builder_repo_root_is_recorded ... ok
[INFO] [stdout] test decision::tests::severity_serialises_lowercase ... ok
[INFO] [stdout] test engine::builder::tests::engine_builder_threads_audit_sink_and_agent_into_records ... ok
[INFO] [stdout] test engine::builder::tests::engine_builder_uses_repo_root_for_protected_paths ... ok
[INFO] [stdout] test engine::builder::tests::engine_builder_with_default_config_populates_self_protection_binary ... ok
[INFO] [stdout] test engine::builder::tests::engine_builder_with_injected_plugins_does_not_load_paths ... ok
[INFO] [stdout] test engine::filter::tests::allowlist_entry_suppresses_overridable_plugin_rule ... ok
[INFO] [stdout] test engine::filter::tests::allowlist_when_must_match_to_suppress ... ok
[INFO] [stdout] test engine::filter::tests::allowlist_entry_does_not_suppress_hard_deny_builtin ... ok
[INFO] [stdout] test engine::filter::tests::allowlist_with_unrelated_rule_id_is_ignored ... ok
[INFO] [stdout] test engine::filter::tests::allowlist_without_expiry_suppresses_indefinitely ... ok
[INFO] [stdout] test engine::filter::tests::audit_record_carries_allowlist_id_when_allow_came_from_allowlist ... ok
[INFO] [stdout] test config::merge::tests::pbt_merge_scalars_are_last_write_wins ... ok
[INFO] [stdout] test engine::filter::tests::expired_allowlist_entry_is_ignored ... ok
[INFO] [stdout] test engine::filter::tests::malformed_expiry_is_treated_as_already_expired ... ok
[INFO] [stdout] test engine::filter::tests::monitor_mode_keeps_hard_deny_as_deny ... ok
[INFO] [stdout] test engine::filter::tests::monitor_mode_demotes_overridable_deny_to_monitor ... ok
[INFO] [stdout] test audit::writer::tests::pbt_append_record_emits_one_terminated_line ... ok
[INFO] [stdout] test engine::filter::tests::outcome_allowlist_id_none_when_decision_is_deny ... ok
[INFO] [stdout] test engine::filter::tests::outcome_allowlist_id_set_when_allow_came_from_allowlist ... ok
[INFO] [stdout] test engine::filter::tests::outcome_allowlist_id_none_when_no_rule_was_suppressed ... ok
[INFO] [stdout] test engine::filter::tests::pack_disable_short_circuits_with_no_overrides ... ok
[INFO] [stdout] test engine::filter::tests::pack_disable_is_ignored_for_hard_deny_rules ... ok
[INFO] [stdout] test engine::filter::tests::plugin_pack_can_be_disabled_via_config ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_attempts_to_weaken_hard_deny_are_blocked ... ok
[INFO] [stdout] test engine::filter::tests::monitor_mode_leaves_allow_unchanged ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_changes_overridable_deny_to_monitor ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_changes_overridable_deny_to_ask ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_changes_overridable_deny_to_allow ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_severity_propagates_to_audit_record ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_severity_is_ignored_for_hard_deny_rule ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_changes_overridable_to_deny_keeps_default_reason ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_strengthens_overridable_to_higher_kind_via_rank_check ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_with_enabled_false_suppresses_overridable_plugin_rule ... ok
[INFO] [stdout] test engine::tests::audit_record_carries_agent_set_via_with_agent_builder ... ok
[INFO] [stdout] test engine::filter::tests::rule_override_without_decision_leaves_decision_unchanged ... ok
[INFO] [stdout] test engine::tests::audit_record_carries_default_unknown_agent_when_unset ... ok
[INFO] [stdout] test engine::tests::audit_record_carries_plugin_versions_for_loaded_plugins ... ok
[INFO] [stdout] test engine::tests::audit_record_severity_is_none_when_decision_carries_unknown_rule_id ... ok
[INFO] [stdout] test engine::tests::audit_record_for_monitor_hard_deny_stays_deny_without_demotion_flag ... ok
[INFO] [stdout] test engine::tests::audit_record_uses_redaction_off_when_configured ... ok
[INFO] [stdout] test engine::tests::audit_record_for_monitor_demoted_deny_carries_mode_demoted_flag ... ok
[INFO] [stdout] test engine::tests::audit_records_allow_when_include_allowed_is_true ... ok
[INFO] [stdout] test audit::tests::memory_sink_records_handles_poisoned_mutex ... ok
[INFO] [stdout] test engine::tests::audit_records_repo_root_when_engine_carries_one ... ok
[INFO] [stdout] test engine::tests::audit_skips_allow_when_include_allowed_is_false ... ok
[INFO] [stdout] test engine::tests::audit_sink_receives_deny_record_with_severity_and_redacted_command ... ok
[INFO] [stdout] test engine::tests::audit_skips_deny_when_include_denied_is_false ... ok
[INFO] [stdout] test engine::tests::default_engine_returns_allow_for_safe_command ... ok
[INFO] [stdout] test engine::tests::engine_error_display_and_source_for_config_variant ... ok
[INFO] [stdout] test engine::tests::engine_error_display_and_source_for_plugin_variant ... ok
[INFO] [stdout] test engine::tests::engine_decide_triple_nested_su_denies_destructive_rm ... ok
[INFO] [stdout] test engine::tests::default_engine_denies_destructive_rm ... ok
[INFO] [stdout] test engine::tests::engine_exposes_its_config ... ok
[INFO] [stdout] test engine::tests::engine_new_succeeds_with_no_repo_root ... ok
[INFO] [stdout] test engine::tests::bash_redirect_target_classifies_as_protected_claude_settings ... ok
[INFO] [stdout] test engine::tests::engine_with_config_falls_back_to_noop_when_jsonl_open_fails ... ok
[INFO] [stdout] test engine::tests::engine_with_config_opens_jsonl_sink_when_audit_path_is_set ... ok
[INFO] [stdout] test engine::tests::engine_with_config_uses_noop_sink_when_audit_path_is_unset ... ok
[INFO] [stdout] test audit::tests::jsonl_sink_serialises_concurrent_writes_across_independent_handles ... ok
[INFO] [stdout] test engine::tests::engine_with_disabled_audit_uses_noop_sink_and_no_warning ... ok
[INFO] [stdout] test engine::tests::multiple_builtins_fire_simultaneously_aggregate_picks_deny_audit_carries_one_rule_id ... ok
[INFO] [stdout] test config::merge::tests::pbt_merge_allowlists_concatenate_in_scope_order ... ok
[INFO] [stdout] test engine::tests::inner_shell_redirect_target_classifies_as_protected_claude_settings ... ok
[INFO] [stdout] test engine::tests::multiple_builtins_outcome_is_order_invariant ... ok
[INFO] [stdout] test decision::tests::pbt_severity_matches_kind_order ... ok
[INFO] [stdout] test audit::tests::jsonl_sink_record_is_ok_when_mutex_is_poisoned ... ok
[INFO] [stdout] test engine::tests::pbt_demote_never_increases_severity ... ok
[INFO] [stdout] test engine::tests::pbt_enforce_is_identity ... ok
[INFO] [stdout] test engine::tests::pbt_hard_deny_deny_is_not_demoted ... ok
[INFO] [stdout] test config::merge::tests::pbt_merge_plugin_paths_concatenate_enabled_only ... ok
[INFO] [stdout] test engine::tests::pbt_monitor_only_touches_deny ... ok
[INFO] [stdout] test engine::filter::tests::pack_disable_uses_dot_boundary ... ok
[INFO] [stdout] test decision::tests::pbt_aggregate_is_idempotent ... ok
[INFO] [stdout] test engine::tests::plugin_rule_fires_alongside_builtins ... ok
[INFO] [stdout] test config::merge::tests::pbt_merge_prepend_default_layer_is_noop ... ok
[INFO] [stdout] test engine::tests::self_protection_fires_when_input_targets_protected_path ... ok
[INFO] [stdout] test facts::path::tests::expands_tilde_and_home_envvar_forms ... ok
[INFO] [stdout] test facts::path::tests::extract_all_collects_nested_mcp_paths ... ok
[INFO] [stdout] test engine::tests::record_audit_captures_write_failure_via_failing_sink ... ok
[INFO] [stdout] test facts::path::tests::extract_apply_patch_collects_add_update_delete_and_move_paths ... ok
[INFO] [stdout] test facts::path::tests::extract_apply_patch_ignores_malformed_lines ... ok
[INFO] [stdout] test facts::path::tests::extract_mcp_tool_recognises_synonym_keys ... ok
[INFO] [stdout] test facts::path::tests::extract_mcp_tool_returns_none_when_path_is_not_string ... ok
[INFO] [stdout] test facts::path::tests::extract_mcp_tool_expands_home_in_raw_path ... ok
[INFO] [stdout] test facts::path::tests::extract_mcp_tool_url_key_is_not_treated_as_path ... ok
[INFO] [stdout] test facts::path::tests::extract_mcp_tool_uses_top_level_path_key ... ok
[INFO] [stdout] test facts::path::tests::extracts_path_tool_from_read_edit_write ... ok
[INFO] [stdout] test facts::path::tests::falls_back_to_raw_when_home_unset ... ok
[INFO] [stdout] test engine::tests::pbt_soft_deny_demotes_to_monitor_preserving_rule_id ... ok
[INFO] [stdout] test facts::path::tests::from_bash_redirects_resolves_relative_against_repo_root ... ok
[INFO] [stdout] test audit::writer::tests::pbt_append_record_body_is_valid_json ... ok
[INFO] [stdout] test facts::path::tests::from_bash_redirects_returns_empty_when_no_redirects ... ok
[INFO] [stdout] test facts::path::tests::from_bash_redirects_skips_heredoc_target ... ok
[INFO] [stdout] test facts::path::tests::is_within_workspace_empty_list_rejects_everything ... ok
[INFO] [stdout] test facts::path::tests::is_within_workspace_uses_component_prefix_not_byte_prefix ... ok
[INFO] [stdout] test facts::path::tests::normalize_components_dotdot_at_root_is_noop ... ok
[INFO] [stdout] test facts::path::tests::normalize_components_preserves_relative ... ok
[INFO] [stdout] test facts::path::tests::normalize_components_resolves_dot_and_dotdot ... ok
[INFO] [stdout] test facts::path::tests::path_fact_canonical_falls_back_to_absolute_when_missing ... ok
[INFO] [stdout] test facts::path::tests::path_fact_mcp_nested_origin_is_nested ... ok
[INFO] [stdout] test facts::path::tests::path_fact_origin_distinguishes_apply_patch_from_direct ... ok
[INFO] [stdout] test facts::path::tests::from_bash_redirects_emits_for_each_redirect_op ... ok
[INFO] [stdout] test facts::path::tests::extract_mcp_tool_returns_none_when_path_missing ... ok
[INFO] [stdout] test facts::path::tests::from_bash_redirects_returns_empty_for_none_bash ... ok
[INFO] [stdout] test engine::tests::pbt_expired_allowlist_does_not_suppress ... ok
[INFO] [stdout] test facts::path::tests::pbt_absolute_paths_are_identity ... ok
[INFO] [stdout] test facts::path::tests::pbt_no_home_falls_back_to_raw ... ok
[INFO] [stdout] test facts::path::tests::resolve_for_containment_climbs_for_nonexistent_tail ... ok
[INFO] [stdout] test facts::path::tests::resolve_for_containment_resolves_dotdot_in_nonexistent_tail ... ok
[INFO] [stdout] test facts::path::tests::resolve_for_containment_uses_canonical_when_available ... ok
[INFO] [stdout] test facts::path::tests::returns_none_for_unknown_tool ... ok
[INFO] [stdout] test facts::path::tests::returns_none_when_field_missing_or_non_string ... ok
[INFO] [stdout] test facts::project::tests::collect_returns_default_when_repo_root_is_none ... ok
[INFO] [stdout] test facts::project::tests::detects_pnpm_and_uv_lock_files_at_root ... ok
[INFO] [stdout] test facts::path::tests::pbt_path_tool_round_trips_raw ... ok
[INFO] [stdout] test facts::project::tests::ignores_lock_files_in_subdirectories ... ok
[INFO] [stdout] test facts::path::tests::pbt_tilde_prefix_expands_to_home ... ok
[INFO] [stdout] test facts::path::tests::pbt_extract_never_panics ... ok
[INFO] [stdout] test facts::path::tests::pbt_non_path_tool_yields_none ... ok
[INFO] [stdout] test facts::project::tests::pbt_wildcard_match_is_reflexive ... ok
[INFO] [stdout] test facts::project::tests::protected_branch_flag_uses_pattern_list ... ok
[INFO] [stdout] test facts::project::tests::protected_flag_false_when_branch_does_not_match ... ok
[INFO] [stdout] test facts::project::tests::reads_current_branch_from_dot_git_head ... ok
[INFO] [stdout] test facts::project::tests::pbt_wildcard_match_bare_star_is_prefix ... ok
[INFO] [stdout] test facts::project::tests::returns_none_for_detached_head ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_aws_dir ... ok
[INFO] [stdout] test facts::project::tests::returns_none_when_dot_git_head_is_unreadable ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_dotenv_through_brace_expansion_anchor ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_dotenv_through_glob_anchor ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_case_variant_paths ... ok
[INFO] [stdout] test facts::project::tests::pbt_wildcard_match_slash_star_matches_subpaths ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_gcloud_dir ... ok
[INFO] [stdout] test engine::tests::pbt_pack_override_suppresses_overridable_git_pack ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_pem_blob ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_npmrc_pypirc_tfstate ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_private_key_file ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_ssh_dir ... ok
[INFO] [stdout] test facts::sensitive::tests::does_not_misclassify_dotenv_lookalikes ... ok
[INFO] [stdout] test facts::project::tests::pbt_wildcard_match_exact_pattern_is_equality ... ok
[INFO] [stdout] test facts::sensitive::tests::multiple_kinds_can_match_one_token ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_kube_and_docker_config ... ok
[INFO] [stdout] test facts::sensitive::tests::match_records_raw_substring ... ok
[INFO] [stdout] test facts::sensitive::tests::classify_returns_empty_for_safe_input ... ok
[INFO] [stdout] test facts::project::tests::pbt_wildcard_match_never_panics ... ok
[INFO] [stdout] test facts::sensitive::tests::classifies_dotenv_variants ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_kind_round_trips ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_match_raw_is_substring ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_plain_alphanumeric_never_classifies ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_ssh_dir_always_classifies ... ok
[INFO] [stdout] test facts::sensitive::tests::pem_blob_remains_case_sensitive ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_anchored_dotenv_literals_match_sensitive_path ... ok
[INFO] [stdout] test facts::shell::tests::commands_flattens_nested_wrappers ... ok
[INFO] [stdout] test facts::shell::tests::complex_compound_pipeline ... ok
[INFO] [stdout] test facts::shell::tests::collects_env_assignments_before_head ... ok
[INFO] [stdout] test facts::shell::tests::does_not_flag_dollar_paren_inside_single_quotes ... ok
[INFO] [stdout] test facts::shell::tests::does_not_flag_plain_command ... ok
[INFO] [stdout] test engine::tests::pbt_hard_deny_ignores_pack_and_allowlist ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_dotenv_false_positives_never_classify ... ok
[INFO] [stdout] test facts::shell::tests::empty_pipeline_segment_is_dropped ... ok
[INFO] [stdout] test facts::shell::tests::extract_su_command_pulls_dash_c_payload ... ok
[INFO] [stdout] test facts::shell::tests::extract_su_command_returns_none_without_dash_c ... ok
[INFO] [stdout] test facts::shell::tests::flags_command_substitution_inside_double_quotes ... ok
[INFO] [stdout] test facts::shell::tests::flags_command_substitution_on_dollar_paren ... ok
[INFO] [stdout] test facts::shell::tests::flags_process_substitution_input ... ok
[INFO] [stdout] test facts::shell::tests::double_dash_separator_is_not_a_flag ... ok
[INFO] [stdout] test facts::shell::tests::flags_process_substitution_output ... ok
[INFO] [stdout] test facts::shell::tests::does_not_treat_url_as_env_assignment ... ok
[INFO] [stdout] test facts::shell::tests::flags_iterator_filters_dash_args ... ok
[INFO] [stdout] test facts::shell::tests::handles_backtick_substring_as_word_chunk ... ok
[INFO] [stdout] test facts::shell::tests::full_path_command_keeps_head_intact ... ok
[INFO] [stdout] test facts::shell::tests::handles_backslash_escapes_outside_quotes ... ok
[INFO] [stdout] test facts::shell::tests::inner_argv_chain_at_budget_unrolls_both_layers ... ok
[INFO] [stdout] test facts::shell::tests::inner_argv_chain_length_for_single_wrapper_is_one ... ok
[INFO] [stdout] test facts::shell::tests::lone_ampersand_does_not_loop ... ok
[INFO] [stdout] test facts::shell::tests::inner_argv_chain_one_above_budget_is_capped_at_three ... ok
[INFO] [stdout] test facts::shell::tests::heredoc_without_terminator_consumes_remainder ... ok
[INFO] [stdout] test facts::shell::tests::lone_dash_is_not_a_flag ... ok
[INFO] [stdout] test facts::shell::tests::parses_bash_dash_c_inner_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_empty_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_eval_inner_command ... ok
[INFO] [stdout] test facts::shell::tests::ignores_trailing_separator ... ok
[INFO] [stdout] test facts::shell::tests::parses_find_exec_inner_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_heredoc_body_simple ... ok
[INFO] [stdout] test facts::shell::tests::parses_blank_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_redirect_to_sensitive_path ... ok
[INFO] [stdout] test facts::shell::tests::parses_heredoc_dash_form_with_tabs ... ok
[INFO] [stdout] test facts::shell::tests::parses_redirect_operators ... ok
[INFO] [stdout] test facts::shell::tests::parses_simple_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_su_dash_c_inner_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_su_username_dash_c_inner_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_xargs_inner_command ... ok
[INFO] [stdout] test facts::shell::tests::parses_xargs_inner_command_with_dash_x_flag ... ok
[INFO] [stdout] test facts::shell::tests::pbt_blank_input_has_no_segments ... ok
[INFO] [stdout] test engine::tests::pbt_allowlist_suppresses_overridable_git_rule ... ok
[INFO] [stdout] test facts::shell::tests::parses_combined_shell_short_options_with_dash_c ... ok
[INFO] [stdout] test facts::shell::tests::pbt_combined_short_opts_surface_inner_payload ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_classify_never_panics ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_classify_matches_ungated_probes ... ok
[INFO] [stdout] test facts::shell::tests::pbt_parse_terminates_on_arbitrary_bytes ... ok
[INFO] [stdout] test facts::shell::tests::pbt_process_substitution_is_flagged ... ok
[INFO] [stdout] test facts::shell::tests::pbt_pipe_produces_n_commands ... ok
[INFO] [stdout] test facts::shell::tests::pbt_inner_argv_chain_is_bounded ... ok
[INFO] [stdout] test facts::sensitive::tests::pbt_brace_dotenv_tokens_always_classify ... ok
[INFO] [stdout] test facts::shell::tests::pbt_env_assignments_precede_head ... ok
[INFO] [stdout] test facts::shell::tests::pipeline_in_compound_command ... ok
[INFO] [stdout] test facts::shell::tests::preserves_redirects_from_inner_shell_code ... ok
[INFO] [stdout] test facts::shell::tests::pbt_single_quotes_protect_separators ... ok
[INFO] [stdout] test facts::shell::tests::quotes_protect_separators ... ok
[INFO] [stdout] test facts::shell::tests::read_word_advances_for_every_non_separator_byte ... ok
[INFO] [stdout] test facts::shell::tests::redirect_only_pipeline_is_kept ... ok
[INFO] [stdout] test facts::shell::tests::redirects_attach_to_pipeline_not_segment ... ok
[INFO] [stdout] test facts::shell::tests::rejects_env_with_non_identifier_key ... ok
[INFO] [stdout] test facts::shell::tests::separator_after_redirect_target_starts_new_segment ... ok
[INFO] [stdout] test facts::shell::tests::splits_on_and_and_or ... ok
[INFO] [stdout] test facts::shell::tests::splits_on_semicolon ... ok
[INFO] [stdout] test facts::shell::tests::splits_pipelines_within_segment ... ok
[INFO] [stdout] test facts::shell::tests::pbt_flags_partition_args ... ok
[INFO] [stdout] test facts::shell::tests::pbt_heredoc_body_is_one_redirect ... ok
[INFO] [stdout] test facts::shell::tests::unwrap_privilege_wrapper_honours_double_dash ... ok
[INFO] [stdout] test facts::shell::tests::pbt_parse_never_panics ... ok
[INFO] [stdout] test facts::shell::tests::strips_quote_delimiters_from_words ... ok
[INFO] [stdout] test facts::shell::tests::triple_nested_su_bash_c_surfaces_inner_rm ... ok
[INFO] [stdout] test facts::shell::tests::process_substitution_absorbs_inner_pipe ... ok
[INFO] [stdout] test engine::tests::pbt_default_engine_never_panics_on_richer_inputs ... ok
[INFO] [stdout] test facts::shell::tests::unwrap_privilege_wrapper_matches_full_path_head ... ok
[INFO] [stdout] test facts::shell::tests::unwrap_privilege_wrapper_returns_none_when_only_flags ... ok
[INFO] [stdout] test facts::shell::tests::unwrap_privilege_wrapper_skips_value_flags ... ok
[INFO] [stdout] test facts::shell::tests::unwrap_privilege_wrapper_strips_prefix_wrappers ... ok
[INFO] [stdout] test facts::shell::tests::value_flag_accessors_expose_each_spelling ... ok
[INFO] [stdout] test facts::shell::tests::unwraps_multi_level_prefix_wrappers ... ok
[INFO] [stdout] test facts::tests::extract_collects_sensitive_through_symlink_canonicalisation ... ok
[INFO] [stdout] test facts::tests::extract_populates_path_for_read_tool ... ok
[INFO] [stdout] test facts::tests::extract_collects_sensitive_from_write_payload ... ok
[INFO] [stdout] test facts::tests::facts_default_is_constructible ... ok
[INFO] [stdout] test facts::shell::tests::unwrap_privilege_wrapper_returns_none_for_non_wrapper ... ok
[INFO] [stdout] test facts::tests::extract_collects_sensitive_from_bash_argv ... ok
[INFO] [stdout] test facts::tests::extract_collects_sensitive_from_read_file_path ... ok
[INFO] [stdout] test facts::tests::pbt_classify_brace_token_matches_extract ... ok
[INFO] [stdout] test facts::shell::tests::pbt_semicolon_produces_n_segments ... ok
[INFO] [stdout] test facts::tests::extract_returns_default_facts_for_empty_input ... ok
[INFO] [stdout] test facts::tests::extract_populates_url_for_webfetch_tool ... ok
[INFO] [stdout] test facts::url::tests::parses_https_and_http_url_shapes ... ok
[INFO] [stdout] test facts::url::tests::lowercases_scheme_and_host ... ok
[INFO] [stdout] test facts::url::tests::parses_ipv6_literal_with_port ... ok
[INFO] [stdout] test facts::url::tests::parses_ipv6_literal_without_port ... ok
[INFO] [stdout] test facts::url::tests::pbt_port_round_trips ... ok
[INFO] [stdout] test facts::url::tests::pbt_parse_never_panics ... ok
[INFO] [stdout] test facts::shell::tests::pbt_redirect_operators_surface_to_pipeline ... ok
[INFO] [stdout] test facts::url::tests::pbt_no_scheme_separator_fails ... ok
[INFO] [stdout] test facts::url::tests::pbt_canonical_urls_round_trip ... ok
[INFO] [stdout] test facts::url::tests::pbt_parse_arbitrary_never_panics ... ok
[INFO] [stdout] test facts::url::tests::pbt_scheme_and_host_are_lowercased ... ok
[INFO] [stdout] test facts::url::tests::rejects_empty_authority ... ok
[INFO] [stdout] test facts::url::tests::pbt_raw_round_trips ... ok
[INFO] [stdout] test decision::tests::pbt_aggregate_is_associative ... ok
[INFO] [stdout] test facts::shell::tests::pbt_structured_command_yields_segments ... ok
[INFO] [stdout] test facts::tests::pbt_extract_never_panics_on_brace_token ... ok
[INFO] [stdout] test facts::url::tests::pbt_userinfo_stripped_from_host ... ok
[INFO] [stdout] test facts::url::tests::rejects_malformed_port ... ok
[INFO] [stdout] test facts::url::tests::rejects_missing_scheme ... ok
[INFO] [stdout] test hook_input::tests::hook_input_parses_full_payload ... ok
[INFO] [stdout] test hook_input::tests::file_path_accessor_handles_path_tools ... ok
[INFO] [stdout] test hook_input::tests::event_normalizes_nested_paths_for_write_without_file_path ... ok
[INFO] [stdout] test hook_input::tests::event_paths_dedupe_preserves_order_when_file_path_repeated ... ok
[INFO] [stdout] test facts::url::tests::rejects_invalid_scheme_chars ... ok
[INFO] [stdout] test hook_input::tests::bash_command_accessor_handles_bash_tool_shapes ... ok
[INFO] [stdout] test hook_input::tests::event_normalizes_nested_paths_for_read ... ok
[INFO] [stdout] test facts::url::tests::strips_userinfo_from_authority ... ok
[INFO] [stdout] test hook_input::tests::event_normalizes_nested_mcp_paths ... ok
[INFO] [stdout] test hook_input::tests::mcp_url_reads_top_level_url_key ... ok
[INFO] [stdout] test hook_input::tests::hook_input_parses_minimal_payload ... ok
[INFO] [stdout] test hook_input::tests::is_mcp_tool_rejects_partial_or_malformed_names ... ok
[INFO] [stdout] test hook_input::tests::is_mcp_tool_recognises_canonical_form ... ok
[INFO] [stdout] test hook_input::tests::mcp_file_path_reads_top_level_path_key ... ok
[INFO] [stdout] test hook_input::tests::mcp_accessors_return_none_for_non_string_or_missing_fields ... ok
[INFO] [stdout] test hook_input::tests::pbt_bash_with_non_string_command_is_none ... ok
[INFO] [stdout] test facts::tests::pbt_extract_brace_dotenv_from_bash ... ok
[INFO] [stdout] test hook_input::tests::pbt_file_path_none_for_non_path_tool ... ok
[INFO] [stdout] test hook_input::tests::mcp_write_payload_reads_top_level_content_key ... ok
[INFO] [stdout] test hook_input::tests::pbt_file_path_none_for_non_string_value ... ok
[INFO] [stdout] test hook_input::tests::pbt_mcp_nested_paths_are_extracted_at_supported_depths ... ok
[INFO] [stdout] test hook_input::tests::pbt_invalid_utf8_payload_returns_err_or_value ... ok
[INFO] [stdout] test hook_input::tests::pbt_file_path_round_trips ... ok
[INFO] [stdout] test hook_input::tests::pbt_write_payload_none_for_non_writer_tool ... ok
[INFO] [stdout] test hook_input::tests::raw_hook_input_converts_to_hook_input ... ok
[INFO] [stdout] test hook_input::tests::pbt_web_fetch_url_round_trips ... ok
[INFO] [stdout] test hook_input::tests::pbt_bash_with_string_command_round_trips ... ok
[INFO] [stdout] test hook_input::tests::web_fetch_url_is_none_for_other_tools_or_missing_field ... ok
[INFO] [stdout] test hook_input::tests::web_fetch_url_returns_string_for_webfetch ... ok
[INFO] [stdout] test hook_input::tests::write_payload_returns_content_for_write_and_new_string_for_edit ... ok
[INFO] [stdout] test hook_input::tests::pbt_non_bash_tool_never_returns_command ... ok
[INFO] [stdout] test hook_input::tests::write_payload_is_none_for_other_tools_or_missing_fields ... ok
[INFO] [stdout] test decision::tests::pbt_aggregate_is_upper_bound ... ok
[INFO] [stdout] test hook_input::tests::pbt_write_payload_returns_content_for_write ... ok
[INFO] [stdout] test hook_output::tests::claude_deny_serialises_expected_shape ... ok
[INFO] [stdout] test hook_input::tests::pbt_write_payload_returns_new_string_for_edit ... ok
[INFO] [stdout] test hook_output::tests::allow_produces_no_response ... ok
[INFO] [stdout] test hook_output::tests::claude_ask_serialises_with_ask_verdict ... ok
[INFO] [stdout] test hook_input::tests::pbt_unknown_tool_never_extracts_paths ... ok
[INFO] [stdout] test hook_output::tests::cline_ask_is_demoted_to_cancel ... ok
[INFO] [stdout] test hook_output::tests::cline_deny_outputs_cancel_json ... ok
[INFO] [stdout] test hook_output::tests::cline_monitor_outputs_empty_object ... ok
[INFO] [stdout] test hook_output::tests::codex_ask_serialises_as_deny_with_note ... ok
[INFO] [stdout] test hook_output::tests::cline_allow_outputs_empty_object ... ok
[INFO] [stdout] test hook_output::tests::copilot_deny_serialises_bare_envelope ... ok
[INFO] [stdout] test hook_output::tests::monitor_produces_no_response ... ok
[INFO] [stdout] test hook_output::tests::cursor_ask_is_preserved_not_demoted ... ok
[INFO] [stdout] test hook_output::tests::cursor_allow_and_monitor_emit_explicit_allow ... ok
[INFO] [stdout] test hook_output::tests::kiro_deny_reason_for_ask_appends_note ... ok
[INFO] [stdout] test hook_output::tests::cursor_deny_serialises_bare_permission_envelope ... ok
[INFO] [stdout] test hook_output::tests::pi_allow_serialises_bare_decision_envelope ... ok
[INFO] [stdout] test hook_input::tests::pbt_accessors_never_panic ... ok
[INFO] [stdout] test hook_input::tests::pbt_web_fetch_url_none_for_non_webfetch_tool ... ok
[INFO] [stdout] test hook_output::tests::pi_ask_is_preserved_not_demoted ... ok
[INFO] [stdout] test hook_output::tests::pi_deny_includes_rule_id_and_reason ... ok
[INFO] [stdout] test hook_output::tests::pi_monitor_serialises_bare_decision_envelope ... ok
[INFO] [stdout] test init::claude_code::tests::default_settings_path_ends_with_claude_settings_when_home_is_set ... ok
[INFO] [stdout] test init::claude_code::tests::detect_binary_delegates_to_shared_impl ... ok
[INFO] [stdout] test init::claude_code::tests::dry_run_does_not_write_when_install_would_happen ... ok
[INFO] [stdout] test init::claude_code::tests::already_present_detection_handles_command_with_trailing_whitespace ... ok
[INFO] [stdout] test hook_output::tests::pbt_copilot_deny_keeps_reason_verbatim ... ok
[INFO] [stdout] test init::claude_code::tests::entry_hooks_returns_empty_when_hooks_is_not_an_array ... ok
[INFO] [stdout] test hook_output::tests::pbt_claude_ask_emits_ask_verdict ... ok
[INFO] [stdout] test init::claude_code::tests::dry_run_reports_already_present_without_writing ... ok
[INFO] [stdout] test init::claude_code::tests::already_present_detection_ignores_unrelated_command_strings ... ok
[INFO] [stdout] test init::claude_code::tests::install_is_idempotent_when_entry_exists ... ok
[INFO] [stdout] test init::claude_code::tests::install_is_idempotent_when_ptuf_marker_exists ... ok
[INFO] [stdout] test init::claude_code::tests::install_rejects_invalid_json_without_overwriting ... ok
[INFO] [stdout] test init::claude_code::tests::install_rejects_when_hooks_value_is_wrong_type ... ok
[INFO] [stdout] test init::claude_code::tests::install_rejects_when_pre_tool_use_is_wrong_type ... ok
[INFO] [stdout] test init::claude_code::tests::entry_hooks_returns_empty_when_hooks_key_is_missing ... ok
[INFO] [stdout] test init::claude_code::tests::install_rejects_when_top_level_is_not_object ... ok
[INFO] [stdout] test hook_output::tests::pbt_claude_allow_and_monitor_yield_none ... ok
[INFO] [stdout] test init::claude_code::tests::install_returns_io_err_when_parent_is_a_regular_file ... ok
[INFO] [stdout] test init::claude_code::tests::install_preserves_unknown_keys_in_settings ... ok
[INFO] [stdout] test init::claude_code::tests::install_tightens_mode_when_existing_file_was_world_readable ... ok
[INFO] [stdout] test init::claude_code::tests::install_writes_settings_with_mode_0600 ... ok
[INFO] [stdout] test init::claude_code::tests::install_appends_when_a_different_matcher_already_exists ... ok
[INFO] [stdout] test init::claude_code::tests::empty_file_is_treated_as_empty_object ... ok
[INFO] [stdout] test init::claude_code::tests::read_settings_reports_io_error_when_path_is_a_directory ... ok
[INFO] [stdout] test init::claude_code::tests::sibling_temp_path_uses_default_filename_when_input_has_none ... ok
[INFO] [stdout] test init::cline::tests::cline_hook_file_name_matches_platform ... ok
[INFO] [stdout] test init::claude_code::tests::write_atomically_propagates_create_dir_all_error_when_parent_is_a_regular_file ... ok
[INFO] [stdout] test init::cline::tests::detect_binary_delegates_to_shared_impl ... ok
[INFO] [stdout] test init::cline::tests::install_dry_run_on_managed_wrapper_change_does_not_write ... ok
[INFO] [stdout] test init::claude_code::tests::write_atomically_propagates_write_error_when_temp_path_is_a_directory ... ok
[INFO] [stdout] test init::cline::tests::install_dry_run_reports_changes_without_writing ... ok
[INFO] [stdout] test init::cline::tests::install_global_outcome_labels_path_as_global ... ok
[INFO] [stdout] test init::claude_code::tests::write_atomically_propagates_rename_error_when_target_is_a_directory ... ok
[INFO] [stdout] test init::claude_code::tests::installs_into_missing_file_and_creates_parent_dir ... ok
[INFO] [stdout] test init::cline::tests::install_marks_wrapper_executable ... ok
[INFO] [stdout] test init::cline::tests::install_refuses_to_overwrite_unmanaged_hook ... ok
[INFO] [stdout] test init::cline::tests::quote_powershell_doubles_embedded_single_quotes ... ok
[INFO] [stdout] test init::cline::tests::is_ptuf_managed_recognises_marker_and_invocation ... ok
[INFO] [stdout] test init::cline::tests::install_writes_wrapper_with_marker_and_hook_command ... ok
[INFO] [stdout] test init::cline::tests::install_reports_io_error_when_hook_path_is_a_directory ... ok
[INFO] [stdout] test init::cline::tests::install_is_idempotent_when_wrapper_is_byte_identical ... ok
[INFO] [stdout] test init::cline::tests::resolve_paths_falls_back_to_global_cline_hooks_dir ... ok
[INFO] [stdout] test init::codex::tests::default_home_config_path_ends_with_codex_when_home_is_set ... ok
[INFO] [stdout] test init::cline::tests::resolve_paths_targets_repo_local_clinerules_hooks ... ok
[INFO] [stdout] test init::codex::tests::default_home_hooks_path_ends_with_codex_when_home_is_set ... ok
[INFO] [stdout] test init::cline::tests::quote_sh_escapes_embedded_single_quotes ... ok
[INFO] [stdout] test init::codex::tests::detect_binary_delegates_to_shared_impl ... ok
[INFO] [stdout] test init::codex::tests::entry_commands_returns_empty_when_hooks_is_not_an_array ... ok
[INFO] [stdout] test init::codex::tests::empty_config_file_is_treated_as_empty_document ... ok
[INFO] [stdout] test init::codex::tests::command_invokes_ptuf_hook_matches_trailing_tokens ... ok
[INFO] [stdout] test init::codex::tests::install_does_not_overwrite_invalid_config_toml ... ok
[INFO] [stdout] test init::codex::tests::empty_hooks_file_is_treated_as_empty_object ... ok
[INFO] [stdout] test init::codex::tests::install_dry_run_reports_changes_without_writing ... ok
[INFO] [stdout] test init::codex::tests::install_does_not_overwrite_invalid_hooks_json ... ok
[INFO] [stdout] test init::codex::tests::install_is_idempotent_when_hook_and_feature_already_exist ... ok
[INFO] [stdout] test init::codex::tests::install_is_idempotent_when_new_hooks_key_already_true ... ok
[INFO] [stdout] test init::cline::tests::install_rewrites_managed_wrapper_when_binary_path_changes ... ok
[INFO] [stdout] test init::codex::tests::entry_commands_returns_empty_when_hooks_key_is_missing ... ok
[INFO] [stdout] test init::codex::tests::install_rejects_invalid_config_toml ... ok
[INFO] [stdout] test init::codex::tests::install_preserves_inline_feature_table_entries ... ok
[INFO] [stdout] test init::codex::tests::install_preserves_unknown_keys_in_hooks_and_config ... ok
[INFO] [stdout] test init::codex::tests::install_rejects_when_pre_tool_use_is_wrong_type ... ok
[INFO] [stdout] test init::codex::tests::install_migrates_legacy_codex_hooks_key ... ok
[INFO] [stdout] test init::codex::tests::install_rejects_when_top_level_is_not_object ... ok
[INFO] [stdout] test init::codex::tests::install_rejects_when_hooks_value_is_wrong_type ... ok
[INFO] [stdout] test init::codex::tests::install_reports_io_error_when_config_path_is_a_directory ... ok
[INFO] [stdout] test init::codex::tests::install_reports_io_error_when_hooks_path_is_a_directory ... ok
[INFO] [stdout] test init::codex::tests::install_rejects_invalid_hooks_json ... ok
[INFO] [stdout] test init::codex::tests::install_appends_when_a_different_matcher_already_exists ... ok
[INFO] [stdout] test init::codex::tests::install_updates_feature_flag_without_rewriting_valid_hook ... ok
[INFO] [stdout] test hook_output::tests::pbt_response_presence_matches_variant ... ok
[INFO] [stdout] test init::codex::tests::resolve_paths_errors_when_no_repo_and_home_unset ... ok
[INFO] [stdout] test init::codex::tests::sibling_temp_path_uses_default_filename_when_input_has_none ... ok
[INFO] [stdout] test init::codex::tests::resolve_paths_uses_repo_root_when_discovered ... ok
[INFO] [stdout] test init::codex::tests::write_json_atomically_propagates_write_error_when_temp_path_is_a_directory ... ok
[INFO] [stdout] test init::codex::tests::write_json_atomically_returns_io_err_when_parent_is_a_regular_file ... ok
[INFO] [stdout] test init::codex::tests::write_toml_atomically_propagates_write_error_when_temp_path_is_a_directory ... ok
[INFO] [stdout] test init::codex::tests::installs_missing_hooks_and_config_files ... ok
[INFO] [stdout] test init::codex::tests::write_json_atomically_propagates_rename_error_when_target_is_a_directory ... ok
[INFO] [stdout] test init::copilot::tests::append_hook_rejects_non_object_root_directly ... ok
[INFO] [stdout] test init::copilot::tests::command_invokes_ptuf_hook_matches_trailing_tokens ... ok
[INFO] [stdout] test init::copilot::tests::detect_binary_delegates_to_shared_impl ... ok
[INFO] [stdout] test init::copilot::tests::entry_commands_collects_bash_and_powershell ... ok
[INFO] [stdout] test init::codex::tests::write_toml_atomically_returns_io_err_when_parent_is_a_regular_file ... ok
[INFO] [stdout] test init::copilot::tests::entry_commands_returns_empty_when_no_command_fields ... ok
[INFO] [stdout] test init::codex::tests::install_writes_hooks_and_config_with_mode_0600 ... ok
[INFO] [stdout] test init::copilot::tests::install_dry_run_reports_changes_without_writing ... ok
[INFO] [stdout] test init::copilot::tests::install_is_idempotent_when_hook_already_exists ... ok
[INFO] [stdout] test hook_output::tests::pbt_copilot_maps_ask_to_deny ... ok
[INFO] [stdout] test init::copilot::tests::install_does_not_overwrite_invalid_hooks_json ... ok
[INFO] [stdout] test init::copilot::tests::install_rejects_invalid_hooks_json ... ok
[INFO] [stdout] test init::copilot::tests::install_rejects_unsupported_version ... ok
[INFO] [stdout] test hook_output::tests::pbt_deny_emits_deny_verdict_in_both_adapters ... ok
[INFO] [stdout] test init::copilot::tests::install_appends_when_unrelated_entry_exists ... ok
[INFO] [stdout] test init::copilot::tests::install_preserves_unknown_keys ... ok
[INFO] [stdout] test init::copilot::tests::empty_hooks_file_is_treated_as_empty_object ... ok
[INFO] [stdout] test init::codex::tests::resolve_paths_falls_back_to_home_when_no_repo_root ... ok
[INFO] [stdout] test init::copilot::tests::install_rejects_when_pre_tool_use_is_wrong_type ... ok
[INFO] [stdout] test init::codex::tests::write_toml_atomically_propagates_rename_error_when_target_is_a_directory ... ok
[INFO] [stdout] test init::copilot::tests::install_rejects_when_hooks_is_wrong_type ... ok
[INFO] [stdout] test init::codex::tests::already_present_detection_ignores_unrelated_command_strings ... ok
[INFO] [stdout] test init::copilot::tests::resolve_paths_requires_repo_root ... ok
[INFO] [stdout] test init::copilot::tests::sibling_temp_path_uses_default_filename_when_input_has_none ... ok
[INFO] [stdout] test init::cursor::tests::append_hook_rejects_non_object_root_directly ... ok
[INFO] [stdout] test init::cursor::tests::command_invokes_ptuf_hook_matches_trailing_tokens ... ok
[INFO] [stdout] test init::cursor::tests::detect_binary_delegates_to_shared_impl ... ok
[INFO] [stdout] test init::copilot::tests::install_returns_io_error_when_parent_directory_cannot_be_created ... ok
[INFO] [stdout] test init::copilot::tests::install_reports_io_error_when_hooks_path_is_a_directory ... ok
[INFO] [stdout] test init::copilot::tests::install_supplies_version_when_missing ... ok
[INFO] [stdout] test init::copilot::tests::install_rejects_when_top_level_is_not_object ... ok
[INFO] [stdout] test init::copilot::tests::pre_tool_use_commands_returns_empty_when_array_missing ... ok
[INFO] [stdout] test init::copilot::tests::install_returns_schema_error_when_hooks_file_is_non_object_json ... ok
[INFO] [stdout] test init::cursor::tests::entry_commands_collects_command_field ... ok
[INFO] [stdout] test init::cursor::tests::entry_commands_returns_empty_when_no_command_field ... ok
[INFO] [stdout] test hook_output::tests::pbt_codex_maps_ask_to_deny ... ok
[INFO] [stdout] test init::cursor::tests::install_preserves_unknown_keys ... ok
[INFO] [stdout] test init::cursor::tests::install_rejects_invalid_hooks_json ... ok
[INFO] [stdout] test init::cursor::tests::install_dry_run_reports_existing_hook_update_without_writing ... ok
[INFO] [stdout] test init::cursor::tests::install_rejects_when_pre_tool_use_is_wrong_type ... ok
[INFO] [stdout] test engine::tests::pbt_monitor_mode_demotion_flag_matches_enforce_baseline ... ok
[INFO] [stdout] test init::cursor::tests::install_rejects_when_top_level_is_not_object ... ok
[INFO] [stdout] test init::cursor::tests::install_dry_run_reports_changes_without_writing ... ok
[INFO] [stdout] test init::cursor::tests::install_returns_io_error_when_hooks_path_is_a_directory ... ok
[INFO] [stdout] test init::copilot::tests::install_writes_hooks_with_mode_0600 ... ok
[INFO] [stdout] test init::cursor::tests::install_rejects_unsupported_version ... ok
[INFO] [stdout] test init::cursor::tests::install_rejects_when_hooks_is_wrong_type ... ok
[INFO] [stdout] test init::cursor::tests::pre_tool_use_commands_returns_empty_when_array_missing ... ok
[INFO] [stdout] test init::cursor::tests::install_does_not_overwrite_invalid_hooks_json ... ok
[INFO] [stdout] test init::cursor::tests::resolve_paths_global_requires_home ... ok
[INFO] [stdout] test init::cursor::tests::resolve_paths_hooks_override_without_parent_uses_dot_root ... ok
[INFO] [stdout] test init::cursor::tests::resolve_paths_local_requires_repo_root ... ok
[INFO] [stdout] test init::cursor::tests::empty_hooks_file_is_treated_as_empty_object ... ok
[INFO] [stdout] test init::cursor::tests::resolve_paths_global_uses_home_cursor_dir ... ok
[INFO] [stdout] test init::kiro::tests::command_invokes_ptuf_hook_matches_trailing_tokens ... ok
[INFO] [stdout] test init::cursor::tests::install_appends_when_unrelated_entry_exists ... ok
[INFO] [stdout] test init::cursor::tests::install_updates_existing_ptuf_hook_to_recommended_values ... ok
[INFO] [stdout] test init::kiro::tests::detect_binary_delegates_to_shared_impl ... ok
[INFO] [stdout] test init::cursor::tests::install_writes_hooks_with_mode_0600 ... ok
[INFO] [stdout] test init::cursor::tests::install_is_idempotent_when_hook_already_exists ... ok
[INFO] [stdout] test init::copilot::tests::installs_missing_hooks_file ... ok
[INFO] [stdout] test init::cursor::tests::resolve_paths_hooks_override_wins_over_scope ... ok
[INFO] [stdout] test init::kiro::tests::install_dry_run_returns_would_install_without_creating_file ... ok
[INFO] [stdout] test init::cursor::tests::resolve_paths_local_uses_discovered_repo_root ... ok
[INFO] [stdout] test hook_input::tests::pbt_bash_command_never_panics ... ok
[INFO] [stdout] test init::cursor::tests::installs_missing_hooks_file ... ok
[INFO] [stdout] test init::kiro::tests::install_rejects_when_pre_tool_use_is_wrong_type ... ok
[INFO] [stdout] test decision::tests::pbt_aggregate_is_severity_invariant_under_permutation ... ok
[INFO] [stdout] test init::cursor::tests::install_supplies_version_when_missing ... ok
[INFO] [stdout] test init::cursor::tests::resolve_paths_root_override_takes_priority_over_start ... ok
[INFO] [stdout] test init::kiro::tests::existing_ptuf_guarded_json_is_idempotent_on_repatch ... ok
[INFO] [stdout] test init::kiro::tests::install_returns_init_error_json_for_invalid_file ... ok
[INFO] [stdout] test init::kiro::tests::global_only_scope_skips_workspace ... ok
[INFO] [stdout] test init::kiro::tests::empty_file_is_treated_as_default_skeleton ... ok
[INFO] [stdout] test init::kiro::tests::enumerate_agents_returns_sorted_split ... ok
[INFO] [stdout] test init::kiro::tests::install_reports_io_error_when_path_is_a_directory ... ok
[INFO] [stdout] test init::kiro::tests::install_rejects_when_top_level_is_not_object ... ok
[INFO] [stdout] test init::kiro::tests::install_writes_agent_config_with_mode_0600 ... ok
[INFO] [stdout] test init::kiro::tests::pre_tool_use_commands_extracts_all_commands ... ok
[INFO] [stdout] test init::kiro::tests::pre_tool_use_commands_returns_empty_when_key_missing ... ok
[INFO] [stdout] test init::kiro::tests::patch_existing_marks_default_agent_covered_when_present ... ok
[INFO] [stdout] test init::kiro::tests::new_agent_mode_keeps_legacy_filename ... ok
[INFO] [stdout] test init::kiro::tests::read_default_agent_rejects_invalid_json ... ok
[INFO] [stdout] test init::kiro::tests::install_appends_when_unrelated_entry_exists ... ok
[INFO] [stdout] test init::kiro::tests::install_creates_new_local_config_with_default_template ... ok
[INFO] [stdout] test init::kiro::tests::read_default_agent_returns_none_when_key_absent ... ok
[INFO] [stdout] test init::kiro::tests::install_rejects_when_hooks_is_wrong_type ... ok
[INFO] [stdout] test init::kiro::tests::resolve_paths_falls_back_to_home_when_outside_git_tree ... ok
[INFO] [stdout] test init::kiro::tests::install_is_idempotent_when_ptuf_hook_already_present ... ok
[INFO] [stdout] test init::kiro::tests::sibling_temp_path_uses_default_filename_when_input_has_none ... ok
[INFO] [stdout] test init::pi::tests::detect_binary_returns_non_empty_string ... ok
[INFO] [stdout] test init::kiro::tests::patch_existing_fails_when_default_agent_missing ... ok
[INFO] [stdout] test init::kiro::tests::install_preserves_unknown_top_level_keys ... ok
[INFO] [stdout] test init::pi::tests::install_dry_run_does_not_write_extension ... ok
[INFO] [stdout] test init::kiro::tests::read_default_agent_returns_value_when_set ... ok
[INFO] [stdout] test init::kiro::tests::write_json_atomically_propagates_rename_error_when_target_is_a_directory ... ok
[INFO] [stdout] test init::kiro::tests::patch_existing_creates_default_json_when_empty ... ok
[INFO] [stdout] test init::kiro::tests::workspace_only_scope_skips_home ... ok
[INFO] [stdout] test init::kiro::tests::patch_existing_covers_workspace_and_home ... ok
[INFO] [stdout] test init::kiro::tests::patch_existing_skips_md_agents ... ok
[INFO] [stdout] test init::kiro::tests::write_json_atomically_propagates_dir_creation_error ... ok
[INFO] [stdout] test init::kiro::tests::write_json_atomically_propagates_write_error_when_tmp_is_a_directory ... ok
[INFO] [stdout] test init::kiro::tests::read_default_agent_returns_none_when_settings_missing ... ok
[INFO] [stdout] test init::pi::tests::install_dry_run_updates_managed_extension_without_writing ... ok
[INFO] [stdout] test init::pi::tests::install_already_present_when_desired_matches ... ok
[INFO] [stdout] test init::pi::tests::install_surfaces_io_error_when_extension_path_is_unreadable ... ok
[INFO] [stdout] test init::pi::tests::resolve_paths_global_errors_when_home_unset ... ok
[INFO] [stdout] test init::pi::tests::install_refuses_unmanaged_existing_extension ... ok
[INFO] [stdout] test init::pi::tests::is_ptuf_managed_requires_all_markers ... ok
[INFO] [stdout] test init::pi::tests::resolve_paths_local_errors_outside_repo ... ok
[INFO] [stdout] test init::pi::tests::render_extension_substitutes_binary_and_version ... ok
[INFO] [stdout] test init::pi::tests::resolve_paths_local_targets_repo_dot_pi_extensions ... ok
[INFO] [stdout] test init::pi::tests::resolve_paths_reads_home_from_environment ... ok
[INFO] [stdout] test init::pi::tests::template_contains_managed_marker_and_required_snippets ... ok
[INFO] [stdout] test init::tests::capture_propagates_io_error_when_path_is_a_directory ... ok
[INFO] [stdout] test init::tests::command_invokes_ptuf_hook_matches_trailing_tokens_against_arbitrary_tail ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_claude_when_only_home_dotclaude_exists ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_cline_via_home_documents_cline ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_codex_via_home_only ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_cursor_via_home_only ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_cursor_via_repo_only ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_kiro_via_home_only ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_pi_via_home_dot_pi_agent ... ok
[INFO] [stdout] test init::tests::command_executable_returns_first_token_or_none ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_cline_via_repo_clinerules ... ok
[INFO] [stdout] test init::tests::detect_agents_returns_empty_when_no_paths_exist ... ok
[INFO] [stdout] test init::tests::detect_agents_returns_all_seven_in_stable_order ... ok
[INFO] [stdout] test init::tests::detect_binary_impl_returns_a_non_empty_string ... ok
[INFO] [stdout] test init::tests::init_error_display_covers_all_variants ... ok
[INFO] [stdout] test init::tests::restore_is_idempotent_when_target_already_absent ... ok
[INFO] [stdout] test init::tests::restore_one_propagates_remove_file_error_when_path_is_a_directory ... ok
[INFO] [stdout] test init::tests::restore_recreates_original_contents ... ok
[INFO] [stdout] test init::tests::restore_propagates_first_error_when_atomic_write_fails ... ok
[INFO] [stdout] test init::tests::sibling_install_tmp_path_falls_back_to_bare_filename_when_no_parent ... ok
[INFO] [stdout] test init::tests::restore_removes_files_that_did_not_exist_before ... ok
[INFO] [stdout] test init::tests::sibling_temp_path_falls_back_when_path_has_no_parent ... ok
[INFO] [stdout] test init::tests::sibling_temp_path_uses_snapshot_tmp_when_path_has_no_file_name ... ok
[INFO] [stdout] test init::tests::write_atomically_propagates_write_error_when_temp_path_is_a_directory ... ok
[INFO] [stdout] test init::tests::write_atomically_returns_io_error_when_parent_is_a_regular_file ... ok
[INFO] [stdout] test init::tests::write_atomically_propagates_rename_error_when_target_is_a_directory ... ok
[INFO] [stdout] test init::tests::write_executable_surfaces_non_already_exists_open_errors ... ok
[INFO] [stdout] test init::tests::write_executable_retries_when_temp_path_already_exists_as_file ... ok
[INFO] [stdout] test init::tests::write_secure_surfaces_non_already_exists_open_errors ... ok
[INFO] [stdout] test init::verify::tests::classify_fail_closed_fails_when_engine_loaded_successfully ... ok
[INFO] [stdout] test init::verify::tests::classify_fail_closed_passes_when_engine_load_failed ... ok
[INFO] [stdout] test init::tests::write_secure_retries_when_temp_path_already_exists_as_file ... ok
[INFO] [stdout] test init::verify::tests::classify_synthetic_deny_fails_for_non_deny_decision ... ok
[INFO] [stdout] test init::verify::tests::classify_synthetic_deny_fails_when_rule_id_differs ... ok
[INFO] [stdout] test init::verify::tests::fail_closed_check_passes_when_plugin_path_missing ... ok
[INFO] [stdout] test init::verify::tests::passed_helper_reports_pass_only_when_both_pass ... ok
[INFO] [stdout] test init::verify::tests::render_json_has_expected_shape ... ok
[INFO] [stdout] test init::verify::tests::render_json_marks_already_present_status ... ok
[INFO] [stdout] test init::verify::tests::render_json_marks_failed_status_with_detail ... ok
[INFO] [stdout] test init::verify::tests::render_text_lists_warnings_when_present ... ok
[INFO] [stdout] test init::verify::tests::render_text_shows_failed_branches ... ok
[INFO] [stdout] test init::verify::tests::render_text_shows_passed_branches_and_no_warnings ... ok
[INFO] [stdout] test init::verify::tests::run_returns_passing_report_in_default_environment ... ok
[INFO] [stdout] test init::verify::tests::run_with_uses_provided_closures ... ok
[INFO] [stdout] test init::verify::tests::synthetic_deny_check_passes_for_rm_rf_root ... ok
[INFO] [stdout] test io_runner::tests::io_runner_dispatches_hook_with_exit_code ... ok
[INFO] [stdout] test io_runner::tests::io_runner_dispatches_plugin_check ... ok
[INFO] [stdout] test init::verify::tests::classify_synthetic_deny_passes_for_canonical_rule ... ok
[INFO] [stdout] test io_runner::tests::run_dispatches_check_with_args ... ok
[INFO] [stdout] test init::tests::capture_records_existing_and_missing_files ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_copilot_via_repo_dotgithub ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_kiro_via_repo_only ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_pi_via_repo_dot_pi ... ok
[INFO] [stdout] test init::tests::detect_agents_finds_codex_via_repo_only ... ok
[INFO] [stdout] test init::pi::tests::resolve_paths_extension_flag_takes_precedence ... ok
[INFO] [stdout] test init::pi::tests::install_writes_managed_marker_and_binary_path ... ok
[INFO] [stdout] test init::pi::tests::install_updates_managed_extension_when_binary_changes ... ok
[INFO] [stdout] test init::kiro::tests::patch_existing_patches_every_json_in_workspace_agents_dir ... ok
[INFO] [stdout] test init::pi::tests::resolve_paths_global_targets_home_pi_agent_extensions ... ok
[INFO] [stdout] test init::pi::tests::install_marks_extension_mode_0600 ... ok
[INFO] [stdout] test io_runner::tests::run_reports_unknown_command_to_stderr_with_exit_one ... ok
[INFO] [stdout] test io_runner::tests::run_with_no_args_reports_missing_subcommand ... ok
[INFO] [stdout] test plugin::dsl::tests::compile_when_shell_ast_returns_error ... ok
[INFO] [stdout] test plugin::dsl::tests::compiles_not_negation ... ok
[INFO] [stdout] test plugin::dsl::tests::compiles_all_with_nested_leaves ... ok
[INFO] [stdout] test plugin::dsl::tests::compiles_sensitive_path_kind_any ... ok
[INFO] [stdout] test plugin::dsl::tests::compiles_url_scheme_any_and_host_any ... ok
[INFO] [stdout] test plugin::dsl::tests::compile_error_is_a_std_error ... ok
[INFO] [stdout] test plugin::dsl::tests::compile_rejects_invalid_shell_leaf_shapes ... ok
[INFO] [stdout] test plugin::dsl::tests::empty_inner_any_surfaces_as_invalid_shape_for_any ... ok
[INFO] [stdout] test plugin::dsl::tests::compile_error_display_covers_every_variant ... ok
[INFO] [stdout] test plugin::dsl::tests::compiles_path_file_path_prefix_any ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_all_combinator ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_any_short_circuits ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_event_only_pre_tool_use ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_not_inverts ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_path_prefix_returns_false_for_non_path_tool ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_path_prefix_against_read_input ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_shell_argv_head_any ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_sensitive_kind_against_read_of_ssh ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_shell_argv_returns_false_for_non_bash_input ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_shell_pipeline_from_to ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_shell_pipeline_misses_when_order_inverted ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_sensitive_kind_returns_false_when_no_match ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_tool_any_match ... ok
[INFO] [stdout] test plugin::dsl::tests::compile_rejects_invalid_mapping_and_list_shapes ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_shell_pipeline_returns_false_for_non_bash_input ... ok
[INFO] [stdout] test plugin::dsl::tests::compiles_single_tool_leaf ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_shell_pipeline_through_sudo ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_url_scheme_and_host_against_webfetch ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_tool_match ... ok
[INFO] [stdout] test plugin::dsl::tests::evaluate_url_leaves_return_false_when_no_url ... ok
[INFO] [stdout] test plugin::dsl::tests::expect_string_list_rejects_non_string_item ... ok
[INFO] [stdout] test plugin::dsl::tests::expect_string_rejects_non_string ... ok
[INFO] [stdout] test plugin::dsl::tests::implicit_all_for_two_top_level_keys ... ok
[INFO] [stdout] test plugin::dsl::tests::non_string_item_in_nested_tool_any_surfaces_leaf_key ... ok
[INFO] [stdout] test plugin::dsl::tests::new_leaf_keys_reject_non_sequence ... ok
[INFO] [stdout] test plugin::dsl::tests::expect_string_list_rejects_non_sequence ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_compile_never_panics ... ok
[INFO] [stdout] test engine::tests::pbt_default_engine_decide_never_panics ... ok
[INFO] [stdout] test engine::tests::pbt_default_engine_never_demotes ... ok
[INFO] [stdout] test plugin::dsl::tests::shell_argv_requires_head_any ... ok
[INFO] [stdout] test plugin::dsl::tests::shell_pipeline_compiles_from_to ... ok
[INFO] [stdout] test plugin::dsl::tests::shell_pipeline_from_to_matches_inner_argv_pipeline ... ok
[INFO] [stdout] test plugin::dsl::tests::shell_pipeline_missing_to_is_rejected ... ok
[INFO] [stdout] test plugin::dsl::tests::unknown_key_is_rejected ... ok
[INFO] [stdout] test plugin::dsl::tests::unknown_key_nested_inside_all_is_rejected_by_name ... ok
[INFO] [stdout] test plugin::dsl::tests::unknown_key_nested_three_deep_is_rejected_by_name ... ok
[INFO] [stdout] test plugin::loader::tests::compile_error_carries_rule_id_and_path_for_nested_invalid_when ... ok
[INFO] [stdout] test plugin::loader::tests::load_path_returns_io_error_for_missing_file ... ok
[INFO] [stdout] test plugin::loader::tests::loader_accepts_shell_ast_but_dsl_has_no_when_node ... ok
[INFO] [stdout] test plugin::loader::tests::loads_minimal_plugin ... ok
[INFO] [stdout] test plugin::loader::tests::loads_rule_and_compiles_when ... ok
[INFO] [stdout] test plugin::loader::tests::malformed_yaml_yields_yaml_error ... ok
[INFO] [stdout] test plugin::loader::tests::plugin_load_errors_carry_path_and_observed_fields ... ok
[INFO] [stdout] test plugin::loader::tests::rejects_unsupported_required_fact ... ok
[INFO] [stdout] test plugin::loader::tests::rejects_when_with_unknown_key ... ok
[INFO] [stdout] test plugin::loader::tests::rejects_wrong_api_version ... ok
[INFO] [stdout] test plugin::loader::tests::rejects_wrong_kind ... ok
[INFO] [stdout] test plugin::loader::tests::supported_facts_includes_expected_v0_3_set ... ok
[INFO] [stdout] test plugin::rule::tests::decision_kind_maps_to_expected_plugin_decision ... ok
[INFO] [stdout] test plugin::rule::tests::defaults_overridable_true_and_hard_deny_false ... ok
[INFO] [stdout] test plugin::rule::tests::explicit_hard_deny_and_overridable_are_honoured ... ok
[INFO] [stdout] test plugin::rule::tests::rule_returns_none_when_when_does_not_match ... ok
[INFO] [stdout] test plugin::runner::tests::decision_label_maps_each_variant_for_render_diagnostics ... ok
[INFO] [stdout] test plugin::runner::tests::fails_when_allow_case_triggers ... ok
[INFO] [stdout] test plugin::runner::tests::fails_when_deny_case_does_not_trigger ... ok
[INFO] [stdout] test plugin::runner::tests::invalid_yaml_propagates_as_plugin_error ... ok
[INFO] [stdout] test plugin::runner::tests::no_test_section_yields_zero_cases_and_passes ... ok
[INFO] [stdout] test plugin::runner::tests::passes_when_all_cases_meet_expectations ... ok
[INFO] [stdout] test plugin::runner::tests::prepare_case_propagates_compile_error_for_unknown_when_key ... ok
[INFO] [stdout] test plugin::runner::tests::render_includes_pass_and_fail_summary ... ok
[INFO] [stdout] test plugin::loader::tests::pbt_load_str_is_total_on_arbitrary_input ... ok
[INFO] [stdout] test plugin::runner::tests::render_propagates_io_error_when_header_write_fails ... ok
[INFO] [stdout] test plugin::runner::tests::render_propagates_io_error_when_per_case_write_fails ... ok
[INFO] [stdout] test plugin::schema::tests::parses_capabilities_block ... ok
[INFO] [stdout] test plugin::schema::tests::parses_minimal_plugin ... ok
[INFO] [stdout] test plugin::schema::tests::parses_rule_with_when_and_tests ... ok
[INFO] [stdout] test plugin::runner::tests::render_labels_monitor_when_allow_expectation_fails ... ok
[INFO] [stdout] test plugin::schema::tests::rejects_unknown_top_level_field ... ok
[INFO] [stdout] test plugin::tests::plugin_error_display_covers_every_variant ... ok
[INFO] [stdout] test plugin::tests::plugin_error_io_chain_is_visible_via_source ... ok
[INFO] [stdout] test plugin::tests::pushed_plugins_contribute_rules ... ok
[INFO] [stdout] test plugin::tests::empty_plugin_set_iterates_no_rules ... ok
[INFO] [stdout] test reason::tests::includes_rule_id_header_and_problem ... ok
[INFO] [stdout] test reason::tests::enumerates_alternatives ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_url_leaves_require_webfetch ... ok
[INFO] [stdout] test reason::tests::pbt_alternatives_are_numbered ... ok
[INFO] [stdout] test reason::tests::pbt_never_panics ... ok
[INFO] [stdout] test rules::destructive_rm::tests::allows_lookalike_system_paths ... ok
[INFO] [stdout] test reason::tests::pbt_no_alternatives_section_when_empty ... ok
[INFO] [stdout] test rules::destructive_rm::tests::allows_other_commands_with_rm_substring ... ok
[INFO] [stdout] test rules::destructive_rm::tests::allows_safe_rm_invocations ... ok
[INFO] [stdout] test rules::destructive_rm::tests::allows_safe_sudo_rm_invocations ... ok
[INFO] [stdout] test rules::destructive_rm::tests::allows_when_only_one_of_recursive_or_force_is_set ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_alternate_flag_orderings ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_bash_dash_c_wrapped_rm ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_find_exec_wrapped_rm ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_full_path_to_rm ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_home_targets_with_trailing_slash ... ok
[INFO] [stdout] test rules::destructive_rm::tests::allows_non_bash_tools ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_in_pipeline_or_compound ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_mixed_long_and_short_flags ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_rm_rf_home_envvar ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_rm_rf_home_tilde ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_rm_rf_root ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_rm_rf_system_paths ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_separated_lowercase_short_flags ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_sudo_wrapped_rm ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_uppercase_recursive_flag ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_when_one_of_multiple_targets_is_destructive ... ok
[INFO] [stdout] test rules::destructive_rm::tests::destructive_rm_normalizes_double_slash ... ok
[INFO] [stdout] test rules::destructive_rm::tests::destructive_rm_pessimistic_on_parent_segments ... ok
[INFO] [stdout] test rules::destructive_rm::tests::denies_rm_rf_root_glob ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_evaluate_simple_leaves_never_panic ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_event_only_pre_tool_use ... ok
[INFO] [stdout] test rules::destructive_rm::tests::pbt_bundled_destructive_flags_deny ... ok
[INFO] [stdout] test reason::tests::pbt_starts_with_header ... ok
[INFO] [stdout] test rules::destructive_rm::tests::pbt_all_destructive_combinations_deny ... ok
[INFO] [stdout] test rules::destructive_rm::tests::trait_metadata_is_stable ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::allows_bash_login_shell ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::allows_dash_c_without_value ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::allows_eval_without_argument ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::allows_python_repl_or_script ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::allows_unrelated_command ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::asks_on_absolute_path_head ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::asks_on_bash_dash_c ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::asks_on_combined_shell_short_options ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::asks_on_eval_first_positional ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::asks_on_find_exec_eval_wrapper_itself ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::asks_on_interpreter_dash_eval_flags ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::asks_on_sudo_bash_dash_c ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::fires_after_separator ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::fires_inside_pipeline ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::ignores_non_bash_tools ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_all_any_vacuous ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_tool_leaf_correct ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test rules::destructive_rm::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test rules::git::tests::branch_delete_allows_lowercase_d ... ok
[INFO] [stdout] test rules::git::tests::branch_delete_allows_other_subcommand ... ok
[INFO] [stdout] test rules::destructive_rm::tests::pbt_no_rm_head_means_no_fire ... ok
[INFO] [stdout] test rules::git::tests::branch_delete_asks_in_cluster ... ok
[INFO] [stdout] test rules::git::tests::branch_delete_asks_short_capital_d ... ok
[INFO] [stdout] test rules::git::tests::branch_delete_asks_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::clean_allows_other_subcommand ... ok
[INFO] [stdout] test rules::git::tests::clean_allows_dry_run ... ok
[INFO] [stdout] test rules::git::tests::clean_allows_partial_flags ... ok
[INFO] [stdout] test rules::git::tests::clean_asks_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::clean_asks_fdx_flag_variants ... ok
[INFO] [stdout] test rules::git::tests::config_override_allows_harmless_keys ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_shell_argv_requires_bash ... ok
[INFO] [stdout] test rules::git::tests::config_override_allows_status_subcommand ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::pbt_no_dynamic_head_means_no_fire ... ok
[INFO] [stdout] test rules::git::tests::config_override_allows_truthy_gpgsign ... ok
[INFO] [stdout] test rules::git::tests::config_override_denies_hookspath ... ok
[INFO] [stdout] test rules::git::tests::config_override_denies_commit_gpgsign_false ... ok
[INFO] [stdout] test rules::git::tests::config_override_denies_quoted_with_spaces ... ok
[INFO] [stdout] test rules::git::tests::config_override_denies_hookspath_via_long_form ... ok
[INFO] [stdout] test rules::git::tests::config_override_denies_tag_gpgsign_zero ... ok
[INFO] [stdout] test rules::git::tests::config_override_denies_uppercase_key ... ok
[INFO] [stdout] test rules::git::tests::config_override_denies_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::config_overrides_skip_dangling_dash_c_with_no_value ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_allows_husky_truthy ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_allows_status_subcommand ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_allows_unrelated_env ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_denies_husky_zero ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_denies_lefthook_zero_on_push ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_denies_pre_commit_allow_no_config ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_denies_skip_listed ... ok
[INFO] [stdout] test rules::git::tests::env_credential_hijack_denies_askpass_on_fetch ... ok
[INFO] [stdout] test rules::git::tests::env_credential_hijack_denies_on_clone_and_ls_remote ... ok
[INFO] [stdout] test rules::git::tests::env_credential_hijack_denies_ssh_command_on_push ... ok
[INFO] [stdout] test rules::git::tests::env_credential_hijack_silent_outside_network_scope ... ok
[INFO] [stdout] test rules::git::tests::env_path_redirect_denies_config_overrides ... ok
[INFO] [stdout] test rules::git::tests::env_path_redirect_silent_on_non_git_head ... ok
[INFO] [stdout] test rules::git::tests::env_path_redirect_denies_git_dir ... ok
[INFO] [stdout] test rules::git::tests::evaluate_emits_monitor_when_decision_kind_is_monitor ... ok
[INFO] [stdout] test rules::git::tests::evaluate_returns_none_when_decision_kind_is_allow ... ok
[INFO] [stdout] test rules::git::tests::force_if_includes_asks_long_flag ... ok
[INFO] [stdout] test rules::git::tests::force_if_includes_does_not_fire_for_lease_or_force ... ok
[INFO] [stdout] test rules::git::tests::env_bypass_denies_multiple_envs ... ok
[INFO] [stdout] test rules::git::tests::force_push_allows_safe_push_and_other_subcommands ... ok
[INFO] [stdout] test rules::git::tests::force_push_denies_plus_refspec ... ok
[INFO] [stdout] test rules::git::tests::env_path_redirect_allows_unrelated_env ... ok
[INFO] [stdout] test rules::destructive_rm::tests::pbt_non_bash_yields_none ... ok
[INFO] [stdout] test rules::git::tests::force_push_denies_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::force_push_does_not_fire_on_bare_plus ... ok
[INFO] [stdout] test rules::git::tests::force_push_denies_via_nested_and_other_wrappers ... ok
[INFO] [stdout] test rules::git::tests::force_push_denies_via_sudo_user_option ... ok
[INFO] [stdout] test rules::git::tests::force_push_plus_refspec_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::gc_prune_now_asks ... ok
[INFO] [stdout] test rules::git::tests::gc_prune_now_allows_safe_gc ... ok
[INFO] [stdout] test rules::git::tests::lease_allows_plain_push ... ok
[INFO] [stdout] test rules::git::tests::lease_asks_long_flag ... ok
[INFO] [stdout] test rules::git::tests::lease_allows_force_only ... ok
[INFO] [stdout] test rules::git::tests::lease_asks_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::lease_asks_with_value_form ... ok
[INFO] [stdout] test rules::git::tests::metadata_matches_design_table ... ok
[INFO] [stdout] test rules::git::tests::no_gpg_sign_allows_safe_commit ... ok
[INFO] [stdout] test rules::git::tests::no_gpg_sign_denies_on_tag ... ok
[INFO] [stdout] test rules::git::tests::no_gpg_sign_allows_unrelated_subcommand ... ok
[INFO] [stdout] test rules::git::tests::no_gpg_sign_denies_on_commit ... ok
[INFO] [stdout] test rules::git::tests::no_verify_allows_message_containing_phrase ... ok
[INFO] [stdout] test rules::git::tests::force_push_does_not_fire_for_lease_variant ... ok
[INFO] [stdout] test rules::git::tests::no_verify_denies_amend_with_long_flag ... ok
[INFO] [stdout] test rules::git::tests::no_verify_denies_long_flag_on_commit ... ok
[INFO] [stdout] test rules::git::tests::no_verify_denies_on_merge_and_rebase ... ok
[INFO] [stdout] test rules::git::tests::no_verify_denies_on_push_long_flag ... ok
[INFO] [stdout] test rules::git::tests::no_verify_denies_short_cluster_with_n_on_commit ... ok
[INFO] [stdout] test rules::git::tests::no_verify_denies_short_n_on_commit ... ok
[INFO] [stdout] test rules::git::tests::no_verify_denies_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::no_verify_resolves_subcommand_after_global_dash_c ... ok
[INFO] [stdout] test rules::git::tests::no_verify_allows_push_dry_run_short_n ... ok
[INFO] [stdout] test rules::git::tests::no_verify_allows_safe_commit ... ok
[INFO] [stdout] test rules::git::tests::no_verify_allows_tag_with_n_count ... ok
[INFO] [stdout] test rules::git::tests::no_gpg_sign_denies_via_sudo ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_not_inverts ... ok
[INFO] [stdout] test rules::git::tests::pbt_force_push_fires_for_bare_force ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_tool_any_membership ... ok
[INFO] [stdout] test rules::git::tests::pbt_git_rules_never_panic_on_arbitrary_bash ... ok
[INFO] [stdout] test rules::git::tests::pbt_git_rules_ignore_non_bash ... ok
[INFO] [stdout] test rules::git::tests::push_delete_allows_normal_push ... ok
[INFO] [stdout] test rules::git::tests::push_delete_asks_colon_refspec ... ok
[INFO] [stdout] test rules::git::tests::push_delete_asks_long_flag ... ok
[INFO] [stdout] test rules::destructive_rm::tests::pbt_only_emits_deny_with_correct_id ... ok
[INFO] [stdout] test rules::git::tests::push_mirror_asks_long_flag ... ok
[INFO] [stdout] test rules::git::tests::push_mirror_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::reflog_expire_allows_read_only_ops ... ok
[INFO] [stdout] test rules::git::tests::reflog_expire_asks_delete_subcommand ... ok
[INFO] [stdout] test rules::git::tests::reflog_expire_asks_expire_now ... ok
[INFO] [stdout] test rules::git::tests::push_delete_asks_short_flag ... ok
[INFO] [stdout] test rules::git::tests::pbt_lease_alone_only_lease_fires ... ok
[INFO] [stdout] test rules::git::tests::remote_set_url_allows_other_remote_subcommands ... ok
[INFO] [stdout] test rules::git::tests::push_mirror_allows_safe_push ... ok
[INFO] [stdout] test rules::git::tests::remote_set_url_allows_other_subcommand ... ok
[INFO] [stdout] test rules::git::tests::remote_set_url_allows_word_in_other_command ... ok
[INFO] [stdout] test rules::git::tests::remote_set_url_asks_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::remote_set_url_asks ... ok
[INFO] [stdout] test rules::git::tests::reset_hard_allows_other_subcommand ... ok
[INFO] [stdout] test rules::git::tests::reset_hard_allows_soft_and_keep ... ok
[INFO] [stdout] test rules::git::tests::reset_hard_asks_long_flag ... ok
[INFO] [stdout] test rules::git::tests::reset_hard_asks_with_no_target ... ok
[INFO] [stdout] test rules::git::tests::rules_fire_inside_compound_commands ... ok
[INFO] [stdout] test rules::git::tests::rules_ignore_non_bash_tools ... ok
[INFO] [stdout] test rules::git::tests::stash_clear_allows_other_stash_subcommands ... ok
[INFO] [stdout] test rules::git::tests::stash_clear_allows_other_subcommand ... ok
[INFO] [stdout] test rules::git::tests::reset_hard_asks_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::stash_clear_allows_word_clear_in_other_arg ... ok
[INFO] [stdout] test rules::git::tests::stash_clear_asks ... ok
[INFO] [stdout] test rules::git::tests::stash_clear_asks_via_sudo ... ok
[INFO] [stdout] test rules::git::tests::unwrap_privilege_wrapper_with_only_flags_returns_none ... ok
[INFO] [stdout] test rules::git::tests::update_ref_delete_allows_create_or_update ... ok
[INFO] [stdout] test rules::git::tests::update_ref_delete_asks_dash_d ... ok
[INFO] [stdout] test rules::injection_content::tests::allows_clean_file ... ok
[INFO] [stdout] test rules::injection_content::tests::allows_codepoints_adjacent_to_new_ranges ... ok
[INFO] [stdout] test rules::injection_content::tests::allows_leading_bom ... ok
[INFO] [stdout] test rules::injection_content::tests::allows_standard_variation_selectors ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_bash_cat ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_bash_head_still_fires ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_bash_sudo_cat ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_bom_not_at_start ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_bash_wrapper ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_edit_tool ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_directional_marks ... ok
[INFO] [stdout] test rules::git::tests::reset_hard_matches_inside_bash_dash_c ... ok
[INFO] [stdout] test rules::git::tests::rules_handle_full_path_to_git ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_invisible_before_invalid_utf8 ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_mcp_tool ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_invisible_math_operators ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_new_categories_via_bash_and_mcp ... ok
[INFO] [stdout] test rules::injection_content::tests::is_content_reader_excludes_hex_dumps ... ok
[INFO] [stdout] test rules::injection_content::tests::metadata_matches_design ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_variation_selector_supplement ... ok
[INFO] [stdout] test rules::git::tests::pbt_safe_config_keys_never_fire ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_unicode_category_representatives ... ok
[INFO] [stdout] test rules::git::tests::pbt_push_dry_run_never_fires_no_verify ... ok
[INFO] [stdout] test rules::injection_content::tests::pbt_hex_dump_heads_yield_no_candidates ... ok
[INFO] [stdout] test rules::injection_content::tests::pbt_clean_ascii_never_flagged ... ok
[INFO] [stdout] test rules::injection_content::tests::reason_names_category_and_line ... ok
[INFO] [stdout] test rules::injection_content::tests::reason_names_variation_selector_category ... ok
[INFO] [stdout] test rules::injection_content::tests::pbt_standard_variation_selectors_never_flagged ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_any_flattens ... ok
[INFO] [stdout] test rules::injection_content::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::pbt_non_bash_yields_none ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_bash_hex_dump_heads ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_bash_clean_cat ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_bash_without_command ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_binary_extension ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_binary_with_nul ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_directory ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_invalid_utf8 ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_missing_file ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_non_path_tool ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_write_tool ... ok
[INFO] [stdout] test rules::injection_content::tests::pbt_scan_bytes_never_panics ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_bash_non_reader_head ... ok
[INFO] [stdout] test rules::patterns::tests::pbt_dotenv_false_positives_rejected ... ok
[INFO] [stdout] test rules::git::tests::pbt_no_git_head_no_fire ... ok
[INFO] [stdout] test rules::patterns::tests::pbt_prefilter_matches_regex ... ok
[INFO] [stdout] test rules::patterns::tests::sensitive_path_matches_absolute_secret_directories ... ok
[INFO] [stdout] test rules::patterns::tests::pbt_anchored_dotenv_literals_match_sensitive_path ... ok
[INFO] [stdout] test rules::patterns::tests::sensitive_path_matches_dotenv_case_insensitive ... ok
[INFO] [stdout] test rules::injection_content::tests::silent_for_bash_sudo_xxd ... ok
[INFO] [stdout] test rules::patterns::tests::argv_references_sensitive_checks_head_and_args ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_allows_npm_install_when_no_pnpm_lock ... ok
[INFO] [stdout] test rules::patterns::tests::sensitive_path_rejects_non_secret_paths ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_allows_pnpm_install_even_with_pnpm_lock ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_denies_npm_ci_when_pnpm_lock_present ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_double_negation_is_identity ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_denies_via_sudo_wrapper ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_allows_npm_run_command ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_denies_npm_install_when_pnpm_lock_present ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_does_not_fire_for_npm_with_no_subcommand ... ok
[INFO] [stdout] test rules::injection_content::tests::asks_for_invisible_within_scan_cap ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_branch_rule_does_not_fire_for_git_with_no_subcommand ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_branch_rule_fires_for_git_clean_with_long_force_flag ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_allows_safe_git_commands_on_protected_branch ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_branch_rule_does_not_fire_for_non_git_command ... ok
[INFO] [stdout] test rules::patterns::tests::pbt_sensitive_path_is_match_never_panics ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pbt_protected_rule_silent_off_protected_branch ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_allows_when_branch_is_not_protected ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_denies_reset_hard_on_protected_branch ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_denies_branch_force_delete_on_protected_branch ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_denies_reset_hard_via_sudo_user_option ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_ignores_non_bash_tools ... ok
[INFO] [stdout] test rules::project_hygiene::tests::rules_default_to_high_severity_deny_overridable ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_denies_stash_clear_on_protected_branch ... ok
[INFO] [stdout] test rules::project_hygiene::tests::uv_allows_uv_pip_install_even_with_uv_lock ... ok
[INFO] [stdout] test rules::project_hygiene::tests::uv_denies_pip3_install_when_uv_lock_present ... ok
[INFO] [stdout] test rules::project_hygiene::tests::uv_denies_pip_install_when_uv_lock_present ... ok
[INFO] [stdout] test rules::project_hygiene::tests::protected_git_denies_via_sudo ... ok
[INFO] [stdout] test rules::remote_pipe::tests::allows_pipe_to_non_interpreter ... ok
[INFO] [stdout] test rules::remote_pipe::tests::allows_when_no_fetcher_present ... ok
[INFO] [stdout] test rules::remote_pipe::tests::denies_remote_fetch_piped_to_interpreters ... ok
[INFO] [stdout] test rules::project_hygiene::tests::uv_allows_pip_install_when_no_uv_lock ... ok
[INFO] [stdout] test rules::project_hygiene::tests::uv_denies_pip_install_via_sudo_wrapper ... ok
[INFO] [stdout] test rules::remote_pipe::tests::denies_with_sudo_interposed ... ok
[INFO] [stdout] test rules::remote_pipe::tests::denies_with_sudo_value_flag_interposed ... ok
[INFO] [stdout] test rules::remote_pipe::tests::denies_remote_pipe_inside_su_c ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pnpm_denies_yarn_install_when_pnpm_lock_present ... ok
[INFO] [stdout] test engine::tests::pbt_audit_redaction_matches_redact_strict ... ok
[INFO] [stdout] test rules::project_hygiene::tests::uv_allows_pip_uninstall ... ok
[INFO] [stdout] test rules::remote_pipe::tests::allows_curl_without_pipe_to_interpreter ... ok
[INFO] [stdout] test rules::patterns::tests::pbt_brace_dotenv_matches_sensitive_path ... ok
[INFO] [stdout] test rules::dynamic_eval::tests::pbt_only_emits_ask_with_correct_id ... ok
[INFO] [stdout] test rules::self_protection::tests::rule_ids_are_kebab_case_under_self_protection ... ok
[INFO] [stdout] test rules::project_hygiene::tests::pbt_lock_rules_silent_when_no_lock ... ok
[INFO] [stdout] test rules::remote_pipe::tests::pbt_no_fetcher_means_no_fire ... ok
[INFO] [stdout] test rules::self_protection::tests::rules_carry_hard_deny_critical_metadata ... ok
[INFO] [stdout] test rules::self_protection::tests::rules_do_not_fire_for_empty_protected ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::allows_non_reader_with_dotenv_arg ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::allows_reader_without_sensitive_arg ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::allows_redirect_write_to_sensitive_path ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::allows_unrelated_segments_separated_by_semicolon ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_brace_expansion_dotenv ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_command_substitution_pessimistic ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_dd_in_either_direction ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_inner_bash_c ... ok
[INFO] [stdout] test rules::injection_content::tests::scans_only_head_of_huge_file ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::allows_tee_into_sensitive_path ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_redirected_stdin ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_sudo_cat ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_reader_heads_on_sensitive_paths ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_when_sensitive_segment_present_among_others ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::gap_unicode_homoglyph_normalizes_or_flags ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::ignores_non_bash_tools ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::gap_cmdsubst_outer_nonreader_surfaces_sensitive_token ... ok
[INFO] [stdout] test rules::remote_pipe::tests::pbt_non_bash_yields_none ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::asks_for_absolute_path_ssh_config ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::metadata_matches_design ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_de_morgan_not_any ... ok
[INFO] [stdout] test rules::remote_pipe::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test rules::sensitive_net::tests::allows_devtcp_redirect_without_sensitive_path ... ok
[INFO] [stdout] test rules::sensitive_net::tests::allows_network_sink_without_sensitive_path ... ok
[INFO] [stdout] test rules::sensitive_net::tests::allows_sensitive_in_first_segment_sink_in_second ... ok
[INFO] [stdout] test rules::sensitive_net::tests::allows_sensitive_read_without_network_sink ... ok
[INFO] [stdout] test rules::sensitive_net::tests::allows_unrelated_segments_separated_by_and_or ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test rules::sensitive_net::tests::allows_when_neither_present ... ok
[INFO] [stdout] test rules::sensitive_net::tests::denies_pem_blob_into_wget ... ok
[INFO] [stdout] test rules::sensitive_net::tests::denies_redirect_to_sensitive_path ... ok
[INFO] [stdout] test rules::sensitive_net::tests::denies_sensitive_paths_into_network_sinks ... ok
[INFO] [stdout] test rules::sensitive_net::tests::denies_sudo_wrapped_network_sink ... ok
[INFO] [stdout] test rules::sensitive_net::tests::denies_when_command_substitution_present_pessimistic ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::pbt_brace_dotenv_surfaces_on_argv ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::pbt_no_reader_head_means_no_fire ... ok
[INFO] [stdout] test rules::self_protection::tests::pbt_empty_protected_never_fires ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_all_flattens ... ok
[INFO] [stdout] test rules::sensitive_net::tests::ignores_non_bash_tools ... ok
[INFO] [stdout] test rules::self_protection::tests::reason_includes_rule_id_and_alternatives ... ok
[INFO] [stdout] test rules::sensitive_net::tests::allows_unrelated_segments_separated_by_semicolon ... ok
[INFO] [stdout] test rules::sensitive_net::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test rules::sensitive_net::tests::sensitive_net_denies_devtcp_redirect ... ok
[INFO] [stdout] test rules::sensitive_read::tests::allows_read_of_non_sensitive_file ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_mcp_filesystem_read_of_aws_credentials ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_mcp_github_create_or_update_of_pem_path ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_read_of_absolute_kube_config ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_apply_patch_adding_dotenv ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_read_of_aws_credentials ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_edit_of_dotenv ... ok
[INFO] [stdout] test plugin::dsl::tests::pbt_de_morgan_not_all ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_read_of_ssh_key ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_write_of_dotenv ... ok
[INFO] [stdout] test rules::sensitive_read::tests::denies_write_of_pem_content_to_arbitrary_path ... ok
[INFO] [stdout] test rules::sensitive_read::tests::does_not_fire_for_bash_invocations_pointing_at_secret_paths ... ok
[INFO] [stdout] test rules::sensitive_read::tests::does_not_fire_for_mcp_tool_without_a_path_field ... ok
[INFO] [stdout] test rules::sensitive_read::tests::does_not_fire_for_non_sensitive_apply_patch ... ok
[INFO] [stdout] test rules::sensitive_read::tests::metadata_matches_design ... ok
[INFO] [stdout] test rules::sensitive_read::tests::does_not_fire_for_non_sensitive_write ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::pbt_reader_brace_dotenv_always_asks ... ok
[INFO] [stdout] test rules::injection_content::tests::pbt_only_emits_ask_with_correct_id ... ok
[INFO] [stdout] test rules::tests::builtin_rules_keep_overridable_true ... ok
[INFO] [stdout] test rules::tests::config_rule_defaults_match_documented_baseline ... ok
[INFO] [stdout] test rules::tests::config_rule_defaults_match_documented_baseline_via_dyn_dispatch ... ok
[INFO] [stdout] test rules::sensitive_read::tests::pbt_non_file_tool_yields_none ... ok
[INFO] [stdout] test rules::tests::evaluate_all_fires_destructive_rm ... ok
[INFO] [stdout] test rules::sensitive_net::tests::pbt_no_network_sink_means_no_fire ... ok
[INFO] [stdout] test rules::tests::evaluate_all_returns_empty_for_safe_bash ... ok
[INFO] [stdout] test rules::tests::legacy_v0_1_rules_are_hard_deny_critical ... ok
[INFO] [stdout] test rules::tests::evaluate_all_can_fire_multiple_rules ... ok
[INFO] [stdout] test rules::remote_pipe::tests::pbt_only_emits_deny_with_correct_id ... ok
[INFO] [stdout] test rules::self_protection::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test rules::tests::pbt_iter_matches_rules_slice ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::pbt_non_bash_yields_none ... ok
[INFO] [stdout] test rules::self_protection::tests::pbt_single_kind_fires_exactly_its_rule ... ok
[INFO] [stdout] test rules::tests::rule_ids_are_stable_strings ... ok
[INFO] [stdout] test rules::workspace::tests::allows_read_inside_workspace ... ok
[INFO] [stdout] test rules::sensitive_read::tests::pbt_empty_sensitive_yields_none ... ok
[INFO] [stdout] test rules::workspace::tests::denies_bash_redirect_outside_workspace ... ok
[INFO] [stdout] test rules::workspace::tests::denies_read_outside_workspace ... ok
[INFO] [stdout] test rules::workspace::tests::denies_write_outside_workspace ... ok
[INFO] [stdout] test rules::workspace::tests::deny_reason_carries_resolved_path_and_workspace_list ... ok
[INFO] [stdout] test rules::sensitive_net::tests::pbt_brace_dotenv_network_exfil_always_denies ... ok
[INFO] [stdout] test rules::tests::pbt_rule_ids_are_unique ... ok
[INFO] [stdout] test rules::workspace::tests::dotdot_traversal_resolved_before_check ... ok
[INFO] [stdout] test rules::workspace::tests::matches_any_of_multiple_workspaces ... ok
[INFO] [stdout] test rules::workspace::tests::nonexistent_descendant_is_classified_via_existing_ancestor ... ok
[INFO] [stdout] test rules::workspace::tests::lookalike_prefix_does_not_satisfy_boundary ... ok
[INFO] [stdout] test rules::sensitive_read::tests::pbt_sensitive_read_paths_always_fire ... ok
[INFO] [stdout] test rules::tests::pbt_bash_only_rules_silent_on_non_bash ... ok
[INFO] [stdout] test rules::workspace::tests::skips_when_no_workspaces_configured ... ok
[INFO] [stdout] test rules::sensitive_net::tests::pbt_non_bash_yields_none ... ok
[INFO] [stdout] test rules::workspace::tests::workspace_root_itself_being_a_symlink_is_followed_for_internal_writes ... ok
[INFO] [stdout] test self_paths::tests::classify_does_not_match_bare_relative_name_by_suffix ... ok
[INFO] [stdout] test self_paths::tests::classify_input_with_paths_pair_includes_extra_slice ... ok
[INFO] [stdout] test rules::workspace::tests::pbt_empty_workspaces_always_skip ... ok
[INFO] [stdout] test rules::sensitive_read::tests::pbt_only_emits_deny_with_correct_id ... ok
[INFO] [stdout] test rules::workspace::tests::symlink_inside_workspace_pointing_outside_is_denied ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_edit_of_binary_path ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_apply_patch_edit_of_repo_local_codex_settings ... ok
[INFO] [stdout] test rules::workspace::tests::allows_write_inside_workspace ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_edit_of_copilot_settings ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_edit_of_kiro_settings ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_nested_mcp_path_on_hook_script ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_edit_of_local_claude_settings ... ok
[INFO] [stdout] test self_paths::tests::classify_returns_empty_for_unrelated_input ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_sudo_writer_via_positional_unwrap ... ok
[INFO] [stdout] test self_paths::tests::classify_skips_non_writer_bash_head_with_positional_path ... ok
[INFO] [stdout] test self_paths::tests::classify_skips_self_positional_for_writer_head ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_edit_of_pi_settings ... ok
[INFO] [stdout] test self_paths::tests::classify_matches_rm_on_protected_path ... ok
[INFO] [stdout] test self_paths::tests::collect_extracts_hook_scripts_from_claude_settings ... ok
[INFO] [stdout] test self_paths::tests::collect_enumerates_every_kiro_agent_json_in_both_scopes ... ok
[INFO] [stdout] test self_paths::tests::collect_extracts_hook_scripts_from_copilot_hooks_json ... ok
[INFO] [stdout] test rules::workspace::tests::pbt_no_panic_with_arbitrary_inputs ... ok
[INFO] [stdout] test self_paths::tests::collect_includes_repo_local_claude_settings ... ok
[INFO] [stdout] test self_paths::tests::collect_extracts_hook_scripts_from_codex_hooks_json ... ok
[INFO] [stdout] test self_paths::tests::collect_extracts_hook_scripts_from_kiro_hooks_json ... ok
[INFO] [stdout] test self_paths::tests::collect_via_system_env_does_not_panic ... ok
[INFO] [stdout] test self_paths::tests::discover_repo_returns_none_for_non_repo_path ... ok
[INFO] [stdout] test self_paths::tests::collect_kiro_settings_is_empty_when_agents_dir_missing ... ok
[INFO] [stdout] test self_paths::tests::match_path_detects_pi_settings_targets ... ok
[INFO] [stdout] test rules::tests::pbt_per_rule_decision_rule_id_matches_self_id ... ok
[INFO] [stdout] test rules::tests::pbt_evaluate_all_never_panics ... ok
[INFO] [stdout] test self_paths::tests::collect_includes_repo_local_copilot_settings ... ok
[INFO] [stdout] test rules::sensitive_read::tests::pbt_evaluate_never_panics ... ok
[INFO] [stdout] test self_paths::tests::protected_kind_round_trip_strings ... ok
[INFO] [stdout] test self_paths::tests::protected_kind_pi_settings_as_str ... ok
[INFO] [stdout] test self_paths::tests::protected_kinds_from_slice_deduplicates ... ok
[INFO] [stdout] test self_paths::tests::protected_kinds_defaults_to_empty ... ok
[INFO] [stdout] test self_paths::tests::protected_kinds_push_unique_preserves_order ... ok
[INFO] [stdout] test self_paths::tests::empty_when_no_repo_root_and_no_home ... ok
[INFO] [stdout] test tests::decide_fails_open_when_project_config_invalid ... ok
[INFO] [stdout] test self_paths::tests::collect_includes_pi_settings_paths ... ok
[INFO] [stdout] test tests::decide_returns_allow_by_default ... ok
[INFO] [stdout] test update::exe::tests::compute_cargo_home_falls_back_to_home_dot_cargo ... ok
[INFO] [stdout] test tests::try_decide_returns_ok_for_clean_cwd ... ok
[INFO] [stdout] test tests::try_decide_errors_on_invalid_project_config ... ok
[INFO] [stdout] test update::exe::tests::compute_cargo_home_prefers_env_var_when_set ... ok
[INFO] [stdout] test self_paths::tests::pbt_kind_label_is_non_empty ... ok
[INFO] [stdout] test update::exe::tests::compute_cargo_home_ignores_empty_env_var ... ok
[INFO] [stdout] test rules::tests::pbt_decision_rule_ids_are_known ... ok
[INFO] [stdout] test update::exe::tests::fake_exe_locator_delegates_to_configured_fields ... ok
[INFO] [stdout] test self_paths::tests::relative_hook_command_canonicalizes_against_settings_dir ... ok
[INFO] [stdout] test update::exe::tests::real_exe_locator_returns_some_path ... ok
[INFO] [stdout] test update::exe::tests::compute_cargo_home_returns_none_without_home_or_env ... ok
[INFO] [stdout] test update::tests::build_installer_command_cargo_with_version_pin_strips_v ... ok
[INFO] [stdout] test update::tests::build_prebuilt_plan_includes_verify_when_attestation_required ... ok
[INFO] [stdout] test update::tests::build_prebuilt_plan_skips_verify_when_skip_attestation_true ... ok
[INFO] [stdout] test update::tests::build_installer_command_cargo_default ... ok
[INFO] [stdout] test update::tests::build_prebuilt_plan_unix_includes_curl_download_and_sh_execute ... ok
[INFO] [stdout] test update::tests::build_prebuilt_plan_windows_uses_iwr_and_powershell_file ... ok
[INFO] [stdout] test update::tests::parse_redirect_tag_extracts_tag_with_crlf ... ok
[INFO] [stdout] test update::tests::parse_redirect_tag_handles_uppercase_header_name ... ok
[INFO] [stdout] test update::tests::parse_redirect_tag_picks_last_location_when_multi_hop ... ok
[INFO] [stdout] test update::spawn::tests::process_spawner_inherited_propagates_nonzero_exit_code ... ok
[INFO] [stdout] test update::spawn::tests::process_spawner_returns_exit_code_and_streams ... ok
[INFO] [stdout] test update::tests::parse_redirect_tag_rejects_empty_tag ... ok
[INFO] [stdout] test update::tests::parse_redirect_tag_rejects_non_release_tag_url ... ok
[INFO] [stdout] test update::spawn::tests::process_spawner_returns_io_error_when_program_missing ... ok
[INFO] [stdout] test update::tests::parse_redirect_tag_rejects_when_no_location ... ok
[INFO] [stdout] test update::tests::parse_redirect_tag_strips_trailing_slash ... ok
[INFO] [stdout] test update::tests::pbt_version_lt_is_total_for_numeric ... ok
[INFO] [stdout] test update::spawn::tests::process_spawner_inherited_returns_exit_code_only ... ok
[INFO] [stdout] test update::spawn::tests::process_spawner_propagates_nonzero_exit_code ... ok
[INFO] [stdout] test update::tests::pbt_version_lt_is_reflexive ... ok
[INFO] [stdout] test update::tests::platform_host_picks_a_valid_variant ... ok
[INFO] [stdout] test update::tests::run_already_up_to_date_skips_updater ... ok
[INFO] [stdout] test rules::sensitive_bash_read::tests::pbt_only_emits_ask_with_correct_id ... ok
[INFO] [stdout] test update::tests::run_allows_downgrade_with_force ... ok
[INFO] [stdout] test update::tests::run_cargo_strategy_fails_when_cargo_spawn_errors ... ok
[INFO] [stdout] test update::tests::pbt_version_lt_is_antisymmetric ... ok
[INFO] [stdout] test update::tests::run_cargo_strategy_with_version_pin_passes_version ... ok
[INFO] [stdout] test update::tests::run_cargo_strategy_invokes_cargo_install_force ... ok
[INFO] [stdout] test update::tests::pbt_parse_redirect_tag_is_total ... ok
[INFO] [stdout] test update::tests::pbt_version_lt_is_transitive ... ok
[INFO] [stdout] test update::tests::run_check_only_does_not_invoke_updater ... ok
[INFO] [stdout] test update::tests::run_check_reports_up_to_date ... ok
[INFO] [stdout] test update::tests::run_curl_missing_is_friendly_error ... ok
[INFO] [stdout] test update::tests::run_latest_tag_fetch_failure_propagates ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_when_execute_spawn_errors_after_verify ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_when_gh_missing_and_not_skipped ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_with_friendly_curl_missing_on_unix_download_spawn_notfound ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_with_updater_spawn_error_on_windows_download_spawn_notfound ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_with_updater_spawn_error_when_verify_spawn_io_error_other ... ok
[INFO] [stdout] test update::tests::run_prebuilt_invokes_curl_then_gh_then_sh_when_attestation_required ... ok
[INFO] [stdout] test update::tests::run_refuses_downgrade_without_force ... ok
[INFO] [stdout] test update::tests::run_skips_downgrade_guard_for_prerelease_with_advisory ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_when_attestation_verify_returns_nonzero ... ok
[INFO] [stdout] test update::tests::pbt_parse_redirect_tag_recovers_well_formed_tag ... ok
[INFO] [stdout] test update::tests::run_force_reinstalls_even_when_up_to_date ... ok
[INFO] [stdout] test update::tests::run_prebuilt_warns_when_attestation_is_skipped ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_when_execute_returns_nonzero ... ok
[INFO] [stdout] test update::tests::select_strategy_falls_back_when_cargo_missing ... ok
[INFO] [stdout] test update::tests::select_strategy_falls_back_when_cargo_returns_nonzero ... ok
[INFO] [stdout] test update::tests::run_updater_exit_code_is_normalised_to_one ... ok
[INFO] [stdout] test update::tests::run_falls_back_with_warning_when_cargo_bin_but_no_cargo ... ok
[INFO] [stdout] test update::tests::run_version_pin_skips_latest_lookup ... ok
[INFO] [stdout] test update::tests::select_strategy_picks_cargo_when_under_cargo_bin_and_cargo_present ... ok
[INFO] [stdout] test update::tests::select_strategy_picks_prebuilt_for_system_install ... ok
[INFO] [stdout] test update::tests::run_prebuilt_fails_when_download_returns_nonzero ... ok
[INFO] [stdout] test update::tests::select_strategy_returns_prebuilt_when_cargo_home_missing ... ok
[INFO] [stdout] test update::tests::version_lt_orders_dotted_numeric_segments ... ok
[INFO] [stdout] test update::tests::strategy_label_distinguishes_variants ... ok
[INFO] [stdout] test update::tests::update_error_display_round_trips_for_every_variant ... ok
[INFO] [stdout] test update::tests::select_strategy_returns_prebuilt_when_current_exe_errors ... ok
[INFO] [stdout] test update::tests::version_lt_returns_none_for_prerelease_or_garbage ... ok
[INFO] [stdout] test update::tests::update_error_source_chains_for_io_variants ... ok
[INFO] [stdout] test self_paths::tests::pbt_empty_protected_classifies_to_empty ... ok
[INFO] [stdout] test rules::git::tests::pbt_git_rule_decision_shape_matches_spec ... ok
[INFO] [stdout] test rules::sensitive_net::tests::pbt_only_emits_deny_with_correct_id ... ok
[INFO] [stdout] test rules::workspace::tests::pbt_inside_path_is_allowed ... ok
[INFO] [stdout] test rules::workspace::tests::pbt_outside_path_is_denied ... ok
[INFO] [stdout] test self_paths::tests::pbt_classify_never_panics ... ok
[INFO] [stdout] test rules::tests::pbt_per_rule_decision_kind_matches_default ... ok
[INFO] [stdout] test self_paths::tests::pbt_collect_yields_sorted_dedup_lists ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 1557 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.77s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/ptuf-3a049742db643ae1)
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests ptuf
[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 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" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732", kill_on_drop: false }`
[INFO] [stdout] dd936c5258aacde9bf6ae9bd85800b6abc98cdfad30079239484dfd6dc71d732
