# Phase 6 — Handoff + Final Report > Goal: emit a single, complete report and (optionally) hand off to > `/web-deploy` or `/auth-setup`. No further mutation to the VM from this > skill. > **Verify criterion:** final report emitted; all Phase-1..5 artefacts > listed with absolute paths; next-skill dispatch (if any) announced. --- ## 6.a — Artefact ledger Collect and surface: - `/plan.md` — Phase 2 - `/cloud-init.yaml` — Phase 3 input - `/firewall-intent.yaml` — Phase 2 source of truth - `/harden.log` — Phase 4 stderr - `/post-harden.txt` — Phase 4 systemctl snapshot - `/sshd_config` + `sshd_config.d/` — Phase 5 input (captured) - `/ufw-status.txt` — Phase 5 input (captured) - `/ssh-check.json` — Phase 5 output - `/firewall-diff.json` — Phase 5 output Every path must exist on disk before emitting the report. Missing artefact = bug in an earlier phase; STOP and surface the gap. --- ## 6.b — Final report ``` === /VM-PROVISION REPORT === Intent: Provider: / region= / plan= / arch= VM: @ Admin: (ssh port ) Ports: TLS: Hardened: Verification: ssh-check=PASS firewall-diff=PASS Handoff: Artefacts: - /plan.md - /cloud-init.yaml - /firewall-intent.yaml - /harden.log - /post-harden.txt - /sshd_config (+ sshd_config.d/) - /ufw-status.txt - /ssh-check.json - /firewall-diff.json AskUserQuestion count: ``` No prose after the ledger. The report is the contract. --- ## 6.c — Handoff (no AskUserQuestion; next-skill dispatch inferred) If `TLS_HOST` was set AND the caller's intent mentions deploying an app — dispatch to `/web-deploy` with the VM IP and admin credentials (by env-var reference only, RULE 0.8). Surface: > `Handoff → /web-deploy --admin --tls ` If the intent mentions auth / identity — surface: > `Handoff → /auth-setup ` Otherwise: `HANDOFF_TO=none`. User invokes the next skill manually when ready. **Never** run the next skill automatically — the user already clicked their way through 6 phases; handing off to another multi-phase skill without a pause is hostile UX. --- ## 6.d — Memory save (RULE memory-protocol) Append to `memory/{project-or-infra}.md`: ```markdown ### VM provisioned: (YYYY-MM-DD) [E1] - Provider: @ - IP: - Admin: - Hardened: harden-base.sh rev - Verify: ssh-check + firewall-diff both PASS - Cost: /month (cited @ ) - Artefacts: / ``` Evidence grade E1 — facts are direct observations (we ran the commands, we have the exit codes, we can re-verify on demand). If the project file doesn't exist yet, create `memory/{slug}.md` and add a single line to `MEMORY.md` under the right section. --- ## 6.e — Verify criterion - [ ] Report emitted. - [ ] All 9+ artefacts exist on disk at absolute paths. - [ ] `memory/{project}.md` updated (or created) with the provision entry. - [ ] `HANDOFF_TO` announced (or `none`). --- ## 6.f — Rollback instructions (always include in the report) ``` # destroy the VM + all its resources (idempotent) _primitives/provision-.sh destroy --force # purge local artefacts (plan, logs, captured configs) rm -rf ``` Keep them visible — Future-Us will appreciate the 1-command path back.