# Antigravity: вход в консоль по логину и паролю — только для тестов

## Когда начинать

**После слияния PR #59** с веб-консолью. До этого задание не берут: входить будет некуда.

## Репозиторий

- https://github.com/ochenstarik-ui/server-monitor-manager
- База: актуальный `main` после слияния #59; зафиксируйте хеш в отчёте
- Ветка: `antigravity/password-login`
- `main` защищён: PR обязателен, обязательны статусы `build-and-test` и `build`
- один PR — одна тема; описание PR заполняется **после** завершения CI

## Задача

Владелец просит вход в консоль по логину и паролю, чтобы не возиться с клиентскими сертификатами во время тестирования.

Просьба законная, но это второй, заведомо более слабый путь аутентификации рядом с mTLS, на котором держится вся модель доступа. Он не должен незаметно стать основным — так происходит всегда, если не помешать этому сразу.

## Обязательные условия

1. **Выключен по умолчанию.** Включается явным параметром конфигурации, имя которого само говорит о назначении, например `Authentication:PasswordLogin:EnabledForTesting`.
2. **При включённом флаге Control пишет предупреждение в лог при каждом старте**, а не один раз при первой настройке.
3. **Пароль хранится подбор-стойким хешем** — Argon2id или bcrypt. Не в конфигурации открытым текстом, не быстрым хешем.
4. **Ограничение частоты попыток и задержка после неудач.** В проекте уже есть политика `"enrollment"` в `Program.cs` — посмотрите, как это сделано, и не изобретайте своё.
5. **Сессия ограничена по времени.**
6. **Роль — `Operator` и не выше.** Доступ к операциям `Automation` и `KAgentIntegration` через пароль не открывается ни при каком значении конфигурации.
7. **Проверка mTLS не ослабляется ни в одной ветке кода.** Если включены оба механизма, сертификат имеет приоритет.

## Тесты

- при выключенном флаге вход по паролю недоступен, соответствующие маршруты отвечают отказом;
- при включённом флаге успешный вход даёт роль `Operator` и только её;
- пароль от `Operator` не открывает маршруты `Automation`;
- неверный пароль неотличим по времени ответа от неизвестного пользователя;
- превышение числа попыток приводит к отказу;
- клиентский сертификат продолжает работать при обоих значениях флага.

## Границы

Codex ведёт `deploy/**`, релизный пайплайн и проверку релиза. **Не трогать:** `deploy/**`, `.github/workflows/linux-*.yml`, `.github/workflows/release-verification.yml`, `tests/release-verification/**`, `tests/bootstrap/**`.

Ваша область: `src/ServerMonitorManager.Control/**`, консоль, `tests/ServerMonitorManager.Control.Tests/**`.

## Критерий приёмки

- выключено по умолчанию, включается явным флагом;
- предупреждение в логе при каждом старте с включённым флагом;
- пароль хранится подбор-стойким хешем;
- роль ограничена `Operator`;
- mTLS не ослаблен;
- перечисленные тесты присутствуют и проходят;
- PR, CI зелёный, PR не смержен до зелёного.

## Отчёт

В описании PR, раздельно: что проверено локально, что в CI со ссылками на прогоны, что не проверялось и почему.
