{ "comment": "ID сценариев, красный цвет которых сейчас ожидаем (открытые дефекты или ещё не реализованные решения владельца). Когда дефект исправлен и все тесты ID зелёные, scripts/test/run-e2e.mjs падает, пока ID не убран отсюда. Добавлять ID сюда можно только вместе с записью в REPORT.md.", "defects": { "N1": "POST /employees: 42P08 inconsistent types for $2 на реальной PostgreSQL", "N2": "подтверждение смены / расчёт / утверждение: staff_outbox.occurred_at NULL (23502)", "N3": "SSRF через push-endpoint на внутренние адреса", "N4": "двойное начисление при пересекающихся расчётах (сейчас блокирован N2)", "N9": "перепривязка чужого push-endpoint", "N10": "справочники доступны терминалу", "N11": "импорт с неверным kind → 500", "N12": "pay-assignment без additionalProperties:false и верхних границ", "F2": "standalone без токенов даёт права STANDALONE_ACCESS анониму", "F3": "cookie = сырой токен, logout не отзывает", "F4": "нет rate limit на вход", "F7": "Idempotency-Key не используется", "F10": "CSRF: мутации по cookie без Origin разрешены", "SYNC-A": "устройство само подтверждает смену через upsert_work_session", "SYNC-B": "устройство само утверждает табель через upsert_timesheet_entry", "SYNC-C0": "начальная загрузка /sync/pull падает 500: column status does not exist (staff_org_units)", "SYNC-C": "начальная загрузка обрезается на 100 сущностях (сейчас также блокирована SYNC-C0)", "SYNC-D": "изменения из портала не пишутся в staff_sync_change_log", "SYNC-E": "отметки уволенных сотрудников принимаются через sync", "SYNC-F": "sync не сохраняет org_unit_id отметки и принимает чужую точку", "SYNC-G": "одна битая команда роняет весь пакет (500)", "SYNC-H": "регистрация устройства по cookie без проверки Origin", "SYNC-I": "без токенов анонимно регистрируется устройство", "SYNC-J": "sync принимает отметки вне окна времени", "SYNC-K": "ack принимает курсор больше выданного сервером" } }