hermes-hub/agents/inbox/2026-08-31-A41-clean-first-install.md
Hermes Team e6bbd60a36 docs(agents): задание A41 — чистая конфигурация при первой установке
Установка на Windows упала с кодом 12, и причина была не в новом коде, а в
накопленном состоянии: конфигурация тащила роль под старым именем, роли без
цепочек и 24 пустых заготовки, переживших несколько переименований. Проверка
споткнулась о наследие.

Владелец сформулировал вывод: при первой установке всё должно начинаться с
нуля — сначала аккаунты, потом распределение по агентам.

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

Отдельным пунктом, из-за цены ошибки: сброс касается только маршрутизации.
Каталог agy_profiles не затрагивается ни при каких условиях — потеря учётных
данных означает повторный ручной вход в два десятка аккаунтов, включая
Antigravity со входом по ссылке для каждого профиля.

Требуется также прогнать проверочный скрипт установщика на ПУСТОЙ
конфигурации: он этого случая никогда не видел, у него всегда было 24
профиля, и падение на чистой машине дало бы тот же код 12 новому
пользователю.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 02:07:19 +07:00

126 lines
11 KiB
Markdown
Raw Permalink 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.

# Задание A41: чистая конфигурация при первой установке
## Дата поступления
2026-08-31
## База
`origin/main` (`380c218`) — там уже слиты A34A39 и правки ревьюера.
```
git fetch origin --prune
git checkout -b antigravity/a41-clean-first-install origin/main
```
В `main` напрямую не пушить.
## Порядок исполнения
Два прохода: **Flash** реализует, **Pro** проводит аудит. Пункт **P0-5** написан для аудитора.
---
## Задача
Владелец: «при первой установке всё должно быть сброшено по умолчанию, и настройка идёт с нуля. Как внёс аккаунты, потом распределяешь. Чтобы не было таких ошибок».
Повод конкретный. Сегодня установка на Windows упала с кодом 12, и причина была не в новом коде, а в **накопленном состоянии**: конфигурация тащила роль под старым именем, роли без цепочек и два десятка пустых заготовок, переживших несколько переименований. Проверка споткнулась о наследие.
## Что известно проверенно
```
get_default_router_config() создаёт 24 профиля:
antigravity 10, openai-codex 3, opencode-go 3, claude 3, grok 3, local 2
из них у владельца реально подключены единицы; остальные показывались как
«Аккаунт не добавлен» и «Холодный резерв», пока A26 не убрал их с экрана
install-linux.sh: «Preserving existing user router_profiles.yaml»
учётные данные лежат ОТДЕЛЬНО, в ~/.hermes/agy_profiles/, вне каталога плагина
```
Последнее — ключевое для этого задания, см. P0-2.
---
## P0-1. Первая установка начинается с пустого листа
Различать два случая и вести себя по-разному:
**Конфигурации нет** — это первая установка. Не создавать 24 заготовки. Роли из реестра объявлены, но **цепочки пусты**, профилей нет вовсе. Интерфейс показывает состояние «аккаунтов нет» и предлагает подключить первый.
**Конфигурация есть** — это обновление. Ничего не трогать, как сейчас. У владельца на трёх машинах живут настроенные цепочки, и молчаливый сброс недопустим.
Различать по наличию файла, а не по версии: версия в проекте заморожена на `0.1.1` намеренно.
## P0-2. Учётные данные не трогать никогда
Отдельным пунктом, потому что цена ошибки высока.
Сброс касается **только конфигурации маршрутизации**: `router_profiles.yaml`. Каталог `~/.hermes/agy_profiles/` и содержимое `hub_settings.json` в части токенов **не затрагиваются ни при каких условиях**.
Потеря учётных данных означает повторный вход в два десятка аккаунтов, включая Antigravity, где вход идёт по ссылке с возвратом и делается вручную для каждого профиля. Это часы работы владельца.
Защита каталогов учётных данных уже реализована в A37 (`security_guard.py`) — использовать её, а не писать вторую.
## P0-3. Профили появляются вместе с аккаунтами
Продолжение линии A26: аккаунты вместо слотов.
1. Подключение аккаунта **создаёт профиль**. Заранее заготовленных пустых профилей быть не должно.
2. Идентификатор выдаётся сам, как уже сделано в A26 (`codex-4`, `codex-5` и далее). Владелец про них знать не обязан.
3. Роль получает аккаунт, когда владелец его назначил или нажал «Авто». До этого цепочка пуста, и это **нормальное состояние**, а не ошибка.
## P0-4. Явный сброс по кнопке
В «Настройках» — «Начать настройку заново».
1. **Спрашивает подтверждение** и прямо перечисляет, что будет удалено, а что сохранено. Учётные данные — в списке сохраняемого.
2. Чистит цепочки ролей и профили, не трогая аккаунты.
3. **Резервная копия перед сбросом**, чтобы ошибочное нажатие можно было отменить. Механизм резервных копий конфигурации в проекте уже есть.
4. После сброса хаб работоспособен: интерфейс открывается, показывает пустое состояние, предлагает подключить аккаунт.
## P0-5. Проверки установщика не должны зависеть от расстановки
Сегодняшняя поломка возникла именно здесь, и это надо закрыть на будущее.
`scripts/verify_multi_provider_router.py` уже переписан ревьюером: имя оркестрирующей роли спрашивается у реестра, пустые цепочки допустимы у ролей без аккаунтов, отказоустойчивость проверяется по механизму, а не по зашитому порядку.
Требуется убедиться, что скрипт проходит **на пустой конфигурации первой установки**. Сейчас он этого случая не видел: у него всегда было 24 профиля. Проверка, падающая на чистой машине, снова даст код 12 — только теперь у нового пользователя.
## P0-6. Аудит вторым проходом
1. **Проверить на копии конфигурации владельца**, что обновление ничего не сбрасывает. Цепочки и порядок аккаунтов обязаны совпасть до и после.
2. **Проверить, что учётные данные целы** после сброса: файлы в `agy_profiles/` на месте, аккаунты по-прежнему подключены.
3. **Установить начисто** в пустой `HERMES_HOME` и пройти путь целиком: установка, открытие интерфейса, подключение аккаунта, назначение роли.
4. **Проверочный скрипт установщика** прогнать и на пустой конфигурации, и на конфигурации владельца.
5. **Побочные изменения** объяснить.
6. **Пропущенный пункт назвать пропущенным.**
---
## Ограничения
- Учётные данные не удалять и не переносить ни при каких условиях.
- Обновление поверх существующей установки ничего не сбрасывает.
- Версию `0.1.1` не поднимать: сборки различаются коммитом.
- Правило честности без исключений: пустое состояние показывать как пустое, а не как ошибку.
## Критерии приёмки
1. Ветка в `origin`, `git status` чист.
2. Установка в пустой `HERMES_HOME` даёт конфигурацию без предсозданных профилей; интерфейс показывает внятное пустое состояние.
3. Обновление поверх конфигурации владельца не меняет ни одной цепочки; проверено на копии, вывод приложен.
4. Подключение аккаунта создаёт профиль; заранее заготовленных пустых нет.
5. Кнопка сброса спрашивает подтверждение, перечисляет сохраняемое, делает резервную копию и не трогает учётные данные; проверено.
6. `verify_multi_provider_router.py` проходит и на пустой конфигурации, и на конфигурации владельца; оба вывода приложены.
7. Путь целиком пройден вручную на чистой установке: подключение аккаунта, назначение роли, работа маршрутизации.
8. `ruff check .` чисто; релизный гейт не ухудшен.
9. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, `X passed / Y skipped / Z failed`. На `main` сейчас **486 passed**.
## Главное
Сегодняшняя ошибка установки возникла не из-за нового кода, а из-за состояния, накопленного за десяток версий. Чистый старт убирает целый класс таких поломок: новый пользователь получает пустую систему и заполняет её сам, а не разбирается с двумя десятками заготовок, часть из которых помнит переименования полугодовой давности.
## Порядок сдачи
Передать точный `FINAL_COMMIT_SHA`.