Skip to content

Release 2.1.59 (2026-06-23)

Features

  • add 'vrg-vm volumes' to surface persistent volumes from local tofu state (#1798) Off-platform persistent volumes — the long-lived, billable, quota-consuming disks that outlive every ephemeral cloud VM — had no tool-side visibility: enumerating them meant dropping to raw gcloud and eyeballing truncated names. The volume is the most important off-platform object to be able to see (for cleanup and SSD-quota management), yet it was invisible.

Add a 'vrg-vm volumes' subcommand that builds a full inventory from purely local tofu state — no network, no gcloud. It globs ~/.config/vergil/tofu///volume.tfstate, parses each google_compute_disk.data resource, and renders a table of IDENTITY / ORG-REPO / DISK NAME / SIZE / ZONE / REGION, sourced from the disk's stamped vergil-* labels and attributes so the listing reflects exactly what vrg-vm manages. Identity/org/repo come from the labels (falling back to the state-dir name); region is derived from the zone. A never-applied placeholder state degrades to a state-keyed row rather than dropping out.

The optional --live flag adds a LIVE column that cross-checks each disk against the provider to spot drift: a disk deleted out of band shows MISSING, an unauthed/unreachable or non-GCP provider degrades to 'unknown'. Parsing never raises — a malformed or unreadable state yields a placeholder row, never a crashed listing.

  • allow an explicit zone in the off-platform profile (#1799) The dispatch hard-pinned the off-platform volume (and thus the VM) to ${region}-b: apply_volume never set var.zone. When that zone lacks capacity for the chosen machine type (e.g. n2-standard-16 stockout in us-central1-b) there was no way to target a sibling zone with the hardware.

Add an optional 'zone' to the off-platform profile ([vm.*] in vergil.toml). It rides the same cascade as region/instance/volume (config RoleOverlay/VmStanza + _VM_KEYS/_VM_STR_SCALARS, vm_spec _Acc/ComposedSpec/overlay/override) and flows spec.zone -> volume_vars -> apply_volume -> var.zone. The volume module already supports it. Optional: empty -> the module's ${region}-b default (it coalesces the empty string away), so existing region-b volumes are unaffected.

The disk is zonal, so zone is a volume-creation-time choice: changing it for an existing volume means destroy-volume + recreate.