Зачем: корневой compose.yaml уже проверяется tests/unit/deployment.test.ts,
а pilot-файл, который реально разворачивается у владельца, — нет. В нём
подстановки вида ${STANDALONE_MANAGER_TOKEN} без :? молча дают пустое
значение, а при пустых токенах standalone выдаёт права анониму (F2);
NODE_ENV=development в pilot отключает production-проверки config.ts.
- PILOT-1: каждая подстановка должна быть ${VAR:?сообщение};
- PILOT-2: ни один сервис не с NODE_ENV=development;
- PILOT-3: у app нет учётных данных мигратора (сейчас зелёный).
Файл в tests/e2e как *.e2e.ts: tests/unit вне разрешённых путей, а
красные пункты (дефекты deploy/, которые правят исполнители) идут через
known-defects.json и не ломают `npm run check`. Сейчас PILOT-1 и PILOT-2
красные: 14 подстановок без :?, app с NODE_ENV=development.
32 lines
3.1 KiB
JSON
32 lines
3.1 KiB
JSON
{
|
||
"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 принимает курсор больше выданного сервером",
|
||
"PILOT-1": "deploy/pilot/compose.yaml: 14 подстановок без :? (пустые токены/пароли молча проходят)",
|
||
"PILOT-2": "deploy/pilot/compose.yaml: app с NODE_ENV=development"
|
||
}
|
||
}
|