hermes-hub/tests
ochenstarik-ui a3373f9f76 fix(tests): платформенные допущения тестов не выдают себя за дефекты продукта
Прогон на Windows-раннере показал, что причин красного CI больше двух.
Четыре падения — не в продукте, а в допущениях тестов, зашитых под Linux.

1. test_a41 читал вывод скрипта в кодировке системы. Скрипт теперь пишет
   UTF-8, а родитель на Windows читал трубу как cp1252 и разваливался на
   UnicodeDecodeError, оставляя proc.stdout равным None. Кодировка задана
   явно с обеих сторон трубы.

2. test_p0_3_stop_running_hub знал только про ветку Linux: os.kill по списку
   от pgrep. На Windows процессы останавливает taskkill по списку от wmic,
   os.kill не вызывается — тест падал на пустом списке убитых. Инвариант же
   один для обеих веток: чужой процесс хаба останавливается, собственный
   PID не трогается. Теперь он проверяется на обеих.

3-4. Оба теста установки подсовывали bash-скрипт hermes-hub-setup.sh. На
   Windows выбирается HermesHubSetup.exe, и установка честно отвечала «в
   релизе не найден подходящий файл обновления для текущей платформы».
   Установщик теперь берётся под ту систему, на которой идёт прогон.
   Проверка сообщения об ошибке смотрит на то, назван ли код возврата, а не
   на склонение: ветки формулируют «код 3» и «кодом 3», инвариант один.

Тесты: 755 -> 756 passed, 2 skipped, 4 deselected. ruff check . чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 19:01:30 +07:00
..
fixtures fix(installer): ошибка 12 при установке — проверка требовала конфигурацию от 20 августа 2026-08-24 09:35:36 +07:00
manual fix(a54): validate accounts synchronously and manage Windows runtime lifecycle 2026-08-31 20:54:19 +07:00
conftest.py fix(tests): адреса провайдеров из окружения ломали прогон на машине владельца 2026-08-31 01:35:57 +07:00
test_a9_migration_quotas_models.py feat(a52): local models replacement, local-supervisor, and dual coder with cloud judge 2026-08-31 19:12:07 +07:00
test_a31_preflight_state_batching_pii.py feat(a52): local models replacement, local-supervisor, and dual coder with cloud judge 2026-08-31 19:12:07 +07:00
test_a35_role_resolution.py feat(pipeline): A35 and A36 canonical Antigravity workflow pipeline with role resolution and loops 2026-08-30 15:34:07 +00:00
test_a36_pipeline.py feat(skills): A49 subagents layout, skills tab, SkillDoctor, and Obsidian memory integration 2026-08-31 18:19:01 +07:00
test_a37_isolation_guards.py fix(security): граница workspace держится одинаково на Windows и Linux 2026-09-03 19:01:30 +07:00
test_a39_local_request_options.py feat(local): параметры запроса (request_options) для локальных профилей 2026-08-30 23:49:57 +07:00
test_a40_model_benchmark.py merge: A44 и A49 — отчёт замеров и субагенты со скиллами и памятью 2026-08-31 18:47:41 +07:00
test_a41_clean_install.py fix(tests): платформенные допущения тестов не выдают себя за дефекты продукта 2026-09-03 19:01:30 +07:00
test_a42_provider_connect.py fix(a55): account connection fixes - antigravity windows/linux, ollama server discovery, version display, full settings 2026-08-31 23:39:53 +07:00
test_a43_frontend_canvas.py feat(ui): A43 интерактивный холст workflow (n8n style), панорамирование, зум колесом, 6 KPI и верстка по макетам 2026-08-31 12:29:06 +07:00
test_a49_subagents_skills_memory.py feat(a52): local models replacement, local-supervisor, and dual coder with cloud judge 2026-08-31 19:12:07 +07:00
test_a51_hub_controls_hermes.py fix(a54): validate accounts synchronously and manage Windows runtime lifecycle 2026-08-31 20:54:19 +07:00
test_a52_local_models_supervisor_dual.py feat(a52): local models replacement, local-supervisor, and dual coder with cloud judge 2026-08-31 19:12:07 +07:00
test_a55_account_connection.py fix(antigravity): вход завершался успешно, а agy требовал войти снова 2026-09-01 10:37:27 +07:00
test_a56_context_compression.py feat(a56): context compression engine with 100% fact retention, configurable compressor profile, and AI-Memory tracking 2026-09-01 01:27:38 +07:00
test_a56_review_findings.py review(a56): сжатие контекста принято с исправлениями 2026-09-01 14:32:35 +07:00
test_a57_agy_native_login.py fix(antigravity): терминал не открывался из-за подменённого HOME; видно работающую сборку 2026-09-01 16:04:07 +07:00
test_a57_review_terminal_launch.py fix(antigravity): терминал не открывался из-за подменённого HOME; видно работающую сборку 2026-09-01 16:04:07 +07:00
test_a58_agy_eligibility_state.py feat(agy): A58 read-only eligibility state detection and owner patcher controls 2026-09-02 01:26:46 +07:00
test_a59_visible_update.py fix(tests): платформенные допущения тестов не выдают себя за дефекты продукта 2026-09-03 19:01:30 +07:00
test_account_modal_refresh.py fix(web): окно аккаунта не обновлялось и застревало на заглушке 2026-08-24 20:40:13 +07:00
test_accounts_a50.py fix(a54): validate accounts synchronously and manage Windows runtime lifecycle 2026-08-31 20:54:19 +07:00
test_accounts_a54.py fix(a54): reject empty credentials before slot allocation 2026-08-31 20:55:42 +07:00
test_accounts_distribution_and_thresholds_a26.py feat(config): A41 чистая конфигурация при первой установке, безопасность учетных данных и сброс 2026-08-31 02:27:42 +07:00
test_accounts_tariffs_quotas.py feat(A11): интеграция с Hermes, токены Codex, честное обнаружение моделей 2026-08-23 15:27:28 +07:00
test_adapter_error_parsing.py fix(adapters): обработчик ошибок падал сам, скрывая настоящую причину 2026-08-24 14:54:39 +07:00
test_add_account_does_not_block.py fix(accounts): мастер подключения замирал на шаге 3 2026-09-01 13:23:55 +07:00
test_agy_cli_token_file.py fix(antigravity): вход завершался успешно, а agy требовал войти снова 2026-09-01 10:37:27 +07:00
test_agy_native_login.py fix(profiles): пустые слоты появлялись сами, потому что запрос пути создавал каталог 2026-09-01 15:27:33 +07:00
test_agy_oauth_credentials.py fix(oauth): preserve complete credentials and sync oauth_creds.json for Antigravity profiles (A20) 2026-08-23 23:09:58 +07:00
test_antigravity_concurrency.py perf(antigravity): из десяти аккаунтов одновременно работал один 2026-08-30 20:04:52 +07:00
test_api_providers_a32.py fix(a55): account connection fixes - antigravity windows/linux, ollama server discovery, version display, full settings 2026-08-31 23:39:53 +07:00
test_brand_icons.js Restore local provider logos and add model-family brand marks 2026-08-31 18:14:34 +07:00
test_codex_opencode_wizard.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_credential_isolation.py fix(test): isolate agy lookup in hermetic credential test 2026-08-27 12:08:14 +00:00
test_dashboard_data.py Finish A28: Subagents and role registry implementation 2026-08-25 19:38:03 +07:00
test_data_truthfulness_and_oauth_security.py feat(state): harden snapshots quotas and routing 2026-08-21 00:03:50 +07:00
test_delete_credentials.py fix(accounts): удаление аккаунта рапортовало успех, ничего не удаляя 2026-08-24 19:17:51 +07:00
test_delete_without_provider.py fix(web): удаление аккаунта не работало из интерфейса 2026-08-24 20:19:58 +07:00
test_deployment_doctor.py feat(config): A41 чистая конфигурация при первой установке, безопасность учетных данных и сброс 2026-08-31 02:27:42 +07:00
test_grok_device_flow.py fix(grok): опрос device-flow не различал отказ, просрочку и ожидание 2026-08-24 15:11:54 +07:00
test_grok_quota.py feat(grok): подписка вместо кредитов — квота и модели заработали 2026-08-24 20:29:08 +07:00
test_health_auth_recovery.py Finish A28: Subagents and role registry implementation 2026-08-25 19:38:03 +07:00
test_import_invariants.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_import_source_contract.py feat(state): harden snapshots quotas and routing 2026-08-21 00:03:50 +07:00
test_in_app_updates_a27.py fix(ci): stop hanging hermetic tests and unblock clean/headless runners 2026-08-27 12:03:37 +00:00
test_installer.py fix(installer): установка на Linux падала на защищённом системном Python 2026-09-01 12:56:47 +07:00
test_installer_windows_and_linux.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_linux_port_paths.py feat(A15): веб-API, общий ActionExecutor и порт путей на Linux 2026-08-23 19:45:13 +07:00
test_local_llm_empty_answer.py Merge A24 (маршрутизация как центр управления) и A25 (локальная модель) 2026-08-24 14:33:16 +07:00
test_local_llm_provider_a25.py feat(a52): local models replacement, local-supervisor, and dual coder with cloud judge 2026-08-31 19:12:07 +07:00
test_memory_freshness_a47.py merge: A50 — аккаунты, обнаружение моделей и автоматическая проверка 2026-08-31 18:54:04 +07:00
test_model_choice_and_discovery.py feat(config): A41 чистая конфигурация при первой установке, безопасность учетных данных и сброс 2026-08-31 02:27:42 +07:00
test_model_validation_a23.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_multi_provider_router.py fix(profiles): пустые слоты появлялись сами, потому что запрос пути создавал каталог 2026-09-01 15:27:33 +07:00
test_native_login_registers_account.py fix(antigravity): вход через терминал не регистрировал аккаунт 2026-09-02 02:05:08 +07:00
test_oauth_lifecycle.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_openai_compatible_providers_a34.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_opencode_credentials.py fix(opencode): адаптер не читал сохранённый ключ — аккаунт не работал никогда 2026-08-23 21:45:32 +07:00
test_p0_1_dangling_handlers_and_wizard.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_p0_release_gate.py feat(hub): A34 восстановление подключения аккаунтов, OpenRouter, NVIDIA, удаление десктопа 2026-08-31 00:23:27 +07:00
test_plan_a_stabilization_and_smart_routing.py Finish A28: Subagents and role registry implementation 2026-08-25 19:38:03 +07:00
test_plugin_passthrough.py fix(plugin): отказ роутера больше не подменяет ответ модели в Hermes 2026-08-23 12:25:02 +07:00
test_provider_proxy.py feat(antigravity): выход через прокси вместо патча бинарника 2026-09-01 16:49:04 +07:00
test_readiness_counting.py fix(readiness): роль на резерве считается работающей 2026-08-24 10:19:33 +07:00
test_roadmap_features.py feat(state): harden snapshots quotas and routing 2026-08-21 00:03:50 +07:00
test_router_error_path.py fix(router): обработчик ошибок падал сам, уровень усилия не подставлялся 2026-08-24 08:51:01 +07:00
test_router_telemetry.py Finish A28: Subagents and role registry implementation 2026-08-25 19:38:03 +07:00
test_routing_control_center_a24.py Finish A28: Subagents and role registry implementation 2026-08-25 19:38:03 +07:00
test_running_build_is_visible.py fix(antigravity): терминал не открывался из-за подменённого HOME; видно работающую сборку 2026-09-01 16:04:07 +07:00
test_settings_screen_keeps_every_row.py fix(ui): настройка прокси исчезала с экрана 2026-09-02 00:30:47 +07:00
test_stale_verdict_vs_catalog.py fix(accounts): отказ проверки переживал более свежий каталог моделей 2026-09-01 14:03:56 +07:00
test_state_layer_and_event_driven_quota.py review(a57): нативный вход через agy принят с исправлениями 2026-09-01 14:54:59 +07:00
test_state_layer_contract.py Finish A28: Subagents and role registry implementation 2026-08-25 19:38:03 +07:00
test_ui_claude_grok_connection.py fix(ci): stop hanging hermetic tests and unblock clean/headless runners 2026-08-27 12:03:37 +00:00
test_ui_model_discovery_reachability.py feat(ui): A12 — компактные карточки аккаунтов, доступность причин Н/Д, упорядочивание провайдеров и тест службы моделей 2026-08-23 13:30:20 +07:00
test_ui_polling_is_silent.py fix(ui): уведомления шли без остановки и закрывали интерфейс 2026-09-01 22:47:55 +07:00
test_unified_health.py merge: A42, A45, A47, A48 — провайдеры, замеры MoE, общая память, интерфейс по макетам 2026-08-31 17:04:56 +07:00
test_updater.py feat(updater): in-app updates based on main repo release commits (A27 Pass 1) 2026-08-25 17:54:51 +07:00
test_web_api_security.py feat(A15): веб-API, общий ActionExecutor и порт путей на Linux 2026-08-23 19:45:13 +07:00
test_web_client_contract.py fix(security): токен сравнивался обычным !=, вопреки контракту 2026-08-25 10:21:40 +07:00
test_web_handlers_dom_contract.js fix(a54): validate accounts synchronously and manage Windows runtime lifecycle 2026-08-31 20:54:19 +07:00
test_web_parity_a21.py feat(integration): consolidate A28, A29 and A30 on top of origin/main with green release gate 2026-08-26 09:10:10 +07:00
test_web_snapshot_freshness.py fix(web): квоты не подтягивались — прогрев кэша и пересбор снапшота 2026-08-23 21:32:26 +07:00
test_workflow_routes_a48.js Route workflow arrows through row gaps with semantic colors 2026-08-31 16:12:00 +07:00
test_workflow_service_a30.py fix(roles): 19 агентов вместо 13, шесть пар неотличимы по названию; поиск локальных серверов 2026-08-30 20:46:25 +07:00
test_workspace_a48.js feat(ui): A48 workspace layout draft awaiting authenticated visual QA 2026-08-31 15:25:15 +07:00