gendesign/tradein-mvp/scripts
bot-backend 721ceb9876
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m56s
fix(tradein): выборка миграции 286 повторяет гейт 1:1, правило первой точки (#3376)
Ревью нашло, что миграция и код ловили РАЗНОЕ. Миграция брала базой предыдущую
СЫРУЮ строку (lag), гейт — предыдущую ОСТАВЛЕННУЮ. На 1M→10M→1M→10M (цена 1M)
lag-версия удаляла честную точку, на 1M→10M→1.05M→9.9M — не была идемпотентной
(второй прогон доедал 9.9M). Теперь кандидаты выбирает PL/pgSQL-цикл, пошагово
повторяющий drop_decimal_slips, а правило первой точки — отдельным INSERT..SELECT
уже по ОСТАВШИМСЯ строкам.

Правило первой точки — из прод-разбора: 12 из 20 остатков domklik это серии вида
330 000 → 3 300 000 (текущая цена 3 300 000) и 420 000 → 4 200 000 → 4 500 000,
где дефектная точка ПЕРВАЯ и базы слева у неё нет. Свидетелей по-прежнему два:
×10 ко второй точке И подтверждение второй третьей-или-текущей-ценой. Решение по
первой точке принимается по kept-серии, а не по сырой, — иначе гейт теряет
идемпотентность (перебор ловит 1122 таких прогона).

Идемпотентность доказана НА ГЕЙТЕ: property-тест gate(gate(s)) == gate(s) по всем
сериям длины 2-6 (19 525 серий × 3 текущие цены). Фальсифицирован обеими
поломками — сырая база даёт 136 красных прогонов, сырые соседи первой точки 1122.
Раз SQL зеркалит гейт, свойство переносится на миграцию.

Ещё в 286: третий свидетель ПРОТИВ удаления (цена подтверждена триггерной строкой
того же объявления — значит она реально наблюдалась в listings.price_rub) и
финальный шаг |diff_percent| > 100 → NULL по всем источникам, то же правило, что
validate_diff_percent на записи. Ожидаемое число удалений в шапке — 35 + ~12 из
двухсвидетельского предзамера, а не 76 (то была односвидетельская цифра).
Прогон обеих фаз дважды с ROLLBACK — tradein-mvp/scripts/sql/286_dryrun.sql.

yandex: проводка гейта снята как мёртвая. На том пути серия из двух точек, а
свидетель последней — текущая цена лота, то есть она же сама: ветка по построению
не могла выбросить ничего. Оставлен честный комментарий-потолок и ссылка на
follow-up (отлов требует DELETE на следующем наблюдении).

cian: после выброса точки соседу пересчитывается diff_percent (было только у
domclick). domclick: цена листинга берётся RETURNING'ом у UPDATE вместо отдельного
SELECT по PK, пересчёт вынесен в общий recompute_diff_percent с гейтом на пустую
цену (ручной ingest кладёт price_changes из JSONL без валидации).
2026-09-06 03:53:08 +05:00
..
local-cian feat(tradein/scripts): local Playwright runners для Cian backfill (bypass server-IP anti-bot) (#553) 2026-05-24 20:00:59 +00:00
sql fix(tradein): выборка миграции 286 повторяет гейт 1:1, правило первой точки (#3376) 2026-09-06 03:53:08 +05:00
backfill-yandex-addresses-ekb.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
backfill_001_address_fingerprints.py feat(tradein): Phase 1.3 backfill scripts — fingerprints + house/listing_sources (#475) 2026-05-23 14:29:39 +00:00
backfill_002_house_sources.sql feat(tradein): Phase 1.3 backfill scripts — fingerprints + house/listing_sources (#475) 2026-05-23 14:29:39 +00:00
backfill_003_listing_sources.sql feat(tradein): Phase 1.3 backfill scripts — fingerprints + house/listing_sources (#475) 2026-05-23 14:29:39 +00:00
browser-smoke.sh chore(tradein): browser-smoke.sh — verify tradein-browser /health + /fetch (#905) 2026-05-31 18:42:17 +03:00
cian_backfill_all.sh feat(tradein): houses.cian_zhk_url column + backfill (#568) (#627) 2026-05-28 13:57:43 +00:00
inspect-houses-html.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
inspect-search-html.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
probe-confidence-distribution.py feat(tradein-estimator): unique-address-based confidence threshold (#513) 2026-05-24 11:52:00 +00:00
probe-db-counts.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
probe-db-leak-full.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
probe-db-region-leak.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
probe-db-url-leak.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
probe-migration-028.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
probe-migration-status.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
README.md feat(tradein): Phase 1.3 backfill scripts — fingerprints + house/listing_sources (#475) 2026-05-23 14:29:39 +00:00
test-playwright.py feat(tradein-scripts): scrapers + probes + Phase C improvements (#551) 2026-05-24 19:58:38 +00:00
trigger-schedules.py chore(tradein): полное выключение источника n1 — миграция 165 + вычистка backend/ops (#2204) 2026-07-03 10:08:56 +03:00
upload-cian-cookies.sh fix(tradein): убрать require_admin полностью — Caddy basic_auth достаточен (#474) 2026-05-23 14:21:01 +00:00

tradein-mvp scripts -- backfill

One-shot manual operator scripts. NOT auto-applied by deploy.yml (which only runs tradein-mvp/backend/data/sql/NN_*.sql).

Order

Run in numbered sequence after PR #470 (matching module) merged:

cd tradein-mvp/backend
export DATABASE_URL="postgresql+psycopg://user:pass@host:5432/tradein"

# 001 -- backfill houses.address_fingerprint (Python, idempotent)
uv run python ../scripts/backfill_001_address_fingerprints.py

# 002 -- backfill house_sources link rows (SQL, idempotent)
psql "${DATABASE_URL/postgresql+psycopg/postgresql}" -f ../scripts/backfill_002_house_sources.sql

# 003 -- backfill listing_sources link rows (SQL, idempotent)
psql "${DATABASE_URL/postgresql+psycopg/postgresql}" -f ../scripts/backfill_003_listing_sources.sql

All scripts idempotent -- re-running is safe (ON CONFLICT DO NOTHING on the SQL; row-level UPDATE WHERE NULL on the Python).

Other scripts

  • upload-cian-cookies.sh -- one-shot Cian session cookie upload (see inline docs)