Recover through three proofs.
Stop DSH and copy the profile manifest, both user layers, lockfile, and first error.
Use --dump-default-config to omit user layers and prove shipped bundles still compose.
Set the implicated active user layer to a valid empty array: [].
Require both a full config dump and real import/activation readiness.
dsh --profile web --dump-default-config > web.default.yml
dsh --profile web --dump-config > web.recovered.yml
dsh --profile web
Offline composition parses patches but does not prove that an inserted package resolves, imports, or activates.
Choose the correct repair.
Restore reviewed groups one at a time.
Require zero exit, lock integrity, declaration, and boot.
Then test its export and lifecycle in isolation.
A writer needs a transaction.
resolve → parse → compose → snapshot
→ isolated boot + health probe
→ promote or restore
Do not turn every missing plugin into a warning. A missing policy, sandbox, or persistence provider is not a safe degraded runtime.
Keep the complete recovery runbook.
The canonical guide maps both user layers, the rc.8 default-config escape hatch, package resolution probes, unsafe shortcuts, transactional writer requirements, and ten acceptance gates.
Read the complete runbook