Зачем: TASK-GROK-2 §3 — денежные дефекты K6–K9, S9, A4 и дата расчёта были в AUDIT.md, но не покрыты стендом; без красных сценариев исправления Codex нечем принимать. Что (tests/e2e/50-money-and-errors.e2e.ts, всё красное и внесено в known-defects.json): - K6/D5: отклонение смены из подписанной ведомости → 409 или сторно. Сейчас падает на предусловии: подтверждение смены 500 (K3). - K7/D2: две записи начисления за один день (две точки) и повторный импорт с другой суммой → итог = сумма по книге. Факт: 22200 вместо 33300. - K8/D1: после подписи меняется ставка, затем проверочный пересчёт (предполагаемый контракт C4 GET /payroll/runs/:id/verify). Блокирован K3. - K9/D3: официант по пресету waiter_upsell: params.shift_rate_minor не сохраняется (сам D3, до K3); далее начисление = оплата смены (после K3). - S9: удаление точки с устройством мигратором → 23502 вместо удаления или 23503 (публичного API удаления нет — так же, как в live-sync.mjs владельца). - A4: тела 500 не должны содержать SQLSTATE и текст PostgreSQL. - N12-DATE: month=2026-13 → 400 (факт 500, 22008); 2026-02-30 уже 400. Прогон run-e2e: 45 red / 9 green, храповик OK.
50 lines
5.5 KiB
JSON
50 lines
5.5 KiB
JSON
{
|
||
"comment": "ID сценариев, красный цвет которых сейчас ожидаем (открытые дефекты или ещё не реализованные решения владельца). Когда дефект исправлен и все тесты ID зелёные, scripts/test/run-e2e.mjs падает, пока ID не убран отсюда. Добавлять ID сюда можно только вместе с записью в REPORT.md. Ключи — двойные ID «владелец/мой» (docs/audit/2026-09-26/AUDIT.md и TASK-GROK-2 §2), для сценариев без ID владельца — мой ID.",
|
||
"defects": {
|
||
"K4/N1": "POST /employees: 42P08 inconsistent types for $2 на реальной PostgreSQL",
|
||
"K3/N2": "подтверждение смены / расчёт / утверждение: staff_outbox.occurred_at NULL (23502)",
|
||
"K12/N3": "SSRF через push-endpoint на внутренние адреса",
|
||
"K5/N4": "двойное начисление при пересекающихся расчётах (сейчас блокирован N2)",
|
||
"N9": "перепривязка чужого push-endpoint",
|
||
"N10": "справочники доступны терминалу",
|
||
"N11": "импорт с неверным kind → 500",
|
||
"N12": "pay-assignment без additionalProperties:false и верхних границ",
|
||
"K1/F2": "standalone без токенов даёт права STANDALONE_ACCESS анониму",
|
||
"K10/F3": "cookie = сырой токен, logout не отзывает",
|
||
"K11/F4": "нет rate limit на вход",
|
||
"F7": "Idempotency-Key не используется",
|
||
"F10": "CSRF: мутации по cookie без Origin разрешены",
|
||
"K13/SYNC-A": "устройство само подтверждает смену через upsert_work_session",
|
||
"K13/SYNC-B": "устройство само утверждает табель через upsert_timesheet_entry",
|
||
"SYNC-C0": "начальная загрузка /sync/pull падает 500: column status does not exist (staff_org_units)",
|
||
"S5/SYNC-C": "начальная загрузка обрезается на 100 сущностях (сейчас также блокирована SYNC-C0)",
|
||
"S5/SYNC-D": "изменения из портала не пишутся в staff_sync_change_log",
|
||
"S4/SYNC-E": "отметки уволенных сотрудников принимаются через sync",
|
||
"S4/SYNC-F": "sync не сохраняет org_unit_id отметки и принимает чужую точку",
|
||
"S3/SYNC-G": "одна битая команда роняет весь пакет (500)",
|
||
"S8/SYNC-H": "регистрация устройства по cookie без проверки Origin",
|
||
"K1/SYNC-I": "без токенов анонимно регистрируется устройство",
|
||
"S2/SYNC-J": "sync принимает отметки вне окна времени",
|
||
"SYNC-K": "ack принимает курсор больше выданного сервером",
|
||
"K1/PILOT-1": "deploy/pilot/compose.yaml: 14 подстановок без :? (пустые токены/пароли молча проходят)",
|
||
"K2/PILOT-2": "deploy/pilot/compose.yaml: app с NODE_ENV=development",
|
||
"D6/OWN-01": "решение владельца: роли точки (этап 4 Codex)",
|
||
"D6/OWN-02": "решение владельца: пакет отправляет только бухгалтер",
|
||
"OWN-03": "решение владельца: уведомления директорам",
|
||
"OWN-04": "решение владельца: подписывает только директор",
|
||
"OWN-05": "решение владельца: ledger пуст до подписи",
|
||
"OWN-06": "решение владельца: подпись → ledger, неизменяемость",
|
||
"K19/OWN-07": "решение владельца: изменение смены после отправки возвращает пакет",
|
||
"OWN-08": "решение владельца: возврат с комментарием",
|
||
"OWN-09": "решение владельца: смена в чужой точке идёт в зарплату той точки",
|
||
"K17/OWN-10": "решение владельца: нет согласия на биометрию → регистрация запрещена",
|
||
"K17/OWN-11": "решение владельца: отзыв согласия меняет статус для терминала",
|
||
"K6/D5": "отклонение смены из подписанной ведомости: 200 без сторно (сейчас блокирован K3 на подтверждении)",
|
||
"K7/D2": "повторный импорт книги теряет суммы: две точки в один день → 222,00 вместо 333,00 ₽",
|
||
"K8/D1": "подписанная ведомость не воспроизводится после смены ставки; контракта verify нет (C4), сейчас блокирован K3",
|
||
"K9/D3": "параметры пресета официанта (shift_rate_minor и др.) не сохраняются",
|
||
"S9": "удаление точки с устройством: 23502 null value in column tenant_id (ON DELETE SET NULL на составном FK)",
|
||
"A4": "ответы 500 содержат SQLSTATE и текст PostgreSQL",
|
||
"N12-DATE": "month=2026-13 → 500 (22008) вместо 400"
|
||
}
|
||
}
|