13 KiB
Задание AGY: доведение krona-front после контрольного аудита
1. Цель
Довести интерактивный frontend-прототип Krona Business Platform до состояния, в котором заявленная функциональность действительно работает и проверяется автоматическими тестами.
Это задание исправляет результат коммита 0e4c0f7. Нельзя ограничиваться изменением документации, скрытием предупреждений линтера или ослаблением тестов.
2. Исходное состояние
- Production build проходит.
- 97 unit/component тестов проходят.
npm run lintзавершается с кодом 0, но выдаёт около 186 предупреждений.- 9 Playwright E2E-тестов не были выполнены из-за отсутствующего Chromium.
- E2E-тест с названием про перемещение сделки фактически не выполняет перемещение.
- Configuration Engine объявляет поддержку 39+ типов, однако runtime renderer полноценно поддерживает только часть.
- IndexedDB и сервисные контракты не готовы к tenant-aware подключению backend.
- В проекте дублируются
shared/componentsиshared/ui. - README и
FEATURE-COVERAGE.mdсодержат завышенные или устаревшие утверждения.
3. Обязательные работы
Этап A. Честная система качества
- Исправить все предупреждения
oxlint, включая:- неиспользуемые импорты, параметры и state;
- синхронные
setStateвнутри effects; Date.now()и другие impure-вызовы во время render.
- Включить режим, при котором предупреждения линтера ломают CI.
- Добавить единый скрипт
npm run check, выполняющий последовательно:- lint без предупреждений;
- TypeScript typecheck;
- unit/component tests;
- production build;
- E2E.
- Playwright должен устанавливаться воспроизводимо:
- локальная команда установки браузера описана в README;
- CI устанавливает Chromium с необходимыми зависимостями;
- отсутствие браузера не маскируется как пропуск или успех.
- Не коммитить
test-results, traces и генерируемые screenshots, кроме отдельно утверждённых visual baselines.
Этап B. Настоящие E2E-сценарии
Переписать e2e/app.spec.ts и при необходимости разделить тесты по файлам. Каждый тест обязан совершать заявленное действие и проверять устойчивый результат.
Минимальный набор:
- Dashboard открывается без runtime/console/page errors и горизонтального overflow на desktop/tablet/mobile.
- Переключение темы выполняется через UI, сохраняется после reload и проверяется по фактическому состоянию приложения. Запрещено подменять проверку прямой установкой
data-theme. - CRM: перетащить сделку в другую колонку, проверить изменение стадии и сохранение после reload.
- CRM: создать лид, конвертировать его в контакт и сделку, проверить появление всех результатов.
- Сделка
Won: создать заказ и проверить его в разделе продаж. - Заказ: подтверждение → резерв → оплата → отгрузка; проверить изменения склада и финансов.
- Configuration Engine: создать кастомную сущность, добавить поля разных групп, собрать форму, сохранить запись и проверить её после reload.
- View Builder: изменить порядок колонок настоящим drag-and-drop и проверить сохранение.
- RBAC: разрешённый маршрут доступен, запрещённый приводит на корректный 403.
- Export/import/reset IndexedDB: экспортировать изменённое состояние, сбросить, импортировать и проверить восстановление.
Использовать устойчивые data-testid или role/name locators. Не использовать селекторы вида «любой [draggable=true]», если тест относится к конкретной сущности.
Этап C. Полная реализация типов полей
Согласовать реестр типов с нормативным docs/52-FIELD-TYPES-REFERENCE.md Business Platform. Один канонический список должен использоваться Builder, renderer, validation, table, card и serialization.
Для каждого заявленного типа реализовать корректные ввод, readonly-отображение, validation и сериализацию. В частности:
multiselect/multi_select,checkbox_group— массив значений, не строка;rating— ограниченный числовой контрол;time—input[type=time];url,color— соответствующие контролы и validation;file,image— mock upload/storage abstraction с metadata и preview, не текстовое поле;address,location— структурированный формат либо явно документированный MVP-контракт;user,employee,team,company,contact,product,entity_relation,entity_ref— selector записей с хранением стабильного ID;formula— readonly вычисление по безопасному ограниченному выражению; запрещёнeval/Function;autonumber— readonly значение из отдельного генератора;json— JSON parse/validation и хранение объекта, а не необработанной строки;rich_text— безопасный ограниченный редактор/формат; не допускать небезопасный HTML;money— minor units плюс ISO 4217 currency, без float как доменного значения;decimal— не смешивать с money; определить сериализацию без неявной потери точности.
Удалить дублирующие псевдонимы типов либо реализовать явную backward-compatible normalization. Добавить parameterized contract tests на каждый тип.
Этап D. Tenant-aware frontend contracts
Прототип остаётся без backend, но его контракты должны позволять подключить платформу без переписывания UI.
- Ввести
AppContext/RequestContextкак минимум сtenantId,actorId,roleIds,correlationId. - Все repository/service methods должны принимать контекст явно или через типизированный provider.
- IndexedDB demo storage должен изолировать данные по
tenantId:- составной ключ или tenant-aware ключи/индексы;
- tenant filter обязателен для get/list/update/delete;
- импорт и экспорт относятся к явно выбранному tenant;
- нельзя прочитать/изменить запись другого tenant по известному ID.
- Добавить тесты tenant isolation для records, metadata, layouts, views, audit и settings.
- Описать адаптер
mock ↔ REST API, включая auth/401/403, validation errors, pagination, optimistic concurrency и correlation IDs.
Этап E. UI-kit и архитектурная очистка
- Выбрать один канонический путь: предпочтительно
src/shared/ui. - Перевести потребителей со
src/shared/components, затем удалить дубли без поломки интерфейса. - Устранить слишком крупные модули (
CrmModule, builders) путём выделения экранов, hooks и domain actions. Не делать механическую нарезку без ясных границ. - Исправить несоответствие README:
QueryClientProviderлибо реально внедрить при необходимости, либо удалить упоминание. - Удалить неиспользуемые зависимости и проверить production bundle. Зафиксировать разумные budget-пороги для initial JS и крупных lazy chunks.
Этап F. Честная документация готовности
- Обновить README и
FEATURE-COVERAGE.mdпо фактическому результату. - Различать:
- готовый интерактивный сценарий;
- target prototype;
- demo-only;
- placeholder;
- ожидает backend.
- Не писать «100% готово», если проверены только render и наличие кнопки.
- Число тестов не вводить вручную в badge либо обновлять автоматически.
- Для каждого модуля указать реально работающие CRUD/actions, persistence, ограничения и непокрытые сценарии.
4. Запреты
- Не отключать lint-правила ради зелёного результата.
- Не заменять E2E unit-тестами.
- Не использовать
test.skip, условный early return или фиктивные проверки для обязательных сценариев. - Не проверять только наличие элемента, если сценарий заявляет изменение данных.
- Не добавлять фиктивный backend и не привязывать UI напрямую к endpoint без service adapter.
- Не хранить tenant только в визуальном state без фильтрации storage/repositories.
- Не заявлять поддержку типа поля, если он отображается обычным текстовым input.
- Не коммитить секреты, локальные
.local, build artifacts и Playwright output.
5. Приёмочные критерии
Работа принимается, когда:
npm ciпроходит на чистом checkout.npm run lintдаёт 0 ошибок и 0 предупреждений.- TypeScript strict typecheck проходит.
- Все unit/component tests проходят.
- Все обязательные Playwright tests реально выполняются в Chromium и проходят на трёх viewport.
- Production build проходит, а budget-проверка не нарушена.
- Каждый заявленный тип поля имеет contract test и минимум один integration test renderer → save → reload → readonly.
- Tenant isolation доказана негативными тестами.
- DnD проверен мышью и доступной клавиатурной альтернативой.
- README и coverage matrix соответствуют фактам.
- Рабочее дерево после проверок чистое.
6. Порядок сдачи
- Работать в ветке
codex/frontend-remediation. - Делать небольшие логические коммиты по этапам A–F.
- В финальном отчёте приложить:
- список исправлений;
- команды и полный итог проверок;
- количество unit и E2E тестов;
- список сознательно оставшихся ограничений;
- ссылку на PR.
- Не сливать PR самостоятельно без отдельной команды владельца.