Use after major refactors or risky infrastructure changes to run iterative stabilization loops in kube-test: clean state, run the v3 matrix (k3s/rke2, autoscaler, leapmicro/microos, multi-arch), proactively debug failures over SSH/journalctl, apply fixes, retest until green, then validate upgrade paths from the latest tag to the current release-candidate branch.
Use after major refactors or risky infrastructure changes to run iterative stabilization loops in kube-test: clean state, run the v3 matrix (k3s/rke2, autoscaler, leapmicro/microos, multi-arch), proactively debug failures over SSH/journalctl, apply fixes, retest until green, then validate upgrade paths from the latest tag to the current release-candidate branch.
Running Stabilization Loop
Overview
Use this workflow when the goal is not only to detect failures, but to fix them and prove full regression safety after major changes.
Usage
/running-stabilization-loop
Buddy Prompt Template
Use this exact prompt when delegating the loop to another agent:
Run the full kube-hetzner v3 stabilization loop end-to-end, do not stop at pass/fail reporting.
Goals:
1) Make every matrix scenario pass from simple to complex.
2) Fix root causes in kube-hetzner (not workarounds in test harness) unless explicitly required.
3) Re-run full matrix after fixes to prove no regressions.
4) Validate upgrade path from latest git tag to the current release-candidate branch for both k3s and rke2.
5) When Tailscale credentials are available, include the Tailscale node-transport
scenarios: secure single-network Tailnet access, plus Flannel with multiple
Hetzner Networks, route auto-approval, autoscaler scale-up/down,
`tailscale status`, and cross-network pod traffic.
6) Include final v3 polish scenarios when touched: Cilium Gateway API with
`enable_kube_proxy=false`, embedded registry mirror on k3s or RKE2, endpoint
output sanity, and example validation.
Hard requirements:
- Use /Users/karim/.ssh/id_ed25519 with IdentitiesOnly=yes for all SSH.
- Use /Volumes/MysticalTech/Code/kube-test/run_v3_matrix.sh and summary-*.md as source of truth.
- If RKE2/K3s apply hangs, SSH during apply and inspect journalctl/cloud-init immediately.
- If destroy hangs, run cleanup and delete stuck autoscaled servers via hcloud.
- Keep changes minimal and production-safe; run Terraform and OpenTofu validation before each rerun.
- For Tailscale node transport, verify single-network clusters work without
route approval when route advertisement is disabled; for multinetwork, verify
node-private routes are approved and SNAT is disabled for advertised routes.
Do not mistake external overlay SSH access for supported Kubernetes node
transport.
- For Cilium Gateway API, verify GatewayClass exists, Gateway is accepted, and
HTTPRoute serves through the Hetzner LoadBalancer. For embedded registry
mirror, verify `registries.yaml`, `embedded-registry: true`, peer ports, and
image-pull behavior.
Deliverables:
- Final scenario matrix results with log paths.
- List of fixes made with files changed.
- Upgrade test result (tag -> release-candidate branch) and any required migration notes.
- Confirmation cleanup is complete and no khv3-* resources are left.
MicroOS: k3s x86, k3s arm, rke2 x86, rke2 arm (4 total,
required when the release touches the legacy image path or mixed-os scenarios)
Check:
hcloud image list --type snapshot -o columns=id,name,architecture,labels
Create missing ones from a fresh, manifest-verified generated bundle. Keep the
token already exported in the environment; do not parse or print it:
repo_root=/Volumes/MysticalTech/Code/kube-hetzner
build_root="$(mktemp -d)"
KH_SOURCE_DIRECTORY="$repo_root" folder_name=generated \
folder_path="$build_root" create_snapshots=none \
"$repo_root/scripts/create.sh"cd"$build_root/generated/packer"
./scripts/install-verified-packer-plugin-hcloud.sh
for template in hcloud-leapmicro-snapshots.pkr.hcl hcloud-microos-snapshots.pkr.hcl; do
packer init "$template"for distro in k3s rke2; do
packer build -var "selinux_package_to_install=${distro}""$template"donedone
For a release canary, set KH_SOURCE_DIRECTORY to the exact release checkout or
an extracted archive of that release. Record the generated bundle's manifest
digest, snapshot IDs, architectures, and distro labels before any cluster
apply. Never build from loose templates copied into kube-test.
Step 4: Run Matrix (Simple to Complex)
Run full matrix:
cd /Volumes/MysticalTech/Code/kube-test
RUN_ID="$(date +%Y%m%d-%H%M%S)" ./run_v3_matrix.sh | tee"scenarios_v3/matrix-${RUN_ID}.log"
Run targeted scenarios:
cd /Volumes/MysticalTech/Code/kube-test
RUN_ID="$(date +%Y%m%d-%H%M%S)" SCENARIOS="s2-rke2-basic s4-rke2-autoscaler" ./run_v3_matrix.sh
Step 5: Proactive Debugging During Runs
Do not wait for timeout-only diagnosis. SSH while apply is running if progress stalls.
Find nodes:
hcloud server list -o columns=id,name,status,ipv4 | grep khv3-
Fix path: rebuild the Leap Micro snapshot from the current authenticated
openSUSE appliance. Never use --no-gpg-checks, gpgcheck=0,
rpm --nosignature, or an equivalent bypass.
Leap Micro OS update release gate
For release candidates that touch snapshots, bootstrap, SSH, SELinux, or OS
updates, keep a disposable cluster after apply and prove the real update path.
Run the agent first, then a control plane:
transactional-update --no-selfupdate --non-interactive up
Require exit status 0, a new default snapshot when updates are available, and
no NOTTRUSTED, key-import, RPM-lock, or discarded-snapshot failure. Reboot the
node and verify all of the following before continuing:
Also prove that the boot ID changed, the node returned Ready, all required
pods recovered, API /readyz passes, metrics work, and an in-cluster DNS probe
succeeds. A single-control-plane canary should show brief API downtime; require
full recovery before destroying it. Re-run the checks after every reboot rather
than accepting a successful package transaction as deployment proof.
Step 6: Fix + Targeted Rerun Loop
Implement minimal fix in /Volumes/MysticalTech/Code/kube-hetzner.
If requested to push the current release-candidate branch:
cd /Volumes/MysticalTech/Code/kube-hetzner
git status --short
git add -A
git commit -m "fix: stabilize v3 matrix and upgrade loops"
git push origin "$(git branch --show-current)"
Abort/Cleanup Shortcut
pkill -f run_v3_matrix.sh || true
pkill -f "terraform -chdir=/Volumes/MysticalTech/Code/kube-test/scenarios_v3" || truefor d in /Volumes/MysticalTech/Code/kube-test/scenarios_v3/s*; do
terraform -chdir="$d" destroy -auto-approve || truedone
find /Volumes/MysticalTech/Code/kube-test/scenarios_v3 -name ".terraform.tfstate.lock.info" -delete