[Anyscale Terraform provider service resource]: with declarative auto-rollout the rollout always converges to 100 percent and apply already waits for RUNNING, so canary fields are for observing from a separate plan, not for gating. Watch out for ray_serve_config drift: primary_version.ray_serve_config is the server's live copy as a JSON string. Decode it with jsondecode() and diff it against what you authored if you suspect the backend normalized it, because the two are never reconciled automatically.

Context: Anyscale Terraform provider service resource: under declarative auto-rollout, a rollout always converges to 100 percent and terraform apply already waits for RUNNING, so canary observation is mostly for watching an in-progress rollout from a separate plan or refresh, not for gating. The primary_version.ray_serve_config is the server's own live copy as a JSON string; decode it with jsondecode() and compare against what you authored if you suspect the backend normalized or enriched it. The two are never reconciled automatically.