feat(db): analysis_runs versioned store + latest-view §22 (#993) #1027

Merged
bot-backend merged 1 commit from feat/993-analysis-runs-table into main 2026-06-03 12:14:53 +00:00
Collaborator

#961 EPIC 17 (961-C2): analysis_runs versioned store + latest-view (ТЗ §22). Миграция 127 — durable, версионируемый, ПЕРЕ-открываемый store анализ-ранов: 1 строка = 1 завершённый анализ участка (frozen result jsonb = SiteFinderReport.as_dict() #987, schema_version для версионированного re-open). Append-mostly (история — не затираем прошлые раны → TABLE, не MV).

Заменяет заглушку last_analysis_date=None (parcels.py:1026,1092) → v_analysis_runs_latest (DISTINCT ON cad_num, max created_at, детерминир. id-DESC tiebreak, зеркало м.125). created_by=X-Authenticated-User, nullable, без FK (нет таблицы users; прецедент м.90/119). result/params/segment JSONB; district/confidence/status денормализованы; CHECK на status+confidence. Idempotent.

Dry-run vs прод-каталог: DDL применяется чисто в rolled-back txn; DISTINCT ON latest-wins подтверждён. Фундамент для #994 (persist) + #992 (контракт).

Closes #993. Refs #961.

**#961 EPIC 17 (961-C2): `analysis_runs` versioned store + latest-view (ТЗ §22).** Миграция 127 — durable, версионируемый, ПЕРЕ-открываемый store анализ-ранов: 1 строка = 1 завершённый анализ участка (frozen `result` jsonb = `SiteFinderReport.as_dict()` #987, `schema_version` для версионированного re-open). Append-mostly (история — не затираем прошлые раны → TABLE, не MV). Заменяет заглушку `last_analysis_date=None` (parcels.py:1026,1092) → `v_analysis_runs_latest` (DISTINCT ON cad_num, max created_at, детерминир. id-DESC tiebreak, зеркало м.125). `created_by`=X-Authenticated-User, nullable, без FK (нет таблицы users; прецедент м.90/119). result/params/segment JSONB; district/confidence/status денормализованы; CHECK на status+confidence. Idempotent. Dry-run vs прод-каталог: DDL применяется чисто в rolled-back txn; DISTINCT ON latest-wins подтверждён. Фундамент для #994 (persist) + #992 (контракт). Closes #993. Refs #961.
bot-backend added 1 commit 2026-06-03 12:14:52 +00:00
feat(db): analysis_runs versioned store + latest-view §22 (#993)
All checks were successful
Deploy / changes (push) Successful in 5s
Deploy / build-frontend (push) Has been skipped
Deploy / build-worker (push) Successful in 38s
Deploy / build-backend (push) Successful in 42s
Deploy / deploy (push) Successful in 1m0s
0f194de069
Migration 127: durable, versioned, re-openable persistence for Site Finder
analysis runs (the §22 API result + forecast/recommendation/report snapshot).
One row = one completed analysis of a parcel (frozen result jsonb =
SiteFinderReport.as_dict() #987, schema_version for versioned re-open).
Append-mostly (history/versioning — never overwrites prior runs → TABLE not MV).

Replaces the last_analysis_date=None placeholder (parcels.py:1026,1092):
"date of last analysis" + "current analysis of parcel" now come from
v_analysis_runs_latest (DISTINCT ON cad_num, max created_at, deterministic
id-DESC tiebreak — mirrors v_supply_layers_latest m.125).

created_by = X-Authenticated-User identity, nullable TEXT, NO FK (no users
table; precedent m.90/m.119; background/Celery runs have no author). result/
params/segment as JSONB (report shape evolves); district/confidence/status
denormalized out for filter/sort. status + confidence CHECK-guarded.
Idempotent (CREATE TABLE/INDEX IF NOT EXISTS + CREATE OR REPLACE VIEW).

Dry-run-verified vs prod catalog (DDL applies clean in rolled-back txn;
DISTINCT ON latest-wins confirmed). Foundation for #994 persist + #992
contract. Closes #993. Refs #961.
bot-backend merged commit 0f194de069 into main 2026-06-03 12:14:53 +00:00
bot-backend deleted branch feat/993-analysis-runs-table 2026-06-03 12:14:54 +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#1027
No description provided.