← Все ТЗ

🛡 Safe Evolution Architecture

Правила безопасного развития: 5-pass review + backward compat + forward-only migrations
📅 24.04.2026🎯 Применяется к модульной data-архитектуре

💭 Принцип пользователя

«Составить самим ТЗ, 5 раз проверить, потом делать. Всё новое не портит старое — всё дополняет. Правим старое — не мешая новому.»

1 Зачем этот процесс

Архитектура из 8+ блоков с тысячами связей. Любое изменение может сломать то что работает. Без дисциплины — хаос за 2 месяца.

С дисциплиной 5-pass + forward-only:

2 5-pass Review ТЗ

Каждое ТЗ проходит 5 разных проверок. Между passes — пауза (минимум 1 час, лучше ночь), чтобы увидеть свежим глазом.

Pass 1 — Полнота

Все ли поля / связи / edge-кейсы описаны?

Pass 2 — Связи

Как блок взаимодействует с другими?

Pass 3 — Обратная совместимость

Не ломает ли существующее?

Pass 4 — Безопасность

RLS / валидация / audit

Pass 5 — Масштабируемость

Выдержит ли ×10 нагрузку?

3 Правило «Новое не портит старое»

❌ Запрещено (никогда)

ОперацияПочему
ALTER TABLE ... DROP COLUMNСтарые запросы упадут
DROP TABLE старойСтарые ссылки на неё сломаются
Переименовать полеВсе SELECT * и старый код упадёт
Изменить тип поляДанные потеряются / сломаются индексы
Удалить API endpointКлиенты / скрипты сломаются
Удалить событиеПодписчики не получат уведомление
ALTER COLUMN NOT NULLСтарые INSERT без этого поля упадут

✅ Разрешено (без риска)

ОперацияПочему безопасно
ALTER TABLE ... ADD COLUMN ... DEFAULT NULLСтарые запросы не знают о поле, продолжают работать
CREATE TABLE новойНе влияет на существующие
CREATE VIEW v_dashboard_v2Старая view v_dashboard_v1 остаётся
CREATE INDEX CONCURRENTLYБез блокировки таблицы
Deprecate endpoint → /api/v2/api/v1 ещё работает год
Event: добавить опциональное полеПодписчики просто игнорируют

4 Правило «Правим старое, не мешая новому»

🕰 Soft Deprecation

-- Помечаем но не удаляем
COMMENT ON COLUMN urls.old_field IS 'DEPRECATED since v1.5, use new_field';
-- Работает 3-6 месяцев, потом удаляем

🌊 Rolling Migration

Не разом 28 000 записей, а кусками:

UPDATE urls SET new_field = COMPUTE(old_field)
WHERE id IN (SELECT id FROM urls WHERE new_field IS NULL LIMIT 1000);
-- Запускаем в cron каждые 10 минут пока не обработано всё

👀 Shadow Reads / Writes

Новая логика пишет в новое место, старая продолжает работать. Сравниваем результаты N дней → переключаем.

-- Пишем в оба места
BEGIN;
  INSERT INTO urls_old (...) VALUES (...);
  INSERT INTO urls_new (...) VALUES (...);
COMMIT;

-- Читаем из старого, но в фоне проверяем что новое совпадает
-- Через 7 дней без расхождений — переключаем чтение на новое

🐤 Canary Releases

  1. 5% трафика на новую версию — 1 день
  2. 20% — 3 дня
  3. 50% — 1 неделя
  4. 100% — после 1 недели без инцидентов

↩️ Rollback план — ОБЯЗАТЕЛЬНО

Каждая миграция имеет обратную. Не имеет — не мерджим.

-- forward.sql
ALTER TABLE urls ADD COLUMN new_field text;

-- rollback.sql
ALTER TABLE urls DROP COLUMN new_field;

5 Шаблон ТЗ любого блока

# ТЗ: Блок {NAME} v{X.Y.Z}

## 1. Цель и место в архитектуре
## 2. Контракт (exports/imports/events/health)
## 3. Схема БД (таблицы, индексы, FK, RLS)
## 4. Миграции (forward + rollback)
## 5. Взаимодействия с другими блоками
## 6. Graceful degradation
## 7. Тесты (unit/integration/contract/health)
## 8. Dashboards / Views
## 9. Операции (cron, handlers)
## 10. Безопасность (RLS, audit, sensitive)

---

## 5-Pass Review

- [ ] Pass 1 — Полнота       · дата · замечания · статус
- [ ] Pass 2 — Связи         · дата · замечания · статус
- [ ] Pass 3 — Backward compat · дата · замечания · статус
- [ ] Pass 4 — Безопасность  · дата · замечания · статус
- [ ] Pass 5 — Масштабируемость · дата · замечания · статус

**Итого:** готово к реализации / требует доработки

---

## Rollback план
## Canary план
## Метрики успеха

6 Порядок ТЗ блоков

Сначала фундаментальные, потом наслаивающиеся:

#БлокЗависимостиСтатус ТЗ
1CORE⏳ Pending
2HOTELS⏳ Pending
3CONTENTCORE⏳ Pending
4ANALYTICSCORE⏳ Pending
5SEOCORE⏳ Pending
6NOTIFICATIONSCORE⏳ Pending
7LEADSCORE, HOTELS⏳ Pending
8ADMIN⏳ Pending
9AI ANALYST (future)все 8💭 Concept

Обновлено 24.04.2026 · Правила для всего портфеля