AURORA-1844: upd_form_cells возвращает строки целиком #231

Open
aep wants to merge 2 commits from feat/215-aurora-1844-upd-form-cells-full-rows into test
Owner

Closes #215

Jira: AURORA-1844

Что сделано

  • Миграция 0050 upd_form_cells_full_rows: v3.upd_form_cells(p_form_id, p_sheet, p_changes, p_direction, p_sections) без снимка «до» и _jsonb_diff; после применения правок один вызов выборки, ответ - строки целиком (изменённые INPUT и все предки-агрегаты, включая неизменившиеся). Обёртка с p_user_id (0031) не тронута.
  • «Шов»: v3._form_affected_rows(p_form_id, p_sheet, p_ids int[], p_direction, p_sections) - выборка затронутых строк (её перепишет AURORA-1850, AURORA-1845 будет звать отдельно).
  • FORM_4: ROOT раздела, GROUP по program_id и ITEM по project_id изменённых строк (не все программы/проекты раздела).
  • p_sections: убираются ключи верхнего уровня исключённых разделов; вложенные null сохраняются (очистка ячейки доходит до клиента).
  • Сателлиты, AHR_LIMIT, OTCH9F - те же фильтры, строки целиком.
  • ARCHITECTURE.md: контракт ответа. Python и фронт не менялись.

Тесты

  • tests/integration/test_upd_form_cells_full_rows.py (10 тестов) и переиспользуемый tests/integration/sheet_contract.py (assert_patch_rows_match_sheet: строка ответа == строка GET по (row_type, depth, sort_order), для AURORA-1850): FORM_1 Support, FORM_2 AHR/CAP/OPER, FORM_4 (только своя программа/проект), AHR_RENT (+ сумма в GET AHR), неизменившийся предок, очистка уменьшает суммы, PATCH /cells с плохой колонкой - ошибка и ничего не применено, ?sections=plan.
  • Полный прогон на PG16 (perf-pg, БД dfip_1844): 210 passed, 4 skipped, 3 failed - те же 3 исходных падения.

Проверить руками

  • Правка ячейки на FORM_2/AHR: в ответе PATCH полные строки, совпадающие с GET.
  • Правка в FORM_4: в ответе нет чужих программ и проектов.
  • Совместимость с PG15 (миграция написана без возможностей PG16, на PG15 не гонялась из-за 0012, см. AURORA-1922).

Замер до/после

Будет добавлен после ночного прогона на стенде perf/. Сценарий: coauthor на FORM_2/AHR до grow (PERF_TARGETS='FORM_2/AHR/*', scroll-coauthor.spec.ts), метрика mean_exec_time upd_form_cell в sql/coauthor/sql_top.json: ~630 -> <=350 мс, вложенных v_form2_view на правку 1 вместо 2.

Rulings I made

  • R-1: в список удаляемых при sections ключей включены также fact_q1..fact_q4, sequestration, reserve, contract_detail (union списков FORM_1/2/4); header не удаляется. Цена ошибки: лишний/недостающий ключ в ответе при sections.
  • R-2: в FORM_4 GROUP/ITEM дополнительно ограничены expense_item_id из пути изменённых статей (программа может встречаться в нескольких разделах). Цена ошибки: пропущенная или лишняя строка GROUP/ITEM.
  • R-3: для плохой колонки тест принимает 400 или 422 (SQL unknown_column сейчас даёт 400, как в существующем тесте).

🤖 Generated with Claude Code

Closes #215 Jira: AURORA-1844 ## Что сделано - Миграция 0050 `upd_form_cells_full_rows`: `v3.upd_form_cells(p_form_id, p_sheet, p_changes, p_direction, p_sections)` без снимка «до» и `_jsonb_diff`; после применения правок один вызов выборки, ответ - строки целиком (изменённые INPUT и все предки-агрегаты, включая неизменившиеся). Обёртка с `p_user_id` (0031) не тронута. - «Шов»: `v3._form_affected_rows(p_form_id, p_sheet, p_ids int[], p_direction, p_sections)` - выборка затронутых строк (её перепишет AURORA-1850, AURORA-1845 будет звать отдельно). - FORM_4: ROOT раздела, GROUP по program_id и ITEM по project_id изменённых строк (не все программы/проекты раздела). - `p_sections`: убираются ключи верхнего уровня исключённых разделов; вложенные null сохраняются (очистка ячейки доходит до клиента). - Сателлиты, AHR_LIMIT, OTCH9F - те же фильтры, строки целиком. - ARCHITECTURE.md: контракт ответа. Python и фронт не менялись. ## Тесты - `tests/integration/test_upd_form_cells_full_rows.py` (10 тестов) и переиспользуемый `tests/integration/sheet_contract.py` (`assert_patch_rows_match_sheet`: строка ответа == строка GET по (row_type, depth, sort_order), для AURORA-1850): FORM_1 Support, FORM_2 AHR/CAP/OPER, FORM_4 (только своя программа/проект), AHR_RENT (+ сумма в GET AHR), неизменившийся предок, очистка уменьшает суммы, PATCH /cells с плохой колонкой - ошибка и ничего не применено, `?sections=plan`. - Полный прогон на PG16 (perf-pg, БД dfip_1844): 210 passed, 4 skipped, 3 failed - те же 3 исходных падения. ## Проверить руками - Правка ячейки на FORM_2/AHR: в ответе PATCH полные строки, совпадающие с GET. - Правка в FORM_4: в ответе нет чужих программ и проектов. - Совместимость с PG15 (миграция написана без возможностей PG16, на PG15 не гонялась из-за 0012, см. AURORA-1922). ## Замер до/после Будет добавлен после ночного прогона на стенде perf/. Сценарий: coauthor на FORM_2/AHR до grow (`PERF_TARGETS='FORM_2/AHR/*'`, `scroll-coauthor.spec.ts`), метрика `mean_exec_time` `upd_form_cell` в `sql/coauthor/sql_top.json`: ~630 -> <=350 мс, вложенных `v_form2_view` на правку 1 вместо 2. ## Rulings I made - R-1: в список удаляемых при `sections` ключей включены также `fact_q1..fact_q4`, `sequestration`, `reserve`, `contract_detail` (union списков FORM_1/2/4); `header` не удаляется. Цена ошибки: лишний/недостающий ключ в ответе при sections. - R-2: в FORM_4 GROUP/ITEM дополнительно ограничены `expense_item_id` из пути изменённых статей (программа может встречаться в нескольких разделах). Цена ошибки: пропущенная или лишняя строка GROUP/ITEM. - R-3: для плохой колонки тест принимает 400 или 422 (SQL `unknown_column` сейчас даёт 400, как в существующем тесте). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 2 commits 2026-10-28 17:18:44 +03:00
Выборка строк вынесена в v3._form_affected_rows; FORM_4 отбирает ROOT, GROUP и ITEM только изменённых строк; при sections убираются ключи исключённых разделов.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Проверка на PostgreSQL 15.12 (контроллер, 28.10): ветка + коммиты AURORA-1922 (PR #221), пустая БД, --init_db — миграция 0050 проходит; полный pytest: 212 passed, 4 skipped, 3 failed (исходные падения test). Новых падений нет.

Проверка на PostgreSQL 15.12 (контроллер, 28.10): ветка + коммиты AURORA-1922 (PR #221), пустая БД, --init_db — миграция 0050 проходит; полный pytest: 212 passed, 4 skipped, 3 failed (исходные падения test). Новых падений нет.
Author
Owner

Ночной замер на стенде perf/ (29.10, масштаб 1, D0 без grow, CPU 1x, arm-ka-* остановлены)

Сборки: «до» — test 2a28748 (БД на 0049); «после» — этот PR f0cac30 (D0 + alembic upgrade → 0050). Фронт в обоих — prod-сборка test.
Команда: PERF_SQLSTATS_TAG=coauthor PERF_TARGETS='FORM_2/AHR/*' PERF_COAUTHOR_RATES=1,5 PERF_REPEATS=3 npx playwright test scenarios/scroll-coauthor.spec.ts (perf/results/<run>/sql/coauthor/sql_top.json).

метрика до (test) после (1844) критерий
mean upd_form_cell 524.2 мс (447 вызовов, только rate 1 — см. ниже) 310.9 мс (695) ≤ 350 — выполнен
вложенных v_form2_view на правку 906 / 447 ≈ 2 (снимок «до» + «после») 707 / 695 ≈ 1 (+12 GET) 1 вместо 2 — выполнен
psql: 20 чередований GET/upd в одном соединении (tools/get_vs_upd.py) GET 223.7 / upd 464.5 мс GET 226.4–227.7 / upd 226.7–228.6 мс GET без изменений
main_thread_ms_per_step автора, rate 1 91.0 92.9 справочно
rate 5: (echoed+errors)/sent нет данных (200+49)/262 = 0.95 справочно

Корректность ответа (на стенде): снимок GET всех 56 тяжёлых запросов на 1844 совпал байт в байт со снимком на 1850 (см. #244); отдельной сверки 1844 против test я не делал — контракт ответа на правку покрыт контрактным тестом PR.

Наблюдение O-1 (инструмент, не PR): на test прогон rate 5 упал во всех 3 повторах — coauthor_echoed=0 (sent=0, код бота null): бот не завершается за 10 с после SIGTERM (очередь правок при ~0,5 с на правку), его итог теряется. На 1844/1850 rate 5 проходит. Поэтому «до» для rate 5 нет.

Файлы: /private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/1850/ (getupd-*.txt, api-1844-co.log), прогоны perf/results/n-base-co, n-p1844-co и perf/report-data/<run>/summary.md в worktree perf-bench.

🤖 Generated with Claude Code

## Ночной замер на стенде perf/ (29.10, масштаб 1, D0 без grow, CPU 1x, arm-ka-* остановлены) **Сборки:** «до» — `test` 2a28748 (БД на 0049); «после» — этот PR f0cac30 (D0 + `alembic upgrade` → 0050). Фронт в обоих — prod-сборка `test`. **Команда:** `PERF_SQLSTATS_TAG=coauthor PERF_TARGETS='FORM_2/AHR/*' PERF_COAUTHOR_RATES=1,5 PERF_REPEATS=3 npx playwright test scenarios/scroll-coauthor.spec.ts` (`perf/results/<run>/sql/coauthor/sql_top.json`). | метрика | до (`test`) | после (1844) | критерий | |---|---|---|---| | mean `upd_form_cell` | 524.2 мс (447 вызовов, только rate 1 — см. ниже) | **310.9 мс** (695) | ≤ 350 — **выполнен** | | вложенных `v_form2_view` на правку | 906 / 447 ≈ **2** (снимок «до» + «после») | 707 / 695 ≈ **1** (+12 GET) | 1 вместо 2 — **выполнен** | | psql: 20 чередований GET/upd в одном соединении (`tools/get_vs_upd.py`) | GET 223.7 / upd 464.5 мс | GET 226.4–227.7 / upd 226.7–228.6 мс | GET без изменений | | main_thread_ms_per_step автора, rate 1 | 91.0 | 92.9 | справочно | | rate 5: (echoed+errors)/sent | нет данных | (200+49)/262 = 0.95 | справочно | Корректность ответа (на стенде): снимок GET всех 56 тяжёлых запросов на 1844 совпал байт в байт со снимком на 1850 (см. #244); отдельной сверки 1844 против `test` я не делал — контракт ответа на правку покрыт контрактным тестом PR. Наблюдение O-1 (инструмент, не PR): на `test` прогон rate 5 упал во всех 3 повторах — `coauthor_echoed=0 (sent=0, код бота null)`: бот не завершается за 10 с после SIGTERM (очередь правок при ~0,5 с на правку), его итог теряется. На 1844/1850 rate 5 проходит. Поэтому «до» для rate 5 нет. Файлы: `/private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/1850/` (getupd-*.txt, api-1844-co.log), прогоны `perf/results/n-base-co`, `n-p1844-co` и `perf/report-data/<run>/summary.md` в worktree perf-bench. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Owner

Ночной замер — часть 2 (итог)

Сборки как в части 1 («до» — 1844 f0cac30, D0 + 0050). Добавлено: поведение в combo (все 14 PR волны 1, бэк combo без 1850; соавтор FORM_2/AHR rate 1 и 5, 2 повтора без trace).

mean upd_form_cell (sql_top, D0) test 1844 combo
среднее, мс 524 310.9 (695 вызовов) 255.9 (388 вызовов)
вложенные v_form2_view за правку (вызовов / правок) 894 / 447 (по 2 на правку) 695 / 695 (по 1) 388 / 388 (по 1)
В combo правка быстрее, чем у 1844 отдельно (256 против 311 мс), причина отдельно не выяснялась (состав combo шире: 1846, 1830–1833, миграции перенумерованы; фронт другой, нагрузка на машину от браузера меньше); page_ws_updates 21.5 (rate 1) и 103.5 (rate 5) > 0, эхо доходит.
Вердикт без изменений: upd_form_cell ≤ 350 мс и 1 v_form2_view на правку — выполнен (310.9; 1 на правку).
Файлы: /private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/, прогон perf/results/n-combo-co/sql/coauthor/sql_top.json.
## Ночной замер — часть 2 (итог) Сборки как в части 1 («до» — 1844 f0cac30, D0 + 0050). Добавлено: поведение в combo (все 14 PR волны 1, бэк combo без 1850; соавтор FORM_2/AHR rate 1 и 5, 2 повтора без trace). | mean `upd_form_cell` (sql_top, D0) | test | 1844 | combo | |---|---|---|---| | среднее, мс | 524 | 310.9 (695 вызовов) | **255.9** (388 вызовов) | | вложенные `v_form2_view` за правку (вызовов / правок) | 894 / 447 (по 2 на правку) | 695 / 695 (по 1) | 388 / 388 (по 1) | В combo правка быстрее, чем у 1844 отдельно (256 против 311 мс), причина отдельно не выяснялась (состав combo шире: 1846, 1830–1833, миграции перенумерованы; фронт другой, нагрузка на машину от браузера меньше); `page_ws_updates` 21.5 (rate 1) и 103.5 (rate 5) > 0, эхо доходит. **Вердикт без изменений:** upd_form_cell ≤ 350 мс и 1 `v_form2_view` на правку — **выполнен** (310.9; 1 на правку). Файлы: `/private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/`, прогон `perf/results/n-combo-co/sql/coauthor/sql_top.json`.
This pull request can be merged automatically.
You are not authorized to merge this pull request.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/215-aurora-1844-upd-form-cells-full-rows:feat/215-aurora-1844-upd-form-cells-full-rows
git checkout feat/215-aurora-1844-upd-form-cells-full-rows
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/DFiP_Budget_planing#231
No description provided.