Всегда "1"; зарезервировано для будущих изменений формата
project
object
Состояние уровня проекта (deployed_at, config_hash, status и т. д.)
services
map
Состояние по каждому сервису, индексируется именем папки сервиса (workspace/services/<name>/)
pending
object
Ожидающие операции, которые необходимо применить; присутствует только если dwe services enable/disable был запущен без --apply. Записывается атомарно командой переключения; очищается командами dwe restart, dwe deploy run или dwe reset run
Когда проект был последний раз полностью развёрнут
config_hash
sha256 hex
Отпечаток отслеживаемых сервисов + конфигурации деплоя верхнего уровня + конфигураций деплоя по каждому сервису. Правки включённых, но не отслеживаемых вариантов сервисов (например, main-debug) не меняют этот хеш.
Когда dwe services enable или dwe services disable запускается без --apply, команда переключения сразу записывает изменение в local.yml, но откладывает шаг применения. Поле pending в файле состояния отслеживает, что ещё нужно выполнить.
Записи pending создаются только после того, как на этом стеке хотя бы раз была предпринята попытка деплоя. Любая предыдущая попытка засчитывается: в журнале есть хотя бы один сервис со статусом, отличным от not_deployed (deployed / failed / in_progress / partial / skipped), ИЛИ присутствует project.last_run, ИЛИ project.status отличается от not_deployed. Если файл журнала повреждён (ошибка загрузки), переключение всё равно пытается записать pending, чтобы повреждение всплыло — тихая потеря pending была бы хуже.
До первой попытки деплоя pending не имеет смысла — следующий dwe deploy подхватит новый local.yml с нуля — поэтому переключение тихо обновляет local.yml/.env, не пишет в журнал и печатает однострочную подсказку run dwe deploy после плана.