# План подготовки приложения к демонстрации заказчику Дата проверки: 2026-04-27 Цель: привести приложение к виду полноценного рабочего продукта перед показом заказчику, без упоминаний тестового, демо, локального, боевого или служебного режима в пользовательском интерфейсе. ## Краткий вывод Приложение частично соответствует последнему продуктовому заданию: есть OTP-вход, роль-ориентированный кабинет, публичная клиентская страница выбора доставки, модель delivery sets, Supabase schema и Edge Functions. Тесты проходят, production build собирается. Главная проблема перед показом: в UI и публичных метаданных остались служебные и демонстрационные следы. Также логистический кабинет сейчас не использует готовую доску `LogisticsReadinessBoard`, хотя она описана в ТЗ и уже реализована как отдельный компонент. Из-за этого сценарий логиста в приложении не совпадает с документированным demo/customer flow. ## Что проверено - `docs/product-overview.md` - `docs/scenarios.md` - `docs/superpowers/specs/2026-04-13-1c-delivery-ui-design.md` - `docs/superpowers/plans/2026-04-13-1c-delivery-frontend-supabase.md` - `src/pages/LoginPage.jsx` - `src/components/auth/OtpLoginForm.jsx` - `src/context/AuthContext.jsx` - `src/pages/DashboardPage.jsx` - `src/hooks/useOrders.js` - `src/components/dashboard/RoleWorkspacePanel.jsx` - `src/components/logistics/LogisticsReadinessBoard.jsx` - `src/components/logistics/DeliverySetDetailPanel.jsx` - `src/pages/ClientDeliveryPage.jsx` - `src/components/client/DeliveryChoiceFlow.jsx` - `src/components/client/DeliverySlotsPicker.jsx` - `src/components/driver/DriverDeliveryPlanner.jsx` - `src/components/driver/DriverDeliveryDetail.jsx` - `public/manifest.webmanifest` - `README.md` ## Проверка команд ```bash npm test ``` Результат: проходит, 71 test file, 305 tests. ```bash npm run build ``` Результат: проходит, Vite production build собран. ```bash npm run lint ``` Результат: падает. Основные проблемы: - `src/pages/DashboardPage.jsx`: `React.useMemo` вызывается после условного `return`, нарушение `react-hooks/rules-of-hooks`. - `src/services/deliveryInvitationApi.js`: неиспользуемые переменные `error` в `catch`. - `.worktrees/role-focus-dashboard-slice/...`: ESLint также проверяет рабочие worktree-копии и находит там ошибки. Нужно либо исключить `.worktrees` из lint, либо привести эти worktree в порядок/удалить их, если они не нужны. ## Соответствие ТЗ | Блок | Ожидание по ТЗ | Текущее состояние | Статус | | --- | --- | --- | --- | | Вход оператора | Email + одноразовый код, без служебных подсказок | Есть OTP, но видны служебный/локальный вход, выбор роли, `roles@local`, `000000`, "Рабочий режим" | Не соответствует для показа | | Роли | Менеджер, логист, водитель, админ в рабочем контуре | Роли есть, но сохраняются legacy-следы `production_lead` и производственный контур | Частично | | Логист | `LogisticsReadinessBoard` с наборами доставки | Компонент есть, но `DashboardPage` показывает старые колонки "Сегодня/Завтра/Послезавтра" по отдельным заказам | Не соответствует | | Delivery sets | Набор доставки как основная единица | Хелперы и компоненты есть, но основной логистический экран их не использует | Частично | | Клиентская ссылка | `/delivery/:token`, выбор даты и половины дня | Реализовано, flow выглядит близко к ТЗ | В целом соответствует | | Водитель | Назначенные доставки, адрес, состав, быстрые статусы | Реализовано | В целом соответствует | | Supabase | Live data, invitations, slots, history | Схема и API есть, но UI показывает "Данные загружены из Supabase, живой контур активен" | Технически есть, copy требует полировки | | Публичные тексты | Не должно быть "демо", "тест", "локальный", "боевой", "рабочий режим" | Такие тексты найдены в login UI, manifest, README/scenarios | Не соответствует | ## Найденные замечания ### P0. Убрать служебный вход и режимные надписи из экрана входа Файлы: - `src/components/auth/OtpLoginForm.jsx` - `src/pages/LoginPage.jsx` - `src/context/AuthContext.jsx` - `src/components/auth/OtpLoginForm.test.jsx` - `src/context/AuthContext.test.js` Что сейчас видно пользователю: - "Для быстрого доступа к рабочим кабинетам можно использовать служебный адрес и выбрать роль вручную." - "Служебный вход" - "Локальный вход" - "Роль для быстрого входа" - "Войти без кода" - "Локальный вход использует единый адрес и код 000000." - "Локальный режим позволяет открыть интерфейс..." - "Рабочий режим: код отправляется на email..." Что нужно сделать: - Оставить только обычный сценарий: email -> отправка кода -> ввод кода -> вход. - Убрать из UI выбор роли на входе. - Убрать публичное поведение `roles@local`. - Убрать публичный текст про `000000`. - Сохранить локальный fallback только как dev-only механизм, если он ещё нужен разработке, но не показывать его в интерфейсе. - Переписать intro copy: "Введите email, мы отправим одноразовый код для входа." - После отправки кода оставить нейтральное сообщение: "Код отправлен на указанную почту. Проверьте входящие и папку Спам." - Обновить тесты, чтобы они проверяли отсутствие служебного/локального/рабочего режима. Критерий готовности: - На `/login` нет слов: `служебный`, `локальный`, `рабочий режим`, `демо`, `test`, `roles@local`, `local@local`, `000000`, `без кода`. ### P0. Подключить реальный логистический экран delivery sets Файлы: - `src/pages/DashboardPage.jsx` - `src/hooks/useOrders.js` - `src/components/dashboard/RoleWorkspacePanel.jsx` - `src/components/logistics/LogisticsReadinessBoard.jsx` - `src/components/logistics/DeliverySetDetailPanel.jsx` - `src/pages/DashboardPage.test.jsx` Что сейчас не совпадает: - ТЗ и `docs/scenarios.md` обещают логисту `LogisticsReadinessBoard`. - В `DashboardPage.jsx` компонент импортирован не используется. - Логист видит старый экран с колонками "Сегодня", "Завтра", "Послезавтра" по отдельным заказам. Что нужно сделать: - Передать `deliverySetBuckets` из `useOrders()` в `RoleWorkspacePanel`. - Заменить старый `renderLogisticsWorkspace` на `LogisticsReadinessBoard`. - При клике по набору открывать `DeliverySetDetailPanel`. - Сохранить понятную карточку заказа там, где она нужна менеджеру. - Добавить/обновить тест на то, что логист видит "Наборы доставки", "На подходе", "Готово к запуску", "Ожидает клиента", "Нужна ручная работа", "Согласовано", "Завершено". Критерий готовности: - Логистический сценарий в приложении совпадает с `docs/scenarios.md`. - Логист работает с наборами доставки, а не с отдельными заказами как главной единицей. ### P1. Убрать технические баннеры Supabase/live contour из UI Файлы: - `src/pages/DashboardPage.jsx` - `src/hooks/useOrders.js` Что сейчас видно: - "Загружаем данные из Supabase..." - "Данные загружены из Supabase, живой контур активен." - Ошибки могут показывать "Supabase" как техническую деталь. Что нужно сделать: - Заменить на пользовательские формулировки: - "Загружаем данные..." - Баннер успешной загрузки убрать полностью. - Ошибки показывать как "Не удалось загрузить данные. Обратитесь к администратору." - Технические детали Supabase оставлять только в логах. Критерий готовности: - В рабочем UI нет слова `Supabase`, кроме внутренних логов/документации для команды. ### P1. Очистить публичные метаданные и demo wording Файлы: - `public/manifest.webmanifest` - `README.md` - `docs/scenarios.md` - `docs/product-overview.md` Что сейчас найдено: - `public/manifest.webmanifest`: "PWA-демо панели заказов и доставки..." - `README.md`: "Служебный вход `roles@local` для демонстрации ролей..." - `docs/scenarios.md`: "Demo-скрипт для первого платного milestone" Что нужно сделать: - В manifest заменить описание на рабочее: "Панель управления доставкой заказов с доступом к кабинетам логиста, водителя и менеджера." - В README убрать служебный вход из публичного списка "Что уже есть". - В `docs/scenarios.md` переименовать demo-скрипт в "Сценарий показа заказчику". - Убрать из пользовательской/презентационной документации `roles@local`, `demo`, `тестовый`, `локальный`, если это не инструкция строго для разработчика. Критерий готовности: - Поиск по публичным файлам не находит демонстрационные маркеры в пользовательском контексте. ### P1. Привести lint в зелёное состояние Файлы: - `src/pages/DashboardPage.jsx` - `src/services/deliveryInvitationApi.js` - `eslint.config.js` или `.eslintignore`/аналогичная настройка - `.worktrees/`, если они остаются в репозитории/рабочей папке Что нужно сделать: - Перенести `useMemo` в `DashboardPage.jsx` выше раннего `return`, чтобы hooks всегда вызывались в одном порядке. - В `deliveryInvitationApi.js` заменить `catch (error)` на `catch` там, где переменная не используется. - Исключить `.worktrees/**` из lint, если эти директории не являются частью основного приложения. - Повторно запустить `npm run lint`. Критерий готовности: - `npm run lint` проходит без ошибок. ### P2. Убрать устаревшие производственные экраны из маршрута показа Файлы: - `src/constants/roles.js` - `src/constants/deliveryWorkflow.js` - `src/components/dashboard/ProductionQueuePanel.jsx` - `src/components/orders/OrderEditorPanel.jsx` - `src/services/orderService.js` - `src/data/mockAppData.js` Что сейчас может сбивать: - `production_lead`, "Начальник производства", "Очередь производства". - `OrderEditorPanel` всё ещё выглядит как форма ручного создания/редактирования заказа. - `createOrder` и уведомление "Новый заказ" остаются в hook, хотя ТЗ говорит, что заказы приходят из 1С. Что нужно сделать: - Проверить, доступны ли эти экраны из текущего UI. Если недоступны, оставить как legacy code с задачей на последующую чистку. - Если доступны, убрать их из демонстрационного маршрута. - Для менеджера оставить только просмотр реестра, поиск и карточку заказа. - Не показывать создание заказа как пользовательскую возможность. Критерий готовности: - На показе нет сценария ручного создания заказа в web app. - Заказ в интерфейсе воспринимается как импортированный из 1С. ### P2. Финальная визуальная проверка всех ролей Файлы: - UI-компоненты по факту найденных визуальных замечаний. Что нужно сделать: - Открыть `/login`. - Проверить вход оператора. - Проверить кабинет менеджера. - Проверить кабинет логиста. - Проверить кабинет водителя. - Проверить `/delivery/client-flow-1001`. - Проверить мобильную ширину для `/login`, `/dashboard`, `/delivery/client-flow-1001`. Чеклист: - Нет служебных/локальных/demo/test/боевых/рабочих режимов. - Нет технических баннеров про Supabase/live contour. - Тексты звучат как рабочий продукт, а не как стенд. - Логист видит delivery sets. - Клиентская страница понятна без объяснений команды. - Водительский экран показывает только назначенные доставки и действия маршрута. ## Рекомендуемый порядок работ 1. Исправить экран входа и auth-copy. 2. Подключить `LogisticsReadinessBoard` в `DashboardPage`. 3. Убрать технические баннеры и режимные тексты из dashboard. 4. Очистить manifest/README/scenarios от demo wording. 5. Починить lint. 6. Пройти ручной smoke test по ролям. 7. Подготовить короткий сценарий показа заказчику. ## Команды финальной проверки ```bash npm test npm run lint npm run build rg -n "(demo|демо|test|тест|боев|рабочий режим|локальный|служебный|roles@local|local@local|000000|без кода|живой контур|Supabase)" src public README.md docs/product-overview.md docs/scenarios.md -S ``` Ожидание: - `npm test` проходит. - `npm run lint` проходит. - `npm run build` проходит. - `rg` не находит запрещённые слова в пользовательском UI и публичных материалах. Допустимы только внутренние тесты, dev-only комментарии и техническая документация, не используемая в демонстрации. ## Definition of Done - Экран входа выглядит как production-ready вход по email-коду. - Все режимные и служебные подсказки убраны из UI. - Логистический кабинет работает по delivery sets. - Клиентская ссылка работает и не содержит технических пояснений. - Водительский кабинет показывает назначенные доставки и статусы маршрута. - Публичные метаданные приложения не называют продукт демо. - Тесты, lint и build зелёные. - Есть отдельный сценарий показа заказчику без внутренних технических деталей.