ops: remediate deployment drift

This commit is contained in:
igor04091968
2026-06-07 22:00:41 +03:00
parent c751035374
commit 8310bc3616
4 changed files with 196 additions and 84 deletions
@@ -63,3 +63,102 @@ PASS
```
на живом контуре.
## Выполнение
Дата выполнения: 2026-06-07.
Статус: выполнено.
### Причина drift
Рабочий portal runtime на gateway host был запущен из устаревшего release
binary. Из-за этого live-контур не соответствовал Demo Freeze v1:
* production-hardening endpoints `/healthz`, `/readyz`, `/version`,
`/metrics` возвращали `404`;
* отдельные API `/portal/api/workforce/kpi/explain`,
`/portal/api/risk/narrative`, `/portal/api/actions` возвращали `404`;
* request/correlation headers отсутствовали на live API;
* browser conformance smoke видел старый Executive/Workforce/Security слой.
Кодовая база при этом уже содержала нужные контракты и UI-блоки. Проблема была
не в архитектуре и не в отсутствующем функционале, а в несовпадении deployed
binary с freeze-срезом.
### Ремедиация
Выполнен controlled deploy актуального release binary на gateway host:
* старый бинарник сохранен в backup-каталог на gateway host;
* новый release binary собран из текущей freeze-ветки;
* бинарник установлен в штатный путь portal service;
* `detmir-portal.service` перезапущен;
* rollback path сохранен через backup старого бинарника.
В репозиторий не добавлялись runtime payload, реальные logs, screenshots с
живыми данными, IP-адреса, hostname, логины, ФИО или подразделения.
### Live endpoint matrix после ремедиации
Проверено через gateway-local portal port:
| Endpoint | Результат |
| --- | --- |
| `/healthz` | `200` |
| `/readyz` | `200` |
| `/version` | `200` |
| `/metrics` | `200` |
| `/portal/api/health` | `200` |
| `/portal/api/reports?role=executive` | `200` |
| `/portal/api/workforce/kpi/explain` | `200` |
| `/portal/api/risk/narrative` | `200` |
| `/portal/api/actions` | `200` |
Также подтверждено:
* `X-Request-Id` возвращается;
* `X-Correlation-Id` возвращается;
* внешний gateway `/healthz` отвечает `200`;
* внешний `/portal/` остается закрыт авторизацией;
* свежий scan journal не показал panic, HTTP 500 или явных timeout.
### Smoke results
```text
AWATCH_PORTAL_SMOKE_URL=http://127.0.0.1:18720 \
node scripts/awatch-production-hardening-smoke.mjs
PASS
```
```text
AWATCH_BROWSER_SMOKE_URL=http://127.0.0.1:18720/portal/ \
AWATCH_BROWSER_SMOKE_ARTIFACT_DIR=/tmp/awatch-live-remediation-browser-smoke \
node scripts/browser-conformance-smoke.mjs
PASS
```
```text
DETMIR_PORTAL_SMOKE_URL=http://127.0.0.1:18720/portal/ \
node scripts/detmir-portal-tabs-smoke.mjs
PASS
```
### Test harness hardening
`scripts/browser-conformance-smoke.mjs` был усилен: после переключения роли он
ожидает фактические маркеры контента в `#content`, а не делает снимок через
фиксированную короткую задержку. Это устраняет ложный FAIL на холодной
асинхронной загрузке Executive/Security views.
Продуктовая бизнес-логика, API contracts, роли, scoring, collectors и
архитектура не менялись.
### Итог
```text
live runtime == documented runtime
live runtime == Demo Freeze v1
Browser smoke: PASS
Production hardening smoke: PASS
```