fd6df322f6
Both ci.yaml and deploy-gke.yaml triggered on push/main and shared the neuron-runner concurrency group. Gitea's cancel-in-progress:false protects running jobs but not queued ones — a new push arriving while a build was in progress cancelled the queued deploy job from the previous push, leaving the soul permanently at 0/0 replicas on GKE. Fix: add deploy as a needs:build job in ci.yaml so build+deploy are a single workflow instance. One push queues one instance — no more orphaned deploys. deploy-gke.yaml is demoted to workflow_dispatch-only for manual slot overrides.