Findings — все известные баги

Единая таблица всех известных проблем. Две схемы ID живут вместе:

  • BUG-NNN — backlog из доквартцовой базы (archive/04-known-bugs-index.md), накопленный до e2e сессий
  • F-NN — найденные в наших e2e сессиях

Колонка Source указывает откуда вылез баг.

Условные обозначения:

  • 🔴 Critical · 🟡 Major · 🟢 Minor · ⚪ Info / by-design
  • Status: open (не фиксили) · in-progress · fixed · retracted · verify-needed (нужно подтвердить после фикса)

🔴 CRITICAL

IDSeverityStatusTitleZoneSource
BUG-005🔴retractedЮЛ Карточка — вкладки «Информация», «Сотрудники», «Документы» не реагируют на клик — UI переделан (Реквизиты/ТТ/PayKeeper), описанные вкладки удалены. Retracted 2026-05-12.legal-entitiesbacklog
F81retracted«Чаевые (Нетмонет)» отображают frontend-hardcoded mock-данные на проде — by-design по BR 3.2 §R5: Волна 1 mock-API готов, Волна 2 (webhook) заблокирована — ждём contract от support@netmonet.co. Retracted 2026-05-13 (Александр: «сознательно промокано»).finance/tipssession-2026-05-12
F86fixedТТ → вкладка «Меню»: GET /api/v1/admin/catalog/menu/<store> → 500 — дубликат BUG-060 из legacy backlog, который был починен деплоем 2026-05-12 (см. CONTEXT.md). Финдинг записан в той же сессии после деплоя, симптом не отыграли заново. Подтверждено 2026-05-13 через Playwright: endpoint возвращает 200 OK с 12 категориями и 50 товарами (ТТ Smoke 001). Код в InternalCatalogMenuController нашпигован null-safety защитами с комментариями про прошлые NPE. Закрыто как retracted-duplicate.stores/menusession-2026-05-12
F91🔴fixedPATCH ТТ с длинным названием (516 char + emoji) → 500 — fixed 2026-05-13 через BUG-026: @Size(max=255) в Create/UpdateStoreRequest. Регресс на admin.nirbi.ru: 516+emoji → 400 VALIDATION_ERROR с details:[{field:"name",message:"name must not exceed 255 characters"}], 255 → 200 OK. UI мапит на errors.name (EditPage.tsx:161-164).storessession-2026-05-12
F93fixedSave шаблона смены → 500 — фикс в 521e343 fix(user): BR 1.4.4 — migrate security layer to Auth Service delegation. JwtUser.getRole() получил backward-compat (маппит scope all_franchise → admin_franchise), legacy-switch в ShiftTemplateService теперь работает. Подтверждено 2026-05-13 на проде: POST→201, PATCH→200, DELETE→204. PROPOSAL (не в скоупе): migrate 9 HR-сервисов с user.getRole() на user.hasPermission(...).employees-hrsession-2026-05-12
F94fixedSave формулы зарплаты «По роли» → 500 — 500 больше не воспроизводится. POST/PATCH /salary-formulas на проде отдаёт корректные 400 VALIDATION_ERROR с понятным сообщением. Тип by_role (легаси) больше не валиден — сейчас допустимы `hourlyfixedmixed. Это часть BR 1.4.4 security миграции (521e343`) + апдейта формул. Если UI всё ещё показывает «По роли» — это отдельный UI/spec-issue, не F94.
F95🔴fixedЭкспорт CSV ведомости → 422 (broken URL) — fixed 2026-05-13 через BUG-027 (v2): endpoint оказался bulk per-store-period (читает store_id+period_start из record по id), а не per-record. PayrollPage логика: 0 ведомостей → disabled; «Все ТТ» → toast «Выберите ТТ»; ТТ + N≥1 → exportPayrollCsv(items[0].id) → CSV всех сотрудников ТТ. Regress на проде: реальный CSV payroll-2026-05.csv скачан Playwright’ом со всеми 3 сотрудниками Столовой №1.employees-hrsession-2026-05-12
F98fixedДублирование товара → 500 — fixed в commit 7fe6cd3 feat(catalog): дубликат товара — backend deep-copy. ProductService.duplicateProduct:153-242 делает полный deep-copy: product + modifiers + price_list_items (0₽) + Kafka publish + best-effort tech_card. Подтверждено 2026-05-13 на проде: POST без CT (как делает фронт catalog.ts:70) → 201, дубликат создан корректно. Дублирует часть BUG-036 (фото/модификаторы/техкарта переносятся). Zombie-копии после теста удалены.catalog/productssession-2026-05-12
F99fixed«+ Дочерняя» создаёт корневую — parent_id не сохраняется — на проде иерархия работает корректно. Подтверждено 2026-05-13: (1) UI-клик «+ Дочерняя» на «Напитки» → POST body содержит parent_id: <Напитки.id>; (2) бэк CategoryService.createCategory:66 сохраняет parent_id в Entity; (3) GET возвращает nested tree через buildCategoryTree, новая категория в Напитки.children[2]. Финдинг устарел/некорректное воспроизведение.catalog/categoriessession-2026-05-12
F100fixedPayKeeper accounts → 502 Bad Gateway — fixed by infra deployment между 2026-05-12 и 2026-05-13. Подтверждено: GET /paykeeper/accounts → 200 {data:[], meta:{total:0}}. paykeeper-adapter pod жив, отвечает. UI «Нет активных интеграций PayKeeper» теперь корректно отражает пустое состояние, не скрывает ошибку. Memory project_prod_stand_admin обновлён.employees/integrationsession-2026-05-12
BUG-006🔴openРедактирование своей франшизы → 404 после Savefranchisebacklog
BUG-008🔴openСоздание сотрудника → 500 INTERNAL_ERRORemployees-hrbacklog
BUG-013🔴openManager → Юр.лица возвращает 403 (по спеке: read по permission)auth-rbacbacklog
BUG-014🔴openManager → Торговые точки возвращает 403 (по спеке: своя ТТ)auth-rbacbacklog
BUG-015🔴openСоздание ТТ возвращает 403 для Franchiseeauth-rbacbacklog
BUG-016🔴openManager → Склад все вкладки → 403 (на самом деле 404 — см. F16)auth-rbac/warehousebacklog
BUG-017🔴openManager → Заказы все вкладки → 403auth-rbac/ordersbacklog
BUG-018🔴openШаблоны смен → редактирование → 500 при Saveemployees-hrbacklog
BUG-019🔴openШаблон смены: повторный Save → 500employees-hrbacklog
BUG-023🔴openФормулы зарплаты → редактирование «по роли» → 500employees-hrbacklog
BUG-024🔴openЭкспорт CSV ведомости → 422employees-hrbacklog
BUG-049🔴openСтоп-листы → 403 у Managerauth-rbac/catalogbacklog
BUG-060🔴openПереход во вкладку «Меню» в карточке ТТ → 500catalog/menu-in-storebacklog
BUG-064🔴openПри назначении официанта → 404orders/tablesbacklog
BUG-065🔴openПеремещение стола в карте зала → белая страницаorders/tablesbacklog
BUG-066🔴fixed«Склад не найден для выбранной ТТ» — блокирует создание приёмкиwarehousebacklog
F3🔴fixedKDS-устройства зарегистрированы без kitchen_station_id (8 устройств null)kdssession-2026-05-05
F6afixedPATCH /catalog/products/{id} тихо игнорирует base_price — by-design after BR 1.10 (миграция 013-create-price-lists.xml: ALTER TABLE products DROP COLUMN base_price CASCADE). Цены в price_list_items, меняются через PATCH /api/v1/admin/catalog/price-lists/{id}/items. Поле base_price нет ни в БД, ни в Entity, ни в UpdateProductRequest — Jackson по умолчанию FAIL_ON_UNKNOWN_PROPERTIES=false его игнорит. Финдинг записан до раскатки миграции 013. Retracted 2026-05-13.catalog/productssession-2026-05-05
F8🔴fixedPATCH product теряет переданный store_ids при available_in_all_stores: falsecatalog/productssession-2026-05-05
F9🔴fixedDELETE product → 500 для товара в состоянии F8 (orphan в БД)catalog/productssession-2026-05-05
F13🔴fixedRBAC read-leak: 7 эндпоинтов доступны без permissions у Курьераauth-rbacsession-2026-05-05
F14🔴fixedRefunds доступны Курьеру без pos.refund (часть F13, выделено по фин-чувствительности)auth-rbac/paymentssession-2026-05-05
F15🔴fixedHR-эндпоинты → 500 для всех ролей (4 шт: payroll, shift-templates, shift-records, schedules)employees-hrsession-2026-05-05
F25🔴openЗаказ исчезает из POS после оплатыpossession-2026-05-05
F27🔴openНа POS нет UI-кнопки отмены заказа на любом статусе (API работает)possession-2026-05-05
F37🔴openНа POS нет журнала закрытых заказов смены (только агрегированная аналитика)possession-2026-05-05
F26🔴openПосле оплаты картой rrn/card_last4 = null всегда; fiscal_data + pk_fop_receipt_key — нестабильно (регресс?). Compliance/fiscal-блокерpayments/card-paymentsession-2026-05-05
F60fixedУникальность fs_number не проверяется — на текущей версии защита работает на двух уровнях: preflight findByFsNumberAndDeletedAtIsNull в POSTerminalService:42 (→ 409 FS_NUMBER_DUPLICATE) + БД unique-index uq_pos_terminals_fs_number из миграции 007. Подтверждено 2026-05-13 на проде через Playwright: дубликат → 409 как по спеке. Финдинг устарел/некорректное воспроизведение. Side-нюанс: unique-index без WHERE deleted_at IS NULL — после soft-delete тот же ФН нельзя переиспользовать (отдельный риск, не F60).stores/terminalssession-2026-05-06-e2e

🟡 MAJOR

IDSeverityStatusTitleZoneSource
F77🔴openПЕРЕСМОТРЕН до Critical: POST /legal-entities с inn=5digits/ogrn=7digits/email=без@ → 500 INTERNAL_ERROR (не VALIDATION). Та же категория что F91 — отсутствие @Pattern/@Size в CreateLegalEntityRequest + DB-constraint violation → catch-all 500. Кандидат на фикс по паттерну BUG-026. Подтверждено 2026-05-13.legal-entitiessession-2026-05-12
F78fixedТТ → Интеграции: GET /paykeeper/accounts/by-store/<id> → 500 — fixed by infra deployment (тот же fix что F100). Подтверждено: → 200 {account_id:null, status:"not_configured"}. ТТ Smoke 001 корректно отдаёт «не настроено» вместо 500.stores/integrationssession-2026-05-12
F80🟡openПодтверждено многократно сегодня: 8+ API-запросов в одном Playwright-evaluate → JWT истёк → 401 → cleanup упал. Refresh-flow на фронте отсутствует. Требуется: фронт client.ts должен ловить 401, дёргать /auth/refresh через refresh_token, повторять запрос. Архитектурный фикс затрагивает все API-вызовы.auth-rbacsession-2026-05-12
F84🟡openСимптом про UI — бэк работает по спеке (POST пустого → 400 INVALID_REQUEST_BODY, валидные DTO → 400 VALIDATION_ERROR с details). Требует UI-проверки ProductCreatePage.tsx:handleSubmit. Не подтверждён через API.catalog/productssession-2026-05-12
F85🔴openПодтверждено: backend XSS — POST product name: "<script>alert(1)</script>" → 201 OK, name сохранён as-is. React по умолчанию escape’ит, но: (1) если где-то dangerouslySetInnerHTML, (2) если экспорт в email/PDF/CSV, (3) если внешний клиент не React — есть исполнение. Нужен HTML-sanitize на бэке (StripHtml / OWASP) или строгий @Pattern для name. Severity повышен до Critical (security).catalog/productssession-2026-05-12
F90🟡openПодтверждено: GET response не содержит ETag/If-Match/version headers. Last-write-wins без optimistic locking. Архитектурный вопрос — добавление поля version во все entities + If-Match header + 412 Precondition Failed на конфликте. Большой scope.allsession-2026-05-12
F92🟡openПодтверждено на бэке: POST /stores с email=«noatsign» → 201 OK accepted. CreateStoreRequest не имеет @Email. Связано с F77 (тот же класс — defensive validation).all/formssession-2026-05-12
F96🟡openПодтверждено: 409 NAME_DUPLICATE → "Role with this name already exists" (англ) в русском UI. Все error message из ApiException — на английском. Требуется i18n-слой (например MessageSource с error.NAME_DUPLICATE ключами + Accept-Language header). Архитектурный фикс — затрагивает все сервисы.all/i18nsession-2026-05-12
BUG-001🟡openИмпорт ЮЛ из xlsx — Unsupported Media Typelegal-entitiesbacklog
BUG-002🟡openЮЛ Создать — после 1 символа теряется фокус (все label)legal-entitiesbacklog
BUG-007🟡openПоиск по ФИО не работаетemployees-hrbacklog
BUG-009🟡openСоздание сотрудника — нет валидации (Имя, Фамилия, Пароль, Телефон, ТТ)employees-hrbacklog
BUG-011🟡openДеактивированный сотрудник — пункты бургера неактивныemployees-hrbacklog
BUG-012🟡openНе редактируется роль сотрудника с аккаунта администратораemployees-hrbacklog
BUG-020🟡openСоздание смены «Вручную» → 422 при Saveemployees-hrbacklog
BUG-021🟡openОтсутствует Clock in/out (фактическое время)employees-hrbacklog
BUG-025🟡openUI позволяет подтвердить ведомость с некорректными даннымиemployees-hrbacklog
BUG-031🟡open«Доступно во всех точках» — после Save галочка возвращается (UI-симптом F8)catalog/productsbacklog
BUG-032🟡openФильтр «Ингредиент» в Товарах — пустоcatalog/productsbacklog
BUG-033🟡openИзменение товара не создаёт новую версию (по ADR-011 нужна)catalog/productsbacklog
BUG-034🟡openВ Каталоге отсутствует фильтр с версионным спискомcatalog/productsbacklog
BUG-035🟡openСмена категории на «Без категории» — после Save возвращается исходнаяcatalog/productsbacklog
BUG-036🟡openДублирование товара не переносит фото, модификаторы, техкартуcatalog/productsbacklog
BUG-039🟡openНа странице категорий нельзя редактировать большинство полейcatalog/categoriesbacklog
BUG-040🟡openКаскадная активация категории не работает (только деактивация)catalog/categoriesbacklog
BUG-041🟡openКатегории — 255 символов без пробелов ломают вёрстку, при редактировании — 409catalog/categoriesbacklog
BUG-044🟡openМодификаторы — нет валидации min/max (см. F30, F31, F32)catalog/modifiersbacklog
BUG-047🟡openТехнология приготовления синхронизирована между опциями модификатораcatalog/modifiersbacklog
BUG-048🟡openНе сохраняется удаление текста из «Технология приготовления»catalog/modifiersbacklog
BUG-050🟡openПрейскурант — нельзя редактировать «Название», «Активность», «Назначено ТТ»catalog/price-listsbacklog
BUG-051🟡openПрейскурант: PATCH /price-lists/{id} со stores/store_ids тихо игнорится. Workaround — PATCH /stores/{id} c price_list_id (это работает)catalog/price-listsbacklog
BUG-052🟡openПоиск по адресу не работаетstoresbacklog
BUG-058🟡openФильтр статус «Приостановлена» есть, функционала остановки ТТ нетstoresbacklog
BUG-061🟡openВ разделе «Меню» отсутствует кнопка «Добавить товар»catalog/menu-in-storebacklog
BUG-062🟡openВ «Меню» вместо описания товара модификаторыcatalog/menu-in-storebacklog
BUG-063🟡openПри назначении официанта показываются ВСЕ сотрудники системыorders/tablesbacklog
F1fixedПрейскурант не привязан, default неявно — by-design: InternalCatalogMenuController:60-66 использует findByFranchiseIdAndIsDefaultTrue как fallback при null price_list_id. Подтверждено 2026-05-13: Smoke 001 имеет price_list_id=null, /menu отдаёт меню по default «Базовый». Архитектурный fallback.catalog/price-listssession-2026-05-05
F4🟡retracted6 admin-маршрутов → 404: tables, warehouse, shifts, aggregators, paykeeper, dashboardadmin-bff routessession-2026-05-05
F6bfixedGET /catalog/products/{id} не возвращает текущую цену — by-design after BR 1.10, зеркало F6a. ProductResponse не содержит цены, потому что цена живёт в price_list_items и резолвится per-prislist/per-store через GET /internal/catalog/menu (учитывает прейскурант ТТ, time tariffs, stop-lists). Retracted 2026-05-13.catalog/productssession-2026-05-05
F10🟡fixedGET /catalog/categories/{id} → 404 (PATCH/DELETE работают)catalog/categoriessession-2026-05-05
F16🟡verify-neededТребует Manager-аккаунта. На проде только admin@erp.local (по memory project_prod_stand_admin — новых аккаунтов на проде не создаём). Перенести в backlog.warehousesession-2026-05-05
F21🟡fixedassembly_time_seconds в позиции заказа = null (денорм не сработала)orders/lifecyclesession-2026-05-05
F24🟡verify-neededПропуски в нумерации заказов (#22, #25 потеряны) — гипотеза: симптом F25/F37orders/lifecyclesession-2026-05-05
F30🟡fixedМодификатор: max < min проходит (BUG-044 confirmed)catalog/modifierssession-2026-05-05
F31🟡fixedМодификатор: отрицательный min_amount проходитcatalog/modifierssession-2026-05-05
F32🟡retractedОпция модификатора: отрицательная цена проходит (потенциальный обход скидок)catalog/modifierssession-2026-05-05
F40🟡openmenu-availability всегда скрывает категорию, не учитывает окноcatalog/menu-availabilitysession-2026-05-05
F41fixedPATCH product silent ignore modifier_group_ids — by-design: модификаторы через POST/PATCH /products/{id}/modifiers/{groupId}. Тот же паттерн что F6a (Jackson FAIL_ON_UNKNOWN_PROPERTIES=false). Подтверждено 2026-05-13.catalog/productssession-2026-05-05
F44🟡retractedPOST modifier-groups тихо игнорирует options[].price (правильный путь — PATCH /price-lists/{id}/modifier-items)catalog/modifierssession-2026-05-05

🟢 MINOR

IDSeverityStatusTitleZoneSource
F76🟢openПодтверждено: legal-entities/ViewPage.tsx:373<Link to="/legal-entities">{le.store_count} ТТ</Link>. Ведёт на список ЮЛ, должно на /stores?legal_entity_id=.... Тривиальный фикс.legal-entitiessession-2026-05-12
F79🟢openПодтверждено: POST categories с name="тестовая категория" → name сохранён as-is с кавычками. Нет санитизации/трима/escape. Низкая severity, скорее UX-нюанс.catalog/employeessession-2026-05-12
F82🟡openПодтверждено на бэке: PATCH product kcal=-100, protein=-50 → 200 OK, отрицательные значения сохраняются. Нужны @PositiveOrZero на kcal/protein/fat/carbs/grossWeight/netWeight в Create/UpdateProductRequest. Severity повышена до Major (бэк-валидация недостаёт).catalog/productssession-2026-05-12
F83🟢openПодтверждено в коде: useState("") для color в ProductEditPage без pattern="^#[0-9A-Fa-f]{6}$". Принимает любой текст. Фикс: input pattern на фронте + регекс-валидация на бэке.catalog/productssession-2026-05-12
F87🟢openПодтверждено: ProductViewPage.tsx не содержит блока «Категория»/category_id/category_name (grep пустой). Поле есть в response, но не отрисовано в карточке. Простой UI-фикс.catalog/productssession-2026-05-12
F88🟢openПодтверждено: CategoriesPage.tsx:506 и ProductListPage.tsx:388 оборачивают <strong>"{deleteTarget?.name}"</strong> — если имя уже с кавычками, получаются двойные. Зависит от фикса F79 (санитизация на бэке) либо escape на фронте.catalogsession-2026-05-12
F89🟢openПодтверждено: stores/EditPage.tsx:262-264 — placeholder <option value="">По умолчанию (дефолтный)</option> + цикл по prelist’ам который добавляет " (дефолтный)" к is_default=true. Две опции с одним суффиксом. Фикс: убрать суффикс у placeholder или у реального default. Тривиально.stores/editsession-2026-05-12
F97🟢verify-neededgrep history.back и navigate(-1) в roles/employees пуст — возможно фикс уже был. Нужна UI-проверка через клик «Отмена» в форме создания роли.employees/rolessession-2026-05-12
F101🟢openПодтверждено в коде: ProductEditPage.tsx:253,264 — кнопка «Улучшить с помощью AI» есть. Реальный handler не проверен (требует UI клик). Скорее всего заглушка — фича не реализована. Скрыть кнопку под feature-flag или реализовать через openclaw-agent.catalog/productssession-2026-05-12
BUG-003🟢openКПП: валидация на латиницеlegal-entitiesbacklog
BUG-004🟢openНет сообщений об ошибке (Телефон, Расч.счёт, БИК, Корр.счёт)legal-entitiesbacklog
BUG-010🟢openСоздание сотрудника — PIN дублируется в верхней строке и в блоке нижеemployees-hrbacklog
BUG-022🟢openРасписание сотрудников — страница выглядит неполноценноemployees-hrbacklog
BUG-026🟢openФормулы зарплаты — у label «Ставка в час» виден технический кодemployees-hrbacklog
BUG-027🟢openФормулы зарплаты — поле «Ставка в час» принимает -1employees-hrbacklog
BUG-028🟢openВедомости — в колонке «Действия» технический кодemployees-hrbacklog
BUG-029🟢openСтраница «Терминалы» требует переосмысленияemployees-hrbacklog
BUG-030🟢openСоздание товара — поле «Описание» в шрифте textareacatalog/productsbacklog
BUG-037🟢openПоле «Описание» — растягивается без пределаcatalog/productsbacklog
BUG-038🟢openПоле «Описание» — длинные строки выходят за пределыcatalog/productsbacklog
BUG-042🟢openКатегории — пустое название сохраняется без ошибкиcatalog/categoriesbacklog
BUG-043🟢openМодификатор — Описание в шрифте textareacatalog/modifiersbacklog
BUG-045🟢openМодификатор — название опции: нет maxlength, принимает «Пробел»catalog/modifiersbacklog
BUG-046🟢openИнгредиенты — Описание в шрифте textareacatalog/ingredientsbacklog
BUG-053🟢openГрафик работы — добавить «Круглосуточно» рядом с «Выходной»storesbacklog
BUG-054🟢openСоздание ТТ — нет валидации Телефон, Адрес, Названиеstoresbacklog
BUG-055🟢openШирота/долгота из 2gis — должны вставляться обе одним действиемstoresbacklog
BUG-056🟢open«Одинаковый для всех дней» — колонка «Выходной» должна быть неактивнаstoresbacklog
BUG-057🟢openЧасовые пояса — добавить Магадан (UTC+11), убрать Новосибирскstoresbacklog
BUG-059🟢openФильтр по городу — требует 100% совпадениеstoresbacklog
BUG-X01🟢openТексты ошибок при невалидных данных — на латиницеcross-cuttingbacklog
BUG-X02🟢openШрифт textarea не консистентен с inputcross-cuttingbacklog
BUG-X03🟢openТехнические коды видны в UI вместо названийcross-cuttingbacklog
BUG-X04🟢openДлинные строки без пробелов выходят за границыcross-cuttingbacklog
F2retractedТестовые данные — не баг кода. Можно поправить через UI/seed.test-datasession-2026-05-05
F5retractedDocumentation rot — не баг кода. Обновляется в рабочем порядке через obsidian_erp.docssession-2026-05-05
F7retractedТестовые данные — не баг кода.test-datasession-2026-05-05
F33🟢fixedМодификатор: max=999999 без верхнего пределаcatalog/modifierssession-2026-05-05
F34🟢fixedМодификатор: можно создать без options[]catalog/modifierssession-2026-05-05
F35🟢fixedТовар: is_open_price=true + is_by_weight=true одновременно (mutex отсутствует)catalog/productssession-2026-05-05
F39fixedСтоп-лист: принимает reason: null — by-design, поле optional (нет @NotBlank в DTO). Подтверждено 2026-05-13: POST с reason=null → 201 accepted. Не блокер.catalog/stop-listssession-2026-05-05
F42🟢openUX: при max_amount опций — нет подсказки на POSpos/modifierssession-2026-05-05
F45🟢retractedDELETE modifier-group оставляет orphan-записи в price-list/modifier-itemscatalog/modifierssession-2026-05-05
F46🟢openPOST /modifier-groups: type принимает любую строку (нет enum-валидации). 2026-05-13: GET endpoint → 404 через BFF, требуется проверка path/permission через /modifiers route в BFF. Финдинг остаётся открытым.catalog/modifierssession-2026-05-06
F47🟢verify-neededUI-симптом, требует воспроизведения с удалёнными модификаторами (на проде сейчас 4 активных модификатора, без удалённых). Без deep UI-теста не подтвердить.catalog/modifiers/uisession-2026-05-06
F48🟢verify-neededНа admin сейчас тоже видно «Роль: —» (видел в snapshot главной страницы). Возможно подтверждается. Но /me для админа отдаёт scope=all_franchise (не legacy role). Это UI-косметика. Низкая severity.dashboard/uisession-2026-05-06
F49🟢open/admin/warehouse (без подраздела) → молчаливый редирект на dashboard, ни 404, ни «выберите подраздел»warehouse/uisession-2026-05-06
F50🟡openНа POS активные заказы не сортируются по created_at — свежий заказ попадает в конец списка вместо верхаpos/orderssession-2026-05-06-pos
F51🟡openНа POS вкладка «Готовы» смешивает ready (готов, не оплачен) и closed (оплачен и выдан). handed_over в потоке не используется. Кассир не различает «надо ещё выдать клиенту» vs «уже закрыт»pos/orderssession-2026-05-06-pos
F52🟡openНа POS нет выбора способа оплаты (наличка/карта) — всё уходит через кассу 3-в-1, в БД payment_method: "card" независимо от фактического канала. Ломает бух-отчёт по выручкеpos/paymentssession-2026-05-06-pos
F53🟡openПодтверждено: Layout.tsx:410-424<button onClick={handleLogout}> без type атрибута. По HTML default type="submit". Если страница содержит <form> где-либо — Enter триггерит submit, ищет ближайшую submit-button → логаут. Фикс: добавить type="button".admin/ui-cross-cuttingsession-2026-05-06-e2e
F54fixedPATCH /stores с is_published: true silent ignore — by-design: UpdateStoreRequest не имеет поля is_published, отдельные endpoint’ы POST /stores/{id}/publish и unpublish. Подтверждено через код. Тот же паттерн F6a/F41.stores/apisession-2026-05-06-e2e
F55🟢openПри создании новой ТТ default-прейскурант не привязывается автоматически — store.price_list_id: null, надо отдельным PATCHstores/onboardingsession-2026-05-06-e2e
F56🟢openKDS показывает не-кухонные позиции заказа в развёрнутом виде серым с пометкой «без станции» — выглядит как «не сделано», хотя позиция уже ready. Лучше «не требует приготовления» / явный ✓kds/uisession-2026-05-06-e2e
F57🔴retractedНа свежей ТТ нет UI/API для привязки кассы 3-в-1 — на самом деле UI есть в карточке ТТ → вкладка «Интеграции» → «Подключить PayKeeper»pos/onboardingsession-2026-05-06-e2e
F58🟢openPOS при отсутствии настройки кассы говорит «проверить подключение кассы 3-в-1», но не подсказывает что нужно: 1) PayKeeper в Интеграциях ТТ 2) Терминал с ФН во вкладке «Терминалы». Кассир/менеджер сам не догадаетсяpos/onboardingsession-2026-05-06-e2e
F59🟢openСписок терминалов на карточке ТТ показывает stale-данные после DELETE — удалённый терминал остаётся в UI до перезагрузки страницыstores/terminals/uisession-2026-05-06-e2e
F61🟡openproduct.assembly_time без явного unit — UI отображает как «N мин», а в order item то же значение приходит как assembly_time_seconds (явно секунды). Неясность единиц → таймеры готовности и ожидания клиента могут считаться неверноcatalog/productssession-2026-05-06-coverage
F62fixed«Чаевые (Нетмонет)» mock-данные — дубликат (тот же симптом). By-design по BR 3.2 §R5: «фронт + mock-API готовы, real backend отложен» (waiting webhook от support@netmonet.co). Retracted as duplicate F81.finance/tipssession-2026-05-06-coverage
F63🟢openВ «Истории заказов» колонка «Кассир» показывает обрезанный UUID (e0c0ffee) вместо имени сотрудника. Должно быть имя по созданному заказуorders/historysession-2026-05-06-coverage
F64🟢verify-neededBackend сейчас корректен: «ИП Иванов Партнёр» store_count=0 (=API count), «ООО Франшиза Главное» store_count=5 (=число ТТ). Если симптом «3 vs 1» сохраняется в UI на каком-то ЮЛ — это специфичный case, нужен повторный воспроизвод через UI. На сейчас не воспроизводится через API.legal-entitiessession-2026-05-06-coverage
F65🟢openПосле DELETE товара его запись в price-list/items остаётся как orphan с ценой 0 — вотчина видна через API, но в превью меню фильтруется. Тех. долг данныхcatalog/price-listssession-2026-05-06-coverage
F66🟡openТекст ошибки «Действие доступно только менеджеру ТТ» — пользователю с ролью «Менеджер», который и есть менеджер. Реально проверка завязана на permission, не на роль — текст вводит в заблуждениеpos/tablessession-2026-05-07-waiter-table
F67🔴openПосле того как официант открыл стол и пробил заказ — имя официанта на столе не появляется автоматически. Менеджер на схеме зала не видит, кто работает за каким столом. Авто-привязки current_waiter_id нетpos/tables, orders/lifecyclesession-2026-05-07-waiter-table
F69🔴openZ-отчёт смены формируется без предупреждения о висящих неоплаченных заказах. Стол остаётся occupied, заказ accepted/paid_at:null переходит между сменамиpos/shift, orders/lifecyclesession-2026-05-07-waiter-table
F70🟡openВ POS «Назначить официанта» показывает всех сотрудников с pos.access (Админ, Бариста, Кассир, Менеджер, Повар, Официант). Должны быть только официантыpos/tables, auth-rbacsession-2026-05-07-waiter-table
F71🟢openРезерв стола в админке через нативный prompt() — одно поле, без структурированных полей (гость, время, число человек). UI antipattern. Зависит от PROPOSAL-1 (оставлять ли резерв в админке вообще)admin/stores/tablessession-2026-05-07-waiter-table
F72🟡openНа KDS у заказа в подписи стола показано FB (последние 2 hex-символа table_id), а не реальный номер стола (№26). Повар не понимает за каким столом готовитьkds, orders/lifecyclesession-2026-05-07-waiter-table
F73🟡openТаймер на KDS «через 114 мин» для блюда со временем приготовления 10 — нерелевантное число. Похоже тянется из yellow_threshold_minutes станции, а не из assembly_time. Связано с F61 (единицы assembly_time)kds, catalog/productssession-2026-05-07-waiter-table
F74🟡openНа схеме зала всего 2 цвета: зелёный=свободен, красный=занят. Когда заказ готов к выдаче — стол остаётся таким же красным. Официант не видит «у тебя на столе пора брать блюда» при обходе зала. Зависит от PROPOSAL-5 (фаза handover)pos/tables, orders/lifecyclesession-2026-05-07-waiter-table
F75🔴openПосле того как повар отметил «готово» на последней кухонной позиции — заказ автоматически становится «Выдан» в POS. Никто не вручал блюдо клиенту. Audit trail неверный, время реального handover не фиксируется. Связано с F25, F51 — три симптома отсутствующей фазы handover (PROPOSAL-5)orders/lifecycle, pos/tablessession-2026-05-07-waiter-table

⚪ INFO / BY-DESIGN / RETRACTED

Не баги, для контекста:

IDЧтоВердикт
F11Manager scope per-store (cross-LE возможен)by-design — scope назначается per-store
F12Cashier admin-login отказанby-design — кассиры через PIN на POS
F19created_at == accepted_at == kitchen_started_at на быстром заказеobservation — не баг
F20KDS одна кнопка «Готово», без двух фазby-design — нет start/finish
F22Семантика kitchen_started_at отличается на order/itemdoc/UX — naming путаный, не блокер
F28Заказ только из «не-кухонных» позиций → сразу readyby-design — обходит KDS
F29Status-машина new → accepted → ready → closed/cancelledarchitectural — подтверждено
F38POS фильтрует товары без активных KDS на станцииretracted — оказалось F40 (категория Кофе скрыта)
F43POS не считает цену опций при показе totalretracted — оказалось F44 (опция реально стоила 0 в БД)

Сводка

SeverityActive countFixedRetracted (UI-validation)
🔴 Critical24 (F26 поднят)7 (BUG-066)
🟡 Major4132 (F4, F44)
🟢 Minor3241 (F45) — by-design soft-delete
⚪ Info9
Total active105143

После UI-регресса 2026-05-06: F32, F44, F45 → retracted (не воспроизводятся через UI, так как поля отсутствуют в форме либо это by-design soft-delete). F4 retracted — это были не SPA-роуты, а API-only пути. Добавлены F47, F48, F49.

Backlog-проверки 2026-05-06:

  • BUG-066 → fixed (warehouse автосоздаётся при создании ТТ; orphan после DELETE store — отдельное замечание).
  • BUG-051 → остаётся open, но симптом уточнён: со стороны прейскуранта silent no-op, со стороны ТТ работает.

Сессия 2026-05-07 (waiter-table walkthrough): добавлены F66, F67, F69, F70, F71, F72, F73, F74, F75 (4 Critical, 4 Major, 1 Minor; F68 не использован — отозван без записи) + 5 PROPOSAL’ов в sessions/2026-05-07-waiter-table-walkthrough.md. PROPOSAL’ы — архитектурные/UX вопросы, НЕ фиксить автоматически. Также подтверждены вчерашние F56, F61 на KDS-стороне.

Следующий ID для новой находки

  • BUG-NNN (старая схема, для backlog/regression): следующий BUG-067 (или BUG-X05 для cross-cutting)
  • F-NN (наша схема, для e2e сессий): следующий F76