server-monitor-manager/agents/_accepted/2026-08-19-console-links/task.md
Ochenstarik 771c252e79 chore(agents): приёмка PR #63 и задание Codex по cosign
Пара «задание — разбор» по PR #63 перенесена в agents/_accepted/ с
основанием приёмки и перечнем того, чего приёмка не доказывает: тесты
главным агентом не запускались, на машине приёмки нет .NET SDK.

Задание Codex требует определить версию cosign у installer 4.1.2, сойтись
с потребителем по формату подписи и предъявить прогон релизного пути с
перечнем шагов, пропущенных при репетиции.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 00:11:33 +07:00

78 lines
7.6 KiB
Markdown
Raw 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.

# Antigravity: управление Links и журнал событий в веб-консоли
## Репозиторий
- https://github.com/ochenstarik-ui/server-monitor-manager
- База: `main` @ `7c43977`
- Ветка: `antigravity/console-links`
- `main` защищён: PR обязателен, обязательны статусы `build-and-test` и `build`, force-push запрещён
- один PR — одна тема; описание PR заполняется **после** завершения CI
- отчёт — раздел в описании PR; отдельным файлом отчёт не является
## Задача
Консоль сейчас показывает узлы и Links и выдаёт коды регистрации. Создать Link или отключить его из неё нельзя.
Links — это главная функция продукта: направленный доступ от одного узла к другому по протоколу и порту, с ограниченным сроком жизни и возможностью мгновенно отозвать. Пока их нельзя ни выдать, ни отозвать из интерфейса, продуктом в его основном назначении пользоваться невозможно — только руками через API с клиентским сертификатом.
**Новых эндпоинтов не требуется, все нужные уже есть.** Работа целиком в консоли.
## Что использовать
| Действие | Эндпоинт |
|---|---|
| Список | `GET /api/v1/control/links` |
| Создать | `POST /api/v1/control/links` |
| Отключить | `POST /api/v1/control/links/{id}/disable` |
| Журнал | `GET /api/v1/control/events` |
Тело создания — `LinkPolicyCreateRequest`: `SourceNodeId`, `TargetNodeId`, `Protocol`, `Port`, `TtlMinutes`, `Reason`, `IdempotencyKey`. Отключение — `LinkPolicyDisableRequest` с `IdempotencyKey`.
## Требования
**1. Показывать желаемое и фактическое раздельно.** `LinkPolicy` содержит `DesiredState`, `ActualState` и `LastError`. Расхождение между желаемым и фактическим — не деталь реализации, а суть системы: правило может быть заказано, но ещё не применено на узле, или примениться с ошибкой. Схлопывать оба поля в один значок «активно» нельзя. Расхождение должно быть заметно само, без вчитывания, и `LastError` показывается, когда он есть.
**2. Создание — с явным подтверждением направления.** Link открывает сетевой доступ. Перед отправкой показать человеку одной строкой, что именно произойдёт: «с узла A к узлу B, протокол, порт, на N минут». Направленность — свойство модели, и перепутанные местами источник и цель дают работающее правило, открывающее доступ не туда.
**3. `Reason` обязателен и осмысленный.** Он идёт в журнал и остаётся единственным следом того, зачем доступ открывали. Пустое поле или пробел не принимать.
**4. Отключение — быстрое и заметное.** Это аварийный рычаг: когда он нужен, его ищут в спешке. Действие доступно из строки списка, без перехода на другую страницу, и подтверждается одним шагом.
**5. `IdempotencyKey` генерируется на клиенте** и не повторяется между разными операциями. При повторной отправке той же формы, например по второму нажатию кнопки или после потери связи, ключ остаётся прежним, чтобы не создать два правила вместо одного.
**6. Срок жизни виден.** Для каждого Link показать, когда он истекает, а не только `TtlMinutes`, заданный при создании.
**7. Журнал событий.** Отдельный раздел со списком из `GET /events`: что произошло, с каким узлом, когда. Достаточно чтения, фильтры не требуются.
**8. Ошибки сервера показывать текстом.** Если создание отклонено проверкой, оператор должен увидеть причину, а не молчаливое ничего.
## Чего не делать
- не добавлять эндпоинты в Control: всё нужное существует;
- не трогать выдачу кодов регистрации и вход по паролю — они уже работают;
- не добавлять операций, которых нет в списке выше: удаление узлов, перезапуск служб, правка сертификатов в консоль пока не входят.
## Границы
Codex ведёт `deploy/**`, релизный пайплайн и проверку релиза. **Не трогать:** `deploy/**`, `.github/workflows/**`, `tests/bootstrap/**`, `tests/release-verification/**`.
Ваша область: `src/ServerMonitorManager.Control/wwwroot/**`, `tests/ServerMonitorManager.Control.Tests/**`. Правки в `src/ServerMonitorManager.Control/Program.cs` допустимы, только если без них не обойтись, — опишите зачем.
## Тесты
Существующие проверки консоли должны продолжать проходить: анонимный доступ отклонён, роли `Agent` и `Automation` запрещены, ассеты отдаются из ресурсов сборки при отсутствии `wwwroot` на диске.
Добавить проверку, что разметка консоли содержит элементы управления Links и раздел журнала, — по образцу существующего `WebConsoleHtmlContainsRequiredUiElementsAndWarning`.
## Критерий приёмки
- из консоли можно создать Link и отключить его;
- желаемое и фактическое состояние показаны раздельно, `LastError` виден при наличии;
- перед созданием показано направление, порт и срок одной понятной строкой;
- `Reason` обязателен, пустой не принимается;
- `IdempotencyKey` генерируется клиентом и устойчив к повторной отправке;
- виден момент истечения каждого Link;
- есть раздел журнала событий;
- ошибки сервера показываются текстом;
- новых эндпоинтов в Control не появилось;
- PR, CI зелёный, PR не смержен до зелёного.