WEB-352 · Задача · — · web
Gate C shadow телеметрия: endpoint admin-gated — записи обычных юзеров не доходят (403)
Закрыт
P1 · важно
ведёт: —
Суть
Роут /api/admin/document-session/gatec-shadow-telemetry требует requireAdmin() (ADMIN_EMAILS): любой не-админ получает 403 forbidden, т.е. клиентская shadow-телеметрия W1 НЕ собирается с реальных пользователей — только с админов. Это второй корень «0 записей» после краша WEB-347.
Обход 24.08: qa-mailprobe-l43@wool2.online добавлен в ADMIN_EMAILS (.env.local, бэкап .env.local.bak-l49probe) — записи пошли (168→171).
Решить: (а) осознанно оставить сбор только с QA/админов на фазу shadow W1, задокументировав; или (б) открыть endpoint аутентифицированным пользователям с rate-limit и схемной валидацией (валидация уже есть в gatec-shadow-telemetry-jsonl-writer.ts). Код: route.ts (requireAdmin → role eligible/ineligible), receiveGateCShadowTelemetryBatch 403-ветка.
Связки: WEB-347 (краш, закрыт l49), волна GATEC-TELEMETRY-W2 (анализ записей), EditorModal mirrorGateCShadowW2.
Доказательства
[2026-08-25 ~12:05] ПОСАДКА 49 (l53) СЕЛА: прод v4-70ab8c1 (l48-salvage + Gate D port fa58f4e + WEB-352 70ab8c1), артефакт sha 2be7aba1 (171918242Б), аттестация подписана координатором ЛОКАЛЬНО (make-activation-attestation.mjs на ноуте, все хеши детерминированно сошлись с l52), paidReady=true, attestation.ok=true, migrations ok. Хроника флипа: попытка 1 упала (sed задвоил WorkingDirectory и путь server.js в inner-скрипте) → авто-откат на l52 отработал (прод зелёный через секунды) → точечный фикс путей → попытка 2: PAID_READY за 5с. Суммарный простой ~3 мин. Автодокладка в сейф: артефакт l53 в Hetzner app-artifact/ (теперь 2 версии, политика keep-3). Фикс живой: эндпоинт принимает телеметрию любой аутентифицированной сессии; live-негатив: анонимный POST → 401 (проверено на проде). Позитивный live-пруф (маячок обычного юзера) появится с первым не-админским пользователем редактора; юнит+негатив тесты в сборке. → done.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-352","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-25T01:03:58.707Z