Закрывает root cause production 500 на /api/v1/admin/site-finder/weight-profiles (а также 2 unapplied migrations: #89/#91). ## Why это нужно После audit обнаружили что: - backend/alembic/versions/ пустой (Alembic configured но не используется) - deploy.yml не имеет migration step - 47+ raw SQL files накопилось без auto-apply - 3 файла unapplied: 87 (engineering), 89 (drop brin), 90 (weight profiles) User report: GET weight-profiles → 500 потому что user_weight_profiles table не существует на prod. ## Changes ### deploy.yml +39 lines - Path trigger расширен на data/sql/*.sql - New step 'Apply DB migrations' между compose pull и compose up -d: - Idempotent CREATE TABLE _schema_migrations - Loop по data/sql/*.sql sorted → skip applied → psql with ON_ERROR_STOP=on - Record applied filename в tracking table - Exit 1 на failure → containers НЕ обновляются (no partial state) ### NN collision fix - 87_engineering_networks_191fz.sql → 91_engineering_networks_191fz.sql (collision с 87_on_demand_indexes.sql, мой renumber 85→87 был неудачным) ### CLAUDE.md +32 lines - Subsection 'Auto-apply' под Migration pattern - Bootstrap procedure docs - Idempotency requirement - Failure recovery ### scripts/bootstrap_schema_migrations.sh +100 lines - One-time seed _schema_migrations с 48 already-applied files - 3 файла intentionally NOT seeded: 89/90/91 (auto-apply на first deploy) - Usage docs + verification query ## Vault domains/infra/Runbook_Auto_Apply_Migrations.md NEW infra-MOC.md updated ## Required manual steps ДО merge 1. SSH gendesign (tunnel) 2. POSTGRES creds export 3. bash scripts/bootstrap_schema_migrations.sh — seed 48 already-applied files 4. Verify: SELECT COUNT(*) FROM _schema_migrations → 48 5. После merge → first deploy auto-apply #89/#90/#91 → 500 closes Closes #150 |
||
|---|---|---|
| .. | ||
| bootstrap_schema_migrations.sh | ||
| cleanup_ghosts.py | ||
| migrate_kg_to_obsidian.py | ||
| setup-couchdb.sh | ||