docs(openspec): aurora-1843 — решения 29.10 (полосы загрузки, ускорение поиска) и рулинги R-12…R-22, O-8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
251a14c05b
commit
2be6f08555
@ -139,6 +139,11 @@
|
||||
- поиск и фильтры совпадают с экраном до изменения;
|
||||
- прежний режим байт-в-байт.
|
||||
|
||||
## Решения (согласовано 29.10)
|
||||
|
||||
12. **Строки, чья страница ещё не пришла, показываются серыми полосами загрузки (MUI Skeleton, тот же вид, что при «Обновить»), а не пустыми.** То же при смене поиска, фильтра или вкладки: до первого ответа нового поколения старые строки не рисуются. Повод — O-7 ночного прогона 29.10 (пустые строки при прыжке ползунком). Коммиты eef358c, 1b8a1a4.
|
||||
13. **Серверный поиск ускоряется до слияния: время поиска не больше 1,5× загрузки первой страницы без поиска на том же листе (масштаб 2, серверное время).** Повод — I-1 (#39): RF «аренд» 4,7 с при первой странице 0,74 с. Коммит c8e957b: GO ≤ 1,36×, RF ≤ 1,44×; оракул поиска и paging_check — CHECK_OK.
|
||||
|
||||
## Решения по устройству
|
||||
|
||||
### 1. Контракт `GET /api/v1/svod/2/{sheet}/{year}`
|
||||
@ -699,3 +704,29 @@ PR создаются по готовности, merge — по команде
|
||||
Цена ошибки: лишний запрос или кратковременные заглушки; проверяет главный контроллер вручную.
|
||||
45. **2026-10-29 (контроллер, R-11) — в сценариях стенда «строка с данными» исключает строки-заглушки и строки со скелетоном (`SVOD2_DATA_ROW_SELECTOR` с `:not(:has(.MuiSkeleton-root))`), `settle` в `svod2-memory` ждёт нуля скелетонов; `first_rows_ms` снимает raf-наблюдатель в странице. Причина: в режиме `load` фронт держит `loading=true` до прихода вариантов и страниц окна, и MRT рисует скелетоны в ячейках даже при непустых данных — без этой правки «до/после» завышало бы выигрыш. Это видимое пользователю отличие (скелетоны вместо строк до конца загрузки окна); решает главный контроллер после ручной проверки.**
|
||||
Цена ошибки: метрика «до/после» нечестна, либо переделка `loading`-индикации на фронте.
|
||||
46. **2026-10-29 (главный контроллер, R-12) — исправления 1842 (b834f10, 4cb0862) влиты в стек 1843 обычными merge сверху вниз (#227 → #241 → #243 → #245), без rebase и force-push; конфликты в `Svod2Page.jsx` и `svod2Styles.test.js` разрешены объединением обеих сторон.**
|
||||
Обоснование: PR на ревью у людей, история не переписывается; 1843 не рисует свой заголовок и не меняет `layoutMode`, противоречий нет.
|
||||
Цена ошибки: сломанный заголовок или пагинация; проверено тестами, build и вживую (границы 26 групп ±1 px).
|
||||
47. **2026-10-29 (исполнитель поиска, R-13) — значения для поиска берутся прямо из колонок `budget_line`, `expense_item`, `contract_summary`, `contract_detail`, `ckk`, без сборки jsonb; набор и правило «при совпадении ключей побеждает последний» повторяют прежнее `header || cs || cd`.**
|
||||
Обоснование: jsonb стоил 10–15 мкс на строку, цель без этого недостижима.
|
||||
Цена ошибки: новая колонка `contract_*` не попадёт в поиск; `test_search_columns_are_those_known_to_svod2_lines` упадёт при добавлении колонки.
|
||||
48. **2026-10-29 (исполнитель поиска, R-14) — значения строки склеиваются через U+0001 и проверяются одним `strpos`; для строки поиска с U+0001 — запасной путь по каждому значению.**
|
||||
Цена ошибки: ложное совпадение на стыке при ошибке в запасном пути; покрыто тестом.
|
||||
49. **2026-10-29 (исполнитель поиска, R-15) — регистр данных приводится `translate` только по парам таблицы, результат которых есть в строке поиска (`svod2_casefold_for_search`); для ненормализованной строки — полная таблица. Таблица вынесена в IMMUTABLE-функции `svod2_casefold_from()`/`svod2_casefold_to()`.**
|
||||
Цена ошибки: расхождение регистра для редкого символа; покрыто тестами и оракулом.
|
||||
50. **2026-10-29 (исполнитель поиска, R-16) — числа переводятся в текст JS лениво и только если строка поиска может совпасть с записью числа; ноль — без вызова plpgsql (`svod2_num_text`).**
|
||||
Цена ошибки: нет, результат тот же; ветки покрыты тестами (`1`, `-`, `.`, `e`, `+`, `e+25`, `1e-7`, `infinity`, `nan`).
|
||||
51. **2026-10-29 (исполнитель поиска, R-17) — `SET jit TO off` на `v_svod2_go` и `v_svod2_rf`; на `v_svod2_facets` не ставится: с `SET` функция перестаёт подставляться, и `test_facets_search_subplan_is_not_correlated` это ловит.**
|
||||
Цена ошибки: facets уязвим к JIT на БД без статистики.
|
||||
52. **2026-10-29 (исполнитель поиска, R-18) — `facets` с поиском остаётся 1,6–1,66× первой страницы (двойной `svod2_lines`, см. #40); в цель #13 не входит. Статус `deferred`.**
|
||||
Цена ошибки: варианты фильтров при поиске появляются на ~0,3–0,6 с позже страницы.
|
||||
53. **2026-10-29 (исполнитель фронта, R-19) — после поиска или фильтра на глубине scrollTop программно не сбрасывается (spec «SHALL NOT менять положение прокрутки программно»); браузер прижимает его к концу короткого списка.**
|
||||
Цена ошибки: если нужен сброс на начало — правка spec и `scrollTop = 0` при refine.
|
||||
54. **2026-10-29 (исполнитель фронта, R-20) — при окне не у начала параллельно странице по прокрутке запрашивается `offset=0` (`shouldFetchFirstPageFallback`): страница за концом нового списка отвечала 6,5 с против 3 с.**
|
||||
Цена ошибки: лишний запрос 300 строк на refine на глубине. После ускорения поиска (#13) выигрыш меньше; пересмотреть после замера, статус `deferred`.
|
||||
55. **2026-10-29 (исполнитель фронта, R-21) — ширина полосы загрузки детерминирована от (колонка, строка) (`getSkeletonWidth`), а не случайна, как у MRT.**
|
||||
Цена ошибки: только внешний вид.
|
||||
56. **2026-10-29 (исполнитель фронта, R-22) — признак «данные устарели» — `dataGeneration !== generation` (`getCurrentPages`); срабатывает и при «Обновить», где старые строки и раньше были закрыты полосами MRT.**
|
||||
Цена ошибки: если при «Обновить» нужно оставлять строки видимыми — различать режимы `load` и `refine`.
|
||||
57. **2026-10-29 (главный контроллер, O-8) — на стенде масштаба 2 таблицы `contract_summary`, `contract_detail` и `ckk` были пустыми: оракул поиска и ночные замеры до 29.10 не проверяли поиск по полям договоров. Исполнитель поиска добавил синтетические договоры в БД `perf` (каждая 3-я строка `contract_detail`, каждая 4-я `contract_summary`); оракул на них — CHECK_OK. Генератор `perfkit` договоры не создаёт — `deferred`.**
|
||||
Цена ошибки: без договоров на стенде регресс поиска по полям договоров не виден замером.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user