Files
kefu/deploy/single-instance-tray-20260917/final-target-tests.log
T
2026-09-21 10:34:06 +08:00

1489 lines
183 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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_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_old_gateway_or_local_result_cannot_overwrite_new_taskid_on_same_object (test_review_policy_regression.ProtocolGenerationIdentityTests.test_old_gateway_or_local_result_cannot_overwrite_new_taskid_on_same_object) ... ok
test_configuration_failure_preserves_high_risk_hold (test_review_policy_regression.ReviewPolicyTests.test_configuration_failure_preserves_high_risk_hold) ... ok
test_current_enforcing_plan_does_not_turn_old_shadow_observation_into_hold (test_review_policy_regression.ReviewPolicyTests.test_current_enforcing_plan_does_not_turn_old_shadow_observation_into_hold) ... ok
test_disabled_gateway_cache_cannot_override_local_mode (test_review_policy_regression.ReviewPolicyTests.test_disabled_gateway_cache_cannot_override_local_mode) ... ok
test_disabled_rules_cannot_hold_customer_or_reply_text (test_review_policy_regression.ReviewPolicyTests.test_disabled_rules_cannot_hold_customer_or_reply_text) ... ok
test_explicit_current_shadow_rechecks_old_high_risk (test_review_policy_regression.ReviewPolicyTests.test_explicit_current_shadow_rechecks_old_high_risk) ... ok
test_gateway_current_mode_uses_only_this_process_settings (test_review_policy_regression.ReviewPolicyTests.test_gateway_current_mode_uses_only_this_process_settings) ... ok
test_gateway_shadow_is_effective_for_legacy_record (test_review_policy_regression.ReviewPolicyTests.test_gateway_shadow_is_effective_for_legacy_record) ... ok
test_high_risk_shadow_observes_and_enforcing_modes_hold (test_review_policy_regression.ReviewPolicyTests.test_high_risk_shadow_observes_and_enforcing_modes_hold) ... ok
test_local_judge_disabled_means_unknown_even_with_shadow_default (test_review_policy_regression.ReviewPolicyTests.test_local_judge_disabled_means_unknown_even_with_shadow_default) ... ok
test_missing_mode_and_unknown_current_plan_remain_manual (test_review_policy_regression.ReviewPolicyTests.test_missing_mode_and_unknown_current_plan_remain_manual) ... ok
test_missing_or_invalid_gateway_mode_is_unknown (test_review_policy_regression.ReviewPolicyTests.test_missing_or_invalid_gateway_mode_is_unknown) ... ok
test_non_high_risks_do_not_trigger_judge_review (test_review_policy_regression.ReviewPolicyTests.test_non_high_risks_do_not_trigger_judge_review) ... ok
test_plain_review_with_draft_can_be_rechecked (test_review_policy_regression.ReviewPolicyTests.test_plain_review_with_draft_can_be_rechecked) ... ok
test_recheck_protects_receipt_and_manual_or_foreign_work (test_review_policy_regression.ReviewPolicyTests.test_recheck_protects_receipt_and_manual_or_foreign_work) ... ok
test_recheck_rejects_any_send_state (test_review_policy_regression.ReviewPolicyTests.test_recheck_rejects_any_send_state) ... ok
test_recorded_enforcing_mode_cannot_be_overridden_by_current_shadow (test_review_policy_regression.ReviewPolicyTests.test_recorded_enforcing_mode_cannot_be_overridden_by_current_shadow) ... ok
test_shadow_still_honors_enabled_keyword_rule (test_review_policy_regression.ReviewPolicyTests.test_shadow_still_honors_enabled_keyword_rule) ... ok
test_valid_recorded_mode_never_reads_current_plan (test_review_policy_regression.ReviewPolicyTests.test_valid_recorded_mode_never_reads_current_plan) ... ok
test_active_keyword_rule_remains_held (test_review_policy_regression.VisualReviewIntegrationTests.test_active_keyword_rule_remains_held) ... ok
test_current_gateway_shadow_releases_known_old_model_hold (test_review_policy_regression.VisualReviewIntegrationTests.test_current_gateway_shadow_releases_known_old_model_hold) ... ok
test_direct_model_round_clears_previous_judge_metadata (test_review_policy_regression.VisualReviewIntegrationTests.test_direct_model_round_clears_previous_judge_metadata) ... ok
test_disabled_keyword_review_is_requeued_without_approval (test_review_policy_regression.VisualReviewIntegrationTests.test_disabled_keyword_review_is_requeued_without_approval) ... ok
test_disabled_rules_do_not_release_protected_tasks (test_review_policy_regression.VisualReviewIntegrationTests.test_disabled_rules_do_not_release_protected_tasks) ... ok
test_global_review_mode_does_not_clear_any_hold (test_review_policy_regression.VisualReviewIntegrationTests.test_global_review_mode_does_not_clear_any_hold) ... ok
test_global_review_releases_in_auto_mode_when_unprotected (test_review_policy_regression.VisualReviewIntegrationTests.test_global_review_releases_in_auto_mode_when_unprotected) ... ok
test_legacy_high_risk_without_valid_current_mode_stays_held (test_review_policy_regression.VisualReviewIntegrationTests.test_legacy_high_risk_without_valid_current_mode_stays_held) ... ok
test_missing_rule_evidence_stays_conservative (test_review_policy_regression.VisualReviewIntegrationTests.test_missing_rule_evidence_stays_conservative) ... ok
test_model_record_persists_actual_judge_mode (test_review_policy_regression.VisualReviewIntegrationTests.test_model_record_persists_actual_judge_mode) ... ok
test_orchestration_binds_callback_to_generation_before_model_starts (test_review_policy_regression.VisualReviewIntegrationTests.test_orchestration_binds_callback_to_generation_before_model_starts) ... ok
test_recorded_strict_visual_verdict_stays_held_with_cached_shadow (test_review_policy_regression.VisualReviewIntegrationTests.test_recorded_strict_visual_verdict_stays_held_with_cached_shadow) ... ok
test_review_cleanup_rolls_back_when_save_raises (test_review_policy_regression.VisualReviewIntegrationTests.test_review_cleanup_rolls_back_when_save_raises) ... ok
test_review_cleanup_rolls_back_when_save_returns_false (test_review_policy_regression.VisualReviewIntegrationTests.test_review_cleanup_rolls_back_when_save_returns_false) ... ok
test_stale_callback_cannot_write_after_inplace_reset_or_new_id (test_review_policy_regression.VisualReviewIntegrationTests.test_stale_callback_cannot_write_after_inplace_reset_or_new_id) ... ok
test_stale_callback_cannot_write_to_new_task_object (test_review_policy_regression.VisualReviewIntegrationTests.test_stale_callback_cannot_write_to_new_task_object) ... ok
test_unknown_historical_reason_is_not_automatically_released (test_review_policy_regression.VisualReviewIntegrationTests.test_unknown_historical_reason_is_not_automatically_released) ... ok
test_visual_enforcing_and_legacy_high_risk_still_hold (test_review_policy_regression.VisualReviewIntegrationTests.test_visual_enforcing_and_legacy_high_risk_still_hold) ... ok
test_visual_shadow_high_risk_does_not_hold (test_review_policy_regression.VisualReviewIntegrationTests.test_visual_shadow_high_risk_does_not_hold) ... 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_a_configured_gateway_takes_the_full_prompt_path (test_reply_safety.BotGatewayPathTest.test_a_configured_gateway_takes_the_full_prompt_path)
配了网关就只走 ai_chat,整串消息原样送过去。 ... ok
test_blanket_review_mode_is_reported_as_such (test_reply_safety.BotGatewayPathTest.test_blanket_review_mode_is_reported_as_such) ... ok
test_no_rule_hit_reports_an_empty_review_reason (test_reply_safety.BotGatewayPathTest.test_no_rule_hit_reports_an_empty_review_reason) ... ok
test_the_client_does_not_run_its_own_best_of_n_behind_a_gateway (test_reply_safety.BotGatewayPathTest.test_the_client_does_not_run_its_own_best_of_n_behind_a_gateway)
并发问几个、谁当裁判,全部由后台的角色编排说了算,网关执行。 ... ok
test_the_gateway_is_asked_exactly_once (test_reply_safety.BotGatewayPathTest.test_the_gateway_is_asked_exactly_once)
曾经先调一次退化接口、失败再调一次完整的——同一句话付两遍钱。 ... ok
test_the_local_shadow_path_shares_one_task_id_across_both_registrations (test_reply_safety.BotGatewayPathTest.test_the_local_shadow_path_shares_one_task_id_across_both_registrations)
影子裁判要登记两次(生成时一次、评分异步回来再一次)——两次必须共用同一个 ... ok
test_the_orchestration_trace_is_recorded (test_reply_safety.BotGatewayPathTest.test_the_orchestration_trace_is_recorded)
选了谁、裁判打了多少分——出事之后要能解释"为什么发的是这句"。 ... ok
test_the_recorded_call_reports_which_review_rule_it_tripped (test_reply_safety.BotGatewayPathTest.test_the_recorded_call_reports_which_review_rule_it_tripped)
报回后端的这一行要能说清"这条为什么被拦",不是只有分数没有理由。 ... ok
test_without_a_gateway_the_local_plan_still_works (test_reply_safety.BotGatewayPathTest.test_without_a_gateway_the_local_plan_still_works)
开发机上没配网关时,本机单出口那条老路一点没变。 ... ok
test_a_trace_is_consumed_once (test_reply_safety.GatewayTraceIsolationTest.test_a_trace_is_consumed_once)
取完即清。留着的话下一条回复会挂上上一条的裁判分。 ... ok
test_each_thread_sees_only_its_own_trace (test_reply_safety.GatewayTraceIsolationTest.test_each_thread_sees_only_its_own_trace) ... ok
test_cancelled_inflight_task_is_rejected_before_any_send_action (test_reply_safety.ManualPendingCancellationTest.test_cancelled_inflight_task_is_rejected_before_any_send_action) ... ok
test_live_manual_delete_removes_state_and_blocks_inflight_recreation (test_reply_safety.ManualPendingCancellationTest.test_live_manual_delete_removes_state_and_blocks_inflight_recreation) ... ok
test_manual_delete_protects_task_after_send_dispatch_reservation (test_reply_safety.ManualPendingCancellationTest.test_manual_delete_protects_task_after_send_dispatch_reservation) ... ok
test_a_failed_disk_write_rolls_the_approval_back (test_reply_safety.ManualReviewApprovalTest.test_a_failed_disk_write_rolls_the_approval_back)
放行标记只活在内存里是不行的。 ... ok
test_a_key_that_left_the_queue_is_reported_missing (test_reply_safety.ManualReviewApprovalTest.test_a_key_that_left_the_queue_is_reported_missing) ... ok
test_a_task_that_is_not_awaiting_review_is_reported_not_crashed (test_reply_safety.ManualReviewApprovalTest.test_a_task_that_is_not_awaiting_review_is_reported_not_crashed) ... ok
test_an_approved_draft_stops_being_held_by_the_review_gate (test_reply_safety.ManualReviewApprovalTest.test_an_approved_draft_stops_being_held_by_the_review_gate) ... ok
test_approval_is_single_use_and_does_not_disable_review_for_later_replies (test_reply_safety.ManualReviewApprovalTest.test_approval_is_single_use_and_does_not_disable_review_for_later_replies)
放行一次不能变成"这个客户从此免审"。 ... ok
test_approving_a_draft_clears_the_review_flag_and_requeues_it (test_reply_safety.ManualReviewApprovalTest.test_approving_a_draft_clears_the_review_flag_and_requeues_it) ... ok
test_empty_input_is_a_no_op (test_reply_safety.ManualReviewApprovalTest.test_empty_input_is_a_no_op) ... ok
test_switching_back_to_auto_send_clears_approval_flags_too (test_reply_safety.ManualReviewApprovalTest.test_switching_back_to_auto_send_clears_approval_flags_too) ... ok
test_animated_sticker_frames_keep_one_layout_signature (test_reply_safety.MediaReplyTest.test_animated_sticker_frames_keep_one_layout_signature) ... ok
test_confirmed_unread_caption_without_placeholder_still_uses_vision (test_reply_safety.MediaReplyTest.test_confirmed_unread_caption_without_placeholder_still_uses_vision) ... [AI] 本次提取的新内容:
客户甲 10:00:00
帮我看看这个
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[编排] 未配置模型网关,本次使用本机 ai_config 里的单模型设置。后台的「角色编排」不会生效。
[AI] 回复内容: 我看到了,您想重点确认哪一处?
ok
test_confirmed_unread_empty_clipboard_uses_type_agnostic_safe_reply (test_reply_safety.MediaReplyTest.test_confirmed_unread_empty_clipboard_uses_type_agnostic_safe_reply) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 已确认未读但媒体类型未知,使用通用安全追问
[AI] 回复内容: 收到消息,请把重点打字说一下
ok
test_dify_vision_query_contains_current_text_and_archive_history (test_reply_safety.MediaReplyTest.test_dify_vision_query_contains_current_text_and_archive_history) ... ok
test_empty_clipboard_surface_change_enters_media_fallback (test_reply_safety.MediaReplyTest.test_empty_clipboard_surface_change_enters_media_fallback) ...
[会话守护] 当前聊天页出现新内容,检查是否为客户未回复消息...
[会话守护] 页面有变化但剪贴板为空,将按非文字消息检查。
[会话守护] 发现客户新消息,先合并连续消息再回复。
ok
test_explicit_customer_block_proves_flat_avatar_is_real_chat (test_reply_safety.MediaReplyTest.test_explicit_customer_block_proves_flat_avatar_is_real_chat) ... [AI] 本次提取的新内容:
客户甲 7/29 10:00:00
请问今天下午能挂号吗
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复
[AI] 回复内容: 可以,我先帮您登记。
ok
test_explicit_empty_media_set_does_not_rescan_old_history (test_reply_safety.MediaReplyTest.test_explicit_empty_media_set_does_not_rescan_old_history) ... ok
test_explicit_image_uses_safe_reply_when_chat_capture_fails (test_reply_safety.MediaReplyTest.test_explicit_image_uses_safe_reply_when_chat_capture_fails) ... [AI] 本次提取的新内容:
客户甲 10:00:00
[图片]
[AI] [!] 聊天消息区域截图失败: capture failed
[AI] 视觉不可用,使用对应媒体类型的安全追问
[AI] 回复内容: 图片我收到了,这边暂时没看清具体内容,您想让我重点看哪一处?
ok
test_first_record_explicit_customer_text_is_still_visually_confirmed (test_reply_safety.MediaReplyTest.test_first_record_explicit_customer_text_is_still_visually_confirmed) ... [AI] 本次提取的新内容:
客户甲 7/29 10:00:00
请问今天下午能挂号吗
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 回复内容: 可以的,我先帮您登记需求。
ok
test_first_record_visual_failure_never_answers_visible_old_text (test_reply_safety.MediaReplyTest.test_first_record_visual_failure_never_answers_visible_old_text) ... ok
test_image_and_text_batch_automatically_uses_mixed_vision (test_reply_safety.MediaReplyTest.test_image_and_text_batch_automatically_uses_mixed_vision) ... [AI] 本次提取的新内容:
客户甲 10:00:00
[图片],这个处方天数改成15天吧
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 回复内容: 我看到了,先核对后再告诉您。
ok
test_legacy_inflight_state_does_not_invent_an_empty_send_anchor (test_reply_safety.MediaReplyTest.test_legacy_inflight_state_does_not_invent_an_empty_send_anchor) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_media_markers_are_detected_but_unicode_emoji_stays_text (test_reply_safety.MediaReplyTest.test_media_markers_are_detected_but_unicode_emoji_stays_text) ... ok
test_message_arriving_during_final_extraction_skips_model (test_reply_safety.MediaReplyTest.test_message_arriving_during_final_extraction_skips_model) ... [回复保护] 最终提取期间又出现新消息,重新开始消息合并等待。
ok
test_message_arriving_during_model_call_cancels_stale_reply (test_reply_safety.MediaReplyTest.test_message_arriving_during_model_call_cancels_stale_reply) ... [AI] 本次提取的新内容:
客户甲 10:00:00
[图片],请看一下
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[回复保护] 模型处理期间又出现新消息,已取消旧回复并重新合并。
ok
test_mixed_vision_without_contains_voice_is_rejected (test_reply_safety.MediaReplyTest.test_mixed_vision_without_contains_voice_is_rejected) ... ok
test_nested_diagnostic_object_cannot_override_protocol_result (test_reply_safety.MediaReplyTest.test_nested_diagnostic_object_cannot_override_protocol_result) ... ok
test_non_json_vision_text_is_never_treated_as_new_message_proof (test_reply_safety.MediaReplyTest.test_non_json_vision_text_is_never_treated_as_new_message_proof) ... ok
test_openai_vision_receives_current_text_history_and_chat_screenshot (test_reply_safety.MediaReplyTest.test_openai_vision_receives_current_text_history_and_chat_screenshot) ... ok
test_pending_text_is_restored_after_model_or_send_failure (test_reply_safety.MediaReplyTest.test_pending_text_is_restored_after_model_or_send_failure) ... [AI] 已恢复上次未成功发送的待回复内容
[AI] 本次提取的新内容:
客户甲 10:00:00
上一轮尚未成功发送的问题
[AI] 使用文本模式分析聊天记录...
[AI] 回复内容: 这次继续回复。
ok
test_pending_unread_task_survives_process_restart (test_reply_safety.MediaReplyTest.test_pending_unread_task_survives_process_restart) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_previous_16_byte_pending_key_is_loaded_instead_of_dropped (test_reply_safety.MediaReplyTest.test_previous_16_byte_pending_key_is_loaded_instead_of_dropped) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_pure_voice_never_asks_a_model_to_guess_audio (test_reply_safety.MediaReplyTest.test_pure_voice_never_asks_a_model_to_guess_audio) ... [AI] 本次提取的新内容:
客户甲 10:00:00
[语音]
[AI] 检测到未转写语音,使用不猜测内容的安全回复
[AI] 回复内容: 这条语音我这边暂时没法准确听清,麻烦您把重点打成文字发我一下。
ok
test_repeated_identical_media_blocks_remain_a_nonempty_delta (test_reply_safety.MediaReplyTest.test_repeated_identical_media_blocks_remain_a_nonempty_delta) ... ok
test_screenshot_only_image_type_is_preserved_in_archive (test_reply_safety.MediaReplyTest.test_screenshot_only_image_type_is_preserved_in_archive) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 回复内容: 图片我看到了,您想重点确认哪一处?
ok
test_screenshot_only_voice_type_is_preserved_for_safe_archive (test_reply_safety.MediaReplyTest.test_screenshot_only_voice_type_is_preserved_for_safe_archive) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 回复内容: 这条语音我这边暂时没法准确听清,麻烦您把重点打成文字发我一下。
ok
test_second_visual_no_incoming_clears_unconfirmed_unreliable_candidate (test_reply_safety.MediaReplyTest.test_second_visual_no_incoming_clears_unconfirmed_unreliable_candidate) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI 页面确认] 纯色头像候选不是客户消息页,已跳过且不会发送。
ok
test_second_visual_no_incoming_keeps_confirmed_unread_and_uses_safe_media_reply (test_reply_safety.MediaReplyTest.test_second_visual_no_incoming_keeps_confirmed_unread_and_uses_safe_media_reply) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复
[AI] 回复内容: 收到消息,请把重点打字说一下。
ok
test_second_visual_no_incoming_keeps_reliable_text_pending_and_uses_safe_text (test_reply_safety.MediaReplyTest.test_second_visual_no_incoming_keeps_reliable_text_pending_and_uses_safe_text) ... [AI] 本次提取的新内容:
客户甲 10:00:00
帮我看看这个
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复
[AI] 回复内容: 您想让我重点看哪一处?
ok
test_selected_caption_falls_back_to_safe_text_when_vision_fails (test_reply_safety.MediaReplyTest.test_selected_caption_falls_back_to_safe_text_when_vision_fails) ... [AI] 本次提取的新内容:
客户甲 10:00:00
帮我看看这个
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 视觉不可用,降级为同批可见文字回复
[AI] 回复内容: 您想让我重点看哪一处?
ok
test_selected_row_detection_flicker_reuses_same_session_cache (test_reply_safety.MediaReplyTest.test_selected_row_detection_flicker_reuses_same_session_cache) ... ok
test_selected_row_preview_detects_same_layout_media_replacement (test_reply_safety.MediaReplyTest.test_selected_row_preview_detects_same_layout_media_replacement) ... ok
test_selected_row_preview_is_stable_when_row_moves (test_reply_safety.MediaReplyTest.test_selected_row_preview_is_stable_when_row_moves) ... ok
test_snapshot_is_committed_only_after_successful_send (test_reply_safety.MediaReplyTest.test_snapshot_is_committed_only_after_successful_send) ... [档案] 增量提取到 2 行新消息(历史上下文由会话档案提供)
ok
test_unchanged_clipboard_text_is_not_replied_to_again (test_reply_safety.MediaReplyTest.test_unchanged_clipboard_text_is_not_replied_to_again) ... [档案] 剪贴板没有新增文字,将检查是否为非文字消息
ok
test_unconfirmed_empty_clipboard_never_sends_generic_media_reply (test_reply_safety.MediaReplyTest.test_unconfirmed_empty_clipboard_never_sends_generic_media_reply) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 无法确认本轮非文字内容,保留任务稍后重试
ok
test_unfinished_merge_deadline_survives_process_restart (test_reply_safety.MediaReplyTest.test_unfinished_merge_deadline_survives_process_restart) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_unknown_flat_avatar_vision_failure_never_uses_generic_fallback (test_reply_safety.MediaReplyTest.test_unknown_flat_avatar_vision_failure_never_uses_generic_fallback) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI 页面确认] 尚未确认这是客户消息页,保留任务且不发送兜底话术。
ok
test_unknown_visual_result_cannot_guess_untranscribed_voice (test_reply_safety.MediaReplyTest.test_unknown_visual_result_cannot_guess_untranscribed_voice) ... ok
test_vision_parser_ignores_analysis_json_before_protocol_result (test_reply_safety.MediaReplyTest.test_vision_parser_ignores_analysis_json_before_protocol_result) ... ok
test_vision_parser_uses_last_protocol_object (test_reply_safety.MediaReplyTest.test_vision_parser_uses_last_protocol_object) ... ok
test_vision_protocol_conflicts_fail_closed (test_reply_safety.MediaReplyTest.test_vision_protocol_conflicts_fail_closed) ... ok
test_visual_failure_does_not_reply_to_stale_clipboard_text (test_reply_safety.MediaReplyTest.test_visual_failure_does_not_reply_to_stale_clipboard_text) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 视觉失败且剪贴板只有旧文字,保留任务稍后重试
ok
test_visual_no_incoming_conflict_never_sends_caption_without_media_warning (test_reply_safety.MediaReplyTest.test_visual_no_incoming_conflict_never_sends_caption_without_media_warning) ... [AI] 本次提取的新内容:
客户甲 10:00:00
帮我看看这个
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复
[AI] 回复内容: 您想让我重点看哪一处?
ok
test_voice_control_labels_are_not_treated_as_transcription (test_reply_safety.MediaReplyTest.test_voice_control_labels_are_not_treated_as_transcription) ... ok
test_voice_duration_is_not_mistaken_for_transcription (test_reply_safety.MediaReplyTest.test_voice_duration_is_not_mistaken_for_transcription) ... ok
test_voice_plus_visible_text_answers_text_without_guessing_audio (test_reply_safety.MediaReplyTest.test_voice_plus_visible_text_answers_text_without_guessing_audio) ... [AI] 本次提取的新内容:
客户甲 10:00:00
[语音] 00:05
明天下午能挂号吗
[AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes)
[AI] 回复内容: 明天下午可以,我先帮您登记。
ok
test_voice_safety_result_preserves_other_mixed_media_types (test_reply_safety.MediaReplyTest.test_voice_safety_result_preserves_other_mixed_media_types) ... ok
test_agent_tail_still_settles_and_clears_the_task (test_reply_safety.NothingLeftToAnswerTextProofTest.test_agent_tail_still_settles_and_clears_the_task) ... ok
test_customer_tail_overrides_the_outgoing_bubble_and_keeps_the_task (test_reply_safety.NothingLeftToAnswerTextProofTest.test_customer_tail_overrides_the_outgoing_bubble_and_keeps_the_task) ... ok
test_delivered_reply_is_archived_before_answering_the_followup (test_reply_safety.NothingLeftToAnswerTextProofTest.test_delivered_reply_is_archived_before_answering_the_followup) ... ok
test_explicit_chat_text_skips_the_extra_extraction (test_reply_safety.NothingLeftToAnswerTextProofTest.test_explicit_chat_text_skips_the_extra_extraction) ... ok
test_display_name_waits_until_the_title_matches_the_target (test_reply_safety.PendingDisplayNameBindingTest.test_display_name_waits_until_the_title_matches_the_target) ... ok
test_age_question_mismatch_is_repaired (test_reply_safety.ReplyStyleTest.test_age_question_mismatch_is_repaired) ... ok
test_casual_tired_message_is_not_redirected_to_hospital (test_reply_safety.ReplyStyleTest.test_casual_tired_message_is_not_redirected_to_hospital) ... ok
test_clarification_does_not_ask_customer_to_repeat (test_reply_safety.ReplyStyleTest.test_clarification_does_not_ask_customer_to_repeat) ... ok
test_dify_query_marks_latest_message_as_only_target (test_reply_safety.ReplyStyleTest.test_dify_query_marks_latest_message_as_only_target) ... ok
test_emergency_reply_keeps_three_short_sentences (test_reply_safety.ReplyStyleTest.test_emergency_reply_keeps_three_short_sentences) ... ok
test_extracts_the_real_latest_customer_sentence (test_reply_safety.ReplyStyleTest.test_extracts_the_real_latest_customer_sentence) ... ok
test_low_information_customer_turn_never_guesses_phone_mistouch (test_reply_safety.ReplyStyleTest.test_low_information_customer_turn_never_guesses_phone_mistouch) ... ok
test_merges_five_consecutive_customer_bubbles_as_one_turn (test_reply_safety.ReplyStyleTest.test_merges_five_consecutive_customer_bubbles_as_one_turn) ... ok
test_old_raw_history_does_not_relabel_staff_reply_as_customer (test_reply_safety.ReplyStyleTest.test_old_raw_history_does_not_relabel_staff_reply_as_customer) ... ok
test_removes_markdown_canned_closing_and_extra_questions (test_reply_safety.ReplyStyleTest.test_removes_markdown_canned_closing_and_extra_questions) ... ok
test_200_percent_dpi_detects_both_resizable_composer_heights (test_reply_safety.SafetyGateTest.test_200_percent_dpi_detects_both_resizable_composer_heights) ... ok
test_200_percent_dpi_input_point_is_inside_editor_body (test_reply_safety.SafetyGateTest.test_200_percent_dpi_input_point_is_inside_editor_body) ... ok
test_a_baseline_already_holding_the_reply_proves_nothing (test_reply_safety.SafetyGateTest.test_a_baseline_already_holding_the_reply_proves_nothing)
基线里已经有这句话,发送前后长得一样,证明不了任何事。 ... ok
test_a_blank_name_hash_falls_back_to_the_strict_avatar_tolerance (test_reply_safety.SafetyGateTest.test_a_blank_name_hash_falls_back_to_the_strict_avatar_tolerance)
名称采不到字时它什么都证明不了,头像必须回到严格容差。 ... ok
test_a_broken_autosend_value_falls_back_to_disabled (test_reply_safety.SafetyGateTest.test_a_broken_autosend_value_falls_back_to_disabled)
配置读坏了的时候,宁可什么都不做,也不能拿别人的字去发给客户。 ... ok
test_a_clock_jump_backwards_does_not_freeze_the_session_forever (test_reply_safety.SafetyGateTest.test_a_clock_jump_backwards_does_not_freeze_the_session_forever)
墙钟被 NTP 往回校时,标记时间会变成"未来"——不能因此永远跳过。 ... ok
test_a_composed_reply_waits_out_the_last_seconds_of_spacing (test_reply_safety.SafetyGateTest.test_a_composed_reply_waits_out_the_last_seconds_of_spacing)
回复已经生成就不能因为还差几秒发送间隔被丢掉,下一轮要从头再调模型。 ... [发送保护] 发送间隔还差 1.0 秒,等完这段再把本条发出去。
ok
test_a_customer_followup_does_not_cancel_our_receipt (test_reply_safety.SafetyGateTest.test_a_customer_followup_does_not_cancel_our_receipt)
客户在我们发完后马上又说一句,末条气泡就在左边。 ... ok
test_a_customer_image_is_kept_with_the_archived_message (test_reply_safety.SafetyGateTest.test_a_customer_image_is_kept_with_the_archived_message)
企微图片没有可复制文本,档案里只剩「(客户发来图片)」这行占位。 ... ok
test_a_different_contact_still_only_establishes_a_baseline (test_reply_safety.SafetyGateTest.test_a_different_contact_still_only_establishes_a_baseline)
名称哈希不同就是另一个人,必须停在建基线,绝不能串聊天。 ... [会话守护] 已建立当前聊天页基线;画面未变化时不会操作鼠标。
ok
test_a_dispatched_transaction_keeps_its_draft_untouched (test_reply_safety.SafetyGateTest.test_a_dispatched_transaction_keeps_its_draft_untouched)
已经按过回车的事务归回执核对管,这里清掉再发就是重复发送。 ... ok
test_a_far_avatar_under_the_same_name_is_still_a_different_row (test_reply_safety.SafetyGateTest.test_a_far_avatar_under_the_same_name_is_still_a_different_row)
名称相同也不能无条件放行;头像彻底不同仍必须拒绝。 ... ok
test_a_findable_task_never_expires_on_a_bad_count (test_reply_safety.SafetyGateTest.test_a_findable_task_never_expires_on_a_bad_count) ... ok
test_a_finished_session_releases_the_round_at_once (test_reply_safety.SafetyGateTest.test_a_finished_session_releases_the_round_at_once)
回完就立刻放行,排队的会话不该多等一轮。 ... ok
test_a_full_chat_keeps_the_proven_path_first (test_reply_safety.SafetyGateTest.test_a_full_chat_keeps_the_proven_path_first)
消息占满面板时不改动既有顺序,墨迹路径只当兜底。 ... ok
test_a_headerless_chat_can_still_prove_the_reply_landed (test_reply_safety.SafetyGateTest.test_a_headerless_chat_can_still_prove_the_reply_landed) ... ok
test_a_human_draft_parks_the_session_instead_of_retrying_forever (test_reply_safety.SafetyGateTest.test_a_human_draft_parks_the_session_instead_of_retrying_forever)
这就是用户报的"一直占用进程":拦是拦住了,但每一轮都要重拦一次。 ... ok
test_a_human_sentence_still_stops_the_bot_cold (test_reply_safety.SafetyGateTest.test_a_human_sentence_still_stops_the_bot_cold) ... ok
test_a_lingering_chat_selection_is_not_a_human_draft (test_reply_safety.SafetyGateTest.test_a_lingering_chat_selection_is_not_a_human_draft)
机器人刚框选复制过聊天记录,那块高亮不会因为点一下空白就消失。 ... ok
test_a_login_page_without_a_workspace_locks_the_bot (test_reply_safety.SafetyGateTest.test_a_login_page_without_a_workspace_locks_the_bot) ... [安全验证] 检测到企业微信登录/安全验证二维码,已停止全部自动点击和发送。请用手机企业微信扫码完成验证;监听会等待消息界面恢复。
ok
test_a_long_rate_limit_still_leaves_the_task_for_later (test_reply_safety.SafetyGateTest.test_a_long_rate_limit_still_leaves_the_task_for_later)
分钟/小时配额用尽时不能原地干等,必须放行让轮询继续跑。 ... ok
test_a_message_taller_than_one_screen_is_scrolled_up_for (test_reply_safety.SafetyGateTest.test_a_message_taller_than_one_screen_is_scrolled_up_for)
满屏正文却没有表头,说明这条消息的开头还在上面,必须往上翻。 ... [剪贴板] 最新一条消息超过一屏,正在向上翻找开头…
[剪贴板] 成功提取 23 行聊天记录(共采集 2 屏 / 去重后 23 行)
ok
test_a_missing_arrival_time_never_breaks_the_queue (test_reply_safety.SafetyGateTest.test_a_missing_arrival_time_never_breaks_the_queue)
旧任务缺少 created_at 时排队不能崩,只能排在最前面等着被收掉。 ... ok
test_a_normal_screen_with_headers_never_scrolls (test_reply_safety.SafetyGateTest.test_a_normal_screen_with_headers_never_scrolls)
能看到表头就说明这条消息是完整的,多翻一屏是白白浪费两秒。 ... [剪贴板] 成功提取 17 行聊天记录(共采集 1 屏 / 去重后 17 行)
ok
test_a_page_without_a_composer_leaves_the_reply_queue (test_reply_safety.SafetyGateTest.test_a_page_without_a_composer_leaves_the_reply_queue) ... [会话过滤] 该会话连续 3 次没有输入框,判定为订阅号/系统号,已移出回复队列,不再重复调用模型。6 小时后会自动复查一次。
ok
test_a_payment_qr_sent_into_a_chat_is_not_a_login_page (test_reply_safety.SafetyGateTest.test_a_payment_qr_sent_into_a_chat_is_not_a_login_page)
客户发一张收款码进来,机器人不能就此罢工等人扫码。 ... ok
test_a_quiet_chat_reports_no_followup_to_chase (test_reply_safety.SafetyGateTest.test_a_quiet_chat_reports_no_followup_to_chase) ... ok
test_a_readable_screen_without_our_reply_frees_the_customer (test_reply_safety.SafetyGateTest.test_a_readable_screen_without_our_reply_frees_the_customer) ... [发送对账] 挂满 600 秒仍无法确认,屏幕上也找不到这句回复,放回队列重新回复。
ok
test_a_real_draft_in_a_non_blank_editor_still_wins (test_reply_safety.SafetyGateTest.test_a_real_draft_in_a_non_blank_editor_still_wins) ... ok
test_a_real_login_qr_still_stops_everything (test_reply_safety.SafetyGateTest.test_a_real_login_qr_still_stops_everything) ... ok
test_a_recovered_copy_rebuilds_the_missing_send_anchor (test_reply_safety.SafetyGateTest.test_a_recovered_copy_rebuilds_the_missing_send_anchor)
带表头的复制文本必须能解析出锚点——这正是发送被卡住的那一步。 ... ok
test_a_reopened_row_clears_its_own_strikes (test_reply_safety.SafetyGateTest.test_a_reopened_row_clears_its_own_strikes)
真会话偶尔判错一次,不能因此被误判成订阅号。 ... ok
test_a_reordered_row_does_not_cost_everyone_else_the_round (test_reply_safety.SafetyGateTest.test_a_reordered_row_does_not_cost_everyone_else_the_round)
刷屏消息把列表搅乱时,打不开的那个会话不能拖着所有人一起等下一轮。 ...
[新消息] 正在处理 row0(坐标: 200, 16)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 16)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
ok
test_a_reply_found_on_screen_after_the_deadline_counts_as_sent (test_reply_safety.SafetyGateTest.test_a_reply_found_on_screen_after_the_deadline_counts_as_sent) ... [发送对账] 挂满 600 秒;回复已在屏幕上,判定发送成功。
ok
test_a_reply_missing_from_the_screen_is_still_refused (test_reply_safety.SafetyGateTest.test_a_reply_missing_from_the_screen_is_still_refused)
末条气泡不再有否决权,但"屏幕上根本没有这句话"仍然必须判失败。 ... ok
test_a_reply_that_never_appeared_is_not_accepted (test_reply_safety.SafetyGateTest.test_a_reply_that_never_appeared_is_not_accepted) ... ok
test_a_saved_snapshot_lands_on_disk_and_old_ones_are_pruned (test_reply_safety.SafetyGateTest.test_a_saved_snapshot_lands_on_disk_and_old_ones_are_pruned) ... ok
test_a_session_with_no_task_never_blows_up (test_reply_safety.SafetyGateTest.test_a_session_with_no_task_never_blows_up) ... ok
test_a_session_without_a_task_never_gets_its_draft_wiped (test_reply_safety.SafetyGateTest.test_a_session_without_a_task_never_gets_its_draft_wiped) ... ok
test_a_sparse_chat_tries_the_ink_anchored_drag_first (test_reply_safety.SafetyGateTest.test_a_sparse_chat_tries_the_ink_anchored_drag_first)
消息稀疏时先走墨迹路径,省下两次注定选空的拖拽。 ... ok
test_a_sparse_headerless_chat_does_not_trigger_the_search (test_reply_safety.SafetyGateTest.test_a_sparse_headerless_chat_does_not_trigger_the_search)
新会话同样复制不出表头,但它行数很少,不该被当成被截断的长消息。 ... [剪贴板] 成功提取 1 行聊天记录(共采集 1 屏 / 去重后 1 行)
ok
test_a_stuck_session_stops_blocking_everyone_else (test_reply_safety.SafetyGateTest.test_a_stuck_session_stops_blocking_everyone_else)
真卡住的会话必须到点放行,否则后面排队的客户一起陪葬。 ... [排队] 当前会话已占用 61 秒仍未回完,先放行其他会话,稍后再回来处理它。
ok
test_a_subscription_row_is_evicted_from_the_queue (test_reply_safety.SafetyGateTest.test_a_subscription_row_is_evicted_from_the_queue)
指纹分毫不差、但这一行根本不是聊天:再等下去也不会变。 ... [会话过滤] 该会话连续 2 次被判定为非聊天行(订阅号/系统号),已移出回复队列,不再为它扫描列表。6 小时后会自动复查一次。
ok
test_a_successful_resume_clears_the_backoff (test_reply_safety.SafetyGateTest.test_a_successful_resume_clears_the_backoff) ... [待回复恢复] 找到已读未回复会话,正在按头像和名称复合指纹重新打开。
ok
test_a_task_is_never_judged_before_the_screen_can_catch_up (test_reply_safety.SafetyGateTest.test_a_task_is_never_judged_before_the_screen_can_catch_up)
刚按下回车就断言"屏幕没变=没发出去",会冤枉刚刚发成功的那一条。 ... ok
test_a_task_with_no_dispatch_time_is_left_alone (test_reply_safety.SafetyGateTest.test_a_task_with_no_dispatch_time_is_left_alone) ... ok
test_a_task_with_no_matching_row_anywhere_expires (test_reply_safety.SafetyGateTest.test_a_task_with_no_matching_row_anywhere_expires)
列表里找不到对应会话的空壳任务不能永远占着队列。 ... [待回复恢复] 该任务连续 8 次在会话列表里找不到对应会话,判定为失效任务并已丢弃;对方再来消息会重新建单。
ok
test_a_text_only_exchange_stays_free_of_image_keys (test_reply_safety.SafetyGateTest.test_a_text_only_exchange_stays_free_of_image_keys) ... ok
test_a_timed_out_draft_that_trips_a_review_rule_still_waits_for_a_human (test_reply_safety.SafetyGateTest.test_a_timed_out_draft_that_trips_a_review_rule_still_waits_for_a_human)
超时直发不能凌驾于审核规则之上。 ... [发送保护] 输入框里这段字已放置 10.0 分钟,超过设置的 5 分钟,按设置直接发送框里的内容。
[人工审核] 命中审核规则:诊断,回复已填入输入框,等待人工审核发送。
ok
test_a_waiting_customer_breaks_the_reconciliation_deadlock (test_reply_safety.SafetyGateTest.test_a_waiting_customer_breaks_the_reconciliation_deadlock)
待核对期间客户还在等 → 放弃旧草稿去回答他,而不是把他晾在那儿。 ... [发送对账] 等了 10 秒,最后一条仍是客户发来的,放弃这条旧草稿,改为回答最新消息。
ok
test_a_working_first_drag_never_costs_a_second_one (test_reply_safety.SafetyGateTest.test_a_working_first_drag_never_costs_a_second_one) ... ok
test_active_sent_uncommitted_is_reconciled_before_model_call (test_reply_safety.SafetyGateTest.test_active_sent_uncommitted_is_reconciled_before_model_call) ... ok
test_actual_staff_name_can_be_proved_by_outgoing_bubble_side (test_reply_safety.SafetyGateTest.test_actual_staff_name_can_be_proved_by_outgoing_bubble_side) ... ok
test_actual_staff_name_is_learned_when_configured_nickname_differs (test_reply_safety.SafetyGateTest.test_actual_staff_name_is_learned_when_configured_nickname_differs) ... ok
test_ai_page_guard_can_only_open_fixed_message_entry (test_reply_safety.SafetyGateTest.test_ai_page_guard_can_only_open_fixed_message_entry) ... [AI页面守护] 测试: non_message_page / open_messages / 95%(当前是微盘)
ok
test_ai_page_guard_never_closes_security_verification (test_reply_safety.SafetyGateTest.test_ai_page_guard_never_closes_security_verification) ... [AI页面守护] 测试: security_verification / none / 93%(需要扫码)
[安全验证] AI 判断为登录或安全验证页,已禁止自动关闭和发送。
ok
test_all_blank_candidates_prefer_the_visible_earlier_process (test_reply_safety.SafetyGateTest.test_all_blank_candidates_prefer_the_visible_earlier_process)
两个窗口都没渲染时(主面板也在托盘里),可见且进程更早的才是主界面。 ... ok
test_an_approved_review_draft_actually_presses_enter (test_reply_safety.SafetyGateTest.test_an_approved_review_draft_actually_presses_enter)
放行之后,同一条草稿必须真的发出去。 ... [发送保护] 发送后暂未确认我方消息,已保留本会话并后台对账;不会重复发送,也不会阻塞其他会话。
ok
test_an_empty_baseline_never_unlocks_the_raw_anchor (test_reply_safety.SafetyGateTest.test_an_empty_baseline_never_unlocks_the_raw_anchor)
完全读不到聊天内容时不能放行,否则等于取消了重复发送保护。 ... ok
test_an_empty_chat_reports_no_ink_instead_of_guessing (test_reply_safety.SafetyGateTest.test_an_empty_chat_reports_no_ink_instead_of_guessing) ... ok
test_an_uncertain_editor_never_gets_overwritten (test_reply_safety.SafetyGateTest.test_an_uncertain_editor_never_gets_overwritten)
像素判定拿不准时保持原样保守:宁可不发,也不能覆盖人工输入。 ... ok
test_an_unchanged_screen_is_never_taken_as_a_send (test_reply_safety.SafetyGateTest.test_an_unchanged_screen_is_never_taken_as_a_send) ... ok
test_an_unchanged_screen_with_our_bubble_last_is_not_called_unsent (test_reply_safety.SafetyGateTest.test_an_unchanged_screen_with_our_bubble_last_is_not_called_unsent)
画面没变却说最后一条是我方发的,两件事对不上,宁可不下"没发出去"。 ... ok
test_an_undecidable_screen_is_rechecked_instead_of_rewritten (test_reply_safety.SafetyGateTest.test_an_undecidable_screen_is_rechecked_instead_of_rewritten)
判不出结果时不反复写盘,也不反复框选,就是安静地等下一轮。 ... [发送对账] 发送结果暂未确认,已保留当前任务并后台核对;不会重复发送,也不会阻塞其他会话。
ok
test_an_unfinished_scan_keeps_its_progress_without_blocking_unread (test_reply_safety.SafetyGateTest.test_an_unfinished_scan_keeps_its_progress_without_blocking_unread)
翻页扫描没走完要保留进度,但同样不能挡住未读扫描。 ... ok
test_an_unfinished_session_keeps_the_round_to_itself (test_reply_safety.SafetyGateTest.test_an_unfinished_session_keeps_the_round_to_itself)
当前会话没回完,本轮不能掉进未读扫描去点开别人。 ... ok
test_an_unreadable_screen_never_becomes_a_second_reply (test_reply_safety.SafetyGateTest.test_an_unreadable_screen_never_becomes_a_second_reply)
一个字都读不到时不许推出"没发出去"——那正是连回三条的老路。 ... ok
test_an_untouched_chat_proves_the_send_never_landed (test_reply_safety.SafetyGateTest.test_an_untouched_chat_proves_the_send_never_landed)
按回车前后整片聊天区一模一样 → 那一下什么都没发生,可以安全重来。 ... [时钟] 检测到系统时间被回拨(发现于发送对账)。已按“已过很久”重新裁定相关任务,避免超时判断永远不成立而卡死。
[发送对账] 等了 1789634976 秒,聊天区跟按回车前完全一样,判定没发出去,将重新回复。
ok
test_an_unwritable_media_dir_never_blocks_the_reply (test_reply_safety.SafetyGateTest.test_an_unwritable_media_dir_never_blocks_the_reply)
留存失败是小事,绝不能因此不回客户。 ... [档案] 会话画面留存失败(不影响回复): 满了
ok
test_auto_hiding_chat_scrollbar_never_counts_as_a_new_message (test_reply_safety.SafetyGateTest.test_auto_hiding_chat_scrollbar_never_counts_as_a_new_message)
消息区右缘的滚动条随鼠标进出淡入淡出,绝不能改写聊天画面指纹。 ... [页面校准] 导航栏 136px→320px,会话列表 460px→460px,输入面板顶边 1000px→1000px;会话列表、消息区与输入区域已同步重算。
ok
test_auto_mode_holds_a_reply_the_judge_scored_high_risk (test_reply_safety.SafetyGateTest.test_auto_mode_holds_a_reply_the_judge_scored_high_risk)
裁判把这条判成高风险时,就算一条关键词规则都没配,照样要停。 ... [人工审核] 模型裁判评估为高风险,回复已填入输入框,等待人工审核发送。
ok
test_auto_mode_holds_a_single_reply_that_trips_a_review_rule (test_reply_safety.SafetyGateTest.test_auto_mode_holds_a_single_reply_that_trips_a_review_rule)
自动发送模式下,命中规则的这一条要单独破例停下来——不用整体切到审核模式。 ... [人工审核] 命中审核规则:诊断,回复已填入输入框,等待人工审核发送。
ok
test_auto_mode_still_sends_a_reply_that_trips_nothing (test_reply_safety.SafetyGateTest.test_auto_mode_still_sends_a_reply_that_trips_nothing)
反过来也要证明:没命中任何规则的照常自动发送,功能没有变成"全审"。 ... [发送保护] 发送后暂未确认我方消息,已保留本会话并后台对账;不会重复发送,也不会阻塞其他会话。
ok
test_autosend_disabled_keeps_the_draft_untouched_forever (test_reply_safety.SafetyGateTest.test_autosend_disabled_keeps_the_draft_untouched_forever) ... ok
test_avatar_anchor_keeps_the_caller_estimate_without_a_lattice (test_reply_safety.SafetyGateTest.test_avatar_anchor_keeps_the_caller_estimate_without_a_lattice)
看不出行距时宁可沿用调用方的估算,不能凭单个色块乱吸附。 ... ok
test_avatar_anchor_never_snaps_onto_a_neighbouring_row (test_reply_safety.SafetyGateTest.test_avatar_anchor_never_snaps_onto_a_neighbouring_row)
吸附只能收敛同一行的估算误差,绝不能跨行认错联系人。 ... ok
test_avatar_hash_drift_no_longer_swallows_the_first_new_message (test_reply_safety.SafetyGateTest.test_avatar_hash_drift_no_longer_swallows_the_first_new_message)
头像哈希漂 2 位仍是同一个人,第一条消息就必须回复。 ...
[会话守护] 当前聊天页出现新内容,检查是否为客户未回复消息...
[会话守护] 复制文字未证明有新客户消息,将用视觉确认是否新增媒体。
[会话守护] 发现客户新消息,先合并连续消息再回复。
ok
test_badge_and_selected_row_use_the_same_avatar_center (test_reply_safety.SafetyGateTest.test_badge_and_selected_row_use_the_same_avatar_center) ... ok
test_badge_offset_error_keeps_the_unread_and_opened_keys_identical (test_reply_safety.SafetyGateTest.test_badge_offset_error_keeps_the_unread_and_opened_keys_identical)
未读徽章按固定偏移推算行中心,偏差不能改写会话键。 ... ok
test_blank_child_window_never_wins_over_the_rendered_main_window (test_reply_safety.SafetyGateTest.test_blank_child_window_never_wins_over_the_rendered_main_window) ... [*] 企业微信存在 2 个同类顶层窗口,已挑选真正渲染了主界面的那一个(其余为子进程空壳窗口)。
ok
test_block_anchor_tolerates_old_blocks_scrolling_off_screen (test_reply_safety.SafetyGateTest.test_block_anchor_tolerates_old_blocks_scrolling_off_screen) ... ok
test_block_anchors_keep_their_own_proven_path (test_reply_safety.SafetyGateTest.test_block_anchors_keep_their_own_proven_path)
有消息块时必须走原来的路径,裸文本只在没有块时兜底。 ... ok
test_calibration_gate_keeps_warning_instead_of_going_silent (test_reply_safety.SafetyGateTest.test_calibration_gate_keeps_warning_instead_of_going_silent)
闸门关闭 = 自动回复完全停摆,绝不能只吭一声就静默。 ... ok
test_center_modal_close_button_is_detected (test_reply_safety.SafetyGateTest.test_center_modal_close_button_is_detected) ... ok
test_chat_bubble_glyph_is_not_treated_as_modal_close (test_reply_safety.SafetyGateTest.test_chat_bubble_glyph_is_not_treated_as_modal_close) ... ok
test_chat_capture_still_covers_the_full_outgoing_bubble (test_reply_safety.SafetyGateTest.test_chat_capture_still_covers_the_full_outgoing_bubble)
自己的气泡右缘紧贴滚动条,截图裁剪区不能为了避开滚动条把它切掉。 ... [页面校准] 导航栏 136px→320px,会话列表 460px→460px,输入面板顶边 1000px→1000px;会话列表、消息区与输入区域已同步重算。
ok
test_chat_pane_right_detects_sidebar_divider (test_reply_safety.SafetyGateTest.test_chat_pane_right_detects_sidebar_divider)
右侧工具栏展开时,靠纵贯分隔线找到聊天面板右缘。 ... ok
test_clearing_the_hold_removes_both_marks (test_reply_safety.SafetyGateTest.test_clearing_the_hold_removes_both_marks) ... ok
test_click_can_reopen_flat_avatar_pending_for_visual_confirmation (test_reply_safety.SafetyGateTest.test_click_can_reopen_flat_avatar_pending_for_visual_confirmation) ... ok
test_click_fails_closed_when_selected_fingerprint_cannot_be_read (test_reply_safety.SafetyGateTest.test_click_fails_closed_when_selected_fingerprint_cannot_be_read) ... [页面校验] 会话列表发生变化,实际打开对象与目标不一致,已停止后续发送。
ok
test_click_ignores_one_transient_post_click_navigation_frame (test_reply_safety.SafetyGateTest.test_click_ignores_one_transient_post_click_navigation_frame) ... ok
test_click_relocates_unread_by_fingerprint_before_acting (test_reply_safety.SafetyGateTest.test_click_relocates_unread_by_fingerprint_before_acting) ... ok
test_click_two_nav_misses_accepts_raw_target_with_chat_evidence (test_reply_safety.SafetyGateTest.test_click_two_nav_misses_accepts_raw_target_with_chat_evidence) ... [页面校验] 导航选中取色不稳定,但目标会话、标题和聊天区均已确认。
ok
test_click_two_nav_misses_without_raw_selected_row_proves_page_exit (test_reply_safety.SafetyGateTest.test_click_two_nav_misses_without_raw_selected_row_proves_page_exit) ... [页面校验] 点击后导航与目标选中行均消失,已确认离开消息页。
ok
test_close_avatars_with_different_names_never_match (test_reply_safety.SafetyGateTest.test_close_avatars_with_different_names_never_match)
现场最接近的一对不同联系人(头像仅差 10 位)必须继续被分开。 ... ok
test_completed_ordinary_scan_switches_to_hidden_unread_group (test_reply_safety.SafetyGateTest.test_completed_ordinary_scan_switches_to_hidden_unread_group) ... [未读扫描] 当前可视区没有客户红点,开始从列表顶部逐页查找未置顶未读…
ok
test_composer_border_and_window_backdrop_never_fake_a_draft (test_reply_safety.SafetyGateTest.test_composer_border_and_window_backdrop_never_fake_a_draft) ... ok
test_composer_found_despite_wide_content_edge_in_chat (test_reply_safety.SafetyGateTest.test_composer_found_despite_wide_content_edge_in_chat)
聊天区中部的全宽横边不再让分隔线检测放弃(用户实机截图场景)。 ... ok
test_composer_scan_is_bounded_inside_chat_pane (test_reply_safety.SafetyGateTest.test_composer_scan_is_bounded_inside_chat_pane)
右侧工具栏内容不再干扰输入区分隔线检测。 ... ok
test_confirmed_unread_pending_older_than_24_hours_is_restored (test_reply_safety.SafetyGateTest.test_confirmed_unread_pending_older_than_24_hours_is_restored) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_cross_monitor_window_is_detected_even_when_its_center_monitor_is_valid (test_reply_safety.SafetyGateTest.test_cross_monitor_window_is_detected_even_when_its_center_monitor_is_valid)
The field failure spans a 200% laptop and a 100% external panel. ... ok
test_cross_monitor_window_is_resized_entirely_inside_primary_work_area (test_reply_safety.SafetyGateTest.test_cross_monitor_window_is_resized_entirely_inside_primary_work_area) ... ok
test_ctrl_enter_accepts_verified_square_avatar_raw_fingerprint_once (test_reply_safety.SafetyGateTest.test_ctrl_enter_accepts_verified_square_avatar_raw_fingerprint_once) ... [发送兼容] 检测到 Enter 仅保留草稿,改用 Ctrl+Enter 发送。
ok
test_ctrl_enter_is_used_only_after_retained_draft_is_proven (test_reply_safety.SafetyGateTest.test_ctrl_enter_is_used_only_after_retained_draft_is_proven) ... ok
test_ctrl_enter_persist_failure_does_not_lock_future_recovery (test_reply_safety.SafetyGateTest.test_ctrl_enter_persist_failure_does_not_lock_future_recovery) ... ok
test_ctrl_enter_stops_immediately_when_human_has_taken_over (test_reply_safety.SafetyGateTest.test_ctrl_enter_stops_immediately_when_human_has_taken_over) ... ok
test_customer_echoing_an_old_assistant_phrase_is_still_pending (test_reply_safety.SafetyGateTest.test_customer_echoing_an_old_assistant_phrase_is_still_pending) ... ok
test_date_bearing_agent_header_is_not_treated_as_customer_message (test_reply_safety.SafetyGateTest.test_date_bearing_agent_header_is_not_treated_as_customer_message) ... ok
test_deep_unread_resume_is_not_cancelled_by_scan_cooldown (test_reply_safety.SafetyGateTest.test_deep_unread_resume_is_not_cancelled_by_scan_cooldown)
A paused forward scan must continue while the global unread still exists. ... [未读扫描] 继续从上轮停留位置向下查找未置顶未读…
[未读扫描] 已扫到列表底部,本轮没有找到可回复的客户未读。
ok
test_deep_unread_scan_resumes_after_time_budget_instead_of_restarting (test_reply_safety.SafetyGateTest.test_deep_unread_scan_resumes_after_time_budget_instead_of_restarting) ... [未读扫描] 当前可视区没有客户红点,开始从列表顶部逐页查找未置顶未读…
[未读扫描] 列表较长,本轮已达到 45 秒安全扫描上限;下轮从当前位置继续。
[未读扫描] 继续从上轮停留位置向下查找未置顶未读…
[未读扫描] 已扫到列表底部,本轮没有找到可回复的客户未读。
ok
test_delayed_copy_marker_never_claims_human_draft_is_empty (test_reply_safety.SafetyGateTest.test_delayed_copy_marker_never_claims_human_draft_is_empty) ... ok
test_dense_chat_text_is_not_a_login_qr (test_reply_safety.SafetyGateTest.test_dense_chat_text_is_not_a_login_qr)
现场(2026-07-31 14:04):一条带表情的长广告消息让机器人整个停机。 ... ok
test_dify_ui_guard_uploads_image_before_chat_message (test_reply_safety.SafetyGateTest.test_dify_ui_guard_uploads_image_before_chat_message) ... ok
test_dimmed_background_is_recognised_as_modal_scrim (test_reply_safety.SafetyGateTest.test_dimmed_background_is_recognised_as_modal_scrim) ... ok
test_dynamic_navigation_width_supports_narrow_and_wide_sidebars (test_reply_safety.SafetyGateTest.test_dynamic_navigation_width_supports_narrow_and_wide_sidebars) ... ok
test_editing_the_draft_restarts_the_autosend_timer (test_reply_safety.SafetyGateTest.test_editing_the_draft_restarts_the_autosend_timer)
人把草稿改了就是另一段话,不能带着上一段的计时直接发出去。 ... ok
test_empty_editor_requires_visual_blank_evidence (test_reply_safety.SafetyGateTest.test_empty_editor_requires_visual_blank_evidence) ... ok
test_enter_without_visible_receipt_never_commits_or_clears (test_reply_safety.SafetyGateTest.test_enter_without_visible_receipt_never_commits_or_clears) ... [发送保护] 发送后暂未确认我方消息,已保留本会话并后台对账;不会重复发送,也不会阻塞其他会话。
ok
test_expanded_right_toolbar_is_excluded_from_empty_editor_vision (test_reply_safety.SafetyGateTest.test_expanded_right_toolbar_is_excluded_from_empty_editor_vision)
200% DPI field evidence must stop at the detected chat divider. ... ok
test_failed_composer_redetection_invalidates_every_chat_reader (test_reply_safety.SafetyGateTest.test_failed_composer_redetection_invalidates_every_chat_reader) ... [剪贴板] 聊天区域边界尚未可靠识别,已取消提取。
ok
test_failed_reopen_does_not_consume_the_polling_round (test_reply_safety.SafetyGateTest.test_failed_reopen_does_not_consume_the_polling_round) ... [待回复恢复] 找到已读未回复会话,正在按头像和名称复合指纹重新打开。
ok
test_filtered_unread_list_uses_avatar_row_and_name_without_red_dot (test_reply_safety.SafetyGateTest.test_filtered_unread_list_uses_avatar_row_and_name_without_red_dot) ... ok
test_filtered_unread_row_may_disappear_only_after_exact_title_proof (test_reply_safety.SafetyGateTest.test_filtered_unread_row_may_disappear_only_after_exact_title_proof) ... [页面校验] 未读行点击后已从筛选列表消失,聊天标题逐字身份校验通过。
ok
test_final_enter_gate_uses_detected_chat_pane_right (test_reply_safety.SafetyGateTest.test_final_enter_gate_uses_detected_chat_pane_right)
Regression: an expanded customer panel used to fake a resize forever. ... ok
test_flat_fingerprint_mismatch_is_not_reclassified_as_system_entry (test_reply_safety.SafetyGateTest.test_flat_fingerprint_mismatch_is_not_reclassified_as_system_entry)
A row-render mismatch must retry, never permanently blacklist a contact. ...
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
ok
test_flat_real_row0_same_open_title_enters_visual_reply_flow (test_reply_safety.SafetyGateTest.test_flat_real_row0_same_open_title_enters_visual_reply_flow)
A selected real chat can keep the same title when its unread row is clicked. ...
[新消息] 正在处理 row0(坐标: 200, 132)
[完成] 回复完成,红点已消失 → row0
ok
test_flat_system_entry_clears_the_preclick_pending_reservation (test_reply_safety.SafetyGateTest.test_flat_system_entry_clears_the_preclick_pending_reservation) ...
[新消息] 正在处理 row0(坐标: 200, 148)
[会话识别] 连续两帧确认候选离开消息页,已排除系统入口并继续扫描。
ok
test_flat_text_avatar_is_admitted_only_as_visual_proof_candidate (test_reply_safety.SafetyGateTest.test_flat_text_avatar_is_admitted_only_as_visual_proof_candidate) ... [会话识别] 检测到未读纯色文字头像候选,将先确认消息页与会话身份再回复。
ok
test_followup_detection_anchors_latest_same_text_reply (test_reply_safety.SafetyGateTest.test_followup_detection_anchors_latest_same_text_reply) ... ok
test_full_business_page_returns_to_messages_without_blind_escape (test_reply_safety.SafetyGateTest.test_full_business_page_returns_to_messages_without_blind_escape) ... ok
test_full_selected_fingerprint_overrides_title_render_hash_drift (test_reply_safety.SafetyGateTest.test_full_selected_fingerprint_overrides_title_render_hash_drift) ... [会话校验] 标题发生渲染变化,已通过头像和名称复合指纹确认仍是原会话。
ok
test_generate_reply_passes_archive_history_and_stages_whole_batch (test_reply_safety.SafetyGateTest.test_generate_reply_passes_archive_history_and_stages_whole_batch) ... [AI] 会话档案提供历史上下文 2 条
[AI] 本次提取的新内容:
客户甲 7/29 10:00:01
第一段
客户甲 7/29 10:00:08
第二段
客户甲 7/29 10:00:18
第三段
[AI] 使用文本模式分析聊天记录...
[AI] 回复内容: 统一回复
ok
test_global_unread_signature_follows_located_band (test_reply_safety.SafetyGateTest.test_global_unread_signature_follows_located_band) ... [导航定位] “消息”入口不在默认位置,已按文字识别定位到 y 264~304px。
[导航定位] “消息”入口不在默认位置,已按文字识别定位到 y 264~304px。
ok
test_group_member_echo_cannot_be_mistaken_for_our_reply (test_reply_safety.SafetyGateTest.test_group_member_echo_cannot_be_mistaken_for_our_reply) ... ok
test_hidden_unread_is_found_on_third_scanned_page (test_reply_safety.SafetyGateTest.test_hidden_unread_is_found_on_third_scanned_page) ... [未读扫描] 当前可视区没有客户红点,开始从列表顶部逐页查找未置顶未读…
[未读扫描] 在第 3 页找到客户未读。
ok
test_human_draft_is_preserved_and_enter_is_never_pressed (test_reply_safety.SafetyGateTest.test_human_draft_is_preserved_and_enter_is_never_pressed) ... [发送保护] 检测到人工草稿,已保留原内容并取消自动发送。
ok
test_incomplete_paste_is_never_sent (test_reply_safety.SafetyGateTest.test_incomplete_paste_is_never_sent) ... [发送保护] 已清除本次未完整写入的自动回复草稿。
[发送保护] 回复未能完整写入聊天输入框,已禁止按下发送键。
ok
test_independent_wecom_document_window_is_not_force_closed (test_reply_safety.SafetyGateTest.test_independent_wecom_document_window_is_not_force_closed) ... ok
test_input_focus_retries_a_second_visual_editor_point (test_reply_safety.SafetyGateTest.test_input_focus_retries_a_second_visual_editor_point) ... ok
test_internal_modal_is_closed_with_escape_before_clicking_x (test_reply_safety.SafetyGateTest.test_internal_modal_is_closed_with_escape_before_clicking_x) ... [页面清理] 测试检测到阻塞弹窗,已用 Esc 自动关闭。
ok
test_invalid_session_geometry_never_scrolls_mouse (test_reply_safety.SafetyGateTest.test_invalid_session_geometry_never_scrolls_mouse) ... [未读扫描] 会话列表几何无效,已禁止窗口外滚动。
[未读扫描] 会话列表几何无效,已禁止窗口外翻页。
ok
test_last_round_wording_is_still_recognised_as_ours (test_reply_safety.SafetyGateTest.test_last_round_wording_is_still_recognised_as_ours)
模型每轮换一种说法,只比对新回复就永远认不出框里那句是自己写的。 ... ok
test_layout_change_after_paste_keeps_draft_and_staged_reply (test_reply_safety.SafetyGateTest.test_layout_change_after_paste_keeps_draft_and_staged_reply) ... [发送保护] 按 Enter 前窗口布局发生变化,已保留自动草稿和已生成回复,稳定后自动续发。
ok
test_layout_guard_accepts_one_normalized_semantic_layout (test_reply_safety.SafetyGateTest.test_layout_guard_accepts_one_normalized_semantic_layout) ... ok
test_layout_guard_rejects_impossible_or_ambiguous_geometry (test_reply_safety.SafetyGateTest.test_layout_guard_rejects_impossible_or_ambiguous_geometry) ... ok
test_layout_rebase_distinguishes_resize_from_appended_message (test_reply_safety.SafetyGateTest.test_layout_rebase_distinguishes_resize_from_appended_message) ... [视觉重定位] 窗口布局已稳定,聊天文字未新增;沿用已生成回复继续发送。
ok
test_legacy_archive_is_moved_once_after_composite_identity_is_known (test_reply_safety.SafetyGateTest.test_legacy_archive_is_moved_once_after_composite_identity_is_known) ... [档案] 已将旧版会话档案一次性迁移到新版复合会话键。
ok
test_legacy_archive_is_not_migrated_when_customer_name_does_not_match (test_reply_safety.SafetyGateTest.test_legacy_archive_is_not_migrated_when_customer_name_does_not_match) ... [档案] 旧会话档案归属无法唯一证明,已保留但不会自动用于当前会话。
ok
test_legacy_archive_with_another_customer_in_history_is_never_migrated (test_reply_safety.SafetyGateTest.test_legacy_archive_with_another_customer_in_history_is_never_migrated) ... [档案] 旧会话档案归属无法唯一证明,已保留但不会自动用于当前会话。
ok
test_legacy_pending_identity_cannot_rebind_from_a_full_selected_row (test_reply_safety.SafetyGateTest.test_legacy_pending_identity_cannot_rebind_from_a_full_selected_row) ... ok
test_legacy_uncertain_task_yields_to_a_proven_new_customer_turn (test_reply_safety.SafetyGateTest.test_legacy_uncertain_task_yields_to_a_proven_new_customer_turn) ... [发送对账] 检测到客户后续新消息,已放弃结果不明的旧草稿并重新合并;旧回复不会重发。
ok
test_login_verification_child_window_is_never_closed (test_reply_safety.SafetyGateTest.test_login_verification_child_window_is_never_closed) ... ok
test_lone_hidden_window_is_kept_without_probing_pixels (test_reply_safety.SafetyGateTest.test_lone_hidden_window_is_kept_without_probing_pixels)
主面板收进托盘时只有一个候选,必须原样返回,不能因为“截图是黑的”被否掉。 ... ok
test_low_confidence_frame_never_revokes_a_confirmed_navigation_width (test_reply_safety.SafetyGateTest.test_low_confidence_frame_never_revokes_a_confirmed_navigation_width)
置信度不足时沿用已生效宽度,因此不能撤销既有的确认结论。 ... ok
test_marking_batch_ready_clears_persisted_merge_deadline (test_reply_safety.SafetyGateTest.test_marking_batch_ready_clears_persisted_merge_deadline) ... ok
test_message_batch_aborts_when_chat_identity_changes (test_reply_safety.SafetyGateTest.test_message_batch_aborts_when_chat_identity_changes) ... [消息合并] 开始收集本会话 0 秒内的连续消息…
[消息合并] 等待期间聊天对象发生变化,取消本次回复。
ok
test_message_batch_aborts_when_same_title_switches_to_another_session (test_reply_safety.SafetyGateTest.test_message_batch_aborts_when_same_title_switches_to_another_session)
A same-title manual switch must not contaminate the original pending batch. ... [消息合并] 当前选中会话指纹已变化,取消本次合并与回复。
ok
test_message_batch_accepts_title_render_drift_for_same_full_session (test_reply_safety.SafetyGateTest.test_message_batch_accepts_title_render_drift_for_same_full_session) ... [会话校验] 标题发生渲染变化,已通过头像和名称复合指纹确认仍是原会话。
[消息合并] 收集完成(期间检测到 0 次消息画面更新),将只发起 1 次模型请求。
ok
test_message_batch_collects_updates_then_allows_one_request (test_reply_safety.SafetyGateTest.test_message_batch_collects_updates_then_allows_one_request) ... [消息合并] 开始收集本会话 0 秒内的连续消息…
[消息合并] 收集完成(期间检测到 2 次消息画面更新),将只发起 1 次模型请求。
ok
test_message_batch_retry_keeps_original_persisted_deadline (test_reply_safety.SafetyGateTest.test_message_batch_retry_keeps_original_persisted_deadline)
A transient retry must wait only the original window's remainder. ... [消息合并] 开始收集本会话 7 秒内的连续消息…
[消息合并] 继续上次合并窗口,剩余约 0 秒…
ok
test_message_nav_band_falls_back_without_wide_text_column (test_reply_safety.SafetyGateTest.test_message_nav_band_falls_back_without_wide_text_column)
窄图标栏 / 找不到导航分界时回退旧的固定位置,不加载 OCR。 ... ok
test_message_nav_band_located_by_text_when_not_first (test_reply_safety.SafetyGateTest.test_message_nav_band_located_by_text_when_not_first)
“消息”上方有个人资料块时,靠 OCR 文字定位它的行。 ... [导航定位] “消息”入口不在默认位置,已按文字识别定位到 y 264~300px。
ok
test_message_nav_selected_uses_located_band (test_reply_safety.SafetyGateTest.test_message_nav_selected_uses_located_band)
选中态校验跟随动态定位的“消息”行,而不是固定 y 65~105。 ... [导航定位] “消息”入口不在默认位置,已按文字识别定位到 y 264~304px。
[导航定位] “消息”入口不在默认位置,已按文字识别定位到 y 264~304px。
ok
test_message_page_refreshes_geometry_after_wide_sidebar_opens (test_reply_safety.SafetyGateTest.test_message_page_refreshes_geometry_after_wide_sidebar_opens) ... [页面校准] 导航栏 136px→320px,会话列表 460px→460px,输入面板顶边 1000px→1000px;会话列表、消息区与输入区域已同步重算。
ok
test_message_workspace_accepts_sparse_200_percent_dpi_highlight (test_reply_safety.SafetyGateTest.test_message_workspace_accepts_sparse_200_percent_dpi_highlight)
Real 200% DPI rounded highlights expose only about 11% blue pixels. ... ok
test_message_workspace_uses_selected_navigation_state (test_reply_safety.SafetyGateTest.test_message_workspace_uses_selected_navigation_state) ... ok
test_minimum_send_interval_is_enforced (test_reply_safety.SafetyGateTest.test_minimum_send_interval_is_enforced) ... ok
test_missing_or_malformed_legacy_anchor_never_confirms_old_reply (test_reply_safety.SafetyGateTest.test_missing_or_malformed_legacy_anchor_never_confirms_old_reply) ... [发送对账] 发送结果暂未确认,已保留当前任务并后台核对;不会重复发送,也不会阻塞其他会话。
ok
test_mixed_legacy_and_composite_keys_never_match_by_avatar_only (test_reply_safety.SafetyGateTest.test_mixed_legacy_and_composite_keys_never_match_by_avatar_only) ... ok
test_navigation_geometry_is_committed_before_a_chat_composer_exists (test_reply_safety.SafetyGateTest.test_navigation_geometry_is_committed_before_a_chat_composer_exists)
消息首页没有选中会话时也必须先校准列表,才能找到并打开未读客户。 ... [几何刷新] 已先按视觉更新导航和会话列表;当前尚未打开可回复会话,输入区将在打开客户后继续识别。
ok
test_navigation_width_inference_accepts_custom_band (test_reply_safety.SafetyGateTest.test_navigation_width_inference_accepts_custom_band) ... ok
test_new_customer_content_drops_the_hold_and_re_evaluates (test_reply_safety.SafetyGateTest.test_new_customer_content_drops_the_hold_and_re_evaluates)
客户又说话了就重新判一次:草稿可能已经被人发出去或删掉了。 ... ok
test_new_same_text_outgoing_block_confirms_send (test_reply_safety.SafetyGateTest.test_new_same_text_outgoing_block_confirms_send) ... ok
test_no_global_unread_does_not_scroll_the_list (test_reply_safety.SafetyGateTest.test_no_global_unread_does_not_scroll_the_list) ... ok
test_non_message_page_is_never_treated_as_internal_modal (test_reply_safety.SafetyGateTest.test_non_message_page_is_never_treated_as_internal_modal) ... ok
test_normal_bright_page_is_not_a_modal_scrim (test_reply_safety.SafetyGateTest.test_normal_bright_page_is_not_a_modal_scrim) ... ok
test_normal_navigation_prevents_false_positive (test_reply_safety.SafetyGateTest.test_normal_navigation_prevents_false_positive)
主界面还在时不停机。这道判断已从像素判据搬到 _security_gate_visible: ... ok
test_offscreen_dispatched_head_never_blocks_normal_pending (test_reply_safety.SafetyGateTest.test_offscreen_dispatched_head_never_blocks_normal_pending) ... ok
test_offscreen_uncertain_head_never_starts_deep_scan (test_reply_safety.SafetyGateTest.test_offscreen_uncertain_head_never_starts_deep_scan) ... ok
test_old_same_text_bubble_cannot_confirm_unchanged_transaction (test_reply_safety.SafetyGateTest.test_old_same_text_bubble_cannot_confirm_unchanged_transaction) ... ok
test_old_same_text_plus_new_customer_message_cannot_confirm_send (test_reply_safety.SafetyGateTest.test_old_same_text_plus_new_customer_message_cannot_confirm_send) ... ok
test_one_bad_frame_never_silences_a_real_contact (test_reply_safety.SafetyGateTest.test_one_bad_frame_never_silences_a_real_contact)
单帧没渲染完不能把真客户静默移出队列。 ... ok
test_open_customer_recaptures_geometry_before_composer_filter (test_reply_safety.SafetyGateTest.test_open_customer_recaptures_geometry_before_composer_filter) ... ok
test_open_messages_clicks_located_band_center (test_reply_safety.SafetyGateTest.test_open_messages_clicks_located_band_center) ... [导航定位] “消息”入口不在默认位置,已按文字识别定位到 y 400~480px。
[页面清理] 测试:已返回“消息”页面并通过选中态校验。
ok
test_open_messages_uses_safe_message_row_in_wide_navigation (test_reply_safety.SafetyGateTest.test_open_messages_uses_safe_message_row_in_wide_navigation) ... [页面清理] 测试:已返回“消息”页面并通过选中态校验。
ok
test_open_unread_group_requires_two_post_click_frames (test_reply_safety.SafetyGateTest.test_open_unread_group_requires_two_post_click_frames) ... ok
test_our_own_abandoned_draft_is_cleared_and_resent (test_reply_safety.SafetyGateTest.test_our_own_abandoned_draft_is_cleared_and_resent) ... ok
test_our_own_last_bubble_settles_the_task_as_sent (test_reply_safety.SafetyGateTest.test_our_own_last_bubble_settles_the_task_as_sent) ... ok
test_page_restore_keeps_pending_and_next_poll_reopens_it (test_reply_safety.SafetyGateTest.test_page_restore_keeps_pending_and_next_poll_reopens_it) ... [页面托管] 当前选中的不是“消息”,正在自动恢复工作页。
ok
test_pending_persist_failure_prevents_unread_click (test_reply_safety.SafetyGateTest.test_pending_persist_failure_prevents_unread_click)
Never consume the unread badge when its recovery task is not durable. ... [待回复恢复] 未读任务无法落盘,已禁止点击以避免丢失消息。
ok
test_pending_row_scan_covers_unknown_scrolled_phase (test_reply_safety.SafetyGateTest.test_pending_row_scan_covers_unknown_scrolled_phase) ... ok
test_pending_search_deduplicates_same_row_on_overlapping_pages (test_reply_safety.SafetyGateTest.test_pending_search_deduplicates_same_row_on_overlapping_pages) ... ok
test_pending_search_rejects_same_identity_on_different_pages (test_reply_safety.SafetyGateTest.test_pending_search_rejects_same_identity_on_different_pages) ... [待回复恢复] 跨分页发现多个相同视觉身份,已拒绝自动选择。
ok
test_pending_search_resumes_after_budget_without_restarting_from_top (test_reply_safety.SafetyGateTest.test_pending_search_resumes_after_budget_without_restarting_from_top)
Long lists must make forward progress across polling turns. ... [待回复恢复] 列表较长,本轮达到扫描上限;下轮从当前位置继续。
ok
test_pending_search_scans_all_pages_then_replays_unique_page (test_reply_safety.SafetyGateTest.test_pending_search_scans_all_pages_then_replays_unique_page) ... ok
test_pending_square_avatar_can_be_found_after_unread_badge_disappears (test_reply_safety.SafetyGateTest.test_pending_square_avatar_can_be_found_after_unread_badge_disappears) ... ok
test_pending_task_freezes_original_chat_title_signature (test_reply_safety.SafetyGateTest.test_pending_task_freezes_original_chat_title_signature) ... ok
test_persisted_name_hash_keeps_established_40_byte_key_layout (test_reply_safety.SafetyGateTest.test_persisted_name_hash_keeps_established_40_byte_key_layout)
Do not silently reinterpret existing conversations.json keys. ... ok
test_plain_surface_is_not_treated_as_modal (test_reply_safety.SafetyGateTest.test_plain_surface_is_not_treated_as_modal) ... ok
test_post_paste_divider_check_ignores_sidebar_and_editor_text (test_reply_safety.SafetyGateTest.test_post_paste_divider_check_ignores_sidebar_and_editor_text)
The final Enter gate must use the chat pane, not the whole window. ... ok
test_previous_16_byte_archive_is_preferred_over_avatar_only_archive (test_reply_safety.SafetyGateTest.test_previous_16_byte_archive_is_preferred_over_avatar_only_archive) ... [档案] 已将旧版会话档案一次性迁移到新版复合会话键。
ok
test_previous_16_byte_pending_is_atomically_rekeyed_after_title_proof (test_reply_safety.SafetyGateTest.test_previous_16_byte_pending_is_atomically_rekeyed_after_title_proof) ... [待回复恢复] 已将上一版待回复任务迁移到新版会话指纹。
ok
test_proven_real_staff_name_confirms_reply_before_fast_followup (test_reply_safety.SafetyGateTest.test_proven_real_staff_name_confirms_reply_before_fast_followup) ... ok
test_proven_render_alias_no_longer_swallows_the_first_new_message (test_reply_safety.SafetyGateTest.test_proven_render_alias_no_longer_swallows_the_first_new_message)
未读粗体与选中常规体已被证明是同一人,同样不能吞掉第一条消息。 ...
[会话守护] 当前聊天页出现新内容,检查是否为客户未回复消息...
[会话守护] 复制文字未证明有新客户消息,将用视觉确认是否新增媒体。
[会话守护] 发现客户新消息,先合并连续消息再回复。
ok
test_qr_page_without_main_navigation_is_blocked (test_reply_safety.SafetyGateTest.test_qr_page_without_main_navigation_is_blocked) ... ok
test_read_pending_conversation_is_reopened_by_fingerprint (test_reply_safety.SafetyGateTest.test_read_pending_conversation_is_reopened_by_fingerprint) ... [待回复恢复] 找到已读未回复会话,正在按头像和名称复合指纹重新打开。
[会话校验] 标题发生渲染变化,已通过头像和名称复合指纹确认仍是原会话。
ok
test_real_wechat_external_avatar_survives_transient_nav_false (test_reply_safety.SafetyGateTest.test_real_wechat_external_avatar_survives_transient_nav_false)
The green @微信 default avatar is a contact, not a system entry. ...
[新消息] 正在处理 row0(坐标: 200, 148)
[完成] 回复完成,红点已消失 → row0
ok
test_receipt_and_fast_followup_are_committed_from_one_snapshot (test_reply_safety.SafetyGateTest.test_receipt_and_fast_followup_are_committed_from_one_snapshot) ... [待回复恢复] 已确认回复实际发出,完成档案提交且不会重复发送。
ok
test_refresh_geometry_pane_unchanged_is_not_a_layout_change (test_reply_safety.SafetyGateTest.test_refresh_geometry_pane_unchanged_is_not_a_layout_change) ... ok
test_refresh_geometry_shrinks_chat_region_when_sidebar_opens (test_reply_safety.SafetyGateTest.test_refresh_geometry_shrinks_chat_region_when_sidebar_opens) ... [几何刷新] 检测到右侧工具栏展开,聊天面板右边界收窄到 x=1550px。
[页面校准] 导航栏 320px→320px,会话列表 460px→460px,输入面板顶边 916px→916px;会话列表、消息区与输入区域已同步重算。
ok
test_rejected_flat_row_render_drift_does_not_starve_next_unread (test_reply_safety.SafetyGateTest.test_rejected_flat_row_render_drift_does_not_starve_next_unread)
A proven tool row stays excluded after font/selection render drift. ... ok
test_render_probe_separates_dark_theme_from_an_empty_shell (test_reply_safety.SafetyGateTest.test_render_probe_separates_dark_theme_from_an_empty_shell) ... ok
test_render_probe_survives_a_window_that_dies_mid_capture (test_reply_safety.SafetyGateTest.test_render_probe_survives_a_window_that_dies_mid_capture) ... ok
test_repeated_resume_failures_back_off_instead_of_retrying_every_round (test_reply_safety.SafetyGateTest.test_repeated_resume_failures_back_off_instead_of_retrying_every_round) ... ok
test_repeated_unknown_layout_escalates_to_maximize_then_multimodal_guard (test_reply_safety.SafetyGateTest.test_repeated_unknown_layout_escalates_to_maximize_then_multimodal_guard) ... [AI] 窗口布局已变化但内容尚未确认,保留原回复且不重复调用模型。
ok
test_reply_without_generation_surface_still_records_pre_enter_baseline (test_reply_safety.SafetyGateTest.test_reply_without_generation_surface_still_records_pre_enter_baseline)
AI-disabled/fixed-reply mode must not become permanently uncertain. ... ok
test_reset_pending_batch_drops_the_cached_question_text (test_reply_safety.SafetyGateTest.test_reset_pending_batch_drops_the_cached_question_text)
放弃旧草稿必须连缓存的旧问题一起丢,下一轮才不会拿它再答一遍。 ... ok
test_reset_pending_clears_uncertain_tracking_maps (test_reply_safety.SafetyGateTest.test_reset_pending_clears_uncertain_tracking_maps) ... ok
test_restart_binds_bold_unread_pending_to_selected_regular_render (test_reply_safety.SafetyGateTest.test_restart_binds_bold_unread_pending_to_selected_regular_render)
Persisted render metadata recovers one task without changing its key. ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
[待回复恢复] 已按持久化渲染身份找回红点消失前的会话任务。
[会话守护] 当前会话仍有已读未回复任务,正在安全重试...
[会话守护] 复制文字未证明有新客户消息,将用视觉确认是否新增媒体。
[会话守护] 发现客户新消息,先合并连续消息再回复。
ok
test_restart_only_retries_when_pre_send_surface_proves_enter_did_not_happen (test_reply_safety.SafetyGateTest.test_restart_only_retries_when_pre_send_surface_proves_enter_did_not_happen) ... [发送对账] 发送结果暂未确认,已保留当前任务并后台核对;不会重复发送,也不会阻塞其他会话。
ok
test_restart_reconciles_visible_sent_reply_without_resending (test_reply_safety.SafetyGateTest.test_restart_reconciles_visible_sent_reply_without_resending) ... [待回复恢复] 已确认回复实际发出,完成档案提交且不会重复发送。
ok
test_review_mode_keeps_verified_draft_and_never_presses_enter (test_reply_safety.SafetyGateTest.test_review_mode_keeps_verified_draft_and_never_presses_enter) ... [人工审核] 回复已填入输入框,等待人工审核发送。
ok
test_right_side_unselectable_media_does_not_relabel_last_copied_customer (test_reply_safety.SafetyGateTest.test_right_side_unselectable_media_does_not_relabel_last_copied_customer) ... ok
test_row_estimate_error_no_longer_forks_the_archive_key (test_reply_safety.SafetyGateTest.test_row_estimate_error_no_longer_forks_the_archive_key)
行锚点估算偏差绝不能让同一个联系人算出第二个档案键。 ... ok
test_same_avatar_long_common_name_prefix_keeps_distinct_suffixes (test_reply_safety.SafetyGateTest.test_same_avatar_long_common_name_prefix_keeps_distinct_suffixes) ... ok
test_same_avatar_names_differing_at_last_visible_character_stay_distinct (test_reply_safety.SafetyGateTest.test_same_avatar_names_differing_at_last_visible_character_stay_distinct)
The final name glyph before the time column is part of session identity. ... ok
test_same_avatar_short_names_with_different_first_character_stay_distinct (test_reply_safety.SafetyGateTest.test_same_avatar_short_names_with_different_first_character_stay_distinct) ... ok
test_same_avatar_with_different_row_names_gets_distinct_session_keys (test_reply_safety.SafetyGateTest.test_same_avatar_with_different_row_names_gets_distinct_session_keys) ... ok
test_same_avatar_with_different_title_never_resumes_cached_reply (test_reply_safety.SafetyGateTest.test_same_avatar_with_different_title_never_resumes_cached_reply) ... [待回复恢复] 找到已读未回复会话,正在按头像和名称复合指纹重新打开。
[待回复恢复] 头像相同但聊天标题不一致,已禁止回复。
ok
test_same_chat_receipt_accepts_title_render_drift_with_full_selected_fp (test_reply_safety.SafetyGateTest.test_same_chat_receipt_accepts_title_render_drift_with_full_selected_fp) ... ok
test_same_chat_receipt_uses_strong_chat_fallback_when_nav_colour_misses (test_reply_safety.SafetyGateTest.test_same_chat_receipt_uses_strong_chat_fallback_when_nav_colour_misses) ... ok
test_same_contact_survives_the_measured_avatar_hash_drift (test_reply_safety.SafetyGateTest.test_same_contact_survives_the_measured_avatar_hash_drift) ... ok
test_same_name_is_stable_between_normal_and_selected_row_colors (test_reply_safety.SafetyGateTest.test_same_name_is_stable_between_normal_and_selected_row_colors) ... ok
test_same_title_never_overrides_a_different_full_selected_fingerprint (test_reply_safety.SafetyGateTest.test_same_title_never_overrides_a_different_full_selected_fingerprint) ... ok
test_selected_blue_row_uses_background_inside_rounded_highlight (test_reply_safety.SafetyGateTest.test_selected_blue_row_uses_background_inside_rounded_highlight)
200% DPI selected rows must not compare avatar corners to outer white. ... ok
test_selected_mail_is_not_mistaken_for_messages (test_reply_safety.SafetyGateTest.test_selected_mail_is_not_mistaken_for_messages) ... ok
test_selected_mismatch_keeps_preclick_pending_on_disk (test_reply_safety.SafetyGateTest.test_selected_mismatch_keeps_preclick_pending_on_disk)
A post-click render mismatch must not lose the now-read message. ...
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
[新消息] 正在处理 row0(坐标: 200, 132)
[页面校验] 目标会话本轮打不开,先服务其他未读会话,稍后再回来。
ok
test_selected_pending_title_render_drift_still_reaches_reply_flow (test_reply_safety.SafetyGateTest.test_selected_pending_title_render_drift_still_reaches_reply_flow) ... [会话校验] 标题发生渲染变化,已通过头像和名称复合指纹确认仍是原会话。
[会话守护] 当前会话仍有已读未回复任务,正在安全重试...
[会话守护] 复制文字未证明有新客户消息,将用视觉确认是否新增媒体。
ok
test_selected_square_avatar_only_bypasses_tool_filter_for_exact_pending (test_reply_safety.SafetyGateTest.test_selected_square_avatar_only_bypasses_tool_filter_for_exact_pending) ... ok
test_semantic_layout_hint_still_requires_local_pixel_boundaries (test_reply_safety.SafetyGateTest.test_semantic_layout_hint_still_requires_local_pixel_boundaries) ... [页面校准] 导航栏 136px→320px,会话列表 460px→500px,输入面板顶边 1000px→1000px;会话列表、消息区与输入区域已同步重算。
ok
test_send_is_cancelled_before_click_when_chat_identity_changed (test_reply_safety.SafetyGateTest.test_send_is_cancelled_before_click_when_chat_identity_changed) ... [发送保护] 当前聊天对象已经变化,已取消粘贴和发送。
ok
test_send_is_cancelled_when_input_geometry_is_invalid (test_reply_safety.SafetyGateTest.test_send_is_cancelled_when_input_geometry_is_invalid) ... [发送保护] 聊天输入区域空间不足,已禁止窗口外粘贴和发送。
ok
test_send_is_cancelled_when_message_arrives_after_paste_before_enter (test_reply_safety.SafetyGateTest.test_send_is_cancelled_when_message_arrives_after_paste_before_enter) ... [发送保护] 按 Enter 前又收到新消息,已清除旧草稿并重新合并。
ok
test_send_is_cancelled_when_new_message_arrives_after_generation (test_reply_safety.SafetyGateTest.test_send_is_cancelled_when_new_message_arrives_after_generation) ... [发送保护] 生成回复后又收到新消息,已取消旧回复并重新合并。
ok
test_send_is_cancelled_when_pending_title_does_not_match (test_reply_safety.SafetyGateTest.test_send_is_cancelled_when_pending_title_does_not_match) ... [发送保护] 当前聊天对象已经变化,已取消粘贴和发送。
ok
test_send_is_cancelled_when_selected_session_fingerprint_is_missing (test_reply_safety.SafetyGateTest.test_send_is_cancelled_when_selected_session_fingerprint_is_missing) ... [发送保护] 当前聊天对象已经变化,已取消粘贴和发送。
ok
test_send_receipt_allows_bounded_delayed_render (test_reply_safety.SafetyGateTest.test_send_receipt_allows_bounded_delayed_render) ... ok
test_send_receipt_deadline_stops_more_expensive_checks (test_reply_safety.SafetyGateTest.test_send_receipt_deadline_stops_more_expensive_checks) ... ok
test_send_stops_immediately_after_internal_modal_handling (test_reply_safety.SafetyGateTest.test_send_stops_immediately_after_internal_modal_handling) ... [发送保护] 发送前处理了页面弹窗,本轮保留任务并重新校验。
ok
test_send_stops_immediately_after_owned_blocker_handling (test_reply_safety.SafetyGateTest.test_send_stops_immediately_after_owned_blocker_handling) ... [发送保护] 发送前处理了阻塞子窗口,本轮保留任务并重新校验。
ok
test_session_list_width_follows_the_persistent_visual_divider (test_reply_safety.SafetyGateTest.test_session_list_width_follows_the_persistent_visual_divider) ... ok
test_session_vision_model_link_error_is_not_cached (test_reply_safety.SafetyGateTest.test_session_vision_model_link_error_is_not_cached) ... [AI会话分类] 未知未读行判断失败,保留后续页面复核:temporary link error
[AI会话分类] 客户甲 → unknown / 0%(temporary link error)
ok
test_session_without_an_archive_baselines_when_the_agent_spoke_last (test_reply_safety.SafetyGateTest.test_session_without_an_archive_baselines_when_the_agent_spoke_last)
屏幕上最后一条是我方发的,说明没人在等回复,仍然只建基线。 ... [会话守护] 已建立当前聊天页基线;画面未变化时不会操作鼠标。
ok
test_session_without_an_archive_recovers_its_first_unanswered_message (test_reply_safety.SafetyGateTest.test_session_without_an_archive_recovers_its_first_unanswered_message)
还没建档的会话,第一条没人回过的客户消息不能被基线吞掉。 ...
[待回复恢复] 发现已读但没有回复的客户消息,正在恢复本次回复...
[会话守护] 当前会话仍有已读未回复任务,正在安全重试...
[会话守护] 复制文字未证明有新客户消息,将用视觉确认是否新增媒体。
[会话守护] 发现客户新消息,先合并连续消息再回复。
ok
test_square_unread_avatar_is_kept_for_safe_visual_proof (test_reply_safety.SafetyGateTest.test_square_unread_avatar_is_kept_for_safe_visual_proof)
A verified unread + full composite identity must not be discarded by shape. ... [会话识别] 检测到未读图标型头像候选,将先确认消息页与会话身份再回复。
ok
test_startup_archive_delta_creates_pending_and_enters_retry (test_reply_safety.SafetyGateTest.test_startup_archive_delta_creates_pending_and_enters_retry)
A selected read message newer than its archive snapshot is recoverable. ...
[待回复恢复] 发现已读但没有回复的客户消息,正在恢复本次回复...
[会话守护] 当前会话仍有已读未回复任务,正在安全重试...
[会话守护] 复制文字未证明有新客户消息,将用视觉确认是否新增媒体。
[会话守护] 发现客户新消息,先合并连续消息再回复。
ok
test_stubborn_internal_modal_freezes_poll_without_repeated_escape (test_reply_safety.SafetyGateTest.test_stubborn_internal_modal_freezes_poll_without_repeated_escape) ... [页面清理] 测试弹窗仍在,将限频重试且本轮不执行会话操作。
ok
test_stubborn_owned_dialog_is_blocked_but_not_reclosed_every_poll (test_reply_safety.SafetyGateTest.test_stubborn_owned_dialog_is_blocked_but_not_reclosed_every_poll) ... [页面清理] 阻塞子窗口暂未关闭,将限频重试: 发送文档
ok
test_stuck_pending_task_no_longer_starves_the_unread_scan (test_reply_safety.SafetyGateTest.test_stuck_pending_task_no_longer_starves_the_unread_scan)
端到端:卡住的任务存在时,本轮仍然必须去扫描新的未读会话。 ... ok
test_successful_send_keeps_current_chat_open (test_reply_safety.SafetyGateTest.test_successful_send_keeps_current_chat_open) ... ok
test_switching_sessions_starts_a_fresh_hold (test_reply_safety.SafetyGateTest.test_switching_sessions_starts_a_fresh_hold)
换到下一个会话时重新计时,不继承上一个会话烧掉的额度。 ... [排队] 当前会话已占用 61 秒仍未回完,先放行其他会话,稍后再回来处理它。
ok
test_text_selection_region_is_clamped_inside_narrow_window (test_reply_safety.SafetyGateTest.test_text_selection_region_is_clamped_inside_narrow_window) ... [页面校准] 导航栏 136px→320px,会话列表 460px→460px,输入面板顶边 280px→280px;会话列表、消息区与输入区域已同步重算。
ok
test_the_autosend_timer_starts_when_the_draft_first_appears (test_reply_safety.SafetyGateTest.test_the_autosend_timer_starts_when_the_draft_first_appears)
超时直发按"第一次看见这段字"计时,不能被每轮复查刷新。 ... ok
test_the_drifted_avatar_canonicalizes_onto_the_existing_key (test_reply_safety.SafetyGateTest.test_the_drifted_avatar_canonicalizes_onto_the_existing_key)
归一化也必须认下这次漂移,否则同一个人当场被铸成第二把档案键。 ... ok
test_the_filter_rechecks_itself_after_the_cooldown (test_reply_safety.SafetyGateTest.test_the_filter_rechecks_itself_after_the_cooldown)
企微改版或误判时必须能自己走回来。 ... ok
test_the_gate_sends_the_existing_draft_once_the_timer_expires (test_reply_safety.SafetyGateTest.test_the_gate_sends_the_existing_draft_once_the_timer_expires)
端到端:时间到了,发出去的必须是**框里那句**,不是模型这轮生成的回复。 ... [发送保护] 输入框里这段字已放置 10.0 分钟,超过设置的 5 分钟,按设置直接发送框里的内容。
[发送兼容] 检测到 Enter 仅保留草稿,改用 Ctrl+Enter 发送。
[发送保护] 发送后暂未确认我方消息,已保留本会话并后台对账;不会重复发送,也不会阻塞其他会话。
ok
test_the_hold_lets_the_session_back_in_after_the_window (test_reply_safety.SafetyGateTest.test_the_hold_lets_the_session_back_in_after_the_window)
不能永久拉黑:人把草稿删了之后,这个会话必须自己走得回来。 ... ok
test_the_lone_bubble_at_the_top_is_found (test_reply_safety.SafetyGateTest.test_the_lone_bubble_at_the_top_is_found) ... ok
test_the_message_workspace_overrides_any_qr_on_screen (test_reply_safety.SafetyGateTest.test_the_message_workspace_overrides_any_qr_on_screen)
消息工作区还在,就绝不可能是登录页。 ... ok
test_the_open_session_is_served_before_anyone_else (test_reply_safety.SafetyGateTest.test_the_open_session_is_served_before_anyone_else)
正在回复的会话不能被别的会话抢走,否则这条回复要等下一轮重来。 ... ok
test_the_raw_anchor_survives_a_restart (test_reply_safety.SafetyGateTest.test_the_raw_anchor_survives_a_restart)
重启后还要能核对回执,否则任务只能挂成待核对、客户白等。 ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_the_rest_of_the_queue_is_first_come_first_served (test_reply_safety.SafetyGateTest.test_the_rest_of_the_queue_is_first_come_first_served)
多个会话同时来消息就排队,按到达先后一条条处理。 ... ok
test_the_scrollbar_gutter_never_counts_as_a_message (test_reply_safety.SafetyGateTest.test_the_scrollbar_gutter_never_counts_as_a_message)
右缘滚动条会随鼠标淡入淡出,算进墨迹就会把范围撑满整个面板。 ... ok
test_the_send_gate_parks_the_session_when_it_meets_a_human_draft (test_reply_safety.SafetyGateTest.test_the_send_gate_parks_the_session_when_it_meets_a_human_draft)
端到端:真走一遍发送闸,确认既没发出去、也留下了跳过标记。 ... [发送保护] 检测到人工草稿,已保留原内容并取消自动发送。
ok
test_the_skip_window_never_overshoots_a_shorter_autosend_setting (test_reply_safety.SafetyGateTest.test_the_skip_window_never_overshoots_a_shorter_autosend_setting)
设 2 分钟直发、复查窗口 5 分钟时,不能真等到 5 分钟才发。 ... ok
test_the_staged_snapshot_reaches_the_archive (test_reply_safety.SafetyGateTest.test_the_staged_snapshot_reaches_the_archive) ... ok
test_the_staged_snapshot_survives_a_restart (test_reply_safety.SafetyGateTest.test_the_staged_snapshot_survives_a_restart)
发送和入档之间进程挂掉,重启后这张画面不能丢。 ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_the_upward_search_gives_up_instead_of_scrolling_forever (test_reply_safety.SafetyGateTest.test_the_upward_search_gives_up_instead_of_scrolling_forever)
对方粘了一整份文档时不能一直翻下去,把这个会话拖死。 ... [剪贴板] 最新一条消息超过一屏,正在向上翻找开头…
[剪贴板] 成功提取 96 行聊天记录(共采集 6 屏 / 去重后 96 行)
ok
test_tiny_chat_region_never_starts_mouse_drag (test_reply_safety.SafetyGateTest.test_tiny_chat_region_never_starts_mouse_drag) ... [剪贴板] 聊天框选区域空间不足,已禁止窗口外拖拽。
ok
test_tiny_window_is_maximized_before_any_input_click (test_reply_safety.SafetyGateTest.test_tiny_window_is_maximized_before_any_input_click) ... [窗口托管] 企业微信窗口过小,正在最大化并重新进行视觉标定。
ok
test_title_mismatch_without_selected_row_proof_remains_blocked (test_reply_safety.SafetyGateTest.test_title_mismatch_without_selected_row_proof_remains_blocked) ... ok
test_title_render_rebind_failure_rolls_back_and_blocks (test_reply_safety.SafetyGateTest.test_title_render_rebind_failure_rolls_back_and_blocks) ... ok
test_typing_status_below_title_does_not_change_chat_identity (test_reply_safety.SafetyGateTest.test_typing_status_below_title_does_not_change_chat_identity) ... ok
test_ui_guard_conflicting_protocol_objects_fail_closed (test_reply_safety.SafetyGateTest.test_ui_guard_conflicting_protocol_objects_fail_closed) ... ok
test_ui_guard_missing_protocol_field_fails_closed (test_reply_safety.SafetyGateTest.test_ui_guard_missing_protocol_field_fails_closed) ... ok
test_ui_guard_rejects_model_action_that_does_not_match_state (test_reply_safety.SafetyGateTest.test_ui_guard_rejects_model_action_that_does_not_match_state) ... ok
test_ui_guard_skips_unrelated_json_before_protocol_object (test_reply_safety.SafetyGateTest.test_ui_guard_skips_unrelated_json_before_protocol_object) ... ok
test_uncertain_active_task_does_not_block_next_pending_session (test_reply_safety.SafetyGateTest.test_uncertain_active_task_does_not_block_next_pending_session) ... ok
test_uncertain_receipt_is_rechecked_at_low_frequency (test_reply_safety.SafetyGateTest.test_uncertain_receipt_is_rechecked_at_low_frequency) ... [发送对账] 发送结果暂未确认,已保留当前任务并后台核对;不会重复发送,也不会阻塞其他会话。
ok
test_uncertain_state_is_strictly_read_only_even_after_surface_change (test_reply_safety.SafetyGateTest.test_uncertain_state_is_strictly_read_only_even_after_surface_change) ... [时钟] 检测到系统时间被回拨(发现于发送对账)。已按“已过很久”重新裁定相关任务,避免超时判断永远不成立而卡死。
[发送对账] 发送结果暂未确认,已保留当前任务并后台核对;不会重复发送,也不会阻塞其他会话。
ok
test_unchanged_selected_chat_does_not_activate_or_move_mouse (test_reply_safety.SafetyGateTest.test_unchanged_selected_chat_does_not_activate_or_move_mouse) ... ok
test_unchanged_surface_after_escape_is_treated_as_false_positive (test_reply_safety.SafetyGateTest.test_unchanged_surface_after_escape_is_treated_as_false_positive)
Esc 没有改变任何画面时,绝不能把聊天内容当弹窗冻结整轮轮询。 ... [页面清理] 测试Esc 前后该区域画面完全一致,判定为聊天内容误判,本轮继续正常回复。
ok
test_unchanged_surface_reuses_staged_reply_without_model_call (test_reply_safety.SafetyGateTest.test_unchanged_surface_reuses_staged_reply_without_model_call) ... [AI] 聊天内容未变化,直接复用上次未发送成功的回复。
ok
test_unconfirmed_navigation_width_mints_no_session_identity (test_reply_safety.SafetyGateTest.test_unconfirmed_navigation_width_mints_no_session_identity)
导航宽度未识别确认时绝不铸造会话键。 ... [会话身份] 导航栏宽度尚未识别确认,无法生成会话身份,自动回复已暂停 0 秒。请确认企业微信主界面已还原、且停在“消息”页。
ok
test_unknown_followup_direction_keeps_a_pending_probe (test_reply_safety.SafetyGateTest.test_unknown_followup_direction_keeps_a_pending_probe) ... [消息续接] 回执画面中存在方向不明确的后续消息,已保留为下一轮待核对任务。
[待回复恢复] 已确认回复实际发出,完成档案提交且不会重复发送。
ok
test_unknown_send_state_fails_closed_with_real_uncertain_timestamp (test_reply_safety.SafetyGateTest.test_unknown_send_state_fails_closed_with_real_uncertain_timestamp) ... [发送对账] 发送结果暂未确认,已保留当前任务并后台核对;不会重复发送,也不会阻塞其他会话。
ok
test_unlocatable_pending_task_leaves_the_round_free_for_new_unread (test_reply_safety.SafetyGateTest.test_unlocatable_pending_task_leaves_the_round_free_for_new_unread)
扫描完整个列表也认不回来时,绝不能吃掉本轮的未读处理。 ... ok
test_unread_badge_and_dynamic_time_do_not_change_session_identity (test_reply_safety.SafetyGateTest.test_unread_badge_and_dynamic_time_do_not_change_session_identity) ... ok
test_unread_badge_disappearing_does_not_change_flat_contact_key (test_reply_safety.SafetyGateTest.test_unread_badge_disappearing_does_not_change_flat_contact_key) ... ok
test_unread_bold_name_and_selected_regular_name_keep_same_identity (test_reply_safety.SafetyGateTest.test_unread_bold_name_and_selected_regular_name_keep_same_identity)
WeCom removes unread bold weight when the row becomes selected. ... ok
test_unread_group_band_requires_unique_exact_ocr_label (test_reply_safety.SafetyGateTest.test_unread_group_band_requires_unique_exact_ocr_label) ... [导航定位] “消息”入口不在默认位置,已按文字识别定位到 y 264~304px。
ok
test_verified_square_avatar_stays_selectable_after_visual_proof_clears (test_reply_safety.SafetyGateTest.test_verified_square_avatar_stays_selectable_after_visual_proof_clears) ... ok
test_visual_model_link_error_preserves_real_customer_task (test_reply_safety.SafetyGateTest.test_visual_model_link_error_preserves_real_customer_task) ... ok
test_a_disabled_rule_never_matches (test_reply_safety.SelectiveReviewRuleTest.test_a_disabled_rule_never_matches) ... ok
test_a_keyword_in_the_customer_text_triggers_review (test_reply_safety.SelectiveReviewRuleTest.test_a_keyword_in_the_customer_text_triggers_review) ... ok
test_a_keyword_in_the_drafted_reply_also_triggers_review (test_reply_safety.SelectiveReviewRuleTest.test_a_keyword_in_the_drafted_reply_also_triggers_review)
客户问的和模型答的,沾上任意一边都算命中——模型自己说漏嘴同样要拦。 ... ok
test_a_malformed_rules_list_fails_safe_by_finding_nothing (test_reply_safety.SelectiveReviewRuleTest.test_a_malformed_rules_list_fails_safe_by_finding_nothing)
本机读到的配置万一是坏的(同步中途、字段缺失),不能让轮询直接崩掉。 ... ok
test_an_empty_rule_list_and_no_judge_never_triggers (test_reply_safety.SelectiveReviewRuleTest.test_an_empty_rule_list_and_no_judge_never_triggers) ... ok
test_high_judge_risk_triggers_review_even_with_no_rules (test_reply_safety.SelectiveReviewRuleTest.test_high_judge_risk_triggers_review_even_with_no_rules)
非影子裁判判高风险时,一条关键词规则都没配也要拦。 ... ok
test_judge_risk_check_is_case_insensitive_and_takes_priority (test_reply_safety.SelectiveReviewRuleTest.test_judge_risk_check_is_case_insensitive_and_takes_priority) ... ok
test_matching_is_case_insensitive (test_reply_safety.SelectiveReviewRuleTest.test_matching_is_case_insensitive) ... ok
test_medium_and_low_judge_risk_do_not_force_review_on_their_own (test_reply_safety.SelectiveReviewRuleTest.test_medium_and_low_judge_risk_do_not_force_review_on_their_own) ... ok
test_ordinary_chat_does_not_trigger_review (test_reply_safety.SelectiveReviewRuleTest.test_ordinary_chat_does_not_trigger_review) ... ok
test_a_message_without_a_snapshot_resolves_to_nothing (test_reply_safety.SessionViewerSnapshotTest.test_a_message_without_a_snapshot_resolves_to_nothing) ... ok
test_a_missing_file_is_not_offered_to_the_viewer (test_reply_safety.SessionViewerSnapshotTest.test_a_missing_file_is_not_offered_to_the_viewer) ... ok
test_a_path_in_the_archive_never_escapes_the_media_dir (test_reply_safety.SessionViewerSnapshotTest.test_a_path_in_the_archive_never_escapes_the_media_dir)
档案是磁盘上的文件,可能被改。只认纯文件名,不认任何路径。 ... ok
test_a_stored_snapshot_resolves_under_the_media_dir (test_reply_safety.SessionViewerSnapshotTest.test_a_stored_snapshot_resolves_under_the_media_dir) ... ok
test_a_blanket_mode_leftover_still_gets_cleared (test_reply_safety.StaleReviewFlagCleanupTest.test_a_blanket_mode_leftover_still_gets_cleared)
全局审核模式留下的标记(没有 review_reason)该清还是要清——这是这个函数本来的职责。 ... ok
test_a_rule_triggered_hold_survives_the_cleanup (test_reply_safety.StaleReviewFlagCleanupTest.test_a_rule_triggered_hold_survives_the_cleanup) ... ok
test_mixed_sessions_are_handled_independently (test_reply_safety.StaleReviewFlagCleanupTest.test_mixed_sessions_are_handled_independently) ... ok
test_still_a_no_op_while_blanket_review_mode_is_on (test_reply_safety.StaleReviewFlagCleanupTest.test_still_a_no_op_while_blanket_review_mode_is_on)
全局开关还开着的时候,这个函数原本就该整个不动——这条防止我这次改动破坏了那条老行为。 ... ok
test_exchange_id_is_committed_only_once_after_restart (test_reply_safety.TransactionStoreTest.test_exchange_id_is_committed_only_once_after_restart) ... ok
test_registration_prepare_mode_does_not_write_before_send (test_reply_safety.TransactionStoreTest.test_registration_prepare_mode_does_not_write_before_send) ... ok
test_visually_proven_outgoing_speaker_survives_restart (test_reply_safety.TransactionStoreTest.test_visually_proven_outgoing_speaker_survives_restart) ... ok
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_a_clock_rollback_never_deletes_a_fresh_log (test_runtime_settings.LogRetentionTest.test_a_clock_rollback_never_deletes_a_fresh_log) ... ok
test_a_shorter_window_deletes_more (test_runtime_settings.LogRetentionTest.test_a_shorter_window_deletes_more) ... ok
test_logs_older_than_the_retention_window_are_deleted (test_runtime_settings.LogRetentionTest.test_logs_older_than_the_retention_window_are_deleted) ... ok
test_out_of_range_values_fall_back_to_the_documented_defaults (test_runtime_settings.LogRetentionTest.test_out_of_range_values_fall_back_to_the_documented_defaults) ... ok
test_the_file_count_cap_still_applies (test_runtime_settings.LogRetentionTest.test_the_file_count_cap_still_applies) ... ok
test_unreadable_directory_never_breaks_startup (test_runtime_settings.LogRetentionTest.test_unreadable_directory_never_breaks_startup) ... ok
test_atomic_operation_progress_includes_phase_step_detail_and_customer (test_runtime_settings.RuntimeSettingsTest.test_atomic_operation_progress_includes_phase_step_detail_and_customer) ... ok
test_bot_uses_instance_batch_window_when_call_has_no_override (test_runtime_settings.RuntimeSettingsTest.test_bot_uses_instance_batch_window_when_call_has_no_override) ... ok
test_classic_capsule_renders_each_progress_message_as_a_numbered_step (test_runtime_settings.RuntimeSettingsTest.test_classic_capsule_renders_each_progress_message_as_a_numbered_step) ... ok
test_classic_queue_consumes_the_runtime_progress_channel (test_runtime_settings.RuntimeSettingsTest.test_classic_queue_consumes_the_runtime_progress_channel) ... ok
test_classic_settings_save_persists_and_updates_live_thread (test_runtime_settings.RuntimeSettingsTest.test_classic_settings_save_persists_and_updates_live_thread) ... ok
test_customer_chat_body_is_not_mirrored_into_floating_capsule (test_runtime_settings.RuntimeSettingsTest.test_customer_chat_body_is_not_mirrored_into_floating_capsule) ... ok
test_invalid_saved_batch_window_falls_back_to_twenty_seconds (test_runtime_settings.RuntimeSettingsTest.test_invalid_saved_batch_window_falls_back_to_twenty_seconds) ... ok
test_invalid_saved_send_delay_falls_back_to_one_second (test_runtime_settings.RuntimeSettingsTest.test_invalid_saved_send_delay_falls_back_to_one_second) ... ok
test_invalid_send_mode_falls_back_to_automatic (test_runtime_settings.RuntimeSettingsTest.test_invalid_send_mode_falls_back_to_automatic) ... ok
test_legacy_settings_without_batch_window_keep_twenty_second_default (test_runtime_settings.RuntimeSettingsTest.test_legacy_settings_without_batch_window_keep_twenty_second_default) ... ok
test_manual_queue_delete_removes_only_selected_full_key_atomically (test_runtime_settings.RuntimeSettingsTest.test_manual_queue_delete_removes_only_selected_full_key_atomically) ... ok
test_manual_retry_only_requeues_retry_wait_tasks (test_runtime_settings.RuntimeSettingsTest.test_manual_retry_only_requeues_retry_wait_tasks) ... ok
test_message_copy_retries_when_wecom_writes_clipboard_late (test_runtime_settings.RuntimeSettingsTest.test_message_copy_retries_when_wecom_writes_clipboard_late) ... ok
test_retry_request_queues_until_bot_startup_finishes (test_runtime_settings.RuntimeSettingsTest.test_retry_request_queues_until_bot_startup_finishes) ... ok
test_review_pending_state_survives_restart (test_runtime_settings.RuntimeSettingsTest.test_review_pending_state_survives_restart) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。
ok
test_runtime_thread_syncs_updated_batch_window_before_next_poll (test_runtime_settings.RuntimeSettingsTest.test_runtime_thread_syncs_updated_batch_window_before_next_poll) ... [引擎B] 数据直读检测已启动
[+] 窗口激活模式已开启:企业微信未显示时会自动还原到前台
[i] 数据库新消息与未读标记共同触发回复任务,窗口异常时保留任务并重试
[+] 人机共存已开启:鼠标静止 5 秒后才自动操作
[+] 连续消息合并等待:7 秒
[+] 发送前等待:1.5 秒
[+] 发送模式:人工审核草稿(AI 只把回复填进输入框,不会自动按回车;需要自动发送请在设置里切到“自动发送”)
[引擎B] DB 直读失败: 数据库正在初始化或刷新,暂用备用读取,备用检测继续运行
ok
test_send_delay_wait_is_independent_and_interruptible (test_runtime_settings.RuntimeSettingsTest.test_send_delay_wait_is_independent_and_interruptible) ... ok
test_tagged_low_level_logs_are_mirrored_to_capsule_progress (test_runtime_settings.RuntimeSettingsTest.test_tagged_low_level_logs_are_mirrored_to_capsule_progress) ... ok
test_async_protocol_check_retains_explicit_approval_request (test_desktop_review_visibility.DesktopReviewTest.test_async_protocol_check_retains_explicit_approval_request) ... ok
test_explicit_approval_reaches_thread_with_exact_key_and_refreshes (test_desktop_review_visibility.DesktopReviewTest.test_explicit_approval_reaches_thread_with_exact_key_and_refreshes) ... ok
test_human_filter_includes_unknown_receipt_and_no_empty_send (test_desktop_review_visibility.DesktopReviewTest.test_human_filter_includes_unknown_receipt_and_no_empty_send) ... ok
test_legacy_receipt_states_are_visible_but_not_sendable (test_desktop_review_visibility.DesktopReviewTest.test_legacy_receipt_states_are_visible_but_not_sendable) ... ok
test_real_queue_snapshot_renders_review_and_handoff_in_embedded_browser (test_desktop_review_visibility.DesktopReviewTest.test_real_queue_snapshot_renders_review_and_handoff_in_embedded_browser) ... ok
test_review_counts_remain_visible_under_an_unrelated_filter (test_desktop_review_visibility.DesktopReviewTest.test_review_counts_remain_visible_under_an_unrelated_filter) ... ok
test_review_filter_surfaces_protocol_draft_and_reason (test_desktop_review_visibility.DesktopReviewTest.test_review_filter_surfaces_protocol_draft_and_reason) ... ok
test_stale_snapshot_requires_explicit_confirmation_before_backend_handoff (test_desktop_review_visibility.DesktopReviewTest.test_stale_snapshot_requires_explicit_confirmation_before_backend_handoff) ... ok
test_stopped_handoff_uses_offline_resolution_and_preserves_seen (test_desktop_review_visibility.DesktopReviewTest.test_stopped_handoff_uses_offline_resolution_and_preserves_seen) ... ok
test_unknown_receipt_handoff_requires_confirmation_and_never_calls_approve (test_desktop_review_visibility.DesktopReviewTest.test_unknown_receipt_handoff_requires_confirmation_and_never_calls_approve) ... ok
test_generation_failure_is_retryable_but_not_sendable (test_desktop_review_visibility.ReviewStateTest.test_generation_failure_is_retryable_but_not_sendable) ... ok
test_media_without_draft_cannot_be_approved (test_desktop_review_visibility.ReviewStateTest.test_media_without_draft_cannot_be_approved) ... ok
test_protocol_and_visual_reviews_have_the_same_action_contract (test_desktop_review_visibility.ReviewStateTest.test_protocol_and_visual_reviews_have_the_same_action_contract) ... ok
test_uncertain_delivery_cannot_be_approved_or_retried_even_with_stale_review_flag (test_desktop_review_visibility.ReviewStateTest.test_uncertain_delivery_cannot_be_approved_or_retried_even_with_stale_review_flag) ... ok
test_a_blank_name_leaves_the_current_one_alone (test_qt_console_bridge.ConsoleBridgeTest.test_a_blank_name_leaves_the_current_one_alone)
空名字是"没填",不是"改成空"——改成空会让提示词里出现一个没有名字的客服。 ... ok
test_a_failed_connection_says_why_in_the_log (test_qt_console_bridge.ConsoleBridgeTest.test_a_failed_connection_says_why_in_the_log)
失败必须留下原因。只说"连接失败"的话,人不知道是地址错了还是后台没起。 ... ok
test_an_over_long_agent_name_is_truncated (test_qt_console_bridge.ConsoleBridgeTest.test_an_over_long_agent_name_is_truncated)
昵称会拼进系统提示词,不能让它无限长。 ... ok
test_approve_task_reaches_the_host_with_the_exact_key (test_qt_console_bridge.ConsoleBridgeTest.test_approve_task_reaches_the_host_with_the_exact_key)
「通过并发送」必须真的连到后端。 ... ok
test_approving_a_task_that_left_the_queue_sends_nothing (test_qt_console_bridge.ConsoleBridgeTest.test_approving_a_task_that_left_the_queue_sends_nothing)
任务已经不在队列里就别再放行——否则可能把草稿发到别的会话去。 ... ok
test_archive_date_button_uses_real_business_filter (test_qt_console_bridge.ConsoleBridgeTest.test_archive_date_button_uses_real_business_filter) ... ok
test_archive_selection_only_commits_an_existing_visible_key (test_qt_console_bridge.ConsoleBridgeTest.test_archive_selection_only_commits_an_existing_visible_key) ... ok
test_auto_send_header_selects_auto_mode_before_starting (test_qt_console_bridge.ConsoleBridgeTest.test_auto_send_header_selects_auto_mode_before_starting) ... ok
test_canvas_uses_available_logical_space_without_design_minimum (test_qt_console_bridge.ConsoleBridgeTest.test_canvas_uses_available_logical_space_without_design_minimum) ... ok
test_connect_backend_forwards_the_url_to_the_host (test_qt_console_bridge.ConsoleBridgeTest.test_connect_backend_forwards_the_url_to_the_host)
控制台上填的后台地址要真的到得了后端。 ... ok
test_console_html_and_javascript_assets_are_packaged_together (test_qt_console_bridge.ConsoleBridgeTest.test_console_html_and_javascript_assets_are_packaged_together) ... ok
test_console_push_timer_coalesces_against_earliest_deadline (test_qt_console_bridge.ConsoleBridgeTest.test_console_push_timer_coalesces_against_earliest_deadline) ... ok
test_editable_fields_look_editable (test_qt_console_bridge.ConsoleBridgeTest.test_editable_fields_look_editable)
能改的地方要看得出来能改。 ... ok
test_every_html_navigation_schedules_authoritative_state (test_qt_console_bridge.ConsoleBridgeTest.test_every_html_navigation_schedules_authoritative_state) ... ok
test_every_save_button_gives_the_user_feedback (test_qt_console_bridge.ConsoleBridgeTest.test_every_save_button_gives_the_user_feedback)
点了保存必须看得见反馈。 ... ok
test_handoff_only_reports_tasks_the_backend_accepted (test_qt_console_bridge.ConsoleBridgeTest.test_handoff_only_reports_tasks_the_backend_accepted) ... ok
test_long_pages_scroll_without_shrinking_text (test_qt_console_bridge.ConsoleBridgeTest.test_long_pages_scroll_without_shrinking_text) ... ok
test_no_layout_container_keeps_a_hard_coded_height (test_qt_console_bridge.ConsoleBridgeTest.test_no_layout_container_keeps_a_hard_coded_height)
去掉滚动条之后,"装不下"不再表现为滚动条,而是内容画到别的面板身上。 ... ok
test_number_fields_tell_you_the_allowed_range (test_qt_console_bridge.ConsoleBridgeTest.test_number_fields_tell_you_the_allowed_range) ... ok
test_page_grids_use_proportional_columns (test_qt_console_bridge.ConsoleBridgeTest.test_page_grids_use_proportional_columns)
各栏必须按比例分配宽度。写死像素的话,舞台变宽它们也不会跟着变宽, ... ok
test_queue_actions_select_exact_key_before_forwarding (test_qt_console_bridge.ConsoleBridgeTest.test_queue_actions_select_exact_key_before_forwarding) ... ok
test_ready_state_delivery_updates_cache_only_after_emit (test_qt_console_bridge.ConsoleBridgeTest.test_ready_state_delivery_updates_cache_only_after_emit) ... ok
test_request_state_forces_webchannel_handshake_payload (test_qt_console_bridge.ConsoleBridgeTest.test_request_state_forces_webchannel_handshake_payload) ... ok
test_responsive_styles_are_bundled_after_reference_styles (test_qt_console_bridge.ConsoleBridgeTest.test_responsive_styles_are_bundled_after_reference_styles) ... ok
test_same_view_state_push_preserves_sidebar_and_main_dom_identity (test_qt_console_bridge.ConsoleBridgeTest.test_same_view_state_push_preserves_sidebar_and_main_dom_identity) ... ok
test_save_ai_only_applies_the_agent_name (test_qt_console_bridge.ConsoleBridgeTest.test_save_ai_only_applies_the_agent_name)
AI 设置页现在只有客服昵称是真正的本机设置。 ... ok
test_set_view_waits_for_loaded_document_and_replays_once (test_qt_console_bridge.ConsoleBridgeTest.test_set_view_waits_for_loaded_document_and_replays_once) ... ok
test_sidebar_orb_is_wired_to_the_listen_toggle (test_qt_console_bridge.ConsoleBridgeTest.test_sidebar_orb_is_wired_to_the_listen_toggle)
侧栏那颗球是用户最常点的开关,HTML 上必须真的绑着动作。 ... ok
test_stale_queue_key_never_mutates_previous_selection (test_qt_console_bridge.ConsoleBridgeTest.test_stale_queue_key_never_mutates_previous_selection) ... ok
test_state_is_not_cached_before_webchannel_handshake (test_qt_console_bridge.ConsoleBridgeTest.test_state_is_not_cached_before_webchannel_handshake) ... ok
test_the_console_script_handles_that_action (test_qt_console_bridge.ConsoleBridgeTest.test_the_console_script_handles_that_action) ... ok
test_the_feedback_helper_covers_pending_result_and_failure (test_qt_console_bridge.ConsoleBridgeTest.test_the_feedback_helper_covers_pending_result_and_failure)
反馈要三段齐全:立刻响应、真实结果、失败也要说清。 ... ok
test_the_save_slots_report_their_result_back (test_qt_console_bridge.ConsoleBridgeTest.test_the_save_slots_report_their_result_back)
Qt 侧的保存槽必须把结果回传,否则网页那边永远只能瞎猜。 ... ok
test_the_scale_never_depends_on_page_height_or_device_pixel_ratio (test_qt_console_bridge.ConsoleBridgeTest.test_the_scale_never_depends_on_page_height_or_device_pixel_ratio) ... ok
test_the_side_rail_height_does_not_follow_page_content (test_qt_console_bridge.ConsoleBridgeTest.test_the_side_rail_height_does_not_follow_page_content)
侧栏在每一页必须一样高。 ... ok
test_toggle_listen_starts_and_stops_the_host (test_qt_console_bridge.ConsoleBridgeTest.test_toggle_listen_starts_and_stops_the_host) ... ok
test_all_receipt_variants_require_explicit_confirmation_at_mutation_time (test_handoff_safety.OfflineHandoffSafetyTests.test_all_receipt_variants_require_explicit_confirmation_at_mutation_time) ... ok
test_sending_stage_cannot_be_removed_even_after_confirmation (test_handoff_safety.OfflineHandoffSafetyTests.test_sending_stage_cannot_be_removed_even_after_confirmation) ... ok
test_startup_confirmation_is_per_task_not_batch_wide (test_handoff_safety.OfflineHandoffSafetyTests.test_startup_confirmation_is_per_task_not_batch_wide) ... ok
test_stage_only_receipt_blocks_approval_retry_cancel_and_incoming_replacement (test_handoff_safety.ProtocolHandoffSafetyTests.test_stage_only_receipt_blocks_approval_retry_cancel_and_incoming_replacement) ... ok
test_stage_only_sending_is_protected_then_restores_as_unknown_receipt (test_handoff_safety.ProtocolHandoffSafetyTests.test_stage_only_sending_is_protected_then_restores_as_unknown_receipt) ... ok
test_stale_ui_snapshot_cannot_handoff_newly_uncertain_response (test_handoff_safety.ProtocolHandoffSafetyTests.test_stale_ui_snapshot_cannot_handoff_newly_uncertain_response) ... ok
test_legacy_visual_queue_upgrades_to_envelope_and_retains_full_evidence (test_handoff_evidence.OfflineEvidenceTests.test_legacy_visual_queue_upgrades_to_envelope_and_retains_full_evidence) ... ok
test_write_failure_preserves_original_queue_and_evidence (test_handoff_evidence.OfflineEvidenceTests.test_write_failure_preserves_original_queue_and_evidence) ... ok
test_failed_persist_rolls_back_memory_and_keeps_pause (test_handoff_evidence.ProtocolEvidenceTests.test_failed_persist_rolls_back_memory_and_keeps_pause) ... ok
test_takeover_record_survives_restart_and_poll_without_becoming_pending (test_handoff_evidence.ProtocolEvidenceTests.test_takeover_record_survives_restart_and_poll_without_becoming_pending) ... ok
test_active_send_and_other_account_stay_protected (test_review_handoff.ProtocolHandoffTests.test_active_send_and_other_account_stay_protected) ... ok
test_explicit_takeover_releases_pause_without_send_or_receipt_change (test_review_handoff.ProtocolHandoffTests.test_explicit_takeover_releases_pause_without_send_or_receipt_change) ... ok
test_failed_send_can_be_taken_over_without_retry (test_review_handoff.ProtocolHandoffTests.test_failed_send_can_be_taken_over_without_retry) ... ok
test_other_uncertain_tasks_keep_pause (test_review_handoff.ProtocolHandoffTests.test_other_uncertain_tasks_keep_pause) ... ok
test_handoff_during_startup_keeps_takeover_semantics (test_review_handoff.RuntimeHandoffTests.test_handoff_during_startup_keeps_takeover_semantics) ... ok
test_live_protocol_takeover_uses_distinct_engine_action (test_review_handoff.RuntimeHandoffTests.test_live_protocol_takeover_uses_distinct_engine_action) ... ok
test_offline_takeover_preserves_dedup_and_does_not_claim_delivery (test_review_handoff.RuntimeHandoffTests.test_offline_takeover_preserves_dedup_and_does_not_claim_delivery) ... ok
test_visual_engine_falls_back_to_guarded_cancellation (test_review_handoff.RuntimeHandoffTests.test_visual_engine_falls_back_to_guarded_cancellation) ... ok
test_a_missing_title_panel_names_nobody (test_session_name.BotIdentityReadingTest.test_a_missing_title_panel_names_nobody) ... ok
test_the_open_chat_is_named_from_its_title (test_session_name.BotIdentityReadingTest.test_the_open_chat_is_named_from_its_title) ... ok
test_the_progress_line_falls_back_to_a_fingerprint_stub (test_session_name.BotIdentityReadingTest.test_the_progress_line_falls_back_to_a_fingerprint_stub) ... ok
test_the_progress_line_prefers_the_nickname (test_session_name.BotIdentityReadingTest.test_the_progress_line_prefers_the_nickname) ... ok
test_the_title_pixels_key_the_cache_so_one_chat_reads_once (test_session_name.BotIdentityReadingTest.test_the_title_pixels_key_the_cache_so_one_chat_reads_once) ... ok
test_a_degenerate_grid_never_raises (test_session_name.ChatEdgeRuleTest.test_a_degenerate_grid_never_raises) ... ok
test_a_full_height_line_at_the_left_edge_is_erased (test_session_name.ChatEdgeRuleTest.test_a_full_height_line_at_the_left_edge_is_erased) ... ok
test_a_long_message_spanning_the_screen_is_not_mistaken_for_a_rule (test_session_name.ChatEdgeRuleTest.test_a_long_message_spanning_the_screen_is_not_mistaken_for_a_rule) ... ok
test_a_real_bubble_touching_the_left_edge_is_kept (test_session_name.ChatEdgeRuleTest.test_a_real_bubble_touching_the_left_edge_is_kept) ... ok
test_a_rule_on_the_right_edge_is_erased_too (test_session_name.ChatEdgeRuleTest.test_a_rule_on_the_right_edge_is_erased_too) ... ok
test_an_empty_grid_survives_untouched (test_session_name.ChatEdgeRuleTest.test_an_empty_grid_survives_untouched) ... ok
test_the_bottom_most_message_is_found_again_once_the_line_is_gone (test_session_name.ChatEdgeRuleTest.test_the_bottom_most_message_is_found_again_once_the_line_is_gone) ... ok
test_the_original_grid_is_not_mutated (test_session_name.ChatEdgeRuleTest.test_the_original_grid_is_not_mutated) ... ok
test_identical_strings_are_zero_apart (test_session_name.CorrectionDistanceTest.test_identical_strings_are_zero_apart) ... ok
test_the_distance_helper_stops_early_instead_of_scanning_everything (test_session_name.CorrectionDistanceTest.test_the_distance_helper_stops_early_instead_of_scanning_everything) ... ok
test_a_blank_panel_has_no_text (test_session_name.InkCropTest.test_a_blank_panel_has_no_text) ... ok
test_a_dark_themed_panel_still_yields_its_text (test_session_name.InkCropTest.test_a_dark_themed_panel_still_yields_its_text) ... ok
test_it_finds_the_line_of_text_in_the_panel (test_session_name.InkCropTest.test_it_finds_the_line_of_text_in_the_panel) ... ok
test_the_crop_keeps_a_margin_around_the_glyphs (test_session_name.InkCropTest.test_the_crop_keeps_a_margin_around_the_glyphs) ... ok
test_the_crop_never_runs_off_the_panel (test_session_name.InkCropTest.test_the_crop_never_runs_off_the_panel) ... ok
test_a_corrected_read_does_not_register_the_wrong_spelling (test_session_name.MisreadCorrectionTest.test_a_corrected_read_does_not_register_the_wrong_spelling) ... ok
test_a_genuinely_new_contact_is_not_folded_into_an_old_one (test_session_name.MisreadCorrectionTest.test_a_genuinely_new_contact_is_not_folded_into_an_old_one) ... ok
test_a_one_character_slip_is_pulled_back_to_the_known_contact (test_session_name.MisreadCorrectionTest.test_a_one_character_slip_is_pulled_back_to_the_known_contact) ... ok
test_an_exact_known_name_is_returned_untouched (test_session_name.MisreadCorrectionTest.test_an_exact_known_name_is_returned_untouched) ... ok
test_correction_keeps_the_id_stable_across_a_slip (test_session_name.MisreadCorrectionTest.test_correction_keeps_the_id_stable_across_a_slip) ... ok
test_short_names_are_never_corrected (test_session_name.MisreadCorrectionTest.test_short_names_are_never_corrected) ... ok
test_the_contact_seen_most_often_wins_a_tie (test_session_name.MisreadCorrectionTest.test_the_contact_seen_most_often_wins_a_tie) ... ok
test_two_characters_apart_is_too_far_to_assume (test_session_name.MisreadCorrectionTest.test_two_characters_apart_is_too_far_to_assume) ... ok
test_full_width_characters_fold_to_the_same_id (test_session_name.NameNormalisationTest.test_full_width_characters_fold_to_the_same_id) ... ok
test_no_name_means_no_id (test_session_name.NameNormalisationTest.test_no_name_means_no_id) ... ok
test_the_id_is_a_plain_md5_hex (test_session_name.NameNormalisationTest.test_the_id_is_a_plain_md5_hex) ... ok
test_the_title_and_the_list_row_agree_on_one_person (test_session_name.NameNormalisationTest.test_the_title_and_the_list_row_agree_on_one_person) ... ok
test_two_different_people_never_share_an_id (test_session_name.NameNormalisationTest.test_two_different_people_never_share_an_id) ... ok
test_a_blank_panel_never_reaches_the_engine (test_session_name.NameReadingTest.test_a_blank_panel_never_reaches_the_engine) ... ok
test_a_confident_read_becomes_the_session_identity (test_session_name.NameReadingTest.test_a_confident_read_becomes_the_session_identity) ... ok
test_a_different_screen_is_read_again (test_session_name.NameReadingTest.test_a_different_screen_is_read_again) ... ok
test_a_missing_engine_reports_no_name_instead_of_crashing (test_session_name.NameReadingTest.test_a_missing_engine_reports_no_name_instead_of_crashing) ... ok
test_a_refused_read_is_not_cached_as_an_answer (test_session_name.NameReadingTest.test_a_refused_read_is_not_cached_as_an_answer) ... ok
test_a_shaky_read_is_refused_rather_than_guessed (test_session_name.NameReadingTest.test_a_shaky_read_is_refused_rather_than_guessed) ... ok
test_an_engine_that_throws_does_not_take_the_round_down (test_session_name.NameReadingTest.test_an_engine_that_throws_does_not_take_the_round_down) ... ok
test_full_page_layout_ocr_returns_text_with_coordinates (test_session_name.NameReadingTest.test_full_page_layout_ocr_returns_text_with_coordinates) ... ok
test_the_cache_is_capped_so_a_day_long_run_cannot_eat_memory (test_session_name.NameReadingTest.test_the_cache_is_capped_so_a_day_long_run_cannot_eat_memory) ... ok
test_the_detector_is_skipped_so_it_stays_fast_enough_to_poll (test_session_name.NameReadingTest.test_the_detector_is_skipped_so_it_stays_fast_enough_to_poll) ... ok
test_the_same_screen_is_only_read_once (test_session_name.NameReadingTest.test_the_same_screen_is_only_read_once) ... ok
test_a_human_reply_also_ends_the_task_without_archiving_our_draft (test_session_name.NoRepeatReplyTest.test_a_human_reply_also_ends_the_task_without_archiving_our_draft) ... ok
test_a_waiting_customer_still_gets_answered (test_session_name.NoRepeatReplyTest.test_a_waiting_customer_still_gets_answered) ... ok
test_an_idle_chat_with_no_task_is_simply_left_alone (test_session_name.NoRepeatReplyTest.test_an_idle_chat_with_no_task_is_simply_left_alone) ... ok
test_an_unreadable_bubble_side_never_silences_the_bot (test_session_name.NoRepeatReplyTest.test_an_unreadable_bubble_side_never_silences_the_bot) ... ok
test_our_own_reply_on_screen_stops_another_one (test_session_name.NoRepeatReplyTest.test_our_own_reply_on_screen_stops_another_one) ... ok
test_seeing_our_reply_settles_the_task_instead_of_retrying_forever (test_session_name.NoRepeatReplyTest.test_seeing_our_reply_settles_the_task_instead_of_retrying_forever) ... ok
test_the_guard_survives_a_blank_transcript (test_session_name.NoRepeatReplyTest.test_the_guard_survives_a_blank_transcript) ... ok
test_a_broken_callback_never_takes_the_round_down (test_session_name.ProgressReportingTest.test_a_broken_callback_never_takes_the_round_down) ... ok
test_a_headless_run_reports_to_nobody_without_complaining (test_session_name.ProgressReportingTest.test_a_headless_run_reports_to_nobody_without_complaining) ... ok
test_a_partially_built_bot_still_accepts_progress (test_session_name.ProgressReportingTest.test_a_partially_built_bot_still_accepts_progress) ... ok
test_the_same_line_is_not_sent_twice (test_session_name.ProgressReportingTest.test_the_same_line_is_not_sent_twice) ... ok
test_an_unreadable_row_falls_back_to_the_pixel_path (test_session_name.RowIdentityTest.test_an_unreadable_row_falls_back_to_the_pixel_path) ... ok
test_no_nickname_means_no_identity (test_session_name.RowIdentityTest.test_no_nickname_means_no_identity) ... ok
test_the_pixel_path_is_untouched_when_the_switch_is_off (test_session_name.RowIdentityTest.test_the_pixel_path_is_untouched_when_the_switch_is_off) ... ok
test_the_same_contact_matches_across_unread_and_selected_renderings (test_session_name.RowIdentityTest.test_the_same_contact_matches_across_unread_and_selected_renderings) ... ok
test_the_session_id_is_exactly_the_nickname_md5 (test_session_name.RowIdentityTest.test_the_session_id_is_exactly_the_nickname_md5) ... ok
test_the_title_and_the_row_produce_one_identity (test_session_name.RowIdentityTest.test_the_title_and_the_row_produce_one_identity) ... ok
test_two_different_contacts_stay_apart (test_session_name.RowIdentityTest.test_two_different_contacts_stay_apart) ... ok
test_a_missing_image_never_raises (test_session_name.RowNameCropTest.test_a_missing_image_never_raises) ... ok
test_a_row_too_small_to_hold_a_name_is_refused (test_session_name.RowNameCropTest.test_a_row_too_small_to_hold_a_name_is_refused) ... ok
test_the_crop_follows_a_narrow_sidebar_instead_of_fixed_pixels (test_session_name.RowNameCropTest.test_the_crop_follows_a_narrow_sidebar_instead_of_fixed_pixels) ... ok
test_the_crop_skips_the_avatar_and_stops_before_the_timestamp (test_session_name.RowNameCropTest.test_the_crop_skips_the_avatar_and_stops_before_the_timestamp) ... ok
test_the_crop_takes_the_name_line_not_the_message_preview (test_session_name.RowNameCropTest.test_the_crop_takes_the_name_line_not_the_message_preview) ... 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_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
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_cancel_during_generation_does_not_send (test_native_protocol_pipeline.EngineTests.test_cancel_during_generation_does_not_send) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
ok
test_crash_in_sending_becomes_uncertain (test_native_protocol_pipeline.EngineTests.test_crash_in_sending_becomes_uncertain) ... [协议收信] 同名客户 · 已加入回复队列
ok
test_database_read_failure_never_announces_healthy_listener (test_native_protocol_pipeline.EngineTests.test_database_read_failure_never_announces_healthy_listener) ... ok
test_duplicate_event_only_sent_once (test_native_protocol_pipeline.EngineTests.test_duplicate_event_only_sent_once) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_manual_reply_during_generation_cancels_send (test_native_protocol_pipeline.EngineTests.test_manual_reply_during_generation_cancels_send) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
ok
test_media_is_left_for_manual_handling (test_native_protocol_pipeline.EngineTests.test_media_is_left_for_manual_handling) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 当前消息需要人工处理;当前未回复消息包含图片、语音或其他非文本内容,协议版需人工处理
ok
test_memory_setting_preserves_only_unanswered_batch_when_disabled (test_native_protocol_pipeline.EngineTests.test_memory_setting_preserves_only_unanswered_batch_when_disabled) ... ok
test_model_control_tokens_are_not_sent (test_native_protocol_pipeline.EngineTests.test_model_control_tokens_are_not_sent) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 模型生成失败,可重试;模型未返回有效文本
ok
test_model_error_can_retry_before_send (test_native_protocol_pipeline.EngineTests.test_model_error_can_retry_before_send) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 模型生成失败,可重试;offline
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_new_incoming_during_generation_discards_old_answer (test_native_protocol_pipeline.EngineTests.test_new_incoming_during_generation_discards_old_answer) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议收信] 同名客户 · 已加入回复队列
ok
test_new_message_invalidates_approved_draft (test_native_protocol_pipeline.EngineTests.test_new_message_invalidates_approved_draft) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 人工审核
[协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 人工审核
ok
test_only_current_account_processed (test_native_protocol_pipeline.EngineTests.test_only_current_account_processed) ... ok
test_pending_batch_window_is_honored (test_native_protocol_pipeline.EngineTests.test_pending_batch_window_is_honored) ... [协议收信] 同名客户 · 已加入回复队列
ok
test_pending_review_and_errors_do_not_show_idle (test_native_protocol_pipeline.EngineTests.test_pending_review_and_errors_do_not_show_idle) ... ok
test_progress_callback_failure_does_not_repeat_or_block_send (test_native_protocol_pipeline.EngineTests.test_progress_callback_failure_does_not_repeat_or_block_send) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_progress_follows_receive_generate_send_then_waiting (test_native_protocol_pipeline.EngineTests.test_progress_follows_receive_generate_send_then_waiting) ... ok
test_ready_flag_alone_cannot_enable_transport (test_native_protocol_pipeline.EngineTests.test_ready_flag_alone_cannot_enable_transport) ... ok
test_restart_after_confirmed_journal_clears_pending_without_send (test_native_protocol_pipeline.EngineTests.test_restart_after_confirmed_journal_clears_pending_without_send) ... [协议收信] 同名客户 · 已加入回复队列
ok
test_review_requires_approval (test_native_protocol_pipeline.EngineTests.test_review_requires_approval) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 人工审核
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_runtime_uses_protocol_engine_without_visual_construction (test_native_protocol_pipeline.EngineTests.test_runtime_uses_protocol_engine_without_visual_construction) ... ok
test_same_name_conversations_use_distinct_ids (test_native_protocol_pipeline.EngineTests.test_same_name_conversations_use_distinct_ids) ... [协议收信] 同名客户 · 已加入回复队列
[协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_stop_during_generation_does_not_send (test_native_protocol_pipeline.EngineTests.test_stop_during_generation_does_not_send) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
ok
test_text_pipeline_with_native_receipt_and_no_feedback (test_native_protocol_pipeline.EngineTests.test_text_pipeline_with_native_receipt_and_no_feedback) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_uncertain_send_is_persisted_and_not_retried (test_native_protocol_pipeline.EngineTests.test_uncertain_send_is_persisted_and_not_retried) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议处理] 同名客户 · 本会话发送结果待人工核对,其他会话继续监听;timeout
ok
test_unknown_receipt_isolated_with_healthy_poll_log (test_native_protocol_pipeline.EngineTests.test_unknown_receipt_isolated_with_healthy_poll_log) ... ok
test_waiting_progress_and_periodic_read_confirmation_are_throttled (test_native_protocol_pipeline.EngineTests.test_waiting_progress_and_periodic_read_confirmation_are_throttled) ... ok
test_cancelled_before_send_does_not_consume_id (test_native_protocol_pipeline.JournalTests.test_cancelled_before_send_does_not_consume_id) ... ok
test_changed_payload_same_event_is_blocked (test_native_protocol_pipeline.JournalTests.test_changed_payload_same_event_is_blocked) ... ok
test_failure_does_not_automatically_retry (test_native_protocol_pipeline.JournalTests.test_failure_does_not_automatically_retry) ... ok
test_invalid_text_rejected (test_native_protocol_pipeline.JournalTests.test_invalid_text_rejected) ... ok
test_missing_conversation_blocks_send (test_native_protocol_pipeline.JournalTests.test_missing_conversation_blocks_send) ... ok
test_reopen_after_success_never_resends (test_native_protocol_pipeline.JournalTests.test_reopen_after_success_never_resends) ... ok
test_success_receipt_and_repeat_returns_saved_result (test_native_protocol_pipeline.JournalTests.test_success_receipt_and_repeat_returns_saved_result) ... ok
test_unknown_blocks_retry (test_native_protocol_pipeline.JournalTests.test_unknown_blocks_retry) ... ok
test_wrong_account_rejected_before_journaling_or_send (test_native_protocol_pipeline.JournalTests.test_wrong_account_rejected_before_journaling_or_send) ... ok
test_cancelled_context_history_only_keeps_unanswered (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_cancelled_context_history_only_keeps_unanswered) ... ok
test_context_enabled_retains_both_roles_and_unanswered_batch (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_context_enabled_retains_both_roles_and_unanswered_batch) ... ok
test_exactly_100_unanswered_messages_preserve_every_part (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_exactly_100_unanswered_messages_preserve_every_part) ... ok
test_existing_approved_draft_with_media_is_not_sent (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_existing_approved_draft_with_media_is_not_sent) ... ok
test_image_then_related_text_stays_manual (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_image_then_related_text_stays_manual) ... ok
test_old_media_before_own_reply_does_not_block_new_text (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_old_media_before_own_reply_does_not_block_new_text) ... ok
test_overflowing_unanswered_batch_cannot_answer_from_truncated_tail (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_overflowing_unanswered_batch_cannot_answer_from_truncated_tail) ... ok
test_own_reply_within_long_history_makes_current_batch_complete (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_own_reply_within_long_history_makes_current_batch_complete) ... ok
test_restart_preserves_uncertain_conversation_and_processes_others (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_restart_preserves_uncertain_conversation_and_processes_others) ... ok
test_unanswered_batch_not_lost_with_short_context_limit (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_unanswered_batch_not_lost_with_short_context_limit) ... ok
test_uncertain_receipt_for_other_account_does_not_pause_current (test_protocol_audit_boundaries.ProtocolAuditBoundaries.test_uncertain_receipt_for_other_account_does_not_pause_current) ... 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_existing_system_notice_is_checked_before_generation (test_contact_reply_guard.ProtocolContactTests.test_existing_system_notice_is_checked_before_generation) ... [协议收信] 同名客户 · 已加入回复队列
[协议跳过] 同名客户 · 对方开启联系人验证,当前不是联系人,已跳过自动回复
ok
test_failed_notice_lookup_keeps_unknown_send_protected (test_contact_reply_guard.ProtocolContactTests.test_failed_notice_lookup_keeps_unknown_send_protected) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议处理] 同名客户 · 本会话发送结果待人工核对,其他会话继续监听;callback timeout
ok
test_notice_arriving_during_generation_cancels_draft (test_contact_reply_guard.ProtocolContactTests.test_notice_arriving_during_generation_cancels_draft) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议跳过] 同名客户 · 对方开启联系人验证,当前不是联系人,已跳过自动回复
ok
test_notice_blocks_one_chat_and_another_chat_still_sends (test_contact_reply_guard.ProtocolContactTests.test_notice_blocks_one_chat_and_another_chat_still_sends) ... [协议跳过] 同名客户 · 对方开启联系人验证,当前不是联系人,已跳过自动回复
[协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_other_send_failure_remains_protected (test_contact_reply_guard.ProtocolContactTests.test_other_send_failure_remains_protected) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议处理] 同名客户 · 客户端拒绝发送,需人工核对;network unavailable
ok
test_rejection_during_send_is_not_retried_after_restart (test_contact_reply_guard.ProtocolContactTests.test_rejection_during_send_is_not_retried_after_restart) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议跳过] 同名客户 · 该用户不是你的联系人
ok
test_restore_notice_allows_later_message (test_contact_reply_guard.ProtocolContactTests.test_restore_notice_allows_later_message) ... [协议跳过] 同名客户 · 对方开启联系人验证,当前不是联系人,已跳过自动回复
[协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_unknown_receipt_with_contact_notice_isolated_without_resending (test_contact_reply_guard.ProtocolContactTests.test_unknown_receipt_with_contact_notice_isolated_without_resending) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议跳过] 同名客户 · 对方开启联系人验证,当前不是联系人,已跳过自动回复
ok
test_user_quoting_notice_does_not_disable_chat (test_contact_reply_guard.ProtocolContactTests.test_user_quoting_notice_does_not_disable_chat) ... [协议收信] 同名客户 · 已加入回复队列
[协议处理] 同名客户 · 根据当前会话生成回复
[协议处理] 同名客户 · 原账号单聊发送
[协议发送成功] 同名客户 · 服务器消息 999
ok
test_bad_rows_do_not_crash_context_or_skip_later_valid_messages (test_database_timestamp_audit.DatabaseTimestampAudit.test_bad_rows_do_not_crash_context_or_skip_later_valid_messages) ... ok
test_nonfinite_timestamps_are_not_messages (test_database_timestamp_audit.DatabaseTimestampAudit.test_nonfinite_timestamps_are_not_messages) ... ok
test_out_of_range_timestamps_are_not_messages (test_database_timestamp_audit.DatabaseTimestampAudit.test_out_of_range_timestamps_are_not_messages) ... ok
test_seconds_and_milliseconds_preserve_chronology (test_database_timestamp_audit.DatabaseTimestampAudit.test_seconds_and_milliseconds_preserve_chronology) ... ok
test_activation_before_primary_acquires_is_not_lost (test_desktop_instance.DesktopInstanceTests.test_activation_before_primary_acquires_is_not_lost) ... ok
test_activation_survives_sender_exit_and_waits_for_ui (test_desktop_instance.DesktopInstanceTests.test_activation_survives_sender_exit_and_waits_for_ui) ... ok
test_clean_exit_allows_existing_contender_to_take_over (test_desktop_instance.DesktopInstanceTests.test_clean_exit_allows_existing_contender_to_take_over) ... ok
test_close_on_wrong_thread_preserves_live_primary (test_desktop_instance.DesktopInstanceTests.test_close_on_wrong_thread_preserves_live_primary) ... ok
test_closed_guard_is_idempotent_but_cannot_reopen (test_desktop_instance.DesktopInstanceTests.test_closed_guard_is_idempotent_but_cannot_reopen) ... ok
test_closing_secondary_keeps_owner_exclusive (test_desktop_instance.DesktopInstanceTests.test_closing_secondary_keeps_owner_exclusive) ... ok
test_different_test_namespaces_do_not_interfere (test_desktop_instance.DesktopInstanceTests.test_different_test_namespaces_do_not_interfere) ... ok
test_killed_owner_releases_mutex_even_with_secondary_handle_open (test_desktop_instance.DesktopInstanceTests.test_killed_owner_releases_mutex_even_with_secondary_handle_open) ... ok
test_multiple_clicks_coalesce_and_secondary_cannot_steal_event (test_desktop_instance.DesktopInstanceTests.test_multiple_clicks_coalesce_and_secondary_cannot_steal_event) ... ok
test_mutex_creation_failure_is_not_treated_as_primary (test_desktop_instance.DesktopInstanceTests.test_mutex_creation_failure_is_not_treated_as_primary) ... ok
test_other_working_directory_uses_same_identity (test_desktop_instance.DesktopInstanceTests.test_other_working_directory_uses_same_identity) ... ok
test_same_thread_second_guard_cannot_recursively_become_primary (test_desktop_instance.DesktopInstanceTests.test_same_thread_second_guard_cannot_recursively_become_primary) ... ok
test_six_concurrent_processes_elect_exactly_one_primary (test_desktop_instance.DesktopInstanceTests.test_six_concurrent_processes_elect_exactly_one_primary) ... ok
test_windows_handle_signatures_are_pointer_sized (test_desktop_instance.DesktopInstanceTests.test_windows_handle_signatures_are_pointer_sized) ... ok
test_activation_is_polled_on_tk_ui_thread (test_classic_instance.ClassicInstanceTests.test_activation_is_polled_on_tk_ui_thread) ... ok
test_guard_constructor_failure_is_visible_and_does_not_launch (test_classic_instance.ClassicInstanceTests.test_guard_constructor_failure_is_visible_and_does_not_launch) ... ok
test_primary_holds_guard_until_session_returns (test_classic_instance.ClassicInstanceTests.test_primary_holds_guard_until_session_returns) ... ok
test_rejected_update_does_not_create_main_window (test_classic_instance.ClassicInstanceTests.test_rejected_update_does_not_create_main_window) ... ok
test_secondary_only_activates_existing_instance (test_classic_instance.ClassicInstanceTests.test_secondary_only_activates_existing_instance) ... ok
test_startup_failure_still_releases_guard (test_classic_instance.ClassicInstanceTests.test_startup_failure_still_releases_guard) ... ok
test_activation_waits_until_ui_exists (test_qt_tray_lifecycle.InstanceActivationTest.test_activation_waits_until_ui_exists) ... ok
test_guard_constructor_failure_is_reported_without_login (test_qt_tray_lifecycle.InstanceActivationTest.test_guard_constructor_failure_is_reported_without_login) ... ok
test_guard_failure_never_starts_unguarded_client (test_qt_tray_lifecycle.InstanceActivationTest.test_guard_failure_never_starts_unguarded_client) ... ok
test_login_modal_activated_before_main_window (test_qt_tray_lifecycle.InstanceActivationTest.test_login_modal_activated_before_main_window) ... ok
test_no_signal_does_not_change_window (test_qt_tray_lifecycle.InstanceActivationTest.test_no_signal_does_not_change_window) ... ok
test_packaging_selfcheck_does_not_contact_real_instance (test_qt_tray_lifecycle.InstanceActivationTest.test_packaging_selfcheck_does_not_contact_real_instance) ... ok
test_primary_enters_session_and_releases_guard (test_qt_tray_lifecycle.InstanceActivationTest.test_primary_enters_session_and_releases_guard) ... ok
test_secondary_does_not_enter_login_or_construct_main_window (test_qt_tray_lifecycle.InstanceActivationTest.test_secondary_does_not_enter_login_or_construct_main_window) ... ok
test_session_exception_releases_guard (test_qt_tray_lifecycle.InstanceActivationTest.test_session_exception_releases_guard) ... ok
test_smoke_test_does_not_contact_real_instance (test_qt_tray_lifecycle.InstanceActivationTest.test_smoke_test_does_not_contact_real_instance) ... ok
test_about_to_quit_is_wired_to_cleanup (test_qt_tray_lifecycle.TrayLifecycleTest.test_about_to_quit_is_wired_to_cleanup) ... ok
test_application_quit_marks_window_for_real_close (test_qt_tray_lifecycle.TrayLifecycleTest.test_application_quit_marks_window_for_real_close) ... ok
test_capsule_closes_to_tray_and_restores_original_geometry (test_qt_tray_lifecycle.TrayLifecycleTest.test_capsule_closes_to_tray_and_restores_original_geometry) ... ok
test_cleanup_stops_listener_and_backup_once (test_qt_tray_lifecycle.TrayLifecycleTest.test_cleanup_stops_listener_and_backup_once) ... ok
test_console_interrupt_uses_real_exit_not_window_close (test_qt_tray_lifecycle.TrayLifecycleTest.test_console_interrupt_uses_real_exit_not_window_close) ... ok
test_exit_menu_bypasses_close_to_tray (test_qt_tray_lifecycle.TrayLifecycleTest.test_exit_menu_bypasses_close_to_tray) ... ok
test_explicit_disable_close_to_tray_quits (test_qt_tray_lifecycle.TrayLifecycleTest.test_explicit_disable_close_to_tray_quits) ... ok
test_forced_relogin_restores_tray_hidden_web_surface (test_qt_tray_lifecycle.TrayLifecycleTest.test_forced_relogin_restores_tray_hidden_web_surface) ... ok
test_no_tray_fallback_restores_capsule_hidden_surfaces (test_qt_tray_lifecycle.TrayLifecycleTest.test_no_tray_fallback_restores_capsule_hidden_surfaces) ... ok
test_no_tray_falls_back_to_taskbar_even_when_running (test_qt_tray_lifecycle.TrayLifecycleTest.test_no_tray_falls_back_to_taskbar_even_when_running) ... ok
test_repeated_activation_keeps_current_visible_geometry (test_qt_tray_lifecycle.TrayLifecycleTest.test_repeated_activation_keeps_current_visible_geometry) ... ok
test_running_status_does_not_reopen_capsule_after_tray_close (test_qt_tray_lifecycle.TrayLifecycleTest.test_running_status_does_not_reopen_capsule_after_tray_close) ... ok
test_running_window_closes_to_tray_without_capsule_or_stop (test_qt_tray_lifecycle.TrayLifecycleTest.test_running_window_closes_to_tray_without_capsule_or_stop) ... ok
test_save_failure_does_not_prevent_worker_shutdown (test_qt_tray_lifecycle.TrayLifecycleTest.test_save_failure_does_not_prevent_worker_shutdown) ... ok
test_single_and_double_click_restore_but_context_menu_does_not (test_qt_tray_lifecycle.TrayLifecycleTest.test_single_and_double_click_restore_but_context_menu_does_not) ... ok
test_stopped_window_closes_to_tray_without_stopping_worker (test_qt_tray_lifecycle.TrayLifecycleTest.test_stopped_window_closes_to_tray_without_stopping_worker) ... ok
test_system_logoff_does_not_close_to_tray (test_qt_tray_lifecycle.TrayLifecycleTest.test_system_logoff_does_not_close_to_tray) ... ok
test_taskbar_native_restore_clears_fallback_mode (test_qt_tray_lifecycle.TrayLifecycleTest.test_taskbar_native_restore_clears_fallback_mode) ... ok
test_tray_menu_has_explicit_open_and_exit_actions (test_qt_tray_lifecycle.TrayLifecycleTest.test_tray_menu_has_explicit_open_and_exit_actions) ... ok
test_tray_restore_preserves_maximized_window (test_qt_tray_lifecycle.TrayLifecycleTest.test_tray_restore_preserves_maximized_window) ... ok
test_tray_restore_reopens_without_restarting_listener (test_qt_tray_lifecycle.TrayLifecycleTest.test_tray_restore_reopens_without_restarting_listener) ... ok
test_tray_setting_outweighs_legacy_keep_background_false (test_qt_tray_lifecycle.TrayLifecycleTest.test_tray_setting_outweighs_legacy_keep_background_false) ... ok
test_a_long_nickname_is_shortened_instead_of_overflowing (test_qt_capsule.CapsuleWindowTest.test_a_long_nickname_is_shortened_instead_of_overflowing) ... ok
test_compact_layout_has_no_horizontal_overlap (test_qt_capsule.CapsuleWindowTest.test_compact_layout_has_no_horizontal_overlap) ... ok
test_running_keeps_the_progress_line_alone (test_qt_capsule.CapsuleWindowTest.test_running_keeps_the_progress_line_alone) ... ok
test_running_replaces_stale_connection_or_window_waiting_progress (test_qt_capsule.CapsuleWindowTest.test_running_replaces_stale_connection_or_window_waiting_progress) ... ok
test_running_without_a_task_still_shows_a_real_process (test_qt_capsule.CapsuleWindowTest.test_running_without_a_task_still_shows_a_real_process) ... ok
test_status_copy_and_actions_remain_connected (test_qt_capsule.CapsuleWindowTest.test_status_copy_and_actions_remain_connected) ... ok
test_stopping_clears_a_stale_progress_line (test_qt_capsule.CapsuleWindowTest.test_stopping_clears_a_stale_progress_line) ... ok
test_the_progress_line_says_who_is_being_answered (test_qt_capsule.CapsuleWindowTest.test_the_progress_line_says_who_is_being_answered) ... ok
test_the_timer_sits_above_the_full_width_progress_line (test_qt_capsule.CapsuleWindowTest.test_the_timer_sits_above_the_full_width_progress_line) ... ok
test_timer_and_longest_copy_fit_their_widgets (test_qt_capsule.CapsuleWindowTest.test_timer_and_longest_copy_fit_their_widgets) ... ok
test_window_flags_and_position_keep_capsule_non_intrusive (test_qt_capsule.CapsuleWindowTest.test_window_flags_and_position_keep_capsule_non_intrusive) ... ok
test_entering_capsule_twice_is_harmless (test_qt_capsule.MainWindowMinimizeTest.test_entering_capsule_twice_is_harmless) ... ok
test_minimize_from_maximized_restores_maximized_console (test_qt_capsule.MainWindowMinimizeTest.test_minimize_from_maximized_restores_maximized_console) ... ok
test_minimize_while_running_switches_to_capsule_and_can_expand (test_qt_capsule.MainWindowMinimizeTest.test_minimize_while_running_switches_to_capsule_and_can_expand) ... ok
test_minimize_while_stopped_keeps_normal_taskbar_behavior (test_qt_capsule.MainWindowMinimizeTest.test_minimize_while_stopped_keeps_normal_taskbar_behavior) ... ok
test_starting_the_listener_switches_to_capsule_by_itself (test_qt_capsule.MainWindowMinimizeTest.test_starting_the_listener_switches_to_capsule_by_itself)
开始监听就收进胶囊:控制台不该挡在企业微信前面。 ... ok
test_delete_action_emits_the_full_untruncated_task_key (test_qt_capsule.QueuePageDeleteTest.test_delete_action_emits_the_full_untruncated_task_key) ... ok
test_retry_action_emits_only_a_real_retry_wait_task (test_qt_capsule.QueuePageDeleteTest.test_retry_action_emits_only_a_real_retry_wait_task) ... ok
test_builtin_risk_categories_are_read_only_and_rule_management_emits (test_qt_capsule.SettingsSendModeTest.test_builtin_risk_categories_are_read_only_and_rule_management_emits) ... ok
test_mode_buttons_are_exclusive_reflect_settings_and_emit_values (test_qt_capsule.SettingsSendModeTest.test_mode_buttons_are_exclusive_reflect_settings_and_emit_values) ... ok
test_rule_management_navigation_targets_ai_security_policy (test_qt_capsule.SettingsSendModeTest.test_rule_management_navigation_targets_ai_security_policy) ... ok
test_window_redetection_reports_the_real_detected_handle (test_qt_capsule.SettingsSendModeTest.test_window_redetection_reports_the_real_detected_handle) ... ok
test_clicking_the_orb_toggles_the_same_way (test_qt_capsule.SidebarMonitorToggleTest.test_clicking_the_orb_toggles_the_same_way) ... ok
test_clicking_the_status_text_starts_the_listener (test_qt_capsule.SidebarMonitorToggleTest.test_clicking_the_status_text_starts_the_listener) ... ok
test_clicking_the_status_text_while_running_pauses (test_qt_capsule.SidebarMonitorToggleTest.test_clicking_the_status_text_while_running_pauses) ... ok
test_intermediate_states_count_as_running (test_qt_capsule.SidebarMonitorToggleTest.test_intermediate_states_count_as_running) ... ok
test_one_click_never_fires_both_signals (test_qt_capsule.SidebarMonitorToggleTest.test_one_click_never_fires_both_signals)
旧实现每次都 disconnect 再 connect;少断一次就会自相抵消。 ... ok
test_the_tooltip_says_what_the_click_will_do (test_qt_capsule.SidebarMonitorToggleTest.test_the_tooltip_says_what_the_click_will_do) ... ok
test_auto_install_policy_starts_downloading (test_startup_update.StartupUpdateTest.test_auto_install_policy_starts_downloading) ... ok
test_available_update_prompts_before_login (test_startup_update.StartupUpdateTest.test_available_update_prompts_before_login) ... ok
test_check_starts_without_login_and_uses_public_manifest (test_startup_update.StartupUpdateTest.test_check_starts_without_login_and_uses_public_manifest) ... ok
test_closed_window_ignores_download_completion (test_startup_update.StartupUpdateTest.test_closed_window_ignores_download_completion) ... ok
test_downloaded_update_launches_helper_and_exits_login (test_startup_update.StartupUpdateTest.test_downloaded_update_launches_helper_and_exits_login) ... ok
test_forced_download_failure_does_not_allow_login (test_startup_update.StartupUpdateTest.test_forced_download_failure_does_not_allow_login) ... ok
test_forced_update_cannot_be_deferred (test_startup_update.StartupUpdateTest.test_forced_update_cannot_be_deferred) ... ok
test_ineligible_release_does_not_prompt (test_startup_update.StartupUpdateTest.test_ineligible_release_does_not_prompt) ... ok
test_known_forced_upgrade_is_preserved_offline (test_startup_update.StartupUpdateTest.test_known_forced_upgrade_is_preserved_offline) ... ok
test_network_failure_continues_login (test_startup_update.StartupUpdateTest.test_network_failure_continues_login) ... ok
test_no_update_continues_without_prompt (test_startup_update.StartupUpdateTest.test_no_update_continues_without_prompt) ... ok
test_optional_download_failure_allows_login (test_startup_update.StartupUpdateTest.test_optional_download_failure_allows_login) ... ok
test_optional_update_can_be_deferred (test_startup_update.StartupUpdateTest.test_optional_update_can_be_deferred) ... ok
test_timeout_continues_once_and_ignores_late_results (test_startup_update.StartupUpdateTest.test_timeout_continues_once_and_ignores_late_results) ... ok
----------------------------------------------------------------------
Ran 883 tests in 50.769s
OK