From 753eccbd9791324158b721012e91b644648620bd Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 28 Oct 2026 22:16:14 +0400 Subject: [PATCH] =?UTF-8?q?docs(openspec):=20=D1=80=D1=83=D0=BB=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B8=20R-27,=20R-28,=20=D1=87=D0=B5=D0=BA-=D0=BB?= =?UTF-8?q?=D0=B8=D1=81=D1=82=20Task=208,=20=D1=83=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=20=D0=B2=D0=B5=D1=82=D0=BA=D0=B8=20(#206)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I-4, M-3, M-9, M-10, M-11. Co-Authored-By: Claude Opus 5.5 --- .../plans/2026-10-28-corrections-table-ui.md | 2 ++ openspec/changes/corrections-table-ui/design.md | 6 ++++-- openspec/changes/corrections-table-ui/proposal.md | 2 +- openspec/changes/corrections-table-ui/tasks.md | 12 +++++++++--- web/ARCHITECTURE.md | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/superpowers/plans/2026-10-28-corrections-table-ui.md b/docs/superpowers/plans/2026-10-28-corrections-table-ui.md index 8bc1599..a327d97 100644 --- a/docs/superpowers/plans/2026-10-28-corrections-table-ui.md +++ b/docs/superpowers/plans/2026-10-28-corrections-table-ui.md @@ -336,3 +336,5 @@ RSHB/arm-core#206, Jira AURORA-1541. (`../docs/dev/qa-guide.md`) на реальной версии; пройти сценарии spec; расхождения ответа с контрактом — правка в фейке и типах или замечание в PR 1540; `make check-full`; PR в `main` (до этого PR не открывать — фронт без API не сливаем, если владелец не решит иначе). + +Уточнение (R-27): в Task 8 удаляются только `services/api/correctionsFake.ts` (+ `correctionsFake.test.ts`) и ветка флага `CORRECTIONS_MOCK` в `corrections.ts`/`config.ts`; `widgets/CorrectionTable/mockData.ts` и `mockCalc.ts` остаются как тестовые фикстуры — их импортируют тесты моделей. diff --git a/openspec/changes/corrections-table-ui/design.md b/openspec/changes/corrections-table-ui/design.md index 1933b25..aa999c8 100644 --- a/openspec/changes/corrections-table-ui/design.md +++ b/openspec/changes/corrections-table-ui/design.md @@ -73,7 +73,7 @@ вся таблица), `GET …/export`. - Клиент — `web/src/services/api/corrections.ts` поверх `api/client.ts`. При `REACT_APP_CORRECTIONS_MOCK=true` те же функции отвечают из фейка контракта в памяти (данные — из дизайна 23.10, с проверками контракта: обязательный комментарий, - `expected_version_no`, применимость правила). Флаг по умолчанию выключен; в production-сборке фейк не используется. + `expected_version_no`, применимость правила). Флаг по умолчанию выключен; фейк включается только переменной окружения, но код фейка остаётся в бандле (R-21, R-26). ### Таблица @@ -131,7 +131,7 @@ 79,77 % из дизайна — ошибка дизайна, п. 7). Расхождение не запрещает сохранение (ждёт п. 8). - **Сохранить** — `PUT` с `status = APPLIED`, `expected_version_no` из ответа; ошибки сервера показываются в окне по коду (`COMMENT_REQUIRED` — у поля комментария, `INVALID_LINE_CODE` — у статьи, `CORRECTION_VERSION_CONFLICT` — «Корректировку уже - изменили, таблица обновлена», окно перечитывает данные). + изменили, данные обновлены», окно перечитывает данные). - **Черновик окна в `localStorage`** (решение владельца 28.10.2026 вместо блокировки переходов): статьи распределения и комментарий сохраняются при каждой правке; ключ — пользователь + версия + агрегат (`rule_id`, компании), в записи — время и `version_no` корректировки, от которой начаты правки. Переход «Назад», закрытие вкладки, переход по ссылке правки не @@ -206,3 +206,5 @@ | 28.10.2026 | R-24: у агрегата флажок «Учитывать в КФО» — серый неактивный индикатор «Да / Частично / Нет», а в дизайне зелёный | решение 28.10 (флажок ставится на строках, у агрегата производное) | ответ по п. 4 «на агрегат» | | 28.10.2026 | R-25: отдельное ревью Task 7 (стиль, два мелких фикса, документация) не делалось, оно покрыто финальным ревью ветки | дифф механический, финальное ревью читает всю ветку | мелкая ошибка в Task 7 всплывёт на финальном ревью | | 28.10.2026 | R-26: фейк (R-21) остаётся в бандле до Task 8, который его удаляет | вырезание требует динамического импорта или `define` в rsbuild, и всё равно временное | ~20 КБ в бандле до подключения API | +| 28.10.2026 | R-27: `mockData` и `mockCalc` остаются как тестовые фикстуры (их импортируют тесты `tableModel`, `editorModel`, `readOnly`, `draftStorage`); Task 8 удаляет только `correctionsFake.ts` (+ его тест) и ветку флага в `corrections.ts`. Уточняет R-5, R-21, R-26: «вырезается» относится только к фейку контракта `correctionsFake` | иначе при подключении API пришлось бы переписывать тесты моделей | если фикстуры устареют относительно контракта — тесты моделей перестанут ловить расхождения; сверять при Task 8 | +| 28.10.2026 | R-28: окно выбора нераспределённой строки (picker) не показывает исключённые (`excluded`) — исключённую сначала возвращают в учёт флажком в таблице | исключённая строка сознательно убрана из КФО; разнесение её в правило молча вернуло бы её в расчёт | аналитику нужен лишний шаг; если захотят выбирать исключённые — снять условие `!u.excluded` в `pickerCandidates` | diff --git a/openspec/changes/corrections-table-ui/proposal.md b/openspec/changes/corrections-table-ui/proposal.md index 5f21d30..44473fc 100644 --- a/openspec/changes/corrections-table-ui/proposal.md +++ b/openspec/changes/corrections-table-ui/proposal.md @@ -53,7 +53,7 @@ AURORA-1395 и в AURORA-1396. - `web/src/widgets/ConsolidatedOsv/OsvTabs.tsx` — вкладка `correction` без `disabled`. - `web/src/layouts/ConsolidationReportPage.tsx` — содержимое вкладки `correction`. - Новое: `web/src/widgets/CorrectionTable/` (таблица, панель, окно корректировки, чистые функции + тесты), - `web/src/services/api/corrections.ts`, типы контракта в `web/src/types/api.ts` (или `types/corrections.ts`), фейк контракта. + `web/src/services/api/corrections.ts`, типы контракта в `web/src/types/corrections.ts`, фейк контракта. - `web/src/conf/config.ts` — флаг `REACT_APP_CORRECTIONS_MOCK`. - Таблицы DBML v5.23: `correction`, `elimination_rule`, `osv_entry` — только читаются через API; новых полей фронт не вводит. - Правила: `05-domain-rules.md` §8 (корректировки) в нынешнем виде описывает только запись корректировки; разнесение строк и diff --git a/openspec/changes/corrections-table-ui/tasks.md b/openspec/changes/corrections-table-ui/tasks.md index 747ede6..996159c 100644 --- a/openspec/changes/corrections-table-ui/tasks.md +++ b/openspec/changes/corrections-table-ui/tasks.md @@ -31,12 +31,18 @@ ## 7. Сверка с дизайном, проверки, документация -- [x] 7.1 Проход сценариев спеки в браузере на фейке и сверка частей экрана с дизайном (ширина 1920) +- [x] 7.1 Проход сценариев спеки в браузере на фейке (ширина 1920, headless Chrome по CDP) и сверка частей экрана с дизайном. Проверено: таблица и группы колонок, панель, фильтры в заголовках, раскрытие, нераспределённые, пресет, настройка таблицы, окно корректировки, решения по строкам (в т.ч. повторный INCLUDE), «Убрать из правила», ошибка загрузки с «Повторить», экспорт, `composition_changed` и «черновик». Не проверено — вынесено в 8.1: полный экран, 409 / `CORRECTION_VERSION_CONFLICT`, недоступный `localStorage`, «Вернуть к автоматике» внутри агрегата, реальный API - [x] 7.2 `make web-check`, `npm test`, `npm run lint`, `openspec validate corrections-table-ui --strict` - [x] 7.3 README (флаг фейка) и ARCHITECTURE (виджет `CorrectionTable`) ## 8. Подключение к API (после слияния AURORA-1540) -- [ ] 8.1 Влить `main`, запустить без флага на стенде на реальной версии, пройти сценарии спеки -- [ ] 8.2 Расхождения ответа с контрактом — правка фейка и типов или замечание в PR 1540; убрать фейк (`correctionsFake`, `mockData`, `mockCalc`) и флаг +- [ ] 8.1 Влить `main`, запустить без флага на стенде на реальной версии, пройти сценарии спеки. Отдельно проверить то, что не проверено на фейке: + - полноэкранный режим (уведомления внутри бокса, выпадающие списки); + - 409 и `CORRECTION_VERSION_CONFLICT` в окне и при решении по строке; + - недоступный `localStorage` (приватное окно): окно корректировки работает без черновика; + - «Вернуть к автоматике» на строке внутри агрегата (на нераспределённой фейк не возвращает строку в правило, R-23); + - сценарии спеки, которых нет на данных фейка, — на реальных данных: Сатурн — Архол; Бековский с 62.01 / 60.02 / 62.03 / 76.01; ПМП — Бековский комбинат для «Добавить строку ОСВ»; + - `allocate` с несколькими `entry_ids` и код `VALIDATION_ERROR` — фейк их не воспроизводит (M-10) +- [ ] 8.2 Расхождения ответа с контрактом — правка фейка и типов или замечание в PR 1540; убрать фейк контракта (`correctionsFake.ts` и его тест) и ветку флага в `corrections.ts`; `mockData` и `mockCalc` остаются тестовыми фикстурами (R-27) - [ ] 8.3 `make check-full`, PR в `main` diff --git a/web/ARCHITECTURE.md b/web/ARCHITECTURE.md index 9950541..84633d9 100644 --- a/web/ARCHITECTURE.md +++ b/web/ARCHITECTURE.md @@ -63,7 +63,7 @@ SPA поверх API arm-core (`/api/v1`). Своих данных и бизне | `useCorrectionTable.ts` | хук | загрузка, `reload`/`replace`/`replaceAggregate` | | `CorrectionContent.tsx`, `CorrectionToolbar.tsx`, `CorrectionTable.tsx`, `HeaderFilter.tsx` | компоненты | вкладка, панель, таблица с группами колонок, воронки в заголовках | | `CorrectionEditorModal.tsx`, `EditorSide.tsx`, `AllocationPicker.tsx`, `RevokeModal.tsx` | компоненты | окно «Корректировка операции», сторона окна, выбор нераспределённой строки, отмена | -| `mockData.ts`, `mockCalc.ts` | фейк | данные дизайна и пересчёт агрегата; вырезаются при подключении API | +| `mockData.ts`, `mockCalc.ts` | фикстуры | данные дизайна и пересчёт агрегата; остаются как тестовые фикстуры (R-27); фейк контракта `services/api/correctionsFake.ts` удаляется в Task 8 | | `../../utils/money.ts` | чистый | деньги копейками (`toCents`, `percentOfSmaller`, порог 5 %) | Чистые модули покрыты vitest (`*.test.ts`); компоненты тестов не имеют (нет DOM-библиотеки), их проверяют в браузере.