Preserve first; cleanup destroys this disposable trial, never recovers it

The scripted walkthrough stops its launcher automatically. For a manual session,
wait until every client has finished, then Ctrl-C its foreground launcher. Never
interrupt an in-flight request merely to demonstrate restart. If it crashes or
is killed, preserve the domain and report uncertainty; do not edit the witness.
An orphaned adapter causes a subsequent launcher to refuse its held service lock.
The package does not automatically kill unknown/orphaned PIDs or repair state.

1. ROOT: export the stopped trial into a NEW archive outside home/state. Replace
   the example archive path with your chosen existing output directory.

  EZA_ARCHIVE=/var/tmp/dt001-first-attempt-evidence.tar
  sudo /usr/bin/python3 -I -B "$EZA_HOME/package/integration/export_v1.py" \
    --config "$EZA_STATE/config.json" --out "$EZA_ARCHIVE"

The archive is private (0600, root-owned), includes all regular state/results
files and EVIDENCE-SHA256SUMS, and excludes socket nodes. It does not include
installed dependency binaries or this source package. Keep the original package
and its independently supplied pin alongside the archive. The command prints
the archive SHA-256; retain that digest separately. Preserve manual shell output
files separately if you used the alternative manual walkthrough.

ROOT read-only checks, from the archive's parent directory:
  sudo sha256sum "$EZA_ARCHIVE"
  sudo tar -tf "$EZA_ARCHIVE"
Do not extract unreviewed archives over a live domain. This export is evidence,
not a supported backup/restore/migration route. Any copies remain non-operational.

2. ROOT DESTRUCTIVE, only after preserving the export and digest:

  EZA_ARCHIVE_SHA256='REPLACE_WITH_THE_REPORTED_ARCHIVE_SHA256'
  sudo /usr/bin/python3 -I -B "$EZA_HOME/package/integration/cleanup_v1.py" \
    --config "$EZA_STATE/config.json" --archive "$EZA_ARCHIVE" \
    --archive-sha256 "$EZA_ARCHIVE_SHA256" --destroy

This validates the export, rejects changed state, refuses a running launcher or
any processes belonging to the five trial UIDs, checks the recorded identities,
then invokes userdel/groupdel for only those names and deletes only the recorded
trial home/state trees. It does not remove the source delivery or evidence archive.
No broad pkill, account reuse, force-delete, system runtime removal or repair.
A partial cleanup failure must be inspected; never widen deletion targets.

If fresh setup failed before config creation, cleanup_v1.py cannot safely guess
what was created. Preserve state/setup-events.jsonl and the failed command output.
A human root operator must compare only the recorded newly created account names
with getent passwd/getent group and inspect only the chosen new paths before any
manual userdel/groupdel or directory deletion. Do not rerun setup over partial state.
