AURORA-1848: лист и своды без null-полей + фронт (B) #242
Open
aep
wants to merge 9 commits from
feat/233-aurora-1848-sheet-json-no-pydantic-b into feat/233-aurora-1848-sheet-json-no-pydantic
pull from: feat/233-aurora-1848-sheet-json-no-pydantic-b
merge into: RSHB:feat/233-aurora-1848-sheet-json-no-pydantic
RSHB:main
RSHB:feat/246-aurora-1944-wheel-scroll-step
RSHB:feat/236-aurora-1843-svod2-server-paging-perf
RSHB:feat/236-aurora-1843-svod2-server-paging-web
RSHB:feat/236-aurora-1843-svod2-server-paging
RSHB:feat/214-aurora-1841-dict-vsp-virtual
RSHB:feat/220-aurora-1842-svod2-column-virtual
RSHB:feat/216-aurora-1846-form4-sheet-sum
RSHB:feat/235-aurora-1850-upd-form-cells-subtree
RSHB:feat/234-aurora-1839-cell-memo
RSHB:feat/233-aurora-1848-sheet-json-no-pydantic
RSHB:feat/237-aurora-1845-ws-connection-cache
RSHB:feat/215-aurora-1844-upd-form-cells-full-rows
RSHB:feat/226-aurora-1837-cell-styles-css
RSHB:feat/207-aurora-1831-project-tn-race
RSHB:feat/208-aurora-1832-phase-dates-tz
RSHB:feat/209-aurora-1833-greenlet-dev
RSHB:feat/206-aurora-1830-users-me-local-email
RSHB:feat/212-aurora-1838-ws-immutable-update
RSHB:feat/211-aurora-1836-row-measure
RSHB:feat/205-aurora-1922-pg15-migration-0012
RSHB:feat/213-aurora-1840-sheet-modals
RSHB:feat/210-aurora-1835-svod1-formatter
RSHB:test
RSHB:svod2-filter-fix2
RSHB:indent-export
RSHB:export-hierarchy
RSHB:svod2-filter-fix
RSHB:fix-id-column
RSHB:export-year-fix
RSHB:form3-source
RSHB:columns-svod-2
RSHB:export-optimize-refresh
RSHB:last-column
RSHB:svod-fix
RSHB:fix-columns
RSHB:form3-expense
RSHB:sattelite-fix
RSHB:delete-sattelite-rows
RSHB:form3-pages
RSHB:form1-sub_sub-fix
RSHB:sort-fix
RSHB:fixes-form
RSHB:new-expenses
RSHB:new-rows
RSHB:fix-style
RSHB:phase-template-edit
RSHB:fixes
RSHB:add-btn-reset-filter
RSHB:vsp-choice-fix
RSHB:project-filters-fix
RSHB:width-column-header-name
RSHB:task-filter-navigation
RSHB:auth
RSHB:icons-program-project
RSHB:export-optimize
RSHB:org-unit-limits
RSHB:auth-v2
RSHB:tasks-filters
RSHB:insert-row-fix
RSHB:svod-roles
RSHB:new-role-fix
RSHB:phase-edit-fix
RSHB:new-role
RSHB:delete-from-cell
RSHB:svod-cahe-and-table-direction
RSHB:direction-stage-fix
RSHB:backslash-fix
RSHB:svod
RSHB:front-svod-form-1
RSHB:projects-filters
RSHB:remove-row-fix
RSHB:computed-fix
RSHB:modal-add-year-project
RSHB:name-fix
RSHB:audit-logs-projects
RSHB:meta-form-3
RSHB:project-back-fix
RSHB:fix-sticky-columns
RSHB:fixies-3-form
RSHB:tech-num-fix
RSHB:fix-logic-limitation
RSHB:projects-fix
RSHB:3-form-project
RSHB:project-add-year-handler
RSHB:projects-summary-handler
RSHB:AURORA-1247
RSHB:projects-handlers
RSHB:vsp-choose-form2-2
RSHB:directions-fix
RSHB:add-validation
RSHB:add-checkbox-export-vsp
RSHB:fix-update-column-config
RSHB:fix-editable-columns
RSHB:add-biome-front
RSHB:vsp-choose-form2
RSHB:export-form-4
RSHB:booking-fix
RSHB:fix-front-tables
RSHB:phase-directions
RSHB:AURORA-1225
RSHB:fix-mapping-form-2-oper
RSHB:AURORA-1076-fix
RSHB:fix-add-row-program-4-form
RSHB:form2-limit-migrations
RSHB:delete-projects
RSHB:AURORA-1076
RSHB:form-4-add-row
RSHB:fix-logs
RSHB:AURORA-1206
RSHB:AURORA-894
RSHB:add-line-log-hotfix
RSHB:form-export-fix
RSHB:form-4-sql
RSHB:table-optimization-fix
RSHB:header_forms
RSHB:form-4-expense-item-filters
RSHB:entity-type-hotfix
RSHB:form-3-phases-timezones
RSHB:form-4-handlers
RSHB:export-fix
RSHB:close-date-vsp-fix
RSHB:deleted-user-auth-fix
RSHB:smeta-fix
RSHB:front-fixes
RSHB:line_id_code_full
RSHB:line_id_code
RSHB:timezones
RSHB:filenames-fix
RSHB:AURORA-1174-73
RSHB:project-sheets
RSHB:AURORA-1166
RSHB:websocket-projects
RSHB:project-front
RSHB:form3-permissions
RSHB:location_from_to_placement_type
RSHB:fix-vsp-filters
RSHB:fix-tests-and-functions
RSHB:mig2-fix
RSHB:vsp_fixes
RSHB:fix-ssp-title
RSHB:AURORA-1148
RSHB:fix-vsp-form-edit
RSHB:sql-funcs2-fix
RSHB:AURORA-1132
RSHB:logs
RSHB:AURORA-1147
RSHB:export-optimization
RSHB:AURORA-1131
RSHB:sql-funcs-fix
RSHB:vsp-dropdown-form
RSHB:form_2-back
RSHB:migrations
RSHB:websocket-self-flag
RSHB:reload-fix
RSHB:test-stand-fix
RSHB:excel-empty-fix
RSHB:requirements-fix
RSHB:AURORA-1096-back
RSHB:AURORA-1098
RSHB:AURORA-1096
RSHB:ws-user-id-fix
RSHB:expense-item-handler
RSHB:fix-date-phase
RSHB:excel-fix
RSHB:vsp-edit-field-fix
RSHB:vsp-fix-back
RSHB:vsp-back
RSHB:create-form-back
RSHB:export-direction-fix
RSHB:change-role-fix
RSHB:org-unit-users-fix
RSHB:audit-fix
RSHB:org-archive
RSHB:del_row_fix
RSHB:websocket_locks
RSHB:new_line_id
RSHB:admin-back
RSHB:form-fix
RSHB:ws
RSHB:ssp-fix
RSHB:stages-back
RSHB:form_124_write
RSHB:form_124
RSHB:new-model
RSHB:test-tsygankov
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "feat/233-aurora-1848-sheet-json-no-pydantic-b"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Не мержить до merge PR A (#239) и PR #223 (AURORA-1838). Ветка содержит merge-коммит #223; после их merge ветка перебазируется на
test, коммиты #223 уйдут из диффа.Closes #233. Jira AURORA-1848 (эпик AURORA-1834). Стек на PR A (#239).
Что сделано
dataнет null-полей (jsonb_strip_nulls(data)внутриjson_build_object(...)::text).updateCellsна отсутствующие ключи (версия #223 достаточна,cellUtils.jsне менялся),cell_updatedвсегда несётvalue(undefined->null,messageUtils.js),getDataRowIdвозвращаетnull(после strip у групповых строк нетline_id, иначеrow_deletedуходил безrow_idи сервер рвал WebSocket, I-3).perf/perfkit/gen/grow.py:form4_idsне падает на ответах без null-полей.BREAKING для потребителя, который отличает «ключ есть и равен null» от «ключа нет»: в
dataлиста и сводов 1/2 нет null-полей (на любой глубине;{}и null в массивах остаются). Отчёты проектов, ответы путей записи (PATCH отдаёт null явно) и WebSocket — как раньше. Выгрузка Excel не меняется. Поведениеjsonb_strip_nullsпроверено вручную на PG 15.12 и 16.15: идентично.test_summary2_sheets_smokeослаблять не пришлось.TanStack Table в dev-сборке пишет
console.warnдляundefinedво вложенномaccessorKey— не исправляем, в prod нет.EditCell.jsx:223<textarea value={undefined}>— аналогичное dev-предупреждение, deferred.X-DB-Time-Msв B включает стоимостьjsonb_strip_nulls: доля Python в A и B напрямую не сопоставима.Тесты
node --test utils/*.test.js31/31 (по отчёту исполнителя),npm run buildуспешен; biome: добавленные файлы чисты, ошибки только в файлах из #223 / старых тестах.-m "not stand": 3 failed в test_run_all.py (есть и на origin/test).Чек-лист ручной проверки (D6)
PERF_TARGETS='FORM_2/AHR/*' PERF_COAUTHOR_RATES=1 PERF_REPEATS=1,page_ws_updates > 0(выполняет контроллер)compare_responses.py compare --mode strip-nullsна стенде; PG15 (проверено, см. комментарий)Замер до/после — добавит контроллер после прогона на стенде. Пороги (свод 2 GO -30 %, FORM_2/AHR -10 % и меньший распакованный размер) не условие мержа, недобор — follow-up.
openspec archive aurora-1848-sheet-json— только после merge B.Rulings I made
getDataRowId->nullвместоundefined.(Рулинги R-1..R-5 фазы A — в PR #239.)
Находки
c859ca1(= M-8)<textarea value={undefined}>— dev-предупреждение React при первом вводеc859ca1c859ca1c859ca1c859ca1Отложенное (deferred): T11.1, T15.1, M-10; из A: T5.2, T6.2, T7.4, T7.6, M-2, O-3 (rf-rollup r.year).
🤖 Generated with Claude Code
После jsonb_strip_nulls у групп/позиций нет ключа line_id, getDataRowId возвращал undefined, и row_id в сообщении удаления сериализовался в {} (KeyError на сервере). Возвращаем null, как до фазы B. Добавлены тесты updateCells (глубокое отсутствие блока, два обновления в батче) и сверка jsonb_strip_nulls с _strip_nulls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>PG 15.12 (dfip-pg15:55434): ветка
c859ca1+ исправление AURORA-1922 (временный worktree), полный pytest: 3 failed (те же 3 известных на test), 250 passed, 4 skipped. jsonb_strip_nulls на PG 15.12 и 16.15 идентичен (проверка ревьюером на литерале с {}, null в массиве).Ночной замер на стенде perf/ (29.10, масштаб 1, D0 без grow, CPU 1x, arm-ka-* остановлены)
Сборки: «до» —
test2a28748; A —b612178(#239); B —c859ca1(этот PR). Одна БДperf(дамп D0), API перезапускался на каждом коммите.Корректность (условие мержа) — выполнено
compare_responses.py compare <base> <B> --mode strip-nulls: совпало 56 из 56 (листы и своды — «до» с вырезанными null в data; отчёты/summary проектов — точно), код 0.--mode strip-nulls: 56 из 56. A против base--mode exact: 56 из 56.Время:
analysis/api_split.py --scale 1 --repeats 10(версия скрипта из B; та же на всех сборках)Вердикт по порогам design D7 (цели, не условие мержа)
X-DB-Time-Msв B включаетjsonb_strip_nulls, поэтому доля «БД» в B чуть завышена относительно A.PERF_TARGETS='FORM_2/AHR/*' PERF_COAUTHOR_RATES=1 PERF_REPEATS=1, page_ws_updates > 0) — допишу отдельным комментарием после фронтовой серии.Файлы:
/private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/1848/(dump-, compare-B-strip.txt, split-/api-split.{md,json}).🤖 Generated with Claude Code
Дополнение: соавтор на B (фронт и бэк этого PR
c859ca1, D0)PERF_TARGETS='FORM_2/AHR/*' PERF_COAUTHOR_RATES=1 PERF_REPEATS=1 npx playwright test scenarios/scroll-coauthor.spec.ts:test: 8.5 из 45.5 — известная O-10 стенда);testrate 1: 91.0 — 1 повтор, в пределах шума одного прогона).Скриншоты B (1600×900) листа, свода 1, свода 2:
/private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/1848/shots/p1848b-*.png(противnight/base/shots/base-*.png; попиксельная сверка — в итоговом комментарии).🤖 Generated with Claude Code
Ночной замер — часть 2 (итог)
Сборки как в части 1 (B =
c859ca1). Добавлено: масштаб 2 и сверка скриншотов.Масштаб 2 (D2 =
gen --scale 2+verifyOK;api_split.py --scale 2 --repeats 5; полное время, мс, медиана 5; размер — несжатое тело):genне былоANALYZE): порог «AHR ≤ 0.9×» на масштабе 2 по этим цифрам не оценить; (б) свод 1 MAIN +11 % (db_ms 686 против 607) — один и тот же код свода 1 в других прогонах той же ночи даёт 622–656 мс (разброс ±6 %), формально порог 1.05 превышен, считаю шумом.Сверка скриншотов 1600×900, base против p1848b: лист (7 позиций) 0 – 0,18 %, свод 1 0 – 0,24 %, сводные 0 %, свод 2 (6 позиций) 0 %. Отличия — несколько чисел в верхних строках (область 1–2 строки), объясняются правками соавтора между снимками (O-2: прогон coauthor менял ячейки FORM_2/AHR), структуры и вёрстки не касаются.
Вердикт: GO ≤ 0.7× — выполнен (0.55 / 0.54); AHR ≤ 0.9× и размер меньше — выполнен на масштабе 1 (0.82, −64 %), на масштабе 2 не оценим; сверка
strip-nulls56/56 — из части 1.Файлы:
/private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/s2/split-1848-*/,imgdiff.txt,imgdiff/diff-p1848b-*.png.Checkout
From your project repository, check out a new branch and test the changes.