feat(parcels): persist analysis runs + real last_analysis_date (#994) #1028

Merged
bot-backend merged 1 commit from feat/994-persist-analysis-runs into main 2026-06-03 12:36:31 +00:00
Collaborator

#961 EPIC 17 (961-C3): персист прогонов анализа + реальный last_analysis_date (ТЗ §22).

  • Persist: каждый успешный POST /analyze → строка в analysis_runs (м.127). Best-effort: SAVEPOINT (begin_nested) + explicit db.commit() + try/except. db.commit() критичен — get_db() без commit-on-success, RELEASE savepoint сам не персистит → без коммита строка откатывалась бы на teardown (silent no-op, поймано code-review). Провал persist НЕ ломает ответ/не травит сессию. result через jsonable_encoder→json.dumps (Pydantic-модели/даты); confidence/status нормализованы под CHECK'и 127.
  • last_analysis_date: by-bbox заполняется из v_analysis_runs_latest одним batch-запросом (НЕ N+1), заменяет заглушку #307. Чтение тоже best-effort — view-missing deploy-окно/drift НЕ должен ронять карту (fallback None).
  • Additive only — форма ответа analyze не меняется.
  • Тесты: by-bbox-сьюит патчит latest_run_dates (mock-db отдаёт те же rows на любой запрос) + новый тест на ISO-дату из latest-рана. Analyze mock-сьюит не затронут (graceful side_effect overflow + best-effort persist поглощают лишний INSERT). Incidental: ruff-format поправил одну pre-existing f-string (строка ~2391).

⚠️ Cross-tx write-тест (строка переживает commit) — post-deploy QA: локально нет TEST_DATABASE_URL + WeasyPrint native libs (macOS) блокируют сбор pytest. CI-Linux прогонит сьюит.

Closes #994. Refs #961.

**#961 EPIC 17 (961-C3): персист прогонов анализа + реальный last_analysis_date (ТЗ §22).** - **Persist**: каждый успешный POST /analyze → строка в `analysis_runs` (м.127). Best-effort: SAVEPOINT (begin_nested) + explicit `db.commit()` + try/except. `db.commit()` критичен — get_db() без commit-on-success, RELEASE savepoint сам не персистит → без коммита строка откатывалась бы на teardown (silent no-op, **поймано code-review**). Провал persist НЕ ломает ответ/не травит сессию. result через jsonable_encoder→json.dumps (Pydantic-модели/даты); confidence/status нормализованы под CHECK'и 127. - **last_analysis_date**: by-bbox заполняется из `v_analysis_runs_latest` одним batch-запросом (НЕ N+1), заменяет заглушку #307. Чтение тоже best-effort — view-missing deploy-окно/drift НЕ должен ронять карту (fallback None). - **Additive only** — форма ответа analyze не меняется. - **Тесты**: by-bbox-сьюит патчит latest_run_dates (mock-db отдаёт те же rows на любой запрос) + новый тест на ISO-дату из latest-рана. Analyze mock-сьюит не затронут (graceful side_effect overflow + best-effort persist поглощают лишний INSERT). Incidental: ruff-format поправил одну pre-existing f-string (строка ~2391). ⚠️ Cross-tx write-тест (строка переживает commit) — post-deploy QA: локально нет TEST_DATABASE_URL + WeasyPrint native libs (macOS) блокируют сбор pytest. CI-Linux прогонит сьюит. Closes #994. Refs #961.
bot-backend added 1 commit 2026-06-03 12:36:27 +00:00
feat(parcels): persist analysis runs + real last_analysis_date (#994)
All checks were successful
Deploy / changes (push) Successful in 5s
Deploy / build-frontend (push) Has been skipped
Deploy / build-backend (push) Successful in 1m35s
Deploy / build-worker (push) Successful in 2m31s
Deploy / deploy (push) Successful in 1m42s
72eae3bc9b
Persist each successful POST /analyze into analysis_runs (migration 127):
best-effort SAVEPOINT-wrapped INSERT in a thin analysis_runs repository, then
explicit db.commit() (get_db has no commit-on-success; SAVEPOINT RELEASE alone
does not persist — without the commit the row rolls back on request teardown,
a silent no-op caught in code review). A persist failure never breaks the
response or poisons the session. Result serialized via jsonable_encoder→
json.dumps (handles embedded Pydantic models/dates); confidence/status
normalized to satisfy the 127 CHECK constraints (unknown→NULL/'complete').

Populate by-bbox last_analysis_date from v_analysis_runs_latest via a single
batch query (no N+1), replacing the #307 placeholder. The read is best-effort
wrapped too — a view-missing deploy window or future drift must not 500 the
map (falls back to last_analysis_date=None).

Additive only — analyze response shape unchanged. Tests: by-bbox suite patches
latest_run_dates (mock-db returns same rows for any query) + new test asserts
ISO last_analysis_date from a latest run. Analyze mock-suite unaffected
(graceful side_effect overflow + best-effort persist absorb the extra INSERT).
Incidental: ruff-format fixed one pre-existing f-string spacing (line ~2391)
the format hook flags on touch.

Closes #994. Refs #961.
bot-backend merged commit 72eae3bc9b into main 2026-06-03 12:36:31 +00:00
bot-backend deleted branch feat/994-persist-analysis-runs 2026-06-03 12:36:31 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1028
No description provided.