krona-front/FRONTEND-REMEDIATION-TASK-FOR-AGY.md

156 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Задание 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. Честная система качества
1. Исправить все предупреждения `oxlint`, включая:
- неиспользуемые импорты, параметры и state;
- синхронные `setState` внутри effects;
- `Date.now()` и другие impure-вызовы во время render.
2. Включить режим, при котором предупреждения линтера ломают CI.
3. Добавить единый скрипт `npm run check`, выполняющий последовательно:
- lint без предупреждений;
- TypeScript typecheck;
- unit/component tests;
- production build;
- E2E.
4. Playwright должен устанавливаться воспроизводимо:
- локальная команда установки браузера описана в README;
- CI устанавливает Chromium с необходимыми зависимостями;
- отсутствие браузера не маскируется как пропуск или успех.
5. Не коммитить `test-results`, traces и генерируемые screenshots, кроме отдельно утверждённых visual baselines.
### Этап B. Настоящие E2E-сценарии
Переписать `e2e/app.spec.ts` и при необходимости разделить тесты по файлам. Каждый тест обязан совершать заявленное действие и проверять устойчивый результат.
Минимальный набор:
1. Dashboard открывается без runtime/console/page errors и горизонтального overflow на desktop/tablet/mobile.
2. Переключение темы выполняется через UI, сохраняется после reload и проверяется по фактическому состоянию приложения. Запрещено подменять проверку прямой установкой `data-theme`.
3. CRM: перетащить сделку в другую колонку, проверить изменение стадии и сохранение после reload.
4. CRM: создать лид, конвертировать его в контакт и сделку, проверить появление всех результатов.
5. Сделка `Won`: создать заказ и проверить его в разделе продаж.
6. Заказ: подтверждение → резерв → оплата → отгрузка; проверить изменения склада и финансов.
7. Configuration Engine: создать кастомную сущность, добавить поля разных групп, собрать форму, сохранить запись и проверить её после reload.
8. View Builder: изменить порядок колонок настоящим drag-and-drop и проверить сохранение.
9. RBAC: разрешённый маршрут доступен, запрещённый приводит на корректный 403.
10. 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.
1. Ввести `AppContext`/`RequestContext` как минимум с `tenantId`, `actorId`, `roleIds`, `correlationId`.
2. Все repository/service methods должны принимать контекст явно или через типизированный provider.
3. IndexedDB demo storage должен изолировать данные по `tenantId`:
- составной ключ или tenant-aware ключи/индексы;
- tenant filter обязателен для get/list/update/delete;
- импорт и экспорт относятся к явно выбранному tenant;
- нельзя прочитать/изменить запись другого tenant по известному ID.
4. Добавить тесты tenant isolation для records, metadata, layouts, views, audit и settings.
5. Описать адаптер `mock ↔ REST API`, включая auth/401/403, validation errors, pagination, optimistic concurrency и correlation IDs.
### Этап E. UI-kit и архитектурная очистка
1. Выбрать один канонический путь: предпочтительно `src/shared/ui`.
2. Перевести потребителей со `src/shared/components`, затем удалить дубли без поломки интерфейса.
3. Устранить слишком крупные модули (`CrmModule`, builders) путём выделения экранов, hooks и domain actions. Не делать механическую нарезку без ясных границ.
4. Исправить несоответствие README: `QueryClientProvider` либо реально внедрить при необходимости, либо удалить упоминание.
5. Удалить неиспользуемые зависимости и проверить production bundle. Зафиксировать разумные budget-пороги для initial JS и крупных lazy chunks.
### Этап F. Честная документация готовности
1. Обновить README и `FEATURE-COVERAGE.md` по фактическому результату.
2. Различать:
- готовый интерактивный сценарий;
- target prototype;
- demo-only;
- placeholder;
- ожидает backend.
3. Не писать «100% готово», если проверены только render и наличие кнопки.
4. Число тестов не вводить вручную в badge либо обновлять автоматически.
5. Для каждого модуля указать реально работающие 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. Приёмочные критерии
Работа принимается, когда:
1. `npm ci` проходит на чистом checkout.
2. `npm run lint` даёт 0 ошибок и 0 предупреждений.
3. TypeScript strict typecheck проходит.
4. Все unit/component tests проходят.
5. Все обязательные Playwright tests реально выполняются в Chromium и проходят на трёх viewport.
6. Production build проходит, а budget-проверка не нарушена.
7. Каждый заявленный тип поля имеет contract test и минимум один integration test renderer → save → reload → readonly.
8. Tenant isolation доказана негативными тестами.
9. DnD проверен мышью и доступной клавиатурной альтернативой.
10. README и coverage matrix соответствуют фактам.
11. Рабочее дерево после проверок чистое.
## 6. Порядок сдачи
1. Работать в ветке `codex/frontend-remediation`.
2. Делать небольшие логические коммиты по этапам A–F.
3. В финальном отчёте приложить:
- список исправлений;
- команды и полный итог проверок;
- количество unit и E2E тестов;
- список сознательно оставшихся ограничений;
- ссылку на PR.
4. Не сливать PR самостоятельно без отдельной команды владельца.