4.8 KiB
docs/roadmap/TASK_014_DEPLOYMENT_DRIFT_REMEDIATION.md
Цель:
Устранить расхождение между:
- Demo Freeze v1;
- live DetMir runtime.
Проверить и внедрить в рабочий контур:
- /healthz
- /readyz
- /version
- /metrics
- request/correlation id
- Explainable KPI
- Risk Narrative
- Executive Action Center
Проверить:
- почему endpoints дают 404;
- почему browser conformance падает;
- почему Executive layer отсутствует;
- соответствует ли развернутый runtime текущему main;
- не используется ли устаревший build.
Результат:
Не добавлять новые функции.
Добиться того, чтобы:
live runtime == documented runtime
и
live runtime == Demo Freeze v1
Критерий успеха очень простой:
Сегодня:
```text
Browser smoke
FAIL
Production hardening smoke
FAIL
После задачи:
Browser smoke
PASS
Production hardening smoke
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
AWATCH_PORTAL_SMOKE_URL=http://127.0.0.1:18720 \
node scripts/awatch-production-hardening-smoke.mjs
PASS
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
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 и архитектура не менялись.
Итог
live runtime == documented runtime
live runtime == Demo Freeze v1
Browser smoke: PASS
Production hardening smoke: PASS