name: drift-test run_id: commands[0] env HOME: /home/zuul env LANG: C.UTF-8 env PATH: /home/zuul/src/github.com/osism/release/.tox/drift-test/bin:/usr/local/bin:/usr/bin:/bin:/usr/games env PIP_DISABLE_PIP_VERSION_CHECK: 1 env PIP_USER: 0 env PYTHONHASHSEED: 4122736694 env PYTHONIOENCODING: utf-8 env PYTHONPATH: /home/zuul/src/github.com/osism/release/src env TOX_ENV_DIR: /home/zuul/src/github.com/osism/release/.tox/drift-test env TOX_ENV_NAME: drift-test env TOX_WORK_DIR: /home/zuul/src/github.com/osism/release/.tox env VIRTUAL_ENV: /home/zuul/src/github.com/osism/release/.tox/drift-test metadata pid: 1763 cwd: /home/zuul/src/github.com/osism/release allow: /home/zuul/src/github.com/osism/release/.tox/drift-test/bin/* cmd: pytest tests/ -v exit_code: 0 ============================= test session starts ============================== platform linux -- Python 3.11.2, pytest-9.1.1, pluggy-1.6.0 -- /home/zuul/src/github.com/osism/release/.tox/drift-test/bin/python cachedir: .tox/drift-test/.pytest_cache rootdir: /home/zuul/src/github.com/osism/release collecting ... collected 790 items tests/catalog_drift/test_catalog_extract.py::test_collections_collect_nested_roles PASSED [ 0%] tests/catalog_drift/test_catalog_extract.py::test_validators_default_the_playbook_name PASSED [ 0%] tests/catalog_drift/test_catalog_extract.py::test_non_literal_map_role2role_raises PASSED [ 0%] tests/catalog_drift/test_catalog_extract.py::test_missing_assignment_raises PASSED [ 0%] tests/catalog_drift/test_catalog_extract.py::test_non_literal_validate_playbooks_raises PASSED [ 0%] tests/catalog_drift/test_catalog_extract.py::test_role_with_non_literal_name_raises PASSED [ 0%] tests/catalog_drift/test_catalog_extract.py::test_validator_entry_without_runtime_raises PASSED [ 0%] tests/catalog_drift/test_catalog_extract.py::test_validate_playbooks_non_dict_literal_raises PASSED [ 1%] tests/catalog_drift/test_catalog_extract.py::test_validator_entry_non_dict_raises PASSED [ 1%] tests/catalog_drift/test_catalog_extract.py::test_non_literal_collection_key_raises PASSED [ 1%] tests/catalog_drift/test_catalog_extract.py::test_collections_carry_release_bounds PASSED [ 1%] tests/catalog_drift/test_catalog_extract.py::test_role_with_unknown_keyword_raises PASSED [ 1%] tests/catalog_drift/test_catalog_extract.py::test_role_with_positional_bound_raises PASSED [ 1%] tests/catalog_drift/test_catalog_extract.py::test_role_with_non_literal_bound_raises PASSED [ 1%] tests/catalog_drift/test_catalog_role_missing.py::test_release_differential_is_one_entry_per_collection PASSED [ 1%] tests/catalog_drift/test_catalog_role_missing.py::test_dead_everywhere_gets_its_own_summary PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_resolving_role_is_no_finding PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_validator_finding_image_is_playbook_alias_is_key PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_validator_checked_against_its_own_runtime PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_duplicate_role_in_one_collection_is_one_finding PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_allowlist_is_applied PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_empty_release_range_raises PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_bounded_role_is_not_checked_outside_its_bounds PASSED [ 2%] tests/catalog_drift/test_catalog_role_missing.py::test_bounded_role_still_reports_inside_its_bounds PASSED [ 3%] tests/catalog_drift/test_catalog_role_missing.py::test_bounded_role_reports_only_the_releases_it_is_deployed_on PASSED [ 3%] tests/catalog_drift/test_catalog_role_missing.py::test_role_deployed_on_no_supported_release_is_a_finding PASSED [ 3%] tests/catalog_drift/test_catalog_role_missing.py::test_unparseable_release_bound_raises PASSED [ 3%] tests/catalog_drift/test_integration_real_repos.py::test_no_findings_below_the_differential SKIPPED [ 3%] tests/catalog_drift/test_integration_real_repos.py::test_redis_is_found_from_2025_2 SKIPPED [ 3%] tests/catalog_drift/test_playbooks_constants.py::test_load_const_reads_a_list PASSED [ 3%] tests/catalog_drift/test_playbooks_constants.py::test_load_const_reads_a_string PASSED [ 3%] tests/catalog_drift/test_playbooks_constants.py::test_load_const_missing_name_raises PASSED [ 4%] tests/catalog_drift/test_playbooks_constants.py::test_load_const_returns_last_assignment PASSED [ 4%] tests/catalog_drift/test_playbooks_constants.py::test_load_const_non_literal_raises PASSED [ 4%] tests/catalog_drift/test_playbooks_kolla.py::test_site_roles_minus_unsupported PASSED [ 4%] tests/catalog_drift/test_playbooks_kolla.py::test_release_specific_osism_playbooks PASSED [ 4%] tests/catalog_drift/test_playbooks_kolla.py::test_interface_applies_render_transform PASSED [ 4%] tests/catalog_drift/test_playbooks_kolla.py::test_kolla_host_and_post_deploy_collisions_are_dropped PASSED [ 4%] tests/catalog_drift/test_playbooks_kolla.py::test_mariadb_backup_recovery_get_hyphenated_aliases PASSED [ 4%] tests/catalog_drift/test_playbooks_kolla.py::test_release_without_override_dir_raises PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_membership_and_provenance PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_ceph_special_case PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_ceph_special_case_absent_ceph_ceph PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_prefixed_key_resolves_only_when_the_prefixed_name_is_itself_a_key PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_bare_prefix_strip_does_not_reconstruct_a_bare_role PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_unknown_role_does_not_resolve PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_runtime_interface_merges_all_four_runtimes PASSED [ 5%] tests/catalog_drift/test_playbooks_resolution.py::test_runtime_interface_is_memoized_on_config PASSED [ 6%] tests/catalog_drift/test_playbooks_resolution.py::test_runtime_interface_cache_keyed_by_release PASSED [ 6%] tests/catalog_drift/test_playbooks_resolution.py::test_validate_resolves_uses_the_named_runtime PASSED [ 6%] tests/catalog_drift/test_playbooks_resolution.py::test_validate_resolves_ceph_ansible_branch PASSED [ 6%] tests/catalog_drift/test_playbooks_resolution.py::test_validate_resolves_wrong_environment_does_not_resolve PASSED [ 6%] tests/catalog_drift/test_playbooks_resolution.py::test_validate_resolves_osism_ansible_requires_an_environment PASSED [ 6%] tests/catalog_drift/test_playbooks_resolution.py::test_validate_resolves_unknown_runtime_raises PASSED [ 6%] tests/catalog_drift/test_playbooks_runtimes.py::test_osism_files_raises_on_bad_playbooks_version_pin PASSED [ 6%] tests/catalog_drift/test_playbooks_runtimes.py::test_osism_symlink_naming PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_osism_underscore_guard_is_dead_code PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_osism_interface_hides_and_keeps PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_osism_interface_collision_last_prefix_wins PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_osism_own_files_playbooks_copy_is_mirrored PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_ceph_keeps_full_stem PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_ceph_files_unions_flavour_and_toplevel PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_ceph_upgrade_alias_always_created PASSED [ 7%] tests/catalog_drift/test_playbooks_runtimes.py::test_ceph_purge_survivors_only_the_osism_pair PASSED [ 8%] tests/catalog_drift/test_playbooks_runtimes.py::test_ceph_flavours_excludes_the_ceph_yml_alias PASSED [ 8%] tests/catalog_drift/test_playbooks_runtimes.py::test_ceph_mirrors_known_upstream_typos PASSED [ 8%] tests/catalog_drift/test_playbooks_runtimes.py::test_kubernetes_files_lists_prefixed PASSED [ 8%] tests/catalog_drift/test_playbooks_runtimes.py::test_kubernetes_strips_prefix PASSED [ 8%] tests/catalog_drift/test_playbooks_runtimes.py::test_playbook_files_dispatch PASSED [ 8%] tests/catalog_drift/test_plugin_registry.py::test_catalog_role_missing_plugin_registered PASSED [ 8%] tests/catalog_drift/test_plugin_registry.py::test_catalog_plugin_group_matches_registry PASSED [ 8%] tests/catalog_drift/test_plugin_registry.py::test_catalog_report_header_exists PASSED [ 9%] tests/catalog_drift/test_plugin_registry.py::test_catalog_role_missing_enabled_in_config PASSED [ 9%] tests/catalog_drift/test_plugin_registry.py::test_each_plugin_has_required_metadata PASSED [ 9%] tests/image_drift/test_demo.py::test_three_entries_per_plugin PASSED [ 9%] tests/image_drift/test_demo.py::test_entries_carry_live_plugin_text PASSED [ 9%] tests/image_drift/test_demo.py::test_entries_are_actionable PASSED [ 9%] tests/image_drift/test_demo.py::test_show_values_plugin_covers_both_render_branches PASSED [ 9%] tests/image_drift/test_demo.py::test_paths_reflect_plugin_input_files PASSED [ 10%] tests/image_drift/test_driver.py::test_help_lists_plugins PASSED [ 10%] tests/image_drift/test_driver.py::test_default_run_exits_1_with_drifting_images PASSED [ 10%] tests/image_drift/test_driver.py::test_allowlisted_osism_ansible_hidden_by_default PASSED [ 10%] tests/image_drift/test_driver.py::test_no_allowlist_surfaces_osism_ansible PASSED [ 10%] tests/image_drift/test_driver.py::test_format_json_keys PASSED [ 10%] tests/image_drift/test_driver.py::test_plugin_filter_runs_only_role_shadows PASSED [ 10%] tests/image_drift/test_driver.py::test_summary_line_counts PASSED [ 10%] tests/image_drift/test_driver.py::test_advisory_only_exits_0 PASSED [ 11%] tests/image_drift/test_driver.py::test_advisory_finding_in_default_json PASSED [ 11%] tests/image_drift/test_driver.py::test_missing_group_errors PASSED [ 11%] tests/image_drift/test_image_orphan.py::test_orphan_alias_detected PASSED [ 11%] tests/image_drift/test_image_orphan.py::test_consumed_alias_not_detected PASSED [ 11%] tests/image_drift/test_image_orphan.py::test_playbook_consumed_alias_not_detected PASSED [ 11%] tests/image_drift/test_image_orphan.py::test_consumer_in_an_unfiltered_file_is_found PASSED [ 11%] tests/image_drift/test_image_orphan.py::test_allowlist_suppresses_orphan PASSED [ 11%] tests/image_drift/test_manager_parser.py::test_plain_value PASSED [ 12%] tests/image_drift/test_manager_parser.py::test_latest_override_pattern PASSED [ 12%] tests/image_drift/test_manager_parser.py::test_unresolved_jinja_marked PASSED [ 12%] tests/image_drift/test_manager_parser.py::test_multiple_entries PASSED [ 12%] tests/image_drift/test_manager_template_parser.py::test_basic_alias_extraction PASSED [ 12%] tests/image_drift/test_manager_template_parser.py::test_jinja_escaped_lines_ignored PASSED [ 12%] tests/image_drift/test_manager_template_parser.py::test_double_quoted_versions_key PASSED [ 12%] tests/image_drift/test_manager_template_parser.py::test_lines_without_pattern_skipped PASSED [ 12%] tests/image_drift/test_manager_template_parser.py::test_extract_stream_resolved_basic PASSED [ 13%] tests/image_drift/test_manager_template_parser.py::test_extract_stream_resolved_multiple PASSED [ 13%] tests/image_drift/test_override_template_parser.py::test_returns_tag_aliases_only PASSED [ 13%] tests/image_drift/test_override_template_parser.py::test_ignores_image_lines PASSED [ 13%] tests/image_drift/test_override_template_parser.py::test_empty_input PASSED [ 13%] tests/image_drift/test_override_template_parser.py::test_comment_and_blank_lines_ignored PASSED [ 13%] tests/image_drift/test_plugin_registry.py::test_image_plugins_registered PASSED [ 13%] tests/image_drift/test_plugin_registry.py::test_image_plugin_group_matches_registry PASSED [ 13%] tests/image_drift/test_plugin_registry.py::test_role_unpinned_enabled_in_config PASSED [ 14%] tests/image_drift/test_plugin_registry.py::test_image_orphan_enabled_in_config PASSED [ 14%] tests/image_drift/test_plugin_registry.py::test_role_registry_orphan_enabled_in_config PASSED [ 14%] tests/image_drift/test_plugin_registry.py::test_rolling_pin_enabled_in_config PASSED [ 14%] tests/image_drift/test_plugin_registry.py::test_each_plugin_has_required_metadata PASSED [ 14%] tests/image_drift/test_release_parser.py::test_parse_release_returns_docker_images PASSED [ 14%] tests/image_drift/test_release_parser.py::test_parse_release_missing_docker_images_errors PASSED [ 14%] tests/image_drift/test_release_vs_manager.py::test_baseline_drift PASSED [ 14%] tests/image_drift/test_release_vs_manager.py::test_allowlist_broad_suppresses_all_redis PASSED [ 15%] tests/image_drift/test_release_vs_manager.py::test_allowlist_narrow_suppresses_one_alias_only PASSED [ 15%] tests/image_drift/test_release_vs_manager.py::test_latest_override_emitted_with_found_latest PASSED [ 15%] tests/image_drift/test_release_vs_manager.py::test_disabled_image_not_in_release_skipped PASSED [ 15%] tests/image_drift/test_report.py::test_show_values_produces_two_blocks PASSED [ 15%] tests/image_drift/test_report.py::test_show_values_live_block_collapses_file PASSED [ 15%] tests/image_drift/test_report.py::test_show_values_dormant_block_collapses_two_files PASSED [ 15%] tests/image_drift/test_report.py::test_show_values_refs_single_line_only PASSED [ 15%] tests/image_drift/test_report.py::test_show_values_item_order_by_path_then_alias PASSED [ 16%] tests/image_drift/test_report.py::test_show_values_fix_and_refs_present PASSED [ 16%] tests/image_drift/test_report.py::test_show_values_empty_expected_renders_no_release_pin PASSED [ 16%] tests/image_drift/test_report.py::test_show_values_empty_expected_refs_single_line PASSED [ 16%] tests/image_drift/test_report.py::test_show_values_empty_expected_sorted_by_path_then_alias PASSED [ 16%] tests/image_drift/test_report.py::test_show_values_nonempty_expected_still_uses_arrow PASSED [ 16%] tests/image_drift/test_report.py::test_kolla_chain_inner_regression_two_blocks PASSED [ 16%] tests/image_drift/test_role_defaults_parser.py::test_concrete_tag_extracted PASSED [ 16%] tests/image_drift/test_role_defaults_parser.py::test_jinja_value_skipped PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_multiple_aliases_in_one_role_file PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_empty_or_malformed_returns_empty PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_tag_indirected_through_own_version_resolved PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_tag_indirected_through_own_version_non_string_pin PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_tag_indirection_whitespace_insensitive PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_tag_indirection_skipped_when_version_non_concrete PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_tag_indirection_skipped_when_version_missing PASSED [ 17%] tests/image_drift/test_role_defaults_parser.py::test_tag_referencing_other_var_skipped PASSED [ 18%] tests/image_drift/test_role_defaults_parser.py::test_composed_tag_left_for_later_pass PASSED [ 18%] tests/image_drift/test_role_registry_orphan.py::test_unreferenced_registry_var_detected PASSED [ 18%] tests/image_drift/test_role_registry_orphan.py::test_own_definition_line_is_not_a_consumer PASSED [ 18%] tests/image_drift/test_role_registry_orphan.py::test_reference_in_same_role_not_detected PASSED [ 18%] tests/image_drift/test_role_registry_orphan.py::test_reference_from_another_role_not_detected PASSED [ 18%] tests/image_drift/test_role_registry_orphan.py::test_bare_jinja_statement_reference_counts_as_consumer PASSED [ 18%] tests/image_drift/test_role_registry_orphan.py::test_longer_name_does_not_mask_its_prefix PASSED [ 18%] tests/image_drift/test_role_registry_orphan.py::test_playbook_reference_not_detected PASSED [ 19%] tests/image_drift/test_role_registry_orphan.py::test_manager_template_reference_not_detected PASSED [ 19%] tests/image_drift/test_role_registry_orphan.py::test_base_docker_registry_var_is_not_reported PASSED [ 19%] tests/image_drift/test_role_registry_orphan.py::test_consumer_in_an_unfiltered_file_is_found PASSED [ 19%] tests/image_drift/test_role_registry_orphan.py::test_allowlist_suppresses_orphan PASSED [ 19%] tests/image_drift/test_role_shadows.py::test_baseline_drift PASSED [ 19%] tests/image_drift/test_role_shadows.py::test_role_without_defaults_skipped PASSED [ 19%] tests/image_drift/test_role_shadows.py::test_jinja_valued_tag_not_drift PASSED [ 20%] tests/image_drift/test_role_shadows.py::test_allowlist_very_narrow_pins_to_role_file PASSED [ 20%] tests/image_drift/test_role_shadows.py::test_netbox_redis_is_live PASSED [ 20%] tests/image_drift/test_role_shadows.py::test_dormant_aliases_are_dormant PASSED [ 20%] tests/image_drift/test_role_shadows.py::test_floatdemo_is_live PASSED [ 20%] tests/image_drift/test_role_shadows.py::test_stream_resolved_not_emitted PASSED [ 20%] tests/image_drift/test_role_shadows.py::test_dormant_findings_are_advisory PASSED [ 20%] tests/image_drift/test_role_shadows.py::test_live_findings_are_actionable PASSED [ 20%] tests/image_drift/test_role_unpinned.py::test_ciinternal_detected PASSED [ 21%] tests/image_drift/test_role_unpinned.py::test_widget_detected_with_release_key PASSED [ 21%] tests/image_drift/test_role_unpinned.py::test_adminer_not_emitted PASSED [ 21%] tests/image_drift/test_role_unpinned.py::test_stream_resolved_not_emitted PASSED [ 21%] tests/image_drift/test_role_unpinned.py::test_allowlist_marks_ciinternal_allowlisted PASSED [ 21%] tests/image_drift/test_rolling_pin.py::test_rolling_pins_flagged PASSED [ 21%] tests/image_drift/test_rolling_pin.py::test_concrete_pin_not_flagged PASSED [ 21%] tests/image_drift/test_rolling_pin.py::test_odd_but_pinned_not_flagged PASSED [ 21%] tests/image_drift/test_rolling_pin.py::test_top_level_key_ignored PASSED [ 22%] tests/image_drift/test_rolling_pin.py::test_entry_fields PASSED [ 22%] tests/image_drift/test_rolling_pin.py::test_allowlist_marks_entry PASSED [ 22%] tests/image_drift/test_source_list_tree.py::test_list_tree_returns_nested_paths PASSED [ 22%] tests/image_drift/test_source_list_tree.py::test_list_tree_absent_raises_by_default PASSED [ 22%] tests/image_drift/test_source_list_tree.py::test_list_tree_absent_missing_ok_returns_empty PASSED [ 22%] tests/kolla_drift/test_archive.py::test_repo_slug_and_archive_url PASSED [ 22%] tests/kolla_drift/test_archive.py::test_snapshot_dir_fetches_extracts_and_serves PASSED [ 22%] tests/kolla_drift/test_archive.py::test_snapshot_dir_memoizes_one_http_call PASSED [ 23%] tests/kolla_drift/test_archive.py::test_snapshot_dir_404_raises PASSED [ 23%] tests/kolla_drift/test_archive.py::test_fetch_retries_once_then_succeeds PASSED [ 23%] tests/kolla_drift/test_archive.py::test_fetch_fails_twice_raises PASSED [ 23%] tests/kolla_drift/test_archive.py::test_unsafe_traversal_member_rejected PASSED [ 23%] tests/kolla_drift/test_archive.py::test_absolute_symlink_member_rejected_on_fallback PASSED [ 23%] tests/kolla_drift/test_archive.py::test_safe_relative_symlink_extracted_on_fallback PASSED [ 23%] tests/kolla_drift/test_config.py::test_load_minimal_config PASSED [ 23%] tests/kolla_drift/test_config.py::test_osism_root_and_paths_are_unknown_keys PASSED [ 24%] tests/kolla_drift/test_config.py::test_unknown_top_level_key_errors PASSED [ 24%] tests/kolla_drift/test_config.py::test_allowlist_broad_match PASSED [ 24%] tests/kolla_drift/test_config.py::test_apply_marks_matching_drift_allowlisted PASSED [ 24%] tests/kolla_drift/test_config.py::test_apply_returns_unmatched_drift_unchanged PASSED [ 24%] tests/kolla_drift/test_config.py::test_allowlist_narrow_by_alias PASSED [ 24%] tests/kolla_drift/test_config.py::test_allowlist_very_narrow PASSED [ 24%] tests/kolla_drift/test_config.py::test_allowlist_empty_reason_errors PASSED [ 24%] tests/kolla_drift/test_config.py::test_allowlist_no_file_returns_empty PASSED [ 25%] tests/kolla_drift/test_config.py::test_sources_parsed PASSED [ 25%] tests/kolla_drift/test_config.py::test_default_owner_defaults_when_absent PASSED [ 25%] tests/kolla_drift/test_config.py::test_unknown_source_key_errors PASSED [ 25%] tests/kolla_drift/test_config.py::test_stale_flags_unused_entry PASSED [ 25%] tests/kolla_drift/test_config.py::test_stale_scoped_to_ran_plugins PASSED [ 25%] tests/kolla_drift/test_config.py::test_prefix_matches_service_and_subgroups PASSED [ 25%] tests/kolla_drift/test_config.py::test_prefix_does_not_match_adjacent_name PASSED [ 25%] tests/kolla_drift/test_config.py::test_exact_is_default_and_unchanged PASSED [ 26%] tests/kolla_drift/test_config.py::test_allowlist_unknown_match_value_errors PASSED [ 26%] tests/kolla_drift/test_config.py::test_allowlist_empty_image_errors PASSED [ 26%] tests/kolla_drift/test_config.py::test_prefix_entry_stale_when_no_match PASSED [ 26%] tests/kolla_drift/test_config.py::test_releases_and_release_refs_parse PASSED [ 26%] tests/kolla_drift/test_config.py::test_releases_default_empty PASSED [ 26%] tests/kolla_drift/test_config.py::test_archive_and_snapshot_cache_defaults PASSED [ 26%] tests/kolla_drift/test_dir_helpers.py::test_dir_read_returns_bytes PASSED [ 26%] tests/kolla_drift/test_dir_helpers.py::test_dir_read_missing_raises_with_where PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_read_optional_present PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_read_optional_absent_returns_none PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_list_tree_sorted_repo_relative PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_list_tree_missing_raises PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_list_tree_missing_ok_returns_empty PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_list_returns_names PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_list_dirs_only PASSED [ 27%] tests/kolla_drift/test_dir_helpers.py::test_dir_list_missing_raises PASSED [ 28%] tests/kolla_drift/test_driver.py::test_local_only_run_refuses_a_plugin_that_must_reach_the_network PASSED [ 28%] tests/kolla_drift/test_driver.py::test_remote_fallback_permits_the_network_read PASSED [ 28%] tests/kolla_drift/test_driver.py::test_a_fully_remote_run_is_never_blocked PASSED [ 28%] tests/kolla_drift/test_driver.py::test_repo_only_plugins_are_not_blocked PASSED [ 28%] tests/kolla_drift/test_driver.py::test_every_offending_plugin_is_listed_at_once PASSED [ 28%] tests/kolla_drift/test_driver.py::test_network_plugin_in_a_local_only_run_exits_2 PASSED [ 28%] tests/kolla_drift/test_driver.py::test_base_dir_not_found_exits_2 PASSED [ 28%] tests/kolla_drift/test_driver_stale.py::test_stale_entry_forces_exit_1_and_is_reported PASSED [ 29%] tests/kolla_drift/test_driver_stale.py::test_no_allowlist_ignores_invalid_file PASSED [ 29%] tests/kolla_drift/test_enablement.py::test_canon_normalizes_hyphen_to_underscore PASSED [ 29%] tests/kolla_drift/test_enablement.py::test_parse_enable_flags_strips_prefix PASSED [ 29%] tests/kolla_drift/test_enablement.py::test_truthy_enables_literal_only_and_canon PASSED [ 29%] tests/kolla_drift/test_enablement.py::test_parse_build_set_unions_both_blocks_canon PASSED [ 29%] tests/kolla_drift/test_enablement.py::test_release_range_derives_from_file_set PASSED [ 29%] tests/kolla_drift/test_enablement.py::test_release_range_override_wins PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_upstream_enable_keys_monolithic PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_upstream_enable_keys_split_dir PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_upstream_groupvars_keys_monolithic PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_upstream_groupvars_keys_split_dir PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_osism_groupvars_keys_merges_defaults_and_versions_template PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_osism_groupvars_keys_counts_overlays PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_osism_enable_flags_merges_across_all_files PASSED [ 30%] tests/kolla_drift/test_enablement.py::test_osism_enable_ids_truthy PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_osism_enable_ids_explicit_includes_all_keys PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_osism_enable_ids_unknown_scope_raises PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_groupvars_home_names_the_per_service_file PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_groupvars_home_falls_back_to_the_layer_without_homes PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_groupvars_home_dropped_key_ignores_homes PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_groupvars_home_in_newest_keys PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_groupvars_home_dropped_only PASSED [ 31%] tests/kolla_drift/test_enablement.py::test_groupvars_home_newest_wins_over_dropped PASSED [ 32%] tests/kolla_drift/test_enablement.py::test_groupvars_home_neither_returns_none PASSED [ 32%] tests/kolla_drift/test_enablement.py::test_in_mirror_layer PASSED [ 32%] tests/kolla_drift/test_enablement.py::test_upstream_role_default_keys_all_top_level_keys PASSED [ 32%] tests/kolla_drift/test_enablement.py::test_upstream_role_default_keys_role_without_defaults_skipped PASSED [ 32%] tests/kolla_drift/test_enablement.py::test_upstream_image_tag_keys_collects_both_suffixes PASSED [ 32%] tests/kolla_drift/test_enablement.py::test_upstream_homes_names_the_lexically_last_file PASSED [ 32%] tests/kolla_drift/test_enablement.py::test_upstream_groupvars_are_read_once_per_ref PASSED [ 32%] tests/kolla_drift/test_enablement_source_refs.py::test_parse_source_refs_returns_openstack_project_refs PASSED [ 33%] tests/kolla_drift/test_enablement_source_refs.py::test_parse_source_refs_preserves_hyphenated_project_names PASSED [ 33%] tests/kolla_drift/test_enablement_source_refs.py::test_parse_source_refs_keeps_valueless_entries PASSED [ 33%] tests/kolla_drift/test_enablement_source_refs.py::test_parse_source_refs_empty_when_block_absent PASSED [ 33%] tests/kolla_drift/test_enablement_values.py::test_groupvars_values_merges_and_parses PASSED [ 33%] tests/kolla_drift/test_enablement_values.py::test_groupvars_values_skips_non_mapping_and_empty PASSED [ 33%] tests/kolla_drift/test_enablement_values.py::test_osism_mirror_values_reads_only_001 PASSED [ 33%] tests/kolla_drift/test_enablement_values.py::test_mirror_values_merges_the_whole_001_layer PASSED [ 33%] tests/kolla_drift/test_enablement_values.py::test_supply_excluding_mirror_excludes_every_layer_file PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_parses_a_gate_into_its_listed_releases PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_parses_the_not_in_form_the_same_way PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_parses_a_named_release_literal PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_ignores_the_rest_of_the_expression PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_finds_a_gate_nested_inside_a_structured_value PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_var_without_a_gate_is_absent PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_deduplicates_repeated_literals_preserving_order PASSED [ 34%] tests/kolla_drift/test_enablement_version_gates.py::test_empty_and_non_mapping_documents_yield_nothing PASSED [ 35%] tests/kolla_drift/test_enablement_version_gates.py::test_per_release_file_round_trips PASSED [ 35%] tests/kolla_drift/test_enablement_version_gates.py::test_per_release_file_target_rejects_other_files PASSED [ 35%] tests/kolla_drift/test_http_head.py::test_head_returns_the_response_for_a_published_artifact PASSED [ 35%] tests/kolla_drift/test_http_head.py::test_head_returns_a_whitelisted_status_without_raising PASSED [ 35%] tests/kolla_drift/test_http_head.py::test_head_raises_on_a_status_that_is_not_whitelisted PASSED [ 35%] tests/kolla_drift/test_http_head.py::test_head_raises_on_server_error_even_when_404_is_whitelisted PASSED [ 35%] tests/kolla_drift/test_http_head.py::test_head_raises_on_rate_limit_even_when_404_is_whitelisted PASSED [ 35%] tests/kolla_drift/test_http_head.py::test_head_raises_source_error_on_transport_failure PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_reports_the_status_on_the_error PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_leaves_the_status_unset_for_a_transport_failure PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_retries_a_transient_status_and_returns_the_recovered_response PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_retries_a_transport_failure PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_still_raises_when_the_host_keeps_refusing PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_does_not_retry_a_settled_answer PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_does_not_retry_a_whitelisted_status PASSED [ 36%] tests/kolla_drift/test_http_head.py::test_head_backs_off_between_attempts PASSED [ 37%] tests/kolla_drift/test_http_head.py::test_a_non_github_throttle_does_not_blame_github PASSED [ 37%] tests/kolla_drift/test_http_head.py::test_a_non_github_throttle_echoes_retry_after_when_offered PASSED [ 37%] tests/kolla_drift/test_http_head.py::test_a_github_throttle_still_gets_the_github_hint PASSED [ 37%] tests/kolla_drift/test_inventory_sections.py::test_returns_groups_with_sorted_members PASSED [ 37%] tests/kolla_drift/test_inventory_sections.py::test_empty_group_has_no_members PASSED [ 37%] tests/kolla_drift/test_inventory_sections.py::test_duplicate_member_in_group_does_not_raise PASSED [ 37%] tests/kolla_drift/test_kolla_docker.py::test_normalises_hyphen_to_underscore PASSED [ 37%] tests/kolla_drift/test_kolla_docker.py::test_empty PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_build.py::test_flags_enabled_buildable_not_built PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_build.py::test_reads_enable_flags_split_across_files PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_build.py::test_allowlist_marks_allowlisted PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_truthy_scope_flags_absent_truthy_services PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_explicit_scope_also_flags_dead_no_flags PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_present_upstream_is_not_orphan PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_union_across_releases_not_intersection PASSED [ 38%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_allowlist_marks_allowlisted PASSED [ 39%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_run_uses_explicit_default PASSED [ 39%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_reads_enable_flags_split_across_files PASSED [ 39%] tests/kolla_drift/test_kolla_enablement_orphan.py::test_empty_release_range_raises PASSED [ 39%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_flags_upstream_key_missing_from_osism PASSED [ 39%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_present_in_osism_is_not_missing PASSED [ 39%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_osism_key_in_any_file_suppresses PASSED [ 39%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_versions_template_supplied_key_not_flagged PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_overlay_supplied_key_not_flagged PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_union_across_releases_not_intersection PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_allowlist_marks_allowlisted PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_empty_release_range_raises PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_missing_key_at_newest_routes_to_001 PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_missing_key_dropped_by_newest_routes_to_010 PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_missing_key_names_its_per_service_file PASSED [ 40%] tests/kolla_drift/test_kolla_groupvars_missing.py::test_two_keys_with_different_homes_have_distinct_remediations PASSED [ 41%] tests/kolla_drift/test_kolla_image_orphan.py::test_flags_removed_service_image_and_tag PASSED [ 41%] tests/kolla_drift/test_kolla_image_orphan.py::test_present_service_not_flagged PASSED [ 41%] tests/kolla_drift/test_kolla_image_orphan.py::test_union_across_releases_not_intersection PASSED [ 41%] tests/kolla_drift/test_kolla_image_orphan.py::test_allowlist_marks_osism_built PASSED [ 41%] tests/kolla_drift/test_kolla_image_orphan.py::test_ceph_catalogue_ignored PASSED [ 41%] tests/kolla_drift/test_kolla_image_orphan.py::test_empty_upstream_union_raises PASSED [ 41%] tests/kolla_drift/test_kolla_image_orphan.py::test_empty_catalogue_match_raises PASSED [ 41%] tests/kolla_drift/test_kolla_inventory.py::test_flags_upstream_only_groups_across_the_release_range PASSED [ 42%] tests/kolla_drift/test_kolla_inventory.py::test_entry_names_only_the_releases_that_want_the_group PASSED [ 42%] tests/kolla_drift/test_kolla_inventory.py::test_group_renamed_upstream_is_flagged_at_the_release_that_renamed_it PASSED [ 42%] tests/kolla_drift/test_kolla_inventory.py::test_members_come_from_the_last_release_that_wants_the_group PASSED [ 42%] tests/kolla_drift/test_kolla_inventory.py::test_red_entry_carries_members PASSED [ 42%] tests/kolla_drift/test_kolla_inventory.py::test_exact_and_prefix_allowlist_match PASSED [ 42%] tests/kolla_drift/test_kolla_inventory.py::test_empty_release_range_raises PASSED [ 42%] tests/kolla_drift/test_kolla_inventory.py::test_declares_the_release_repo_it_reads PASSED [ 42%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_clean_mirror_no_drift PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_value_diff_flagged PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_missing_from_mirror_flagged PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_dropped_key_routed_to_010 PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_dup_key_delete PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_invented_key PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_typo_mirrored_not_flagged PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_newest_selected_by_sort PASSED [ 43%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_dropped_key_classified_with_out_of_order_releases PASSED [ 44%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_allowlist_marks_entry PASSED [ 44%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_empty_release_range_raises PASSED [ 44%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_layer_split_across_files_is_a_clean_mirror PASSED [ 44%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_layer_later_file_wins_on_duplicate_key PASSED [ 44%] tests/kolla_drift/test_kolla_mirror_verbatim.py::test_missing_upstream_key_names_its_per_service_file PASSED [ 44%] tests/kolla_drift/test_kolla_orphan_config.py::test_flags_dead_service_companion_vars PASSED [ 44%] tests/kolla_drift/test_kolla_orphan_config.py::test_found_src_points_to_each_file PASSED [ 44%] tests/kolla_drift/test_kolla_orphan_config.py::test_no_dead_services_returns_empty PASSED [ 45%] tests/kolla_drift/test_kolla_orphan_config.py::test_respects_orphan_allowlist PASSED [ 45%] tests/kolla_drift/test_kolla_orphan_config.py::test_own_allowlist_marks_allowlisted PASSED [ 45%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_reports_retired_patch_orphan PASSED [ 45%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_disabled_patch_at_newest_is_consumer PASSED [ 45%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_live_patch_at_newest_not_reported PASSED [ 45%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_defined_upstream_in_groupvars_not_reported PASSED [ 45%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_defined_upstream_in_role_default_only_not_reported PASSED [ 45%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_defined_upstream_at_older_release_only_not_reported PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_mentioned_upstream_but_not_defined_is_reported PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_owned_by_dead_non_allowlisted_service_not_reported PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_owned_by_dead_allowlisted_service_is_reported PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_never_consumed_by_patch_not_reported PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_substring_safety PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_allowlist_applies PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_advisory_severity PASSED [ 46%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_fail_closed_empty_release_range PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_fail_closed_empty_kolla_yml PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_fail_closed_newest_patches_missing PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_fail_closed_newest_patches_empty PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_unreadable_newest_patch_raises PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_unreadable_older_patch_raises PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_missing_older_patches_dir_is_not_error PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_retired_while_applied_uses_behaviour_change_block PASSED [ 47%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_retired_while_parked_uses_cleanup_block PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_applied_file_wins_over_disabled_at_same_release PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_two_blocks_report_separately PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_found_carries_per_release_state PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_missing_older_patch_dir_renders_as_absent PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_non_contiguous_live_range PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_live_range_named_in_fix PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_gate_boundary_is_release_after_newest_live PASSED [ 48%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_non_contiguous_gate_boundary PASSED [ 49%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_no_live_release_asks_for_removal PASSED [ 49%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_applied_block_keeps_and_does_not_order_a_gate PASSED [ 49%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_keep_branch_close_does_not_claim_removal_is_the_only_exit PASSED [ 49%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_gated_definition_still_reported PASSED [ 49%] tests/kolla_drift/test_kolla_retired_patch_orphan.py::test_same_range_groups_one_block_different_ranges_split PASSED [ 49%] tests/kolla_drift/test_kolla_secrets_orphan.py::test_flags_orphan_secrets_per_release PASSED [ 49%] tests/kolla_drift/test_kolla_secrets_orphan.py::test_present_secret_is_not_orphan PASSED [ 50%] tests/kolla_drift/test_kolla_secrets_orphan.py::test_allowlist_marks_allowlisted PASSED [ 50%] tests/kolla_drift/test_kolla_secrets_orphan.py::test_missing_template_skips_release PASSED [ 50%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_flags_ref_when_a_later_phase_tarball_is_published PASSED [ 50%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_silent_when_no_later_phase_is_published PASSED [ 50%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_silent_when_already_on_the_latest_published_phase PASSED [ 50%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_does_not_probe_or_flag_the_configured_phase_itself PASSED [ 50%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_probes_only_the_phases_opendev_publishes_a_tarball_for PASSED [ 50%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_a_release_already_moved_costs_no_probes PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_later_phases_are_only_those_after_the_configured_one PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_skips_ref_that_does_not_name_the_release PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_skips_valueless_ref PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_preserves_hyphenated_project_names PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_inconclusive_probe_is_reported_unresolved_not_clean PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_inconclusive_probe_does_not_also_yield_a_stale_finding PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_one_inconclusive_project_does_not_hide_the_others PASSED [ 51%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_probe_inconclusive_is_a_source_error PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_tarball_exists_true_for_a_published_artifact PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_tarball_exists_false_when_absent PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_tarball_exists_raises_instead_of_reporting_absent_on_outage PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_tarball_exists_classifies_a_transport_failure PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_declares_the_host_no_base_dir_can_serve PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_report_names_the_target_phase_and_the_file_to_edit PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_report_does_not_offer_a_phase_that_has_no_tarball PASSED [ 52%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_projects_moving_to_the_same_phase_share_one_report_block PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_plugin_level_remediation_describes_the_rename_without_inventing_phases PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_unresolved_report_says_unknown_rather_than_clean PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_unresolved_refs_failing_alike_share_one_report_block PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_unresolved_and_stale_render_as_separate_blocks PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_unresolved_entry_is_actionable_so_the_run_exits_nonzero PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_run_reports_drift_read_from_the_release_manifest PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_run_reports_an_unverified_ref_when_the_probe_fails PASSED [ 53%] tests/kolla_drift/test_kolla_source_ref_phase.py::test_run_allowlists_an_unverified_ref_for_a_pinned_project PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_inner.py::test_flags_all_inert_keys PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_inner.py::test_enabled_and_buildable_key_is_an_add PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_inner.py::test_disabled_or_unbuildable_key_is_a_remove PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_inner.py::test_add_and_remove_render_as_separate_blocks PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_inner.py::test_hyphen_underscore_is_not_drift PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_inner.py::test_reads_enable_flags_split_across_files PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_inner.py::test_allowlist_marks_allowlisted PASSED [ 54%] tests/kolla_drift/test_kolla_version_chain_upstream.py::test_flags_services_without_template_key PASSED [ 55%] tests/kolla_drift/test_kolla_version_chain_upstream.py::test_expected_src_uses_configured_ref PASSED [ 55%] tests/kolla_drift/test_kolla_version_chain_upstream.py::test_present_service_not_flagged PASSED [ 55%] tests/kolla_drift/test_kolla_version_chain_upstream.py::test_allowlist_marks_allowlisted PASSED [ 55%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_flags_a_gate_naming_a_release_outside_the_supported_range PASSED [ 55%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_silent_when_every_named_release_is_supported PASSED [ 55%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_reports_only_the_dead_releases_of_a_mixed_gate PASSED [ 55%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_flags_a_not_in_gate_too PASSED [ 55%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_ignores_files_that_are_not_yaml PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_flags_a_per_release_file_for_a_retired_release PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_silent_for_a_per_release_file_of_a_supported_release PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_a_retired_per_release_file_can_also_carry_a_stale_gate PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_findings_are_advisory_so_the_nightly_job_stays_green PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_a_deliberate_gate_can_be_allowlisted PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_stale_releases_keeps_order_and_drops_supported PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_report_names_the_variable_the_release_and_the_file PASSED [ 56%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_gate_and_file_findings_render_as_separate_blocks PASSED [ 57%] tests/kolla_drift/test_kolla_version_gate_orphan.py::test_plugin_is_registered PASSED [ 57%] tests/kolla_drift/test_model.py::test_drift_entry_has_all_fields PASSED [ 57%] tests/kolla_drift/test_model.py::test_drift_entry_to_dict_for_json PASSED [ 57%] tests/kolla_drift/test_model.py::test_default_severity_is_actionable PASSED [ 57%] tests/kolla_drift/test_model.py::test_as_allowlisted_preserves_severity PASSED [ 57%] tests/kolla_drift/test_plugin_registry.py::test_registry_is_a_list PASSED [ 57%] tests/kolla_drift/test_plugin_registry.py::test_each_plugin_has_required_metadata PASSED [ 57%] tests/kolla_drift/test_plugin_registry.py::test_kolla_inner_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_upstream_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_inventory_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_enablement_build_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_enablement_orphan_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_secrets_orphan_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_retired_patch_orphan_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_orphan_config_plugin_registered PASSED [ 58%] tests/kolla_drift/test_plugin_registry.py::test_kolla_groupvars_missing_plugin_registered PASSED [ 59%] tests/kolla_drift/test_plugin_registry.py::test_every_plugin_has_summary_and_remediation PASSED [ 59%] tests/kolla_drift/test_plugin_registry.py::test_default_config_enables_every_registered_plugin PASSED [ 59%] tests/kolla_drift/test_plugin_registry.py::test_kolla_mirror_verbatim_plugin_registered PASSED [ 59%] tests/kolla_drift/test_plugin_registry.py::test_plugins_in_lifecycle_order PASSED [ 59%] tests/kolla_drift/test_plugin_registry.py::test_plugin_groups_match_registries_and_are_disjoint PASSED [ 59%] tests/kolla_drift/test_report.py::test_single_plugin_groups_sorts_and_renders PASSED [ 59%] tests/kolla_drift/test_report.py::test_orders_blocks_by_plugins_list PASSED [ 60%] tests/kolla_drift/test_report.py::test_build_style_splits_one_block_per_ref_pair PASSED [ 60%] tests/kolla_drift/test_report.py::test_allowlisted_excluded_from_blocks_and_count PASSED [ 60%] tests/kolla_drift/test_report.py::test_empty_returns_empty_list PASSED [ 60%] tests/kolla_drift/test_report.py::test_entry_summary_remediation_override_plugin_default PASSED [ 60%] tests/kolla_drift/test_report.py::test_lists_image_not_alias PASSED [ 60%] tests/kolla_drift/test_report.py::test_remediation_alone_splits_the_group PASSED [ 60%] tests/kolla_drift/test_sbom_map.py::test_extracts_keys PASSED [ 60%] tests/kolla_drift/test_sbom_map.py::test_missing_map_raises PASSED [ 61%] tests/kolla_drift/test_secrets_map.py::test_extracts_top_level_keys PASSED [ 61%] tests/kolla_drift/test_secrets_map.py::test_ignores_comments_indented_and_markers PASSED [ 61%] tests/kolla_drift/test_secrets_map.py::test_empty_input PASSED [ 61%] tests/kolla_drift/test_source.py::test_read_local_working_tree_when_found PASSED [ 61%] tests/kolla_drift/test_source.py::test_read_not_found_in_base_dir_is_mode_b_error PASSED [ 61%] tests/kolla_drift/test_source.py::test_read_local_file_absent_is_error_not_remote PASSED [ 61%] tests/kolla_drift/test_source.py::test_read_remote_fallback_when_not_found PASSED [ 61%] tests/kolla_drift/test_source.py::test_read_no_base_dir_is_remote PASSED [ 62%] tests/kolla_drift/test_source.py::test_first_base_dir_with_the_repo_wins PASSED [ 62%] tests/kolla_drift/test_source.py::test_pinned_local_git_repo_reads_at_pin_ref PASSED [ 62%] tests/kolla_drift/test_source.py::test_pinned_non_git_dir_falls_back_to_remote PASSED [ 62%] tests/kolla_drift/test_source.py::test_pinned_non_git_dir_no_fallback_is_mode_b PASSED [ 62%] tests/kolla_drift/test_source.py::test_read_remote_404_errors PASSED [ 62%] tests/kolla_drift/test_source.py::test_read_network_error PASSED [ 62%] tests/kolla_drift/test_source.py::test_read_underscore_repo_translates_to_hyphen PASSED [ 62%] tests/kolla_drift/test_source.py::test_read_optional_present_local PASSED [ 63%] tests/kolla_drift/test_source.py::test_read_optional_missing_local_returns_none PASSED [ 63%] tests/kolla_drift/test_source.py::test_read_optional_404_returns_none PASSED [ 63%] tests/kolla_drift/test_source.py::test_read_optional_network_error_still_raises PASSED [ 63%] tests/kolla_drift/test_source.py::test_read_optional_underscore_repo_translates_to_hyphen PASSED [ 63%] tests/kolla_drift/test_source.py::test_list_dir_local PASSED [ 63%] tests/kolla_drift/test_source.py::test_list_dir_remote PASSED [ 63%] tests/kolla_drift/test_source.py::test_list_dir_remote_404_errors PASSED [ 63%] tests/kolla_drift/test_source.py::test_list_dir_remote_404_missing_ok_returns_empty PASSED [ 64%] tests/kolla_drift/test_source.py::test_list_dir_remote_rate_limit_missing_ok_still_raises PASSED [ 64%] tests/kolla_drift/test_source.py::test_list_dir_local_missing_ok_returns_empty PASSED [ 64%] tests/kolla_drift/test_source.py::test_list_dir_local_absent_raises_by_default PASSED [ 64%] tests/kolla_drift/test_source.py::test_list_dir_underscore_repo_translates_to_hyphen PASSED [ 64%] tests/kolla_drift/test_source.py::test_source_override_redirects_owner_and_ref PASSED [ 64%] tests/kolla_drift/test_source.py::test_list_dir_local_dirs_only_excludes_files PASSED [ 64%] tests/kolla_drift/test_source.py::test_list_dir_remote_dirs_only_filters_type PASSED [ 64%] tests/kolla_drift/test_source.py::test_list_dir_at_ref_uses_explicit_ref_and_owner PASSED [ 65%] tests/kolla_drift/test_source.py::test_list_dir_at_ref_404_raises PASSED [ 65%] tests/kolla_drift/test_source.py::test_list_dir_at_ref_404_missing_ok_returns_empty PASSED [ 65%] tests/kolla_drift/test_source.py::test_list_dir_at_ref_local_pinned_missing_ok_returns_empty PASSED [ 65%] tests/kolla_drift/test_source.py::test_release_to_ref_prefers_stable PASSED [ 65%] tests/kolla_drift/test_source.py::test_release_to_ref_falls_back_through_candidates PASSED [ 65%] tests/kolla_drift/test_source.py::test_release_to_ref_treats_422_as_absent PASSED [ 65%] tests/kolla_drift/test_source.py::test_release_to_ref_uses_eom_tag_last PASSED [ 65%] tests/kolla_drift/test_source.py::test_release_to_ref_none_raises PASSED [ 66%] tests/kolla_drift/test_source.py::test_release_to_ref_override_wins PASSED [ 66%] tests/kolla_drift/test_source.py::test_read_at_ref_returns_bytes_at_explicit_ref PASSED [ 66%] tests/kolla_drift/test_source.py::test_read_at_ref_optional_404_returns_none PASSED [ 66%] tests/kolla_drift/test_source.py::test_read_at_ref_404_raises_when_not_optional PASSED [ 66%] tests/kolla_drift/test_source.py::test_describe_resolution_local_and_remote PASSED [ 66%] tests/kolla_drift/test_source.py::test_describe_resolution_mode_b_raises PASSED [ 66%] tests/kolla_drift/test_source.py::test_describe_resolution_lists_all_missing PASSED [ 66%] tests/kolla_drift/test_source.py::test_git_show_multi_ref_from_one_clone PASSED [ 67%] tests/kolla_drift/test_source.py::test_git_show_optional_absent_path PASSED [ 67%] tests/kolla_drift/test_source.py::test_git_ls_tree_returns_basenames_and_dirs_only PASSED [ 67%] tests/kolla_drift/test_source.py::test_resolve_local_ref_finds_non_origin_remote PASSED [ 67%] tests/kolla_drift/test_source.py::test_git_show_unresolvable_ref_raises PASSED [ 67%] tests/kolla_drift/test_source.py::test_git_ref_exists PASSED [ 67%] tests/kolla_drift/test_source.py::test_read_at_ref_local_git PASSED [ 67%] tests/kolla_drift/test_source.py::test_describe_resolution_pinned_local_tag PASSED [ 67%] tests/kolla_drift/test_source.py::test_read_at_ref_unpinned_local_dir_is_remote PASSED [ 68%] tests/kolla_drift/test_source.py::test_release_to_ref_memoizes_probes PASSED [ 68%] tests/kolla_drift/test_source.py::test_read_remote_rate_limit_403_gives_helpful_error PASSED [ 68%] tests/kolla_drift/test_source.py::test_rate_limit_error_when_authenticated_omits_token_advice PASSED [ 68%] tests/kolla_drift/test_source.py::test_secondary_rate_limit_retry_after_gives_hint PASSED [ 68%] tests/kolla_drift/test_source.py::test_raw_cdn_429_without_headers_gives_raw_specific_hint PASSED [ 68%] tests/kolla_drift/test_source.py::test_plain_403_is_not_mistaken_for_rate_limiting PASSED [ 68%] tests/kolla_drift/test_source.py::test_non_github_host_does_not_get_the_github_hint PASSED [ 68%] tests/kolla_drift/test_source.py::test_non_github_host_echoes_retry_after_when_offered PASSED [ 69%] tests/kolla_drift/test_source.py::test_auth_headers_adds_bearer_for_github_host PASSED [ 69%] tests/kolla_drift/test_source.py::test_auth_headers_absent_when_no_token PASSED [ 69%] tests/kolla_drift/test_source.py::test_auth_headers_not_leaked_to_non_github_host PASSED [ 69%] tests/kolla_drift/test_source.py::test_get_sends_auth_header_to_github PASSED [ 69%] tests/kolla_drift/test_source.py::test_get_does_not_send_auth_to_non_github_mirror PASSED [ 69%] tests/kolla_drift/test_source.py::test_read_uses_archive_when_enabled PASSED [ 69%] tests/kolla_drift/test_source.py::test_archive_snapshot_shared_across_reads PASSED [ 70%] tests/kolla_drift/test_source.py::test_list_dir_uses_archive PASSED [ 70%] tests/kolla_drift/test_source.py::test_list_tree_uses_archive PASSED [ 70%] tests/kolla_drift/test_source.py::test_list_dir_at_ref_uses_archive PASSED [ 70%] tests/kolla_drift/test_source.py::test_read_at_ref_uses_archive PASSED [ 70%] tests/kolla_drift/test_source.py::test_ref_exists_memoizes_probes PASSED [ 70%] tests/kolla_drift/test_source.py::test_ref_exists_memoizes_absence_too PASSED [ 70%] tests/kolla_drift/test_source.py::test_ref_exists_cache_is_per_ref PASSED [ 70%] tests/kolla_drift/test_versions_template.py::test_extracts_distinct_keys PASSED [ 71%] tests/kolla_drift/test_versions_template.py::test_empty_input PASSED [ 71%] tests/mirror_sync/test_attribute.py::test_finds_the_commit_that_changed_the_key PASSED [ 71%] tests/mirror_sync/test_attribute.py::test_searches_both_old_and_new_homes PASSED [ 71%] tests/mirror_sync/test_attribute.py::test_a_missing_home_does_not_break_the_union PASSED [ 71%] tests/mirror_sync/test_attribute.py::test_key_is_regex_escaped PASSED [ 71%] tests/mirror_sync/test_attribute.py::test_range_is_bounded_below PASSED [ 71%] tests/mirror_sync/test_attribute.py::test_cap_is_globally_newest_first_across_homes PASSED [ 71%] tests/mirror_sync/test_attribute.py::test_a_commit_touching_both_homes_is_not_listed_twice PASSED [ 72%] tests/mirror_sync/test_attribute.py::test_a_git_failure_is_reported_not_silently_empty PASSED [ 72%] tests/mirror_sync/test_attribute.py::test_no_known_home_is_reported_not_silently_empty PASSED [ 72%] tests/mirror_sync/test_attribute.py::test_remote_only_run_skips_with_a_stated_reason PASSED [ 72%] tests/mirror_sync/test_attribute.py::test_missing_range_skips_with_a_stated_reason PASSED [ 72%] tests/mirror_sync/test_attribute.py::test_results_are_capped_and_say_so PASSED [ 72%] tests/mirror_sync/test_classify.py::test_quoted_no_vs_false_is_representation_not_semantic PASSED [ 72%] tests/mirror_sync/test_classify.py::test_yes_vs_true_is_representation PASSED [ 72%] tests/mirror_sync/test_classify.py::test_on_off_tokens_are_covered PASSED [ 73%] tests/mirror_sync/test_classify.py::test_token_match_is_case_insensitive PASSED [ 73%] tests/mirror_sync/test_classify.py::test_opposite_truth_values_are_semantic PASSED [ 73%] tests/mirror_sync/test_classify.py::test_a_non_boolish_string_is_not_representation PASSED [ 73%] tests/mirror_sync/test_classify.py::test_jinja_delimiter_whitespace_only_is_notation PASSED [ 73%] tests/mirror_sync/test_classify.py::test_whitespace_inside_a_jinja_expression_stays_semantic PASSED [ 73%] tests/mirror_sync/test_classify.py::test_a_changed_filter_argument_stays_semantic PASSED [ 73%] tests/mirror_sync/test_classify.py::test_overridden_requires_an_unconditional_later_layer PASSED [ 73%] tests/mirror_sync/test_classify.py::test_a_100_layer_counts_as_unconditional PASSED [ 74%] tests/mirror_sync/test_classify.py::test_a_010_layer_does_not_count PASSED [ 74%] tests/mirror_sync/test_classify.py::test_a_layer_sorting_before_the_mirror_does_not_count PASSED [ 74%] tests/mirror_sync/test_classify.py::test_release_conditional_override_is_not_overridden PASSED [ 74%] tests/mirror_sync/test_classify.py::test_a_release_gate_nested_in_a_mapping_is_not_overridden PASSED [ 74%] tests/mirror_sync/test_classify.py::test_a_release_gate_nested_in_a_list_is_not_overridden PASSED [ 74%] tests/mirror_sync/test_classify.py::test_a_release_gate_nested_two_levels_deep_is_not_overridden PASSED [ 74%] tests/mirror_sync/test_classify.py::test_a_plain_mapping_override_is_still_overridden PASSED [ 74%] tests/mirror_sync/test_classify.py::test_overlay_only_supply_is_not_overridden PASSED [ 75%] tests/mirror_sync/test_classify.py::test_versions_yml_is_the_named_exception PASSED [ 75%] tests/mirror_sync/test_classify.py::test_supply_info_reads_the_defaults_layers_with_last_wins PASSED [ 75%] tests/mirror_sync/test_classify.py::test_supply_info_includes_the_rendered_versions_layer PASSED [ 75%] tests/mirror_sync/test_cli.py::test_report_mode_also_requires_defaults_dir PASSED [ 75%] tests/mirror_sync/test_cli.py::test_the_same_key_under_two_dispositions_is_an_error PASSED [ 75%] tests/mirror_sync/test_cli.py::test_keep_is_decided_at_exit_not_entry PASSED [ 75%] tests/mirror_sync/test_cli.py::test_a_midwrite_failure_names_the_worktree_and_how_to_remove_it PASSED [ 75%] tests/mirror_sync/test_cli.py::test_a_failure_before_any_write_does_not_claim_a_partial_write PASSED [ 76%] tests/mirror_sync/test_cli.py::test_a_successful_apply_returns_zero_and_emits_one_json_document PASSED [ 76%] tests/mirror_sync/test_cli.py::test_a_refused_apply_reports_applied_false_not_null PASSED [ 76%] tests/mirror_sync/test_cli.py::test_a_report_run_reports_applied_null PASSED [ 76%] tests/mirror_sync/test_cli.py::test_worktree_failures_exit_3 PASSED [ 76%] tests/mirror_sync/test_cli.py::test_arms_failures_exit_3 PASSED [ 76%] tests/mirror_sync/test_cli.py::test_pins_from_conflicting_with_base_ref_is_an_error PASSED [ 76%] tests/mirror_sync/test_cli.py::test_the_report_file_is_written_by_default_and_named_in_the_output PASSED [ 76%] tests/mirror_sync/test_cli.py::test_report_file_honours_an_explicit_path PASSED [ 77%] tests/mirror_sync/test_cli.py::test_a_refused_apply_still_leaves_the_report_behind PASSED [ 77%] tests/mirror_sync/test_cli.py::test_json_names_the_report_file_so_a_consumer_can_find_it PASSED [ 77%] tests/mirror_sync/test_cli.py::test_commit_without_apply_is_refused PASSED [ 77%] tests/mirror_sync/test_cli.py::test_commit_branch_without_apply_is_refused_too PASSED [ 77%] tests/mirror_sync/test_cli.py::test_apply_reports_the_branch_and_commit_it_made PASSED [ 77%] tests/mirror_sync/test_commit.py::test_commit_branches_stages_and_returns_the_sha PASSED [ 77%] tests/mirror_sync/test_commit.py::test_commit_stages_a_deletion PASSED [ 77%] tests/mirror_sync/test_commit.py::test_an_existing_branch_is_refused_not_moved PASSED [ 78%] tests/mirror_sync/test_commit.py::test_signoff_requires_an_identity PASSED [ 78%] tests/mirror_sync/test_commit.py::test_default_branch_is_named_for_the_target PASSED [ 78%] tests/mirror_sync/test_detail.py::test_multiline_value_is_written_with_real_newlines PASSED [ 78%] tests/mirror_sync/test_detail.py::test_quoting_is_preserved_for_short_values PASSED [ 78%] tests/mirror_sync/test_detail.py::test_each_class_carries_its_meaning PASSED [ 78%] tests/mirror_sync/test_detail.py::test_attribution_and_note_travel_with_the_row PASSED [ 78%] tests/mirror_sync/test_detail.py::test_header_names_the_base_ref_and_both_shas PASSED [ 78%] tests/mirror_sync/test_detail.py::test_files_and_keys_the_terminal_truncates_are_all_here PASSED [ 79%] tests/mirror_sync/test_detail.py::test_a_class_with_no_rows_gets_no_section PASSED [ 79%] tests/mirror_sync/test_effective.py::test_effective_range_stops_at_target PASSED [ 79%] tests/mirror_sync/test_effective.py::test_effective_range_rejects_unsupported_target PASSED [ 79%] tests/mirror_sync/test_effective.py::test_derive_sets_releases_override_and_fresh_caches PASSED [ 79%] tests/mirror_sync/test_effective.py::test_derive_prepends_the_worktree_parent_to_base_dirs PASSED [ 79%] tests/mirror_sync/test_effective.py::test_requested_shas_rejects_pin_and_pins_from_together PASSED [ 79%] tests/mirror_sync/test_effective.py::test_requested_shas_rejects_a_non_sha PASSED [ 80%] tests/mirror_sync/test_effective.py::test_requested_shas_applies_the_pin_only_to_the_target PASSED [ 80%] tests/mirror_sync/test_effective.py::test_check_pin_validates_against_the_real_tip_not_itself PASSED [ 80%] tests/mirror_sync/test_effective.py::test_check_pin_rejects_a_commit_before_the_branch_point PASSED [ 80%] tests/mirror_sync/test_effective.py::test_check_pin_rejects_a_pin_not_reachable_from_the_tip PASSED [ 80%] tests/mirror_sync/test_effective.py::test_check_pin_is_a_noop_when_nothing_was_overridden PASSED [ 80%] tests/mirror_sync/test_effective.py::test_validate_pins_payload_rejects_a_target_mismatch PASSED [ 80%] tests/mirror_sync/test_effective.py::test_validate_pins_payload_rejects_an_incomplete_release_set PASSED [ 80%] tests/mirror_sync/test_effective.py::test_validate_pins_payload_rejects_a_malformed_release_sha PASSED [ 81%] tests/mirror_sync/test_effective.py::test_validate_pins_payload_rejects_a_non_mapping_release_shas PASSED [ 81%] tests/mirror_sync/test_effective.py::test_validate_pins_payload_rejects_an_unknown_schema PASSED [ 81%] tests/mirror_sync/test_effective.py::test_validate_pins_payload_returns_the_map_and_base PASSED [ 81%] tests/mirror_sync/test_effective.py::test_resolve_tips_uses_release_to_ref_then_resolve_commit PASSED [ 81%] tests/mirror_sync/test_enablement_additions.py::test_mirror_prefix_is_public_and_matches_the_private_constant PASSED [ 81%] tests/mirror_sync/test_enablement_additions.py::test_upstream_groupvars_files_is_public PASSED [ 81%] tests/mirror_sync/test_gate.py::test_parses_the_canonical_shape PASSED [ 81%] tests/mirror_sync/test_gate.py::test_declines_a_compound_condition PASSED [ 82%] tests/mirror_sync/test_gate.py::test_declines_a_nested_ternary PASSED [ 82%] tests/mirror_sync/test_gate.py::test_declines_a_mixed_release_list PASSED [ 82%] tests/mirror_sync/test_gate.py::test_declines_an_unquoted_release PASSED [ 82%] tests/mirror_sync/test_gate.py::test_declines_an_empty_release_list PASSED [ 82%] tests/mirror_sync/test_gate.py::test_accepts_a_trailing_comma PASSED [ 82%] tests/mirror_sync/test_gate.py::test_declines_a_variable_branch PASSED [ 82%] tests/mirror_sync/test_gate.py::test_accepts_openstack_release_as_an_alias PASSED [ 82%] tests/mirror_sync/test_gate.py::test_check_retain_accepts_a_correct_gate PASSED [ 83%] tests/mirror_sync/test_gate.py::test_check_retain_rejects_a_reversed_gate PASSED [ 83%] tests/mirror_sync/test_gate.py::test_check_retain_rejects_a_wrong_release_list PASSED [ 83%] tests/mirror_sync/test_gate.py::test_check_retain_rejects_a_non_canonical_gate PASSED [ 83%] tests/mirror_sync/test_gate.py::test_check_retain_rejects_a_key_no_later_layer_supplies PASSED [ 83%] tests/mirror_sync/test_gate.py::test_check_retain_rejects_a_gate_in_the_010_layer PASSED [ 83%] tests/mirror_sync/test_gate.py::test_retain_unverified_is_rejected_for_a_canonical_gate PASSED [ 83%] tests/mirror_sync/test_gate.py::test_retain_unverified_is_rejected_when_no_gate_exists PASSED [ 83%] tests/mirror_sync/test_gate.py::test_retain_unverified_accepts_a_present_non_canonical_gate PASSED [ 84%] tests/mirror_sync/test_gate.py::test_an_unknown_disposition_key_is_an_error PASSED [ 84%] tests/mirror_sync/test_gate.py::test_a_failed_retention_check_propagates_rather_than_becoming_missing PASSED [ 84%] tests/mirror_sync/test_gate.py::test_missing_dispositions_only_lists_rows_with_no_flag PASSED [ 84%] tests/mirror_sync/test_gate.py::test_accept_upstream_is_noted PASSED [ 84%] tests/mirror_sync/test_layers.py::test_mirror_layer_refuses_a_monolithic_upstream_layout PASSED [ 84%] tests/mirror_sync/test_layers.py::test_mirror_layer_refuses_an_empty_upstream_listing PASSED [ 84%] tests/mirror_sync/test_layers.py::test_every_arms_refusal_shares_one_base PASSED [ 84%] tests/mirror_sync/test_layers.py::test_mirror_layer_writes_prefixed_copies_and_deletes_orphans PASSED [ 85%] tests/mirror_sync/test_layers.py::test_mirror_layer_rejects_an_unsafe_upstream_name PASSED [ 85%] tests/mirror_sync/test_layers.py::test_mirror_homes_reads_the_tree_with_last_wins PASSED [ 85%] tests/mirror_sync/test_layers.py::test_compat_layer_emits_values_from_the_release_that_still_has_them PASSED [ 85%] tests/mirror_sync/test_layers.py::test_compat_layer_excludes_keys_another_osism_layer_supplies PASSED [ 85%] tests/mirror_sync/test_layers.py::test_compat_layer_excludes_keys_the_target_still_defines PASSED [ 85%] tests/mirror_sync/test_layers.py::test_compat_layer_raises_when_a_dropped_key_has_no_value PASSED [ 85%] tests/mirror_sync/test_layers.py::test_compat_layer_deletes_a_managed_file_with_no_desired_keys PASSED [ 85%] tests/mirror_sync/test_layers.py::test_report_mode_reports_an_unmarked_file_instead_of_refusing PASSED [ 86%] tests/mirror_sync/test_layers.py::test_compat_layer_refuses_an_unmarked_managed_file PASSED [ 86%] tests/mirror_sync/test_layers.py::test_compat_layer_refuses_to_delete_an_unmarked_file PASSED [ 86%] tests/mirror_sync/test_layers.py::test_require_owned_rejects_a_marker_used_inside_a_value PASSED [ 86%] tests/mirror_sync/test_layers.py::test_require_owned_rejects_a_marker_below_the_header PASSED [ 86%] tests/mirror_sync/test_layers.py::test_compat_layer_never_inspects_a_file_outside_the_range PASSED [ 86%] tests/mirror_sync/test_layers.py::test_compat_layer_ignores_releases_after_the_target PASSED [ 86%] tests/mirror_sync/test_layers.py::test_changed_and_created_compares_bytes_against_disk PASSED [ 86%] tests/mirror_sync/test_layers.py::test_changed_and_created_sees_a_content_change PASSED [ 87%] tests/mirror_sync/test_layers.py::test_generated_sequences_are_indented_for_yamllint PASSED [ 87%] tests/mirror_sync/test_layers.py::test_generated_values_match_the_upstream_quoting_style PASSED [ 87%] tests/mirror_sync/test_layers.py::test_mapping_keys_are_not_quoted PASSED [ 87%] tests/mirror_sync/test_layers.py::test_nested_keys_stay_bare_and_keep_upstream_order PASSED [ 87%] tests/mirror_sync/test_model.py::test_has_changes_is_false_when_every_write_is_unchanged PASSED [ 87%] tests/mirror_sync/test_model.py::test_has_changes_true_on_a_changed_write PASSED [ 87%] tests/mirror_sync/test_model.py::test_has_changes_true_on_a_mirror_delete_alone PASSED [ 87%] tests/mirror_sync/test_model.py::test_has_changes_true_on_a_compat_delete_alone PASSED [ 88%] tests/mirror_sync/test_model.py::test_semantic_keys_selects_only_semantic_rows_in_row_order PASSED [ 88%] tests/mirror_sync/test_model.py::test_plan_is_frozen PASSED [ 88%] tests/mirror_sync/test_render.py::test_json_payload_is_deterministic_and_versioned PASSED [ 88%] tests/mirror_sync/test_render.py::test_json_payload_round_trips_through_the_pins_validator PASSED [ 88%] tests/mirror_sync/test_render.py::test_json_counts_each_class_separately PASSED [ 88%] tests/mirror_sync/test_render.py::test_text_labels_representation_and_shows_attribution PASSED [ 88%] tests/mirror_sync/test_render.py::test_text_offers_every_disposition_now_that_the_gate_exists PASSED [ 88%] tests/mirror_sync/test_render.py::test_text_lists_the_dispositions_that_were_applied PASSED [ 89%] tests/mirror_sync/test_render.py::test_text_distinguishes_no_rows_from_nothing_computed PASSED [ 89%] tests/mirror_sync/test_render.py::test_exit_code_2_when_a_blocker_exists_even_with_no_semantic_row PASSED [ 89%] tests/mirror_sync/test_render.py::test_text_names_the_blocker_and_how_to_clear_it PASSED [ 89%] tests/mirror_sync/test_render.py::test_exit_code_2_when_a_semantic_row_is_undispositioned PASSED [ 89%] tests/mirror_sync/test_render.py::test_exit_code_1_when_changes_are_planned_and_all_dispositioned PASSED [ 89%] tests/mirror_sync/test_render.py::test_exit_code_0_when_nothing_would_change PASSED [ 89%] tests/mirror_sync/test_render.py::test_exit_code_1_when_only_files_change_and_no_row_needs_review PASSED [ 90%] tests/mirror_sync/test_render.py::test_a_retain_flag_clears_a_row_now_that_it_is_validated_elsewhere PASSED [ 90%] tests/mirror_sync/test_render.py::test_acceptance_command_prepends_the_worktree_and_keeps_every_base_dir PASSED [ 90%] tests/mirror_sync/test_render.py::test_acceptance_command_works_for_a_remote_mode_run PASSED [ 90%] tests/mirror_sync/test_render.py::test_acceptance_command_quotes_paths_with_spaces PASSED [ 90%] tests/mirror_sync/test_render.py::test_acceptance_command_warns_when_the_derived_range_is_newer PASSED [ 90%] tests/mirror_sync/test_render.py::test_acceptance_command_has_no_caveat_when_the_target_is_newest PASSED [ 90%] tests/mirror_sync/test_render.py::test_text_summary_names_each_class_and_what_it_means PASSED [ 90%] tests/mirror_sync/test_render.py::test_text_inlines_a_short_value_but_elides_a_long_one PASSED [ 91%] tests/mirror_sync/test_render.py::test_text_truncates_a_long_name_list_to_a_sample_and_a_count PASSED [ 91%] tests/mirror_sync/test_render.py::test_text_groups_a_repeated_note_instead_of_repeating_it PASSED [ 91%] tests/mirror_sync/test_render.py::test_text_header_names_the_base_ref_alongside_its_sha PASSED [ 91%] tests/mirror_sync/test_render.py::test_text_states_the_exit_code_and_where_the_full_values_are PASSED [ 91%] tests/mirror_sync/test_render.py::test_text_omits_the_exit_line_when_the_caller_has_no_code_yet PASSED [ 91%] tests/mirror_sync/test_render.py::test_shape_pluralises_a_single_entry_correctly PASSED [ 91%] tests/mirror_sync/test_render.py::test_a_back_compat_layer_says_whether_it_is_new_or_already_correct PASSED [ 91%] tests/mirror_sync/test_render.py::test_a_header_only_rewrite_says_so_instead_of_just_rewritten PASSED [ 92%] tests/mirror_sync/test_render.py::test_real_key_movement_is_reported_as_counts PASSED [ 92%] tests/mirror_sync/test_render.py::test_exit_0_after_an_apply_does_not_claim_there_was_nothing_to_do PASSED [ 92%] tests/mirror_sync/test_render.py::test_commit_summary_records_pins_and_dispositions PASSED [ 92%] tests/mirror_sync/test_render.py::test_commit_summary_wraps_at_72_for_a_commit_body PASSED [ 92%] tests/mirror_sync/test_source_commits.py::test_resolve_commit_local_peels_branch_to_sha PASSED [ 92%] tests/mirror_sync/test_source_commits.py::test_resolve_commit_local_accepts_a_sha PASSED [ 92%] tests/mirror_sync/test_source_commits.py::test_resolve_commit_prefers_a_remote_over_a_stale_local_branch PASSED [ 92%] tests/mirror_sync/test_source_commits.py::test_resolve_commit_falls_back_to_a_local_head PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_resolve_commit_unknown_ref_raises PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_is_ancestor_local PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_is_ancestor_raises_on_a_missing_descendant PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_is_ancestor_raises_when_the_ancestor_object_is_absent PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_merge_base_local PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_local_checkout_returns_none_when_remote PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_local_checkout_returns_the_dir_when_local PASSED [ 93%] tests/mirror_sync/test_source_commits.py::test_resolve_commit_remote_reads_sha_from_commits_api PASSED [ 94%] tests/mirror_sync/test_source_commits.py::test_resolve_commit_rejects_a_non_sha_from_the_api PASSED [ 94%] tests/mirror_sync/test_source_commits.py::test_is_ancestor_remote_uses_compare_status PASSED [ 94%] tests/mirror_sync/test_source_commits.py::test_merge_base_remote_reads_compare_payload PASSED [ 94%] tests/mirror_sync/test_worktree.py::test_default_path_leaf_is_named_defaults PASSED [ 94%] tests/mirror_sync/test_worktree.py::test_create_yields_a_clean_tree_and_the_base_commit PASSED [ 94%] tests/mirror_sync/test_worktree.py::test_create_refuses_an_existing_path PASSED [ 94%] tests/mirror_sync/test_worktree.py::test_uncommitted_operator_work_is_not_consulted PASSED [ 94%] tests/mirror_sync/test_worktree.py::test_create_removes_the_worktree_when_head_cannot_be_read PASSED [ 95%] tests/mirror_sync/test_worktree.py::test_session_removes_on_exit_by_default PASSED [ 95%] tests/mirror_sync/test_worktree.py::test_session_removes_on_exception_too PASSED [ 95%] tests/mirror_sync/test_worktree.py::test_session_keeps_when_asked PASSED [ 95%] tests/mirror_sync/test_worktree.py::test_session_raises_when_cleanup_fails PASSED [ 95%] tests/mirror_sync/test_worktree.py::test_cleanup_failure_does_not_mask_the_original_error PASSED [ 95%] tests/mirror_sync/test_worktree.py::test_every_failure_is_a_worktree_error PASSED [ 95%] tests/mirror_sync/test_write.py::test_writes_only_changed_paths PASSED [ 95%] tests/mirror_sync/test_write.py::test_deletes_after_writing PASSED [ 96%] tests/mirror_sync/test_write.py::test_a_missing_delete_target_is_not_an_error PASSED [ 96%] tests/mirror_sync/test_write.py::test_refuses_a_path_outside_the_all_directory PASSED [ 96%] tests/mirror_sync/test_write.py::test_refuses_when_the_all_directory_is_a_symlink PASSED [ 96%] tests/mirror_sync/test_write.py::test_refuses_a_symlinked_destination PASSED [ 96%] tests/mirror_sync/test_write.py::test_refuses_a_symlinked_delete_target PASSED [ 96%] tests/mirror_sync/test_write.py::test_refuses_a_traversal_that_stays_lexically_under_all PASSED [ 96%] tests/mirror_sync/test_write.py::test_refuses_an_absolute_path PASSED [ 96%] tests/mirror_sync/test_write.py::test_refuses_when_the_plan_is_blocked PASSED [ 97%] tests/mirror_sync/test_write.py::test_signals_before_the_first_mutation PASSED [ 97%] tests/mirror_sync/test_write.py::test_a_preflight_failure_does_not_signal PASSED [ 97%] tests/mirror_sync/test_write.py::test_a_blocked_plan_does_not_signal PASSED [ 97%] tests/test_driver_groups.py::test_group_image_runs_only_image_plugins PASSED [ 97%] tests/test_driver_groups.py::test_group_kolla_runs_only_kolla_plugins PASSED [ 97%] tests/test_driver_groups.py::test_group_all_runs_both_groups PASSED [ 97%] tests/test_driver_groups.py::test_archive_mode_preamble_not_misleading PASSED [ 97%] tests/test_driver_groups.py::test_use_raw_get_preamble_warns_slow PASSED [ 98%] tests/test_driver_groups.py::test_missing_group_errors PASSED [ 98%] tests/test_driver_groups.py::test_demo_exits_0_without_reading_config_or_allowlist PASSED [ 98%] tests/test_driver_groups.py::test_demo_renders_every_real_plugin PASSED [ 98%] tests/test_driver_groups.py::test_demo_json_emits_entries PASSED [ 98%] tests/test_driver_groups.py::test_help_lists_plugin_groups PASSED [ 98%] tests/test_release_notes_defaults.py::test_layer_is_sorted_and_filtered PASSED [ 98%] tests/test_release_notes_defaults.py::test_layer_omits_directories_and_keeps_only_blobs PASSED [ 98%] tests/test_release_notes_defaults.py::test_layer_none_on_http_error PASSED [ 99%] tests/test_release_notes_defaults.py::test_layer_none_on_truncated_tree PASSED [ 99%] tests/test_release_notes_defaults.py::test_layer_none_on_request_exception PASSED [ 99%] tests/test_release_notes_defaults.py::test_section_fetches_the_layer_before_099_and_names_the_layer_in_prose PASSED [ 99%] tests/test_release_notes_defaults.py::test_layer_empty_list_when_listing_succeeds_with_no_matches PASSED [ 99%] tests/test_release_notes_defaults.py::test_section_is_none_when_the_listing_fails_even_if_099_would_fetch PASSED [ 99%] tests/test_release_notes_defaults.py::test_section_is_none_when_the_listing_is_truncated PASSED [ 99%] tests/test_release_notes_defaults.py::test_section_is_none_when_one_mirror_file_fails_to_fetch PASSED [100%] ======================== 788 passed, 2 skipped in 9.77s ========================