Контракт отсоединения
Что означает «автономный бэкенд» — построчно, с указанием того, что в репозитории обеспечивает каждую строку. Ни одна строка не появляется здесь без доказательства. Строка, у которой есть только локальное доказательство, так и говорит — доказательство на развёртывании является отдельным рубежом (SPEC.md §11 R4).
Доказательства, а не индекс статусов. Релизные рубежи для доказательства на развёртывании —
SPEC.md §11 R4.8 (учения по отсоединению) и R4.9 (показатели производительности).
Контракт
Заголовок раздела «Контракт»| Строка контракта | Чем обеспечивается | Уровень доказательства |
|---|---|---|
| Репозиторий принадлежит владельцу | поток подключения scripts/github.ts; артефакт принимается в целевой каталог, который указывает оператор |
локальный |
| База данных принадлежит владельцу | graduate/target.ts и graduate/migrate.ts пишут только в целевую базу данных; scripts/d1-provision.ts создаёт D1 владельца |
локальный |
| Развёртывание и учётные данные принадлежат владельцу | генерируемые wrangler.example.jsonc, scripts/configure-deployment.mjs; bearer-токен читается из окружения владельца (API_BEARER_TOKEN) |
локальный |
| Нормализованная схема Prisma, настоящие таблицы и индексы | graduate/schema.ts, packages/eav-to-prisma; backend/test/graduate-generator.test.ts |
локальный |
| Проверяемые, только дополняемые миграции | graduate/migrate.ts, graduate/lineage.ts, генерируемый scripts/emit-migration.mjs; backend/test/graduate-adoption.test.ts “regenerates after a schema change, appending to the migration lineage” |
локальный |
| Сгенерированные маршруты с привычной семантикой моделей и запросов Prisma | packages/prisma-generator-express (цель Hono); backend/test/artifact-two-version-transition.test.ts запускает артефакт и вызывает его маршруты |
локальный |
| Никаких обращений к Dee Wan во время выполнения | backend/test/graduate-artifact-auth.test.ts, backend/test/graduate-no-callback.test.ts |
локальный |
| Никакой зависимости от идентификации, доступности или инфраструктуры Dee Wan | те же два теста: сгенерированная аутентификация читает один bearer-токен из собственного окружения | локальный; доказательство на развёртывании ОТКРЫТО |
| Код, принадлежащий разработчику, переживает повторную генерацию | graduate/zones.ts + backend/test/graduate-adoption.test.ts “keeps a developer’s own file across a schema change”; правило для владельца — в Расширение вашего бэкенда |
локальный |
| ДАННЫЕ, принадлежащие владельцу, переживают повторную генерацию | backend/test/graduate-adoption.test.ts “keeps rows the adopter wrote into their own table across a schema change” |
локальный |
| Разработчик может перестать использовать Dee Wan и продолжать развивать репозиторий | правило зон, а также генерируемые scripts/regenerate.mjs и scripts/emit-migration.mjs, которые работают без CMS |
локальный; см. «Прекращение» ниже |
Что ещё НЕ доказано
Заголовок раздела «Что ещё НЕ доказано»- Учения по отсоединению на развёртывании, на точном коммите. Сгенерированный бэкенд отвечает
на чтения, пока Worker Dee Wan выключен. Для этого нужны полномочия Cloudflare (SPEC.md
§11 R0.2). Скрипт и файл доказательств находятся в
scripts/detach-drill.tsиdocs/artifacts/detachment-evidence.md; оба прямо сообщают, если запусков не было. - Показатели производительности. Ни один бенчмарк ещё не запускался. См.
docs/PERFORMANCE-EVIDENCE.md. Пока в этом файле нет запуска, нет и никаких заявлений о скорости.
Две вещи, которые должен знать владелец
Заголовок раздела «Две вещи, которые должен знать владелец»Сгенерированные таблицы контента принадлежат запуску. Миграция сверяет цель
с планом и ОТКАЗЫВАЕТ (observed_row_set_mismatch), если находит в сгенерированной
таблице строки, которые CMS не публиковала. Этот отказ и есть гарантия того, что
развёрнутый бэкенд отдаёт то, что, по словам CMS, он отдаёт. Записывайте собственные данные в
собственные таблицы — для этого и существуют src/owned/ и ваши собственные миграции.
Сделать существующее поле обязательным — не бесплатно. Пересборка таблицы завершается ошибкой на строках, содержащих NULL, и запуск отказывает, а не уничтожает данные. Сначала заполните значения, затем сделайте поле обязательным.
Прекращение
Заголовок раздела «Прекращение»Отсоединение — поддерживаемый исход, а не аварийный выход. Владелец удаляет вебхук, перестаёт нажимать Deploy и сохраняет репозиторий.
Что продолжает работать:
- развёрнутый Worker и его база данных,
- каждый уже сгенерированный маршрут,
- уже применённая цепочка миграций,
- собственный код владельца в
src/owned/и его собственные таблицы, prisma migrate deploy,wrangler deploy, его CI.
Что прекращается:
- повторная генерация из моделей CMS (новые определения моделей не поступают),
- копирование вновь опубликованного контента CMS,
- поверхность редактирования: контент редактируется в CMS.
С этого момента схема развивается через обычные миграции Prisma в
репозитории владельца. Файлы в зоне generated можно свободно редактировать, как только
никто больше не выполняет повторную генерацию, — правило зон имеет значение, только пока CMS ещё генерирует файлы в
это дерево.
Две поверхности, а не одна
Заголовок раздела «Две поверхности, а не одна»Публичный API CMS работает вживую: публикация доходит до него сразу. Его edge-кеш
по умолчанию выключен (no-store); когда кеширование включено, публикация очищает его
теги кеша. Сгенерированный бэкенд — это РЕЛИЗ схемы и контента: изменение в CMS доходит до
него только через явную повторную генерацию и развёртывание. Он не синхронизируется
непрерывно. Непрерывная синхронизация — отдельное продуктовое решение, и она не реализована.