hermes-hub/tests
Hermes Team 7e83c38340 perf(antigravity): из десяти аккаунтов одновременно работал один
В adapters/antigravity_adapter.py жил модульный _AGY_INVOCATION_LOCK, общий
для ВСЕХ профилей Antigravity. Он брался при каждом вызове, у которого есть
учётные данные, то есть при каждом рабочем. Ветка без мьютекса срабатывала
только у профиля без учётки — у вызова, который и так упадёт.

Измерено на живом адаптере: три параллельных вызова по одной секунде
занимали 3.01 с. При десяти подключённых аккаунтах одновременно работал ровно
один, чем обесценивалась вся мультиаккаунтность — то, ради чего хаб и делался.

Мьютекс охранял пустоту. Он был введён в 50fde5f со словами «guarded global
gemini:antigravity credential swap ... to eliminate concurrent subprocess
race», когда подмена учётных данных была ГЛОБАЛЬНОЙ. С тех пор она стала
попрофильной: agy_subprocess пишет в profile_dir/.gemini/oauth_creds.json, а
HOME, USERPROFILE, HOMEPATH и HOMEDRIVE подменяются на каталог профиля.
Общего состояния между профилями не осталось — проверено поиском глобальных
путей и обращений к keyring, их нет.

После снятия: те же три вызова занимают 1.00 с, и каждый идёт со своим HOME
(ag-w1, ag-w2, ag-w3) — изоляция не пострадала.

Ограничение одновременности остаётся за LeaseManager: он считает лизы по
профилю и настраивается через max_concurrency, в том числе значением 1 для
локальных моделей с --parallel 1.

Добавлен тест, удерживающий это свойство: он падает, если вызовы разных
профилей снова начнут сериализоваться. Существующий тест изоляции учётных
данных проходит без изменений.

Найдено при разборе анализа, который Antigravity провёл на сервере владельца
(hermes-muliacount). 459 passed, ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 20:04:52 +07:00
..
fixtures fix(installer): ошибка 12 при установке — проверка требовала конфигурацию от 20 августа 2026-08-24 09:35:36 +07:00
conftest.py Fix UI test instability and clarify contract boundaries 2026-08-23 18:27:07 +07:00
test_a9_migration_quotas_models.py feat(router): integrate local LLM provider (llama.cpp/vLLM/Ollama) with zero quotas (A25) 2026-08-24 14:00:25 +07:00
test_account_modal_refresh.py fix(web): окно аккаунта не обновлялось и застревало на заглушке 2026-08-24 20:40:13 +07:00
test_accounts_distribution_and_thresholds_a26.py feat(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +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_agy_native_login.py feat(antigravity): implement native agy login, profile isolation, and protect global ~/.gemini (A22) 2026-08-23 23:57:57 +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_codex_opencode_wizard.py fix(ui): repair startup crash in TeamView and tighten the headless guard 2026-08-20 23:22:19 +07:00
test_credential_isolation.py feat(security): isolate subprocess credentials, implement selection explanation matrix, and resolve installer registry isolation 2026-08-21 10:17:19 +07:00
test_dashboard_data.py fix(dashboard): unify LeaseManager, warm up initial CPU measurement, add live network speed, and clarify YAML comment support 2026-08-21 22:18:59 +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(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +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 feat(router): profile auth self-healing, honest model validation, and manual model refresh (A23) 2026-08-24 02:02:28 +07:00
test_import_invariants.py style: normalize merged state tests 2026-08-21 00:11:16 +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(updater): проверка обновлений не доходила до интерфейса; непроверенный файл запускался 2026-08-25 18:31:52 +07:00
test_installer.py feat(security): isolate subprocess credentials, implement selection explanation matrix, and resolve installer registry isolation 2026-08-21 10:17:19 +07:00
test_installer_windows_and_linux.py feat(installer): самодостаточный exe для Windows 2026-08-24 09:21:08 +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 Merge A24 (маршрутизация как центр управления) и A25 (локальная модель) 2026-08-24 14:33:16 +07:00
test_model_choice_and_discovery.py feat(router): A18 — выбор модели, действие set_model, персистентный кэш и выбор в веб-клиенте 2026-08-23 22:08:08 +07:00
test_model_validation_a23.py feat(router): profile auth self-healing, honest model validation, and manual model refresh (A23) 2026-08-24 02:02:28 +07:00
test_multi_provider_router.py feat(router): integrate local LLM provider (llama.cpp/vLLM/Ollama) with zero quotas (A25) 2026-08-24 14:00:25 +07:00
test_oauth_lifecycle.py feat(web): вход Antigravity и Claude из браузера на любой машине 2026-08-25 09:52:53 +07:00
test_opencode_credentials.py fix(opencode): адаптер не читал сохранённый ключ — аккаунт не работал никогда 2026-08-23 21:45:32 +07:00
test_p0_release_gate.py fix: update canonical installer with dependency resolution and close release blockers 2026-08-20 18:17:08 +07:00
test_plan_a_stabilization_and_smart_routing.py feat(antigravity): implement native agy login, profile isolation, and protect global ~/.gemini (A22) 2026-08-23 23:57:57 +07:00
test_plugin_passthrough.py fix(plugin): отказ роутера больше не подменяет ответ модели в Hermes 2026-08-23 12:25:02 +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 feat(telemetry): implement empirical call telemetry, metrics aggregates, user pricing, and update state contract 2026-08-21 16:57:57 +07:00
test_routing_control_center_a24.py feat(web): routing control center with drag-and-drop, inline models, and 7-view navigation (A24) 2026-08-24 10:53:57 +07:00
test_state_layer_and_event_driven_quota.py feat(release): close contract audit v1.2, release feed verification, diagnostic CLI, and failover event logging 2026-08-21 10:05:30 +07:00
test_state_layer_contract.py feat(state): harden snapshots quotas and routing 2026-08-21 00:03:50 +07:00
test_ui_claude_grok_connection.py fix(A15): восстановить десктоп и починить веб-API 2026-08-23 19:54:29 +07:00
test_ui_contract_v11.py Fix UI test instability and clarify contract boundaries 2026-08-23 18:27:07 +07:00
test_ui_design_system.py refactor(ui): centralize design tokens and complete the component library 2026-08-20 23:35:10 +07:00
test_ui_mockup_redesign.py Fix UI test instability and clarify contract boundaries 2026-08-23 18:27:07 +07:00
test_ui_model_discovery_reachability.py feat(ui): A12 — компактные карточки аккаунтов, доступность причин Н/Д, упорядочивание провайдеров и тест службы моделей 2026-08-23 13:30:20 +07:00
test_ui_phase2_6.py Fix UI test instability and clarify contract boundaries 2026-08-23 18:27:07 +07:00
test_ui_refinement.py fix(router): address review findings B1-B4 and S1-S9 with full regression suite 2026-08-20 17:04:49 +07:00
test_ui_routing_graph.py A17: Implement real network verification for profile test and update status snapshot 2026-08-23 22:13:24 +07:00
test_ui_screenshot_harness.py feat(ui): implement approved three-theme mockup redesign 2026-08-21 19:06:46 +07:00
test_ui_wizard_finish.py Fix UI test instability and clarify contract boundaries 2026-08-23 18:27:07 +07:00
test_unified_health.py feat(router): integrate local LLM provider (llama.cpp/vLLM/Ollama) with zero quotas (A25) 2026-08-24 14:00:25 +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_view_startup_contract.py test(ui): keep the startup guard assertion after views stopped reading the store 2026-08-21 08:47:59 +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_parity_a21.py feat(web): routing control center with drag-and-drop, inline models, and 7-view navigation (A24) 2026-08-24 10:53:57 +07:00
test_web_snapshot_freshness.py fix(web): квоты не подтягивались — прогрев кэша и пересбор снапшота 2026-08-23 21:32:26 +07:00