Decide whether a canary can promote based on slice metrics and exposure
quality. Lower WER, lower latency, and lower cost are better, but an
incomplete, tiny, or unapproved slice report should not auto-promote.
Hidden answer: Python solution
import math
REQUIRED_SLICE_FIELDS = {
"wer_relative_delta",
"p95_latency_ms_delta",
"requests",
}
def finite_number(value):
return isinstance(value, (int, float)) and not isinstance(value, bool) and math.isfinite(value)
def canary_promotion(metrics, approved_slices, min_requests_per_slice=100):
if not isinstance(metrics, dict):
return {"decision": "hold", "blockers": ["invalid_metrics"]}
if not isinstance(approved_slices, set) or not approved_slices:
raise ValueError("approved_slices must be a non-empty set")
if not finite_number(min_requests_per_slice) or min_requests_per_slice <= 0:
raise ValueError("min_requests_per_slice must be positive")
blockers = []
slices = metrics.get("slices")
if not isinstance(slices, dict) or not slices:
blockers.append("missing_slices")
slices = {}
for name, values in slices.items():
if name not in approved_slices:
blockers.append(f"{name}:unapproved_slice")
continue
if not isinstance(values, dict):
blockers.append(f"{name}:invalid_metrics")
continue
missing = REQUIRED_SLICE_FIELDS - values.keys()
if missing:
blockers.append(f"{name}:missing_{sorted(missing)[0]}")
continue
if not finite_number(values["requests"]) or values["requests"] < min_requests_per_slice:
blockers.append(f"{name}:low_exposure")
if not finite_number(values["wer_relative_delta"]) or values["wer_relative_delta"] > 0.02:
blockers.append(f"{name}:wer")
if not finite_number(values["p95_latency_ms_delta"]) or values["p95_latency_ms_delta"] > 75:
blockers.append(f"{name}:latency")
if metrics.get("privacy_errors") is None:
blockers.append("missing_privacy_errors")
elif not finite_number(metrics["privacy_errors"]) or metrics["privacy_errors"] > 0:
blockers.append("privacy")
if metrics.get("unit_cost_relative_delta") is None:
blockers.append("missing_unit_cost")
elif not finite_number(metrics["unit_cost_relative_delta"]) or metrics["unit_cost_relative_delta"] > 0.15:
blockers.append("unit_cost")
if blockers:
return {"decision": "hold", "blockers": blockers}
return {"decision": "promote", "blockers": []}
Average quality improvement is not enough. A canary should protect
critical slices, privacy, latency, unit economics, and telemetry
completeness before promotion. Missing top-level or slice telemetry
should hold the release, not crash late, smuggle NaN through a
comparison, expose raw cohort labels, or default to success.