--- paths: - tradein-mvp/**/*.py - tradein-mvp/**/*.sql - tradein-mvp/frontend/**/*.{ts,tsx} --- # trade-in (Mera) conventions — `tradein-mvp/` Отдельный продукт + отдельный стек от Site Finder. Backend `tradein-mvp/backend/app/**`, SQL `tradein-mvp/backend/data/sql/NN_*.sql`, frontend `tradein-mvp/frontend/`. Backend Python подчиняется `.claude/rules/backend.md` (psycopg v3, CAST, ruff-100), SQL — `.claude/rules/sql.md` (NN naming, idempotency). Ниже — то, что СПЕЦИФИЧНО для trade-in. ## Две БД — не путай - **`postgres-tradein`** (db=tradein) — скрейпленные листинги avito/cian/yandex, estimator, coverage, houses. Для ЛЮБОЙ tradein-задачи метрики/схему бери отсюда (`mcp__postgres-tradein__*`). - **`postgres-gendesign`** (db=gendesign) — Site Finder, НЕ trade-in. ## Тестировать HTTP только ВНУТРИ контейнера SSH-туннель `localhost:8000` → `gendesign-backend` (Site Finder, db=gendesign, старый код), **НЕ** tradein-backend (порт не опубликован на хост). curl на туннель:8000 по trade-in endpoint = мусор / чужая БД (стоило ~2ч). Тест trade-in API только изнутри контейнера: ```bash ssh gendesign # затем: docker exec tradein-backend curl -s localhost:8000/ # админ-роуты: -H "X-Authenticated-User: admin" docker exec tradein-postgres psql -U -d tradein -c "..." ``` ## Scheduler крутится в `tradein-scraper`, не `tradein-backend` In-app scheduler (`scrape_schedules`, tick 60s, `python -m app.scheduler_main`, `SCHEDULER_ENABLE=true`) живёт в контейнере **`tradein-scraper`**; в `tradein-backend` намеренно `false`. Статус scheduled-задач смотри в scraper-контейнере (logs/printenv), не в backend. Ручной smoke: `UPDATE scrape_schedules SET next_run_at=now() WHERE source='X'` → подхват ≤60s. ## SQL авто-применяется на ПРОД (strict) `tradein-mvp/backend/data/sql/NN_*.sql` применяется автоматически на деплое через `_schema_migrations` в `.forgejo/workflows/deploy-tradein.yml` (НЕ init-only, strict exit-1). Idempotency критична — деструктивный DDL хитит прод на деплое. NN-нумерация уже 3-значная и ИМЕЕТ коллизии (`108_*` ×2, `084_*` ×2) → перед новым файлом `ls tradein-mvp/backend/data/sql | grep '^NN'` на дубль basename, не доверяй `tail`. ## Rapid-merge trap 2 tradein-PR мержа за секунды → backend `test`-job cancelled → `build-backend` пропущен → «deploy success» на СТАРОМ образе (нет нового кода/deps). Сверяй `:latest` Created-timestamp vs время мержа + smoke в контейнере; не верь «деплой прошёл». Recovery: ручной `workflow_dispatch` для `deploy-tradein.yml`.