* feat: run Spinifex on latitude.sh bare metal
Add a latitude.sh provider and deploy script. One node uses a static Elastic IP pool. Three nodes use a latitude floating pool over a fixed Elastic IP set, with the cluster and Geneve planes on a latitude.sh VLAN.
The floating engine gains a FixedSet provider interface. Its allocation token, re-read before a move and holder label apply to fixed sets only, so Vultr records and behaviour are unchanged.
Bead mulga-c43h3.3
* fix: check a server's project before destroy and refuse mismatched response IDs
A recorded server must sit in the project this deployment's Terraform holds, so a recycled ID with the same hostname elsewhere stops destroy. A missing project or ID refuses too.
The client rejects an Elastic IP response whose ID is not the requested one, without showing it.
Bead mulga-c43h3.3
* feat: cap a latitude pool at five Elastic IPs
Config validation rejects a source="latitude" pool listing more than MaxLatitudeElasticIPs addresses, so an allocation makes at most five bounded provider reads.
Bead mulga-c43h3.3
* fix: remember the project ID before destroy for the cleanup sweep
The Terraform output that names the project is gone once destroy has run, so the sweep could not tell a matching server from a foreign one and kept both.
Bead mulga-c43h3.3