test_completed_result_is_not_reused_for_later_explicit_refresh (test_database_loading_performance.KeyAcquisitionSingleFlightTest.test_completed_result_is_not_reused_for_later_explicit_refresh) ... ok test_failure_is_shared_and_does_not_poison_later_retry (test_database_loading_performance.KeyAcquisitionSingleFlightTest.test_failure_is_shared_and_does_not_poison_later_retry) ... ok test_simultaneous_browser_and_protocol_initialization_start_one_worker (test_database_loading_performance.KeyAcquisitionSingleFlightTest.test_simultaneous_browser_and_protocol_initialization_start_one_worker) ... ok test_busy_navigation_is_coalesced_to_latest_account_conversation_and_query (test_database_loading_performance.LocalFirstLoaderTest.test_busy_navigation_is_coalesced_to_latest_account_conversation_and_query) ... ok test_local_chat_arrives_before_remote_lookup_begins (test_database_loading_performance.LocalFirstLoaderTest.test_local_chat_arrives_before_remote_lookup_begins) ... ok test_old_patient_result_never_replaces_new_selection_and_only_latest_is_queued (test_database_loading_performance.LocalFirstLoaderTest.test_old_patient_result_never_replaces_new_selection_and_only_latest_is_queued) ... ok test_remote_timeout_keeps_local_chat_visible_and_not_setup_error (test_database_loading_performance.LocalFirstLoaderTest.test_remote_timeout_keeps_local_chat_visible_and_not_setup_error) ... ok test_repeated_refresh_during_load_does_not_queue_another_initialization (test_database_loading_performance.LocalFirstLoaderTest.test_repeated_refresh_during_load_does_not_queue_another_initialization) ... ok test_stale_database_result_is_ignored (test_database_loading_performance.LocalFirstLoaderTest.test_stale_database_result_is_ignored) ... ok test_busy_refresh_does_not_start_a_second_scan (test_wechat_database_flow.AutomaticDatabaseFlowTest.test_busy_refresh_does_not_start_a_second_scan) ... ok test_first_load_automates_and_tab_return_does_not_retry_failure (test_wechat_database_flow.AutomaticDatabaseFlowTest.test_first_load_automates_and_tab_return_does_not_retry_failure) ... ok test_manual_acquire_does_not_trigger_a_second_automatic_scan (test_wechat_database_flow.AutomaticDatabaseFlowTest.test_manual_acquire_does_not_trigger_a_second_automatic_scan) ... ok test_worker_error_exposes_manual_fallback (test_wechat_database_flow.AutomaticDatabaseFlowTest.test_worker_error_exposes_manual_fallback) ... ok test_empty_cache_returns_actionable_error (test_wxwork_message_browser.WeChatMessageBrowserTests.test_empty_cache_returns_actionable_error) ... ok test_lists_databases_conversations_and_messages (test_wxwork_message_browser.WeChatMessageBrowserTests.test_lists_databases_conversations_and_messages) ... ok test_selects_conversation_and_filters (test_wxwork_message_browser.WeChatMessageBrowserTests.test_selects_conversation_and_filters) ... ok test_cached_message_page_makes_no_sqlite_queries (test_wxwork_browser_performance.BrowserPerformanceTest.test_cached_message_page_makes_no_sqlite_queries) ... ok test_concurrent_account_switches_cannot_leak_another_accounts_page (test_wxwork_browser_performance.BrowserPerformanceTest.test_concurrent_account_switches_cannot_leak_another_accounts_page) ... ok test_concurrent_navigation_uses_consistent_cache (test_wxwork_browser_performance.BrowserPerformanceTest.test_concurrent_navigation_uses_consistent_cache) ... ok test_content_search_checks_all_conversations (test_wxwork_browser_performance.BrowserPerformanceTest.test_content_search_checks_all_conversations) ... ok test_conversation_and_message_offsets_are_stable_with_timestamp_ties (test_wxwork_browser_performance.BrowserPerformanceTest.test_conversation_and_message_offsets_are_stable_with_timestamp_ties) ... ok test_database_replace_with_preserved_mtime_and_size_invalidates_inode (test_wxwork_browser_performance.BrowserPerformanceTest.test_database_replace_with_preserved_mtime_and_size_invalidates_inode) ... ok test_database_replaced_between_index_and_message_read_cannot_leak_conversation (test_wxwork_browser_performance.BrowserPerformanceTest.test_database_replaced_between_index_and_message_read_cannot_leak_conversation) ... ok test_database_replaced_between_index_and_preview_read_cannot_leak_conversation (test_wxwork_browser_performance.BrowserPerformanceTest.test_database_replaced_between_index_and_preview_read_cannot_leak_conversation) ... ok test_deletion_invalidates_message_and_conversation_counts (test_wxwork_browser_performance.BrowserPerformanceTest.test_deletion_invalidates_message_and_conversation_counts) ... ok test_multiple_accounts_do_not_rebuild_unselected_indexes (test_wxwork_browser_performance.BrowserPerformanceTest.test_multiple_accounts_do_not_rebuild_unselected_indexes) ... ok test_new_message_invalidates_counts_order_and_cached_page (test_wxwork_browser_performance.BrowserPerformanceTest.test_new_message_invalidates_counts_order_and_cached_page) ... ok test_reader_never_changes_source_database_or_adds_indexes (test_wxwork_browser_performance.BrowserPerformanceTest.test_reader_never_changes_source_database_or_adds_indexes) ... ok test_refresh_explicitly_invalidates_even_unchanged_metadata (test_wxwork_browser_performance.BrowserPerformanceTest.test_refresh_explicitly_invalidates_even_unchanged_metadata) ... ok test_rename_invalidates_names_without_touching_messages (test_wxwork_browser_performance.BrowserPerformanceTest.test_rename_invalidates_names_without_touching_messages) ... ok test_search_finds_conversations_older_than_the_newest_thousand (test_wxwork_browser_performance.BrowserPerformanceTest.test_search_finds_conversations_older_than_the_newest_thousand) ... ok test_search_offset_is_applied_after_filtering (test_wxwork_browser_performance.BrowserPerformanceTest.test_search_offset_is_applied_after_filtering) ... ok test_snapshots_do_not_expose_mutable_cache_objects (test_wxwork_browser_performance.BrowserPerformanceTest.test_snapshots_do_not_expose_mutable_cache_objects) ... ok test_system_conversations_are_excluded_but_total_message_count_is_exact (test_wxwork_browser_performance.BrowserPerformanceTest.test_system_conversations_are_excluded_but_total_message_count_is_exact) ... ok test_wal_only_commit_invalidates_without_main_db_change (test_wxwork_browser_performance.BrowserPerformanceTest.test_wal_only_commit_invalidates_without_main_db_change) ... ok test_warm_conversation_navigation_does_not_repeat_full_aggregates (test_wxwork_browser_performance.BrowserPerformanceTest.test_warm_conversation_navigation_does_not_repeat_full_aggregates) ... ok test_auto_failure_exposes_manual_fallback_and_refresh_retries (test_wxwork_local_setup.LocalDatabaseSetupTest.test_auto_failure_exposes_manual_fallback_and_refresh_retries) ... ok test_corrupt_fresh_cache_is_rebuilt_without_scanning (test_wxwork_local_setup.LocalDatabaseSetupTest.test_corrupt_fresh_cache_is_rebuilt_without_scanning) ... ok test_database_notice_keeps_specific_failure (test_wxwork_local_setup.LocalDatabaseSetupTest.test_database_notice_keeps_specific_failure) ... ok test_directory_choice_preserves_other_settings (test_wxwork_local_setup.LocalDatabaseSetupTest.test_directory_choice_preserves_other_settings) ... ok test_existing_key_and_plain_database_do_not_scan_processes (test_wxwork_local_setup.LocalDatabaseSetupTest.test_existing_key_and_plain_database_do_not_scan_processes) ... ok test_first_install_auto_discovers_and_decrypts_without_manual_input (test_wxwork_local_setup.LocalDatabaseSetupTest.test_first_install_auto_discovers_and_decrypts_without_manual_input) ... ok test_frozen_key_worker_uses_executable_without_python_script (test_wxwork_local_setup.LocalDatabaseSetupTest.test_frozen_key_worker_uses_executable_without_python_script) ... ok test_import_then_refresh_reads_encrypted_message (test_wxwork_local_setup.LocalDatabaseSetupTest.test_import_then_refresh_reads_encrypted_message) ... ok test_invalid_keys_produce_actionable_error_without_secret (test_wxwork_local_setup.LocalDatabaseSetupTest.test_invalid_keys_produce_actionable_error_without_secret) ... ok test_key_worker_only_persists_verified_keys (test_wxwork_local_setup.LocalDatabaseSetupTest.test_key_worker_only_persists_verified_keys) ... ok test_key_worker_timeout_and_no_process_are_actionable (test_wxwork_local_setup.LocalDatabaseSetupTest.test_key_worker_timeout_and_no_process_are_actionable) ... ok test_missing_directory_falls_back_without_scanning_processes (test_wxwork_local_setup.LocalDatabaseSetupTest.test_missing_directory_falls_back_without_scanning_processes) ... ok test_missing_key_is_not_reported_as_missing_database (test_wxwork_local_setup.LocalDatabaseSetupTest.test_missing_key_is_not_reported_as_missing_database) ... ok test_onedrive_directory_is_found_without_saved_config (test_wxwork_local_setup.LocalDatabaseSetupTest.test_onedrive_directory_is_found_without_saved_config) ... ok test_partial_accounts_trigger_auto_acquisition_and_manual_fallback (test_wxwork_local_setup.LocalDatabaseSetupTest.test_partial_accounts_trigger_auto_acquisition_and_manual_fallback) ... ok test_registry_documents_expands_environment_variables (test_wxwork_local_setup.LocalDatabaseSetupTest.test_registry_documents_expands_environment_variables) ... ok test_saved_custom_path_is_used_after_install (test_wxwork_local_setup.LocalDatabaseSetupTest.test_saved_custom_path_is_used_after_install) ... ok test_scanner_success_without_usable_key_is_still_a_failure (test_wxwork_local_setup.LocalDatabaseSetupTest.test_scanner_success_without_usable_key_is_still_a_failure) ... ok test_stale_or_malformed_key_automatically_recovers (test_wxwork_local_setup.LocalDatabaseSetupTest.test_stale_or_malformed_key_automatically_recovers) ... ok test_wrong_key_does_not_overwrite_saved_key (test_wxwork_local_setup.LocalDatabaseSetupTest.test_wrong_key_does_not_overwrite_saved_key) ... 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_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 ---------------------------------------------------------------------- Ran 106 tests in 6.222s OK (skipped=1)