test_async_protocol_check_retains_explicit_approval_request (test_desktop_review_visibility.DesktopReviewTest.test_async_protocol_check_retains_explicit_approval_request) ... skipped 'This directory has no protocol transport' 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_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_no_layout_container_keeps_a_hard_coded_height (test_qt_console_bridge.ConsoleBridgeTest.test_no_layout_container_keeps_a_hard_coded_height) 去掉滚动条之后,"装不下"不再表现为滚动条,而是内容画到别的面板身上。 ... ok test_no_layout_scrolls_anywhere (test_qt_console_bridge.ConsoleBridgeTest.test_no_layout_scrolls_anywhere) 整套界面不许出现滚动条——内容多了就往下铺,由整体缩放来兜。 ... 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_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_canvas_fills_the_window_in_both_directions (test_qt_console_bridge.ConsoleBridgeTest.test_the_canvas_fills_the_window_in_both_directions) 画布要铺满窗口:高度按设计画布等比缩放,宽度靠加宽画布本身补齐。 ... 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_which_page_is_open (test_qt_console_bridge.ConsoleBridgeTest.test_the_scale_never_depends_on_which_page_is_open) 缩放只能由窗口尺寸决定,绝不能看当前页内容有多高。 ... 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_the_stage_and_pages_grow_with_their_content (test_qt_console_bridge.ConsoleBridgeTest.test_the_stage_and_pages_grow_with_their_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_a_broken_recorder_never_stops_a_reply (test_queue_log.BotQueueRecordingTest.test_a_broken_recorder_never_stops_a_reply) ... ok test_a_new_task_writes_one_enqueue_line (test_queue_log.BotQueueRecordingTest.test_a_new_task_writes_one_enqueue_line) ... ok test_a_recorded_step_carries_the_session_id_the_ui_shows (test_queue_log.BotQueueRecordingTest.test_a_recorded_step_carries_the_session_id_the_ui_shows) ... ok test_a_recorded_step_is_also_pushed_to_the_floating_capsule (test_queue_log.BotQueueRecordingTest.test_a_recorded_step_is_also_pushed_to_the_floating_capsule) ... ok test_an_atomic_operation_is_visible_in_capsule_and_execution_table (test_queue_log.BotQueueRecordingTest.test_an_atomic_operation_is_visible_in_capsule_and_execution_table) ... ok test_an_unreadable_nickname_is_never_stored_as_the_customer (test_queue_log.BotQueueRecordingTest.test_an_unreadable_nickname_is_never_stored_as_the_customer) 读不出昵称时 `_session_label` 返回「会话 xxxx」,那是占位不是人名。 ... ok test_the_nickname_is_kept_on_the_task_for_later_steps (test_queue_log.BotQueueRecordingTest.test_the_nickname_is_kept_on_the_task_for_later_steps) 后面几步都要报出人名,不能每一步再去 OCR 一遍。 ... ok test_the_nickname_survives_a_restart (test_queue_log.BotQueueRecordingTest.test_the_nickname_survives_a_restart) 重启后队列界面还要认得出这些任务是谁的。 ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_the_same_task_touched_again_does_not_queue_twice (test_queue_log.BotQueueRecordingTest.test_the_same_task_touched_again_does_not_queue_twice) 一轮里同一个会话会被反复标记,每次都记一条"入队"就没法看了。 ... ok test_visual_model_is_named_explicitly_in_capsule_progress (test_queue_log.BotQueueRecordingTest.test_visual_model_is_named_explicitly_in_capsule_progress) ... ok test_a_model_that_already_explained_itself_is_not_repeated (test_queue_log.GenerationGapTest.test_a_model_that_already_explained_itself_is_not_repeated) ... ok test_a_recorded_reply_also_counts_as_the_model_speaking_up (test_queue_log.GenerationGapTest.test_a_recorded_reply_also_counts_as_the_model_speaking_up) ... ok test_a_silent_model_still_leaves_a_line_in_the_record (test_queue_log.GenerationGapTest.test_a_silent_model_still_leaves_a_line_in_the_record) ... ok test_a_plain_question_is_quoted_in_the_record (test_queue_log.ModelCallRecordTest.test_a_plain_question_is_quoted_in_the_record) ... ok test_a_screenshot_only_round_is_described_rather_than_left_blank (test_queue_log.ModelCallRecordTest.test_a_screenshot_only_round_is_described_rather_than_left_blank) ... ok test_a_wall_of_text_is_trimmed_to_stay_readable (test_queue_log.ModelCallRecordTest.test_a_wall_of_text_is_trimmed_to_stay_readable) ... ok test_an_image_message_says_so_instead_of_looking_empty (test_queue_log.ModelCallRecordTest.test_an_image_message_says_so_instead_of_looking_empty) ... ok test_an_image_with_a_caption_keeps_both (test_queue_log.ModelCallRecordTest.test_an_image_with_a_caption_keeps_both) ... ok test_line_breaks_never_break_the_table_row (test_queue_log.ModelCallRecordTest.test_line_breaks_never_break_the_table_row) ... ok test_several_media_kinds_are_all_named (test_queue_log.ModelCallRecordTest.test_several_media_kinds_are_all_named) ... ok test_a_corrupted_history_starts_over_instead_of_crashing (test_queue_log.QueueLogStoreTest.test_a_corrupted_history_starts_over_instead_of_crashing) 记录只是排查线索,它坏掉不能反过来让界面和机器人一起崩。 ... ok test_a_failed_write_reports_failure_instead_of_raising (test_queue_log.QueueLogStoreTest.test_a_failed_write_reports_failure_instead_of_raising) ... ok test_a_finished_write_leaves_no_temp_files_behind (test_queue_log.QueueLogStoreTest.test_a_finished_write_leaves_no_temp_files_behind) 写入走临时文件加原子替换,界面才不会读到写了一半的 JSON。 ... ok test_a_long_running_bot_never_grows_the_file_without_bound (test_queue_log.QueueLogStoreTest.test_a_long_running_bot_never_grows_the_file_without_bound) ... ok test_a_novel_length_reply_does_not_bloat_every_row (test_queue_log.QueueLogStoreTest.test_a_novel_length_reply_does_not_bloat_every_row) ... ok test_a_recorded_step_comes_back_with_everything_it_was_given (test_queue_log.QueueLogStoreTest.test_a_recorded_step_comes_back_with_everything_it_was_given) ... ok test_asking_for_fewer_steps_gives_exactly_that_many (test_queue_log.QueueLogStoreTest.test_asking_for_fewer_steps_gives_exactly_that_many) ... ok test_clearing_wipes_the_history_and_survives_a_reread (test_queue_log.QueueLogStoreTest.test_clearing_wipes_the_history_and_survives_a_reread) ... ok test_junk_rows_are_dropped_rather_than_handed_to_the_table (test_queue_log.QueueLogStoreTest.test_junk_rows_are_dropped_rather_than_handed_to_the_table) ... ok test_reading_an_empty_history_is_not_an_error (test_queue_log.QueueLogStoreTest.test_reading_an_empty_history_is_not_an_error) ... ok test_the_newest_step_is_the_one_you_see_first (test_queue_log.QueueLogStoreTest.test_the_newest_step_is_the_one_you_see_first) 排查总是从"刚才发生了什么"开始,最新的必须在最上面。 ... ok test_a_bare_task_still_gets_a_readable_status (test_queue_log.QueuePageReadingTest.test_a_bare_task_still_gets_a_readable_status) ... ok test_a_batched_task_reads_as_generating (test_queue_log.QueuePageReadingTest.test_a_batched_task_reads_as_generating) ... ok test_a_fresh_unread_task_reads_as_waiting (test_queue_log.QueuePageReadingTest.test_a_fresh_unread_task_reads_as_waiting) ... ok test_a_long_wait_is_shown_in_hours_so_a_stuck_task_stands_out (test_queue_log.QueuePageReadingTest.test_a_long_wait_is_shown_in_hours_so_a_stuck_task_stands_out) ... ok test_a_short_wait_is_shown_in_seconds (test_queue_log.QueuePageReadingTest.test_a_short_wait_is_shown_in_seconds) ... ok test_a_task_being_sent_reads_as_sending_not_as_queued (test_queue_log.QueuePageReadingTest.test_a_task_being_sent_reads_as_sending_not_as_queued) ... ok test_a_task_whose_receipt_is_unconfirmed_says_so (test_queue_log.QueuePageReadingTest.test_a_task_whose_receipt_is_unconfirmed_says_so) 这个状态正是"回了没回"说不清的时候,界面上必须看得见。 ... ok test_a_task_with_no_timestamp_never_shows_a_bogus_wait (test_queue_log.QueuePageReadingTest.test_a_task_with_no_timestamp_never_shows_a_bogus_wait) ... ok test_a_missing_pending_file_is_not_reported_as_an_error (test_queue_log.QueuePageTableTest.test_a_missing_pending_file_is_not_reported_as_an_error) 第一次启动时这个文件根本不存在,不该在日志里吓人一跳。 ... ok test_a_queue_that_drains_replaces_its_rows_with_the_empty_notice (test_queue_log.QueuePageTableTest.test_a_queue_that_drains_replaces_its_rows_with_the_empty_notice) 刷新是原地重画的,上一轮的行不清干净就会留在屏幕上骗人。 ... ok test_a_running_listener_does_not_nag (test_queue_log.QueuePageTableTest.test_a_running_listener_does_not_nag) ... ok test_a_stopped_listener_keeps_the_explanation_without_opening_a_window (test_queue_log.QueuePageTableTest.test_a_stopped_listener_keeps_the_explanation_without_opening_a_window) 停着的时候等待时长照涨,不说明白会被当成机器人卡死了。 ... ok test_a_task_awaiting_proof_is_coloured_apart_from_a_real_failure (test_queue_log.QueuePageTableTest.test_a_task_awaiting_proof_is_coloured_apart_from_a_real_failure) ... ok test_a_task_whose_nickname_never_read_still_takes_a_visible_slot (test_queue_log.QueuePageTableTest.test_a_task_whose_nickname_never_read_still_takes_a_visible_slot) 认不出是谁也得让人看见它在排队,否则就成了看不见的积压。 ... ok test_a_task_with_a_junk_timestamp_still_appears_in_the_queue (test_queue_log.QueuePageTableTest.test_a_task_with_a_junk_timestamp_still_appears_in_the_queue) 一条坏数据不能让整页读不出来——那正是最需要看它的时候。 ... ok test_an_empty_history_says_so_too (test_queue_log.QueuePageTableTest.test_an_empty_history_says_so_too) ... ok test_an_empty_queue_never_shows_the_stopped_warning (test_queue_log.QueuePageTableTest.test_an_empty_queue_never_shows_the_stopped_warning) ... ok test_an_empty_queue_says_so_instead_of_showing_a_blank_slab (test_queue_log.QueuePageTableTest.test_an_empty_queue_says_so_instead_of_showing_a_blank_slab) ... ok test_awaiting_proof_is_not_counted_as_a_failure_today (test_queue_log.QueuePageTableTest.test_awaiting_proof_is_not_counted_as_a_failure_today) 把"多半已经发出去了"记成失败,会让人以为出了大问题。 ... ok test_the_queue_is_shown_oldest_first_so_nobody_is_starved (test_queue_log.QueuePageTableTest.test_the_queue_is_shown_oldest_first_so_nobody_is_starved) 界面上的顺序就是实际服务顺序,先来的必须排在前面。 ... ok test_todays_sends_and_failures_are_counted_from_the_history (test_queue_log.QueuePageTableTest.test_todays_sends_and_failures_are_counted_from_the_history) ... ok test_yesterdays_sends_do_not_inflate_todays_count (test_queue_log.QueuePageTableTest.test_yesterdays_sends_do_not_inflate_todays_count) ... ok test_a_new_send_forgets_the_previous_rounds_reason (test_queue_log.SendFailureReasonTest.test_a_new_send_forgets_the_previous_rounds_reason) 上一轮的原因留到这一轮,会把人引到早就修好的问题上。 ... ok test_a_pressed_enter_awaiting_proof_is_not_branded_a_failure (test_queue_log.SendFailureReasonTest.test_a_pressed_enter_awaiting_proof_is_not_branded_a_failure) 回车已经按下去,只是还没认出那条消息——多半其实发出去了。 ... ok test_a_successful_send_records_what_was_actually_said (test_queue_log.SendFailureReasonTest.test_a_successful_send_records_what_was_actually_said) ... ok test_an_unnamed_reason_still_produces_a_usable_line (test_queue_log.SendFailureReasonTest.test_an_unnamed_reason_still_produces_a_usable_line) ... ok test_every_gate_reason_is_human_readable_not_a_code (test_queue_log.SendFailureReasonTest.test_every_gate_reason_is_human_readable_not_a_code) ... ok test_the_gate_that_blocked_the_send_is_named_in_the_record (test_queue_log.SendFailureReasonTest.test_the_gate_that_blocked_the_send_is_named_in_the_record) ... 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_active_send_and_other_account_stay_protected (test_review_handoff.ProtocolHandoffTests.test_active_send_and_other_account_stay_protected) ... skipped 'visual-only distribution has no protocol engine' test_explicit_takeover_releases_pause_without_send_or_receipt_change (test_review_handoff.ProtocolHandoffTests.test_explicit_takeover_releases_pause_without_send_or_receipt_change) ... skipped 'visual-only distribution has no protocol engine' test_failed_send_can_be_taken_over_without_retry (test_review_handoff.ProtocolHandoffTests.test_failed_send_can_be_taken_over_without_retry) ... skipped 'visual-only distribution has no protocol engine' test_other_uncertain_tasks_keep_pause (test_review_handoff.ProtocolHandoffTests.test_other_uncertain_tasks_keep_pause) ... skipped 'visual-only distribution has no protocol engine' 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 ---------------------------------------------------------------------- Ran 141 tests in 3.672s OK (skipped=5)