Project-level state (deployed_at, config_hash, status, etc.)
services
map
Per-service state, keyed by service folder name (workspace/services/<name>/)
pending
object
Pending operations that need to be applied; present only when dwe services enable/disable was run without --apply. Written atomically by the toggle command; cleared by dwe restart, dwe deploy run, or dwe reset run
Fingerprint of tracked services + top-level deploy config + per-service deploy configs. Edits to enabled-but-untracked service variants (e.g., main-debug) do not change this hash.
When dwe services enable or dwe services disable is run without --apply, the toggle command writes the local.yml change immediately but defers the apply step. The pending field in the state file tracks what still needs to run.
Pending entries are recorded only once a deploy has been attempted at least once on this stack. Any prior attempt counts: the journal lists at least one service in a non-not_deployed status (deployed / failed / in_progress / partial / skipped), OR project.last_run is present, OR project.status is set to anything other than not_deployed. If the journal file is corrupt (load error), the toggle still attempts the pending write so the corruption surfaces — silent pending loss would be worse.
Before any deploy attempt, pending has no meaning — the next dwe deploy picks up the new local.yml fresh — so the toggle silently updates local.yml/.env, writes no journal entry, and prints a one-line run dwe deploy hint after the plan.