test_programming_error_is_visible_and_does_not_terminate_visual_listener (test_listener_continuity.ListenerContinuityTests.test_programming_error_is_visible_and_does_not_terminate_visual_listener) ... ok test_recovery_backoff_is_bounded_and_repeated_errors_do_not_flood_logs (test_listener_continuity.ListenerContinuityTests.test_recovery_backoff_is_bounded_and_repeated_errors_do_not_flood_logs) ... ok test_user_stop_interrupts_connection_backoff_without_polling (test_listener_continuity.ListenerContinuityTests.test_user_stop_interrupts_connection_backoff_without_polling) ... ok test_verification_capture_failure_keeps_guard_and_no_further_polls (test_listener_continuity.ListenerContinuityTests.test_verification_capture_failure_keeps_guard_and_no_further_polls) ... ok test_verification_requires_consecutive_clean_captures (test_listener_continuity.ListenerContinuityTests.test_verification_requires_consecutive_clean_captures) ... ok test_verification_resumes_only_after_two_clean_workspace_captures (test_listener_continuity.ListenerContinuityTests.test_verification_resumes_only_after_two_clean_workspace_captures) ... ok test_visual_initial_connection_waits_then_recovers (test_listener_continuity.ListenerContinuityTests.test_visual_initial_connection_waits_then_recovers) ... ok test_visual_temporary_poll_failure_recovers_same_bot_and_preserves_protected_state (test_listener_continuity.ListenerContinuityTests.test_visual_temporary_poll_failure_recovers_same_bot_and_preserves_protected_state) ... ok test_attention_does_not_stop_listener_or_clear_review_and_delivery_protection (test_listener_continuity.ProtocolListenerContinuityTests.test_attention_does_not_stop_listener_or_clear_review_and_delivery_protection) ... ok test_protocol_database_errors_retry_same_account_bot_without_reconstruction (test_listener_continuity.ProtocolListenerContinuityTests.test_protocol_database_errors_retry_same_account_bot_without_reconstruction) ... ok test_protocol_startup_unavailable_waits_without_polling_then_recovers (test_listener_continuity.ProtocolListenerContinuityTests.test_protocol_startup_unavailable_waits_without_polling_then_recovers) ... ok test_stop_during_protocol_backoff_closes_resources_and_never_repolls (test_listener_continuity.ProtocolListenerContinuityTests.test_stop_during_protocol_backoff_closes_resources_and_never_repolls) ... ok test_stop_during_unsupported_build_wait_never_constructs_bot (test_listener_continuity.ProtocolListenerContinuityTests.test_stop_during_unsupported_build_wait_never_constructs_bot) ... ok test_unsupported_build_waits_and_never_constructs_sender_until_preflight_passes (test_listener_continuity.ProtocolListenerContinuityTests.test_unsupported_build_waits_and_never_constructs_sender_until_preflight_passes) ... ok test_capsule_preserves_verification_progress (test_listener_ui_continuity.ListenerUIContinuityTests.test_capsule_preserves_verification_progress) ... ok test_explicit_stop_still_finishes_worker (test_listener_ui_continuity.ListenerUIContinuityTests.test_explicit_stop_still_finishes_worker) ... ok test_protocol_task_attention_does_not_disconnect_healthy_listener (test_listener_ui_continuity.ListenerUIContinuityTests.test_protocol_task_attention_does_not_disconnect_healthy_listener) ... ok test_recoverable_wait_does_not_mark_queue_as_stopped (test_listener_ui_continuity.ListenerUIContinuityTests.test_recoverable_wait_does_not_mark_queue_as_stopped) ... ok test_sidebar_waiting_keeps_stop_button_active (test_listener_ui_continuity.ListenerUIContinuityTests.test_sidebar_waiting_keeps_stop_button_active) ... ok test_waiting_states_keep_running_and_stop_control_available (test_listener_ui_continuity.ListenerUIContinuityTests.test_waiting_states_keep_running_and_stop_control_available) ... ok test_web_labels_distinguish_waiting_from_stopped (test_listener_ui_continuity.ListenerUIContinuityTests.test_web_labels_distinguish_waiting_from_stopped) ... ok test_database_poll_failure_recovers_without_recreating_pending_tasks (test_listener_continuity_integration.ListenerContinuityIntegrationTests.test_database_poll_failure_recovers_without_recreating_pending_tasks) ... ok test_receipt_unknown_and_review_do_not_stop_other_conversations (test_listener_continuity_integration.ListenerContinuityIntegrationTests.test_receipt_unknown_and_review_do_not_stop_other_conversations) ... ok test_database_wide_failure_propagates_without_healthy_claim_or_send (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_database_wide_failure_propagates_without_healthy_claim_or_send) ... ok test_explicit_pre_send_unavailable_stays_error_and_peers_continue (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_explicit_pre_send_unavailable_stays_error_and_peers_continue) ... ok test_foreign_account_task_cannot_send_while_current_account_continues (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_foreign_account_task_cannot_send_while_current_account_continues) ... ok test_generation_error_does_not_stop_another_conversation (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_generation_error_does_not_stop_another_conversation) ... ok test_malformed_message_row_does_not_drop_valid_rows (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_malformed_message_row_does_not_drop_valid_rows) ... ok test_malformed_task_timing_does_not_block_peers (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_malformed_task_timing_does_not_block_peers) ... ok test_media_manual_handling_only_blocks_its_own_conversation (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_media_manual_handling_only_blocks_its_own_conversation) ... ok test_new_messages_and_contact_notices_cannot_replace_unknown_send (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_new_messages_and_contact_notices_cannot_replace_unknown_send) ... ok test_pending_review_only_blocks_its_own_conversation (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_pending_review_only_blocks_its_own_conversation) ... ok test_restart_keeps_unknown_and_failed_tasks_isolated (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_restart_keeps_unknown_and_failed_tasks_isolated) ... ok test_sending_persistence_error_preserves_no_replay_and_peer_processing (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_sending_persistence_error_preserves_no_replay_and_peer_processing) ... ok test_task_context_read_error_is_recorded_without_stopping_peers (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_task_context_read_error_is_recorded_without_stopping_peers) ... ok test_unexpected_sender_exception_is_unknown_not_automatic_retry (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_unexpected_sender_exception_is_unknown_not_automatic_retry) ... ok test_unknown_receipt_does_not_stop_same_poll_or_future_peer_tasks (test_protocol_listener_continuity.ProtocolListenerContinuityTests.test_unknown_receipt_does_not_stop_same_poll_or_future_peer_tasks) ... ok test_customer_parentheses_and_personal_wechat_title_are_not_groups (test_reply_session_policy.SessionPolicyTests.test_customer_parentheses_and_personal_wechat_title_are_not_groups) ... ok test_exact_application_titles_include_spacing_variants (test_reply_session_policy.SessionPolicyTests.test_exact_application_titles_include_spacing_variants) ... ok test_explicit_member_units_identify_group_header (test_reply_session_policy.SessionPolicyTests.test_explicit_member_units_identify_group_header) ... ok test_explicit_metadata_and_nested_db_event_are_supported (test_reply_session_policy.SessionPolicyTests.test_explicit_metadata_and_nested_db_event_are_supported) ... ok test_false_string_and_single_chat_types_do_not_block_customers (test_reply_session_policy.SessionPolicyTests.test_false_string_and_single_chat_types_do_not_block_customers) ... ok test_list_unread_count_or_word_group_is_insufficient (test_reply_session_policy.SessionPolicyTests.test_list_unread_count_or_word_group_is_insufficient) ... ok test_message_text_and_other_people_names_are_not_filters (test_reply_session_policy.SessionPolicyTests.test_message_text_and_other_people_names_are_not_filters) ... ok test_opened_title_has_additional_member_count (test_reply_session_policy.SessionPolicyTests.test_opened_title_has_additional_member_count) ... ok test_structured_group_ids_are_skipped (test_reply_session_policy.SessionPolicyTests.test_structured_group_ids_are_skipped) ... ok test_context_reloaded_for_generation_can_exclude_group (test_protocol_session_exclusions.ProtocolSessionExclusions.test_context_reloaded_for_generation_can_exclude_group) ... ok test_database_existing_direct_filter_rejects_group_before_content_read (test_protocol_session_exclusions.ProtocolSessionExclusions.test_database_existing_direct_filter_rejects_group_before_content_read) ... ok test_duplicate_excluded_event_does_not_rewrite_queue_or_repeat_log (test_protocol_session_exclusions.ProtocolSessionExclusions.test_duplicate_excluded_event_does_not_rewrite_queue_or_repeat_log) ... ok test_excluded_legacy_manual_or_error_tasks_are_removed_before_review (test_protocol_session_exclusions.ProtocolSessionExclusions.test_excluded_legacy_manual_or_error_tasks_are_removed_before_review) ... ok test_excluded_sessions_do_not_block_other_personal_session (test_protocol_session_exclusions.ProtocolSessionExclusions.test_excluded_sessions_do_not_block_other_personal_session) ... ok test_final_native_guard_cancels_then_clears_only_unsent_draft (test_protocol_session_exclusions.ProtocolSessionExclusions.test_final_native_guard_cancels_then_clears_only_unsent_draft) ... ok test_foreign_account_draft_is_never_cleared_by_current_account_policy (test_protocol_session_exclusions.ProtocolSessionExclusions.test_foreign_account_draft_is_never_cleared_by_current_account_policy) ... ok test_group_ids_and_structured_kinds_never_generate (test_protocol_session_exclusions.ProtocolSessionExclusions.test_group_ids_and_structured_kinds_never_generate) ... ok test_identity_changed_during_generation_drops_draft_before_review_or_send (test_protocol_session_exclusions.ProtocolSessionExclusions.test_identity_changed_during_generation_drops_draft_before_review_or_send) ... ok test_latest_context_identity_is_checked_before_generation (test_protocol_session_exclusions.ProtocolSessionExclusions.test_latest_context_identity_is_checked_before_generation) ... ok test_latest_last_message_metadata_is_checked_even_without_context_kind (test_protocol_session_exclusions.ProtocolSessionExclusions.test_latest_last_message_metadata_is_checked_even_without_context_kind) ... ok test_named_system_sessions_never_generate_or_enter_review (test_protocol_session_exclusions.ProtocolSessionExclusions.test_named_system_sessions_never_generate_or_enter_review) ... ok test_new_excluded_message_cannot_replace_unknown_send (test_protocol_session_exclusions.ProtocolSessionExclusions.test_new_excluded_message_cannot_replace_unknown_send) ... ok test_personal_message_mentions_of_groups_or_application_are_not_filtered (test_protocol_session_exclusions.ProtocolSessionExclusions.test_personal_message_mentions_of_groups_or_application_are_not_filtered) ... ok test_personal_name_containing_group_word_is_not_group_identity (test_protocol_session_exclusions.ProtocolSessionExclusions.test_personal_name_containing_group_word_is_not_group_identity) ... ok test_restart_discards_old_drafts_and_reviews_preserving_dedup (test_protocol_session_exclusions.ProtocolSessionExclusions.test_restart_discards_old_drafts_and_reviews_preserving_dedup) ... ok test_restart_keeps_attempted_delivery_evidence (test_protocol_session_exclusions.ProtocolSessionExclusions.test_restart_keeps_attempted_delivery_evidence) ... ok test_unknown_delivery_after_excluded_guard_preserves_evidence (test_protocol_session_exclusions.ProtocolSessionExclusions.test_unknown_delivery_after_excluded_guard_preserves_evidence) ... ok test_application_exact_name_rejects_queue_before_model_or_window_read (test_visual_session_exclusions.VisualSessionExclusionTests.test_application_exact_name_rejects_queue_before_model_or_window_read) ... [会话过滤] 企小码系统会话不参与自动回复,已跳过 ok test_excluded_application_stops_send_before_any_input (test_visual_session_exclusions.VisualSessionExclusionTests.test_excluded_application_stops_send_before_any_input) ... [会话过滤] 企小码系统会话不参与自动回复,已跳过 ok test_expired_group_cache_is_rechecked_instead_of_permanent_blacklist (test_visual_session_exclusions.VisualSessionExclusionTests.test_expired_group_cache_is_rechecked_instead_of_permanent_blacklist) ... ok test_external_group_identity_cannot_enqueue (test_visual_session_exclusions.VisualSessionExclusionTests.test_external_group_identity_cannot_enqueue) ... [会话过滤] 群聊不参与自动回复,已跳过 ok test_group_metadata_stops_model_wrapper_without_generating (test_visual_session_exclusions.VisualSessionExclusionTests.test_group_metadata_stops_model_wrapper_without_generating) ... [会话过滤] 群聊不参与自动回复,已跳过 ok test_header_identity_change_between_frames_is_not_group_proof (test_visual_session_exclusions.VisualSessionExclusionTests.test_header_identity_change_between_frames_is_not_group_proof) ... ok test_known_personal_database_id_does_not_use_title_heuristics_or_old_group_cache (test_visual_session_exclusions.VisualSessionExclusionTests.test_known_personal_database_id_does_not_use_title_heuristics_or_old_group_cache) ... ok test_member_like_personal_nickname_is_not_excluded (test_visual_session_exclusions.VisualSessionExclusionTests.test_member_like_personal_nickname_is_not_excluded) ... ok test_mixed_unread_list_skips_application_and_group_then_selects_next_customer (test_visual_session_exclusions.VisualSessionExclusionTests.test_mixed_unread_list_skips_application_and_group_then_selects_next_customer) ... [视觉队列] 已跳过系统入口:企小码会话管理 [会话过滤] 群聊不参与自动回复,已跳过 ok test_no_group_inference_from_body_or_customer_name_containing_group_word (test_visual_session_exclusions.VisualSessionExclusionTests.test_no_group_inference_from_body_or_customer_name_containing_group_word) ... ok test_ocr_failure_is_not_a_reason_to_drop_customer (test_visual_session_exclusions.VisualSessionExclusionTests.test_ocr_failure_is_not_a_reason_to_drop_customer) ... ok test_partial_legacy_fingerprint_does_not_prove_unrelated_current_title (test_visual_session_exclusions.VisualSessionExclusionTests.test_partial_legacy_fingerprint_does_not_prove_unrelated_current_title) ... ok test_post_click_exclusion_continues_current_round_to_next_customer (test_visual_session_exclusions.VisualSessionExclusionTests.test_post_click_exclusion_continues_current_round_to_next_customer) ... [新消息] 正在处理 row0(坐标: 0, 20) [新消息] 正在处理 row0(坐标: 0, 20) [完成] 回复完成,红点已消失 → row0 ok test_post_click_queue_exclusion_continues_current_round_to_next_customer (test_visual_session_exclusions.VisualSessionExclusionTests.test_post_click_queue_exclusion_continues_current_round_to_next_customer) ... [新消息] 正在处理 row0(坐标: 0, 20) [会话过滤] 群聊不参与自动回复,已跳过 [新消息] 正在处理 row0(坐标: 0, 20) [完成] 回复完成,红点已消失 → row0 ok test_protected_delivery_evidence_is_preserved_for_every_exclusion (test_visual_session_exclusions.VisualSessionExclusionTests.test_protected_delivery_evidence_is_preserved_for_every_exclusion) ... [会话过滤] 企小码系统会话不参与自动回复,已跳过 ok test_selected_identity_mismatch_does_not_remove_previous_task (test_visual_session_exclusions.VisualSessionExclusionTests.test_selected_identity_mismatch_does_not_remove_previous_task) ... ok test_stable_group_title_requires_two_headers_then_skips_without_reopening (test_visual_session_exclusions.VisualSessionExclusionTests.test_stable_group_title_requires_two_headers_then_skips_without_reopening) ... [会话过滤] 群聊不参与自动回复,已跳过 ok test_startup_system_purge_keeps_uncertain_transaction (test_visual_session_exclusions.VisualSessionExclusionTests.test_startup_system_purge_keeps_uncertain_transaction) ... ok test_task_replacement_during_header_confirmation_is_not_removed_or_cached (test_visual_session_exclusions.VisualSessionExclusionTests.test_task_replacement_during_header_confirmation_is_not_removed_or_cached) ... ok test_title_change_between_frames_does_not_remove_previous_task (test_visual_session_exclusions.VisualSessionExclusionTests.test_title_change_between_frames_does_not_remove_previous_task) ... ok test_unknown_task_name_reads_list_before_explicit_member_suffix (test_visual_session_exclusions.VisualSessionExclusionTests.test_unknown_task_name_reads_list_before_explicit_member_suffix) ... ok test_vanished_selection_rebinds_second_header_before_excluding (test_visual_session_exclusions.VisualSessionExclusionTests.test_vanished_selection_rebinds_second_header_before_excluding) ... ok test_vanished_selection_with_other_application_header_keeps_customer (test_visual_session_exclusions.VisualSessionExclusionTests.test_vanished_selection_with_other_application_header_keeps_customer) ... ok test_vanished_selection_with_other_group_member_header_keeps_customer (test_visual_session_exclusions.VisualSessionExclusionTests.test_vanished_selection_with_other_group_member_header_keeps_customer) ... ok test_vanished_unread_row_requires_separate_list_name_and_stable_header (test_visual_session_exclusions.VisualSessionExclusionTests.test_vanished_unread_row_requires_separate_list_name_and_stable_header) ... [会话过滤] 群聊不参与自动回复,已跳过 ok test_wechat_label_does_not_count_as_group_even_with_member_suffix (test_visual_session_exclusions.VisualSessionExclusionTests.test_wechat_label_does_not_count_as_group_even_with_member_suffix) ... ok test_counts_are_disjoint_and_count_conversations_not_messages (test_review_badges.AttentionBadgeTests.test_counts_are_disjoint_and_count_conversations_not_messages) ... ok test_hidden_queue_refreshes_counts_without_rebuilding_widgets (test_review_badges.AttentionBadgeTests.test_hidden_queue_refreshes_counts_without_rebuilding_widgets) ... ok test_native_badge_scales_and_preserves_exact_accessible_count (test_review_badges.AttentionBadgeTests.test_native_badge_scales_and_preserves_exact_accessible_count) ... ok test_queue_refresh_updates_both_native_entrances_under_unrelated_filter (test_review_badges.AttentionBadgeTests.test_queue_refresh_updates_both_native_entrances_under_unrelated_filter) ... ok test_web_badges_update_while_editing_and_hide_when_resolved (test_review_badges.AttentionBadgeTests.test_web_badges_update_while_editing_and_hide_when_resolved) ... ok test_current_shadow_plan_releases_legacy_high_risk_once (test_review_policy_integration.ProtocolPolicyIntegration.test_current_shadow_plan_releases_legacy_high_risk_once) ... ok test_gateway_shadow_verdict_is_recorded_and_sent_without_approval (test_review_policy_integration.ProtocolPolicyIntegration.test_gateway_shadow_verdict_is_recorded_and_sent_without_approval) ... ok test_gateway_strict_verdict_overrides_stale_shadow_cache (test_review_policy_integration.ProtocolPolicyIntegration.test_gateway_strict_verdict_overrides_stale_shadow_cache) ... ok test_score_only_high_risk_still_requires_approval (test_review_policy_integration.ProtocolPolicyIntegration.test_score_only_high_risk_still_requires_approval) ... ok test_disabling_keyword_rule_releases_existing_draft (test_review_policy_integration.VisualPolicyIntegration.test_disabling_keyword_rule_releases_existing_draft) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_new_strict_verdict_overrides_old_shadow_config (test_review_policy_integration.VisualPolicyIntegration.test_new_strict_verdict_overrides_old_shadow_config) ... ok test_old_judge_callback_cannot_modify_new_turn (test_review_policy_integration.VisualPolicyIntegration.test_old_judge_callback_cannot_modify_new_turn) ... ok test_shadow_mode_survives_restart_and_releases_obsolete_review (test_review_policy_integration.VisualPolicyIntegration.test_shadow_mode_survives_restart_and_releases_obsolete_review) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_shadow_never_clears_unknown_receipt (test_review_policy_integration.VisualPolicyIntegration.test_shadow_never_clears_unknown_receipt) ... ok test_explicit_approval_survives_restart_but_is_consumed_on_next_turn (test_visual_review_visibility.VisualReviewVisibilityTest.test_explicit_approval_survives_restart_but_is_consumed_on_next_turn) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_failed_approval_save_keeps_review_visible_and_unapproved (test_visual_review_visibility.VisualReviewVisibilityTest.test_failed_approval_save_keeps_review_visible_and_unapproved) ... ok test_known_global_review_still_honors_explicit_mode_change (test_visual_review_visibility.VisualReviewVisibilityTest.test_known_global_review_still_honors_explicit_mode_change) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_legacy_manual_review_stage_without_boolean_is_restored (test_visual_review_visibility.VisualReviewVisibilityTest.test_legacy_manual_review_stage_without_boolean_is_restored) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_legacy_review_recovers_rule_reason_from_stage_detail (test_visual_review_visibility.VisualReviewVisibilityTest.test_legacy_review_recovers_rule_reason_from_stage_detail) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_legacy_review_with_lost_reason_stays_actionable (test_visual_review_visibility.VisualReviewVisibilityTest.test_legacy_review_with_lost_reason_stays_actionable) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_next_customer_turn_does_not_inherit_previous_judge_risk (test_visual_review_visibility.VisualReviewVisibilityTest.test_next_customer_turn_does_not_inherit_previous_judge_risk) ... ok test_review_outcome_preserves_specific_reason_for_desktop_and_log (test_visual_review_visibility.VisualReviewVisibilityTest.test_review_outcome_preserves_specific_reason_for_desktop_and_log) ... ok test_review_without_unread_badge_does_not_expire_during_downtime (test_visual_review_visibility.VisualReviewVisibilityTest.test_review_without_unread_badge_does_not_expire_during_downtime) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_rule_reason_and_judge_survive_restart_and_auto_mode (test_visual_review_visibility.VisualReviewVisibilityTest.test_rule_reason_and_judge_survive_restart_and_auto_mode) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_user_can_cancel_restored_review_without_sending (test_visual_review_visibility.VisualReviewVisibilityTest.test_user_can_cancel_restored_review_without_sending) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_foreign_account_task_cannot_be_approved_deleted_or_retried (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_foreign_account_task_cannot_be_approved_deleted_or_retried) ... ok test_high_risk_reason_available_in_automatic_mode (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_high_risk_reason_available_in_automatic_mode) ... ok test_media_batch_is_visible_manual_work_without_approvable_draft (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_media_batch_is_visible_manual_work_without_approvable_draft) ... ok test_next_valid_batch_discards_old_manual_requirement (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_next_valid_batch_discards_old_manual_requirement) ... ok test_old_saved_review_and_manual_tasks_restore_metadata_only (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_old_saved_review_and_manual_tasks_restore_metadata_only) ... ok test_overlong_batch_cannot_be_approved_as_a_draft (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_overlong_batch_cannot_be_approved_as_a_draft) ... ok test_retry_clears_old_metadata_then_rechecks_media_without_sending (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_retry_clears_old_metadata_then_rechecks_media_without_sending) ... ok test_review_draft_reason_persists_then_explicit_approval_sends_once (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_review_draft_reason_persists_then_explicit_approval_sends_once) ... ok test_unknown_receipt_cannot_be_approved_or_retried (test_protocol_review_visibility.ProtocolReviewVisibilityTests.test_unknown_receipt_cannot_be_approved_or_retried) ... ok ---------------------------------------------------------------------- Ran 124 tests in 7.991s OK