You receive old and new metric maps by slice. Decide whether a pull
request can merge when global WER improves but a launch-critical
approved eval slice regresses.
Hidden answer: strong checklist and Python sketch
A strong gate treats approved launch-critical slices as first-class release
criteria. Merge should be blocked or paused when a critical slice
exceeds its regression budget, even if the aggregate metric
improves. Include invalid-budget, missing-slice, and missing-metric
handling, plus range checks for WER values, so eval coverage and
metric quality cannot silently disappear.
import math
from collections.abc import Mapping
def valid_rate(value):
return (
not isinstance(value, bool)
and isinstance(value, (int, float))
and math.isfinite(value)
and 0 <= value <= 1
)
def asr_slice_gate(baseline, candidate, budgets):
if not all(isinstance(group, Mapping) for group in (baseline, candidate, budgets)):
return "pause_for_eval", [("pause", "all", "metric inputs must be maps")]
findings = []
for slice_name, budget in budgets.items():
if not isinstance(budget, Mapping):
findings.append(("pause", slice_name, "invalid budget entry"))
continue
max_delta = budget.get("max_wer_delta")
if not valid_rate(max_delta):
findings.append(("pause", slice_name, "invalid regression budget"))
continue
if slice_name not in baseline or slice_name not in candidate:
findings.append(("pause", slice_name, "missing eval slice"))
continue
old_metrics = baseline[slice_name]
new_metrics = candidate[slice_name]
if not isinstance(old_metrics, Mapping) or not isinstance(new_metrics, Mapping):
findings.append(("pause", slice_name, "invalid metric entry"))
continue
if "wer" not in old_metrics or "wer" not in new_metrics:
findings.append(("pause", slice_name, "missing WER metric"))
continue
old_wer = old_metrics["wer"]
new_wer = new_metrics["wer"]
if not valid_rate(old_wer) or not valid_rate(new_wer):
findings.append(("pause", slice_name, "WER outside 0..1 range"))
continue
delta = new_wer - old_wer
if delta > max_delta:
findings.append(("block", slice_name, round(delta, 4)))
if any(item[0] == "block" for item in findings):
return "block_merge", findings
if findings:
return "pause_for_eval", findings
return "merge_allowed", []