# DOMOVOY Gen2 — Execution Contract for Codex ## 1. Назначение Этот документ определяет, **как выполнять** `PRE-GEN2-000`, `ARCH-GEN2-000` и `GEN2-001…GEN2-030`. Он не заменяет: - `DOMOVOY_CONSTITUTION.md`; - `GEN2_TARGET_ARCHITECTURE.md`; - `GEN2_CANONICAL_DATA_MODEL.md`; - `GEN2_MIGRATION_MAP.md`; - `GEN2_MASTER_PLAN.md`. При конфликте действуют существующий `AGENTS.md` и canonical architecture authority order. Если конфликт нельзя снять однозначно — `BLOCKED_BY_SPEC_GAP` / `BLOCKED_BY_ARCHITECTURE_GAP`, а не обход. ## 2. Почему `ARCH-GEN2-000`, а не `GEN2-000` Текущий `devctl` принимает `architecture_revision` только как: - принятый `ADR-*`; или - существующий architecture task с префиксом `ARCH-*`. Поэтому Master Plan task `GEN2-000 — Adopt Gen2 ...` исполняется как: `ARCH-GEN2-000` Смысл задачи не изменён. Все последующие `GEN2-*` используют: `"architecture_revision": "ARCH-GEN2-000"` ## 3. Нулевой принцип **Цель — построить Gen2, а не бесконечно проверять тесты.** Тесты дают достаточное доказательство сохранения критических свойств. Они не являются самостоятельным продуктом. Не добавлять тест только потому, что можно добавить ещё один edge case. ## 4. PRE-GEN2: сначала сохранить всё текущее До любых Gen2 semantic/schema изменений выполнить `PRE-GEN2-000`. ### 4.1 Инвентаризация Проверить: - `git status`; - все worktrees; - все локальные ветки; - ветки, опережающие `main`; - staged / unstaged / untracked files; - незапушенные commits; - merge/rebase/cherry-pick state. Ничего не удалять и не делать `reset --hard` до классификации каждого изменения. ### 4.2 Preservation Для каждого актуального открытого изменения: 1. понять происхождение; 2. исключить secrets/generated/runtime garbage; 3. сохранить актуальную работу commit-ом; 4. не переписывать опубликованную историю; 5. не терять конфликтующую ветку ради удобного merge. ### 4.3 Merge После preservation: 1. обновить локальный `main`; 2. контролируемо слить всю актуальную работу; 3. разрешить конфликты по смыслу, сохраняя существующее поведение; 4. выполнить только PRE FAST gate; 5. push `main`. ### 4.4 Baseline После успешного push: - записать SHA как `GEN2_BASE_COMMIT`; - поставить baseline tag `domovoy-pre-gen2`; - сохранить baseline report; - создать ветку `gen2-integration` от baseline; - push `gen2-integration`. Если tag уже существует, не перезаписывать его молча: использовать duplicate-safe имя с датой/коротким SHA и записать фактическое имя в report. ## 5. Как установить execution package До `PRE-GEN2-000` в репозиторий копируются **только**: - `bootstrap/dev/tasks/PRE-GEN2-000-*.json` -> `dev/tasks/`; - `bootstrap/dev/ACTIVE_TASK.json` -> `dev/ACTIVE_TASK.json`. Остальные Gen2 документы/task packets не должны случайно попасть в V1 baseline как «реализация Gen2». После PRE baseline: 1. checkout `gen2-integration`; 2. создать branch для `ARCH-GEN2-000`; 3. скопировать содержимое `program/docs/gen2/` в согласованные canonical repo paths; 4. скопировать `program/dev/tasks/*.json` в `dev/tasks/`; 5. заменить `dev/ACTIVE_TASK.json` содержимым `program/dev/ACTIVE_TASK.arch-gen2-000.json`; 6. выполнить `ARCH-GEN2-000`. ## 6. Branch model После PRE каждая задача выполняется отдельно. ### 6.1 Перед task ```text checkout gen2-integration pull/verify expected head create branch gen2/- set dev/ACTIVE_TASK.json -> selected packet run preflight ``` Все post-PRE task packets имеют: `"base_repo_revision": "gen2-integration"` Это намеренно. Пока Codex работает в task branch, локальная ветка `gen2-integration` остаётся на исходной точке задачи. Поэтому `check-diff` видит **только diff текущего packet-а**, а не всю программу Gen2. ### 6.2 После FAST gate 1. `check-diff`; 2. `git diff --check`; 3. commit task branch; 4. merge task branch -> `gen2-integration`; 5. push `gen2-integration`; 6. удалить task branch только после проверки merge. Не сливать незавершённый packet в integration ради «сохранения прогресса»: для этого используются commits в task branch. ## 7. Milestone merge в main `main` обновляется по реперным точкам, а не после каждой мелкой задачи. Milestone exit: 1. выполнить соответствующий `MILESTONE` или `FULL` gate на `gen2-integration`; 2. только если gate зелёный — merge `gen2-integration` -> `main`; 3. push `main`; 4. поставить milestone tag; 5. fast-forward `gen2-integration` до нового `main` merge commit; 6. push `gen2-integration`. Рекомендуемые tags: - `domovoy-gen2-m0` - `domovoy-gen2-m1` - … - `domovoy-gen2-m6` Не перезаписывать существующий tag. ## 8. Test profiles ### 8.1 FAST — основной цикл FAST выполняется на каждом task. Состав: - targeted `go test` только изменённого owner/runtime; - targeted `go vet`; - `devctl preflight`; - `devctl check-diff`; - `devctl/independent`; - `git diff --check`; - один-два regression checks для фактического риска task-а. **FAST не включает `go test ./...` по умолчанию.** Если targeted command невозможно корректно сформировать из-за package topology, сначала объяснить почему; не переходить автоматически на полный suite без причины. ### 8.2 MILESTONE MILESTONE запускается после завершения целого архитектурного органа. Только: - затронутые owners; - соседние contracts; - migration/backfill sample; - ключевые cross-owner regressions; - restart/recovery там, где это часть milestone. ### 8.3 FULL FULL запускается только там, где packet прямо содержит `FULL:` evidence. Базовые FULL points: - `GEN2-016` — M3; - `GEN2-027` — M5; - `GEN2-029` — до необратимого V1 retirement; - `GEN2-030` — финальный acceptance. Дополнительный FULL допустим только при: - критической глобальной schema migration; - изменении Authority/Commit invariants; - серьёзном production rollback concern; - явном требовании владельца. ### 8.4 Не повторять свежий FULL без причины Если предыдущий FULL: - выполнен на том же milestone; - после него не менялась соответствующая глобальная поверхность; - нет нового риска, который он должен покрыть, не запускать его повторно «для уверенности». ## 9. STOP TEST EXPANSION Codex обязан остановить расширение тестов и вернуться к цели task-а, если одновременно верно: 1. функциональная/архитектурная цель ещё не достигнута; 2. тестовая работа стала существенно больше самой реализации; 3. новые тесты проверяют уже защищённый invariant или косметические вариации; 4. нет нового существенного риска, ради которого они нужны. В этом случае: - оставить минимально достаточные tests; - записать потенциальные дополнительные cases в findings; - продолжить реализацию. ## 10. Architecture and migration law ### 10.1 Один canonical writer Никогда не иметь два canonical writers одного mutable semantic state. Разрешено: - backfill; - shadow projection; - dual-read; - compare; - read fallback. Не разрешено: - два равноправных canonical write paths «на время миграции». ### 10.2 Historical migrations Не редактировать V1 migrations `001–045`. Gen2 создаёт только новые next-numbered migrations. Если порядковый номер изменился из-за параллельной работы, использовать следующий свободный — смысл migration определяется task, а не заранее зарезервированным числом. ### 10.3 Особенность текущего devctl Текущий validator трактует **любое** изменение `database/**` как требующее положительного `new_database_owner_roles`, а любое изменение `deploy/**` — положительного `new_privileges`. Поэтому packets на этих поверхностях содержат `1` как compatibility gate. Это **не означает**, что task автоматически разрешает: - новый semantic owner; - новый DB role; - cross-owner FK/JOIN/write; - дополнительную внешнюю привилегию. Разрешено только то, что явно написано в packet + Gen2 architecture docs. `ARCH-GEN2-000` может улучшить этот validator, но должен сохранить обратную совместимость с уже созданными packets. ## 11. Scope discipline Task packet — верхняя граница изменения. Если Codex обнаружил, что нужно изменить файл вне scope: 1. не менять файл; 2. установить, это implementation need или architecture gap; 3. вернуть соответствующий `BLOCKED_*`, либо подготовить revision task packet; 4. после явного расширения scope продолжить. Не расширять task до соседнего рефакторинга только потому, что он «логично рядом». ## 12. Read before write Перед нетривиальным изменением: 1. прочитать Gen2 canonical docs; 2. прочитать текущий task packet; 3. найти существующую реализацию/owner; 4. проверить migrations/contracts/call path; 5. только затем менять код. Если существующий механизм уже решает задачу — расширить его, а не создавать параллельный. ## 13. Data migration rules Для каждого cutover: 1. additive schema; 2. backfill с lineage; 3. shadow/read comparison; 4. controlled reader switch; 5. writer switch только после доказательства; 6. observation window; 7. V1 compatibility path остаётся до retirement task. Rollback не должен уничтожать уже накопленные Gen2 evidence. ## 14. Production Production mutation допускается только packet-ами, где это явно разрешено. Основной production transition — `GEN2-027`. Перед promotion: - health; - migration compatibility; - bounded canary; - household smoke; - rollback drill. Если canary неубедителен — rollback считается нормальным результатом, а не провалом программы. ## 15. Self-evolution До `GEN2-022` SELF/Skill/Reflex не получает права самовольно менять production code. После `GEN2-022`: - proposal != promotion; - creator != evaluator; - candidate строится отдельно; - tests/shadow/canary; - Supervisor держит last-known-good; - owner intent/authority остаётся выше внутренней оптимизации. ## 16. Completion report каждого task Codex обязан закончить packet коротким отчётом: - task id/revision; - base SHA; - branch/commit SHA; - changed paths/modules; - contracts/schema/events/dependencies/privileges touched; - writer before/after; - migration/backfill/cutover state; - FAST/MILESTONE/FULL tests **фактически** выполненные; - tests сознательно не выполненные и почему; - rollback point; - findings not changed; - gaps/limitations; - следующий task, который разрешено активировать. Не писать `PASS` для теста, который не запускался. ## 17. Terminal states Допустимые остановки: - `BLOCKED_BY_SPEC_GAP` - `BLOCKED_BY_ARCHITECTURE_GAP` - `BLOCKED_BY_MISSING_CAPABILITY` - `BLOCKED_BY_CONFLICT` - `REQUIRES_MIGRATION_DECISION` Typed stop лучше скрытого архитектурного обхода. ## 18. Главный критерий программы Успех task-а — не «все возможные тесты зелёные». Успех: 1. заявленная Gen2 capability/architecture increment реально создана; 2. canonical ownership не размыт; 3. предыдущий критический behavior не сломан; 4. есть достаточное evidence; 5. rollback понятен; 6. следующий packet может строиться на результате без архитектурного долга, который мы сознательно откладываем.