FAILURE MAP
← Case archive

FA-96626 / Phone number formatting / Open access

SMS sender identifier classifier: overlong alphanumeric senders are accepted · case 01

A twelve-character sender is accepted.

Verified by executionVariant 1 · 14 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The alphanumeric rule has no upper length bound.

VERIFIED REPAIR

Allow at most eleven characters.

Unsuccessful approach: A strict bound of eleven rejects eleven-character senders.

Case contract

Strip. "+" followed by 8..15 digits is a long code (else invalid). All digits: 3..6 is a short code, 8..15 is a long code rendered with a leading "+", anything else invalid. Otherwise 1..11 characters of letters, digits, space, hyphen or dot with at least one letter is an alphanumeric sender. Return [kind, value].

Why this case matters

Sender identifiers are normalized before messages are queued; a misclassified sender is rejected by the carrier or impersonates another sender.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    s = x.strip()
    if s.startswith('+'):
        d = s[1:]
        if d.isdigit() and 8 <= len(d) <= 15:
            return ['longcode', s]
        return ['invalid', s]
    if s.isdigit():
        if 3 <= len(s) <= 6:
            return ['shortcode', s]
        if 8 <= len(s) <= 15:
            return ['longcode', '+' + s]
        return ['invalid', s]
    if 1 <= len(s) and any(c.isalpha() for c in s) and all(c.isalnum() or c in ' -.' for c in s):
        return ['alpha', s]
    return ['invalid', s]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['three-digit short code', '121', ['shortcode', '121']], ['two digits too short', '11', ['invalid', '11']], ['six-digit short code', '123451', ['shortcode', '123451']], ['bare long number gains a plus', '425550111', ['longcode', '+425550111']], ['plus long number', '+425550111', ['longcode', '+425550111']], ['plus with too few digits', '+12145', ['invalid', '+12145']], ['plus with sixteen digits', '+1234567890123456', ['invalid', '+1234567890123456']], ['alphanumeric sender', ' FAKECO1 ', ['alpha', 'FAKECO1']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS1', ['invalid', 'FAKECOSHOPS1']], ['digits and hyphen without letters', '12-31', ['invalid', '12-31']], ['sender starting with a digit', '1GO', ['alpha', '1GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '122', ['shortcode', '122']], ['two digits too short', '22', ['invalid', '22']], ['six-digit short code', '123452', ['shortcode', '123452']], ['bare long number gains a plus', '425550122', ['longcode', '+425550122']], ['plus long number', '+425550122', ['longcode', '+425550122']], ['plus with too few digits', '+12245', ['invalid', '+12245']], ['plus with sixteen digits', '+1234567890223456', ['invalid', '+1234567890223456']], ['alphanumeric sender', ' FAKECO2 ', ['alpha', 'FAKECO2']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS2', ['invalid', 'FAKECOSHOPS2']], ['digits and hyphen without letters', '12-32', ['invalid', '12-32']], ['sender starting with a digit', '2GO', ['alpha', '2GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '123', ['shortcode', '123']], ['two digits too short', '33', ['invalid', '33']], ['six-digit short code', '123453', ['shortcode', '123453']], ['bare long number gains a plus', '425550133', ['longcode', '+425550133']], ['plus long number', '+425550133', ['longcode', '+425550133']], ['plus with too few digits', '+12345', ['invalid', '+12345']], ['plus with sixteen digits', '+1234567890323456', ['invalid', '+1234567890323456']], ['alphanumeric sender', ' FAKECO3 ', ['alpha', 'FAKECO3']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS3', ['invalid', 'FAKECOSHOPS3']], ['digits and hyphen without letters', '12-33', ['invalid', '12-33']], ['sender starting with a digit', '3GO', ['alpha', '3GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '124', ['shortcode', '124']], ['two digits too short', '44', ['invalid', '44']], ['six-digit short code', '123454', ['shortcode', '123454']], ['bare long number gains a plus', '425550144', ['longcode', '+425550144']], ['plus long number', '+425550144', ['longcode', '+425550144']], ['plus with too few digits', '+12445', ['invalid', '+12445']], ['plus with sixteen digits', '+1234567890423456', ['invalid', '+1234567890423456']], ['alphanumeric sender', ' FAKECO4 ', ['alpha', 'FAKECO4']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS4', ['invalid', 'FAKECOSHOPS4']], ['digits and hyphen without letters', '12-34', ['invalid', '12-34']], ['sender starting with a digit', '4GO', ['alpha', '4GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '125', ['shortcode', '125']], ['two digits too short', '55', ['invalid', '55']], ['six-digit short code', '123455', ['shortcode', '123455']], ['bare long number gains a plus', '425550155', ['longcode', '+425550155']], ['plus long number', '+425550155', ['longcode', '+425550155']], ['plus with too few digits', '+12545', ['invalid', '+12545']], ['plus with sixteen digits', '+1234567890523456', ['invalid', '+1234567890523456']], ['alphanumeric sender', ' FAKECO5 ', ['alpha', 'FAKECO5']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS5', ['invalid', 'FAKECOSHOPS5']], ['digits and hyphen without letters', '12-35', ['invalid', '12-35']], ['sender starting with a digit', '5GO', ['alpha', '5GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]]]
for label, arg, expected in fixtures[N - 1]:
    check(label, solve(arg), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
three-digit short code['shortcode', '121']['shortcode', '121']Passed
two digits too short['invalid', '11']['invalid', '11']Passed
six-digit short code['shortcode', '123451']['shortcode', '123451']Passed
bare long number gains a plus['longcode', '+425550111']['longcode', '+425550111']Passed
plus long number['longcode', '+425550111']['longcode', '+425550111']Passed
plus with too few digits['invalid', '+12145']['invalid', '+12145']Passed
plus with sixteen digits['invalid', '+1234567890123456']['invalid', '+1234567890123456']Passed
alphanumeric sender['alpha', 'FAKECO1']['alpha', 'FAKECO1']Passed
eleven-character sender['alpha', 'FAKECOSHOPS']['alpha', 'FAKECOSHOPS']Passed
twelve-character sender['alpha', 'FAKECOSHOPS1']['invalid', 'FAKECOSHOPS1']Failed
digits and hyphen without letters['invalid', '12-31']['invalid', '12-31']Passed
sender starting with a digit['alpha', '1GO']['alpha', '1GO']Passed
asterisk rejected['invalid', 'FAKE*CO']['invalid', 'FAKE*CO']Passed
space allowed['alpha', 'FAKE CO']['alpha', 'FAKE CO']Passed

SHA-256 / 56119bf1370ae07798270b8059e53352f1286f2829d115401a9e22b1d58207a1

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    s = x.strip()
    if s.startswith('+'):
        d = s[1:]
        if d.isdigit() and 8 <= len(d) <= 15:
            return ['longcode', s]
        return ['invalid', s]
    if s.isdigit():
        if 3 <= len(s) <= 6:
            return ['shortcode', s]
        if 8 <= len(s) <= 15:
            return ['longcode', '+' + s]
        return ['invalid', s]
    if 1 <= len(s) < 11 and any(c.isalpha() for c in s) and all(c.isalnum() or c in ' -.' for c in s):
        return ['alpha', s]
    return ['invalid', s]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['three-digit short code', '121', ['shortcode', '121']], ['two digits too short', '11', ['invalid', '11']], ['six-digit short code', '123451', ['shortcode', '123451']], ['bare long number gains a plus', '425550111', ['longcode', '+425550111']], ['plus long number', '+425550111', ['longcode', '+425550111']], ['plus with too few digits', '+12145', ['invalid', '+12145']], ['plus with sixteen digits', '+1234567890123456', ['invalid', '+1234567890123456']], ['alphanumeric sender', ' FAKECO1 ', ['alpha', 'FAKECO1']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS1', ['invalid', 'FAKECOSHOPS1']], ['digits and hyphen without letters', '12-31', ['invalid', '12-31']], ['sender starting with a digit', '1GO', ['alpha', '1GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '122', ['shortcode', '122']], ['two digits too short', '22', ['invalid', '22']], ['six-digit short code', '123452', ['shortcode', '123452']], ['bare long number gains a plus', '425550122', ['longcode', '+425550122']], ['plus long number', '+425550122', ['longcode', '+425550122']], ['plus with too few digits', '+12245', ['invalid', '+12245']], ['plus with sixteen digits', '+1234567890223456', ['invalid', '+1234567890223456']], ['alphanumeric sender', ' FAKECO2 ', ['alpha', 'FAKECO2']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS2', ['invalid', 'FAKECOSHOPS2']], ['digits and hyphen without letters', '12-32', ['invalid', '12-32']], ['sender starting with a digit', '2GO', ['alpha', '2GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '123', ['shortcode', '123']], ['two digits too short', '33', ['invalid', '33']], ['six-digit short code', '123453', ['shortcode', '123453']], ['bare long number gains a plus', '425550133', ['longcode', '+425550133']], ['plus long number', '+425550133', ['longcode', '+425550133']], ['plus with too few digits', '+12345', ['invalid', '+12345']], ['plus with sixteen digits', '+1234567890323456', ['invalid', '+1234567890323456']], ['alphanumeric sender', ' FAKECO3 ', ['alpha', 'FAKECO3']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS3', ['invalid', 'FAKECOSHOPS3']], ['digits and hyphen without letters', '12-33', ['invalid', '12-33']], ['sender starting with a digit', '3GO', ['alpha', '3GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '124', ['shortcode', '124']], ['two digits too short', '44', ['invalid', '44']], ['six-digit short code', '123454', ['shortcode', '123454']], ['bare long number gains a plus', '425550144', ['longcode', '+425550144']], ['plus long number', '+425550144', ['longcode', '+425550144']], ['plus with too few digits', '+12445', ['invalid', '+12445']], ['plus with sixteen digits', '+1234567890423456', ['invalid', '+1234567890423456']], ['alphanumeric sender', ' FAKECO4 ', ['alpha', 'FAKECO4']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS4', ['invalid', 'FAKECOSHOPS4']], ['digits and hyphen without letters', '12-34', ['invalid', '12-34']], ['sender starting with a digit', '4GO', ['alpha', '4GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '125', ['shortcode', '125']], ['two digits too short', '55', ['invalid', '55']], ['six-digit short code', '123455', ['shortcode', '123455']], ['bare long number gains a plus', '425550155', ['longcode', '+425550155']], ['plus long number', '+425550155', ['longcode', '+425550155']], ['plus with too few digits', '+12545', ['invalid', '+12545']], ['plus with sixteen digits', '+1234567890523456', ['invalid', '+1234567890523456']], ['alphanumeric sender', ' FAKECO5 ', ['alpha', 'FAKECO5']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS5', ['invalid', 'FAKECOSHOPS5']], ['digits and hyphen without letters', '12-35', ['invalid', '12-35']], ['sender starting with a digit', '5GO', ['alpha', '5GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]]]
for label, arg, expected in fixtures[N - 1]:
    check(label, solve(arg), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
three-digit short code['shortcode', '121']['shortcode', '121']Passed
two digits too short['invalid', '11']['invalid', '11']Passed
six-digit short code['shortcode', '123451']['shortcode', '123451']Passed
bare long number gains a plus['longcode', '+425550111']['longcode', '+425550111']Passed
plus long number['longcode', '+425550111']['longcode', '+425550111']Passed
plus with too few digits['invalid', '+12145']['invalid', '+12145']Passed
plus with sixteen digits['invalid', '+1234567890123456']['invalid', '+1234567890123456']Passed
alphanumeric sender['alpha', 'FAKECO1']['alpha', 'FAKECO1']Passed
eleven-character sender['invalid', 'FAKECOSHOPS']['alpha', 'FAKECOSHOPS']Failed
twelve-character sender['invalid', 'FAKECOSHOPS1']['invalid', 'FAKECOSHOPS1']Passed
digits and hyphen without letters['invalid', '12-31']['invalid', '12-31']Passed
sender starting with a digit['alpha', '1GO']['alpha', '1GO']Passed
asterisk rejected['invalid', 'FAKE*CO']['invalid', 'FAKE*CO']Passed
space allowed['alpha', 'FAKE CO']['alpha', 'FAKE CO']Passed

SHA-256 / 611a06dc9b5c65f380ab73e8f028476019d84b3da838fae18432165530d8a7fc

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    s = x.strip()
    if s.startswith('+'):
        d = s[1:]
        if d.isdigit() and 8 <= len(d) <= 15:
            return ['longcode', s]
        return ['invalid', s]
    if s.isdigit():
        if 3 <= len(s) <= 6:
            return ['shortcode', s]
        if 8 <= len(s) <= 15:
            return ['longcode', '+' + s]
        return ['invalid', s]
    if 1 <= len(s) <= 11 and any(c.isalpha() for c in s) and all(c.isalnum() or c in ' -.' for c in s):
        return ['alpha', s]
    return ['invalid', s]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['three-digit short code', '121', ['shortcode', '121']], ['two digits too short', '11', ['invalid', '11']], ['six-digit short code', '123451', ['shortcode', '123451']], ['bare long number gains a plus', '425550111', ['longcode', '+425550111']], ['plus long number', '+425550111', ['longcode', '+425550111']], ['plus with too few digits', '+12145', ['invalid', '+12145']], ['plus with sixteen digits', '+1234567890123456', ['invalid', '+1234567890123456']], ['alphanumeric sender', ' FAKECO1 ', ['alpha', 'FAKECO1']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS1', ['invalid', 'FAKECOSHOPS1']], ['digits and hyphen without letters', '12-31', ['invalid', '12-31']], ['sender starting with a digit', '1GO', ['alpha', '1GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '122', ['shortcode', '122']], ['two digits too short', '22', ['invalid', '22']], ['six-digit short code', '123452', ['shortcode', '123452']], ['bare long number gains a plus', '425550122', ['longcode', '+425550122']], ['plus long number', '+425550122', ['longcode', '+425550122']], ['plus with too few digits', '+12245', ['invalid', '+12245']], ['plus with sixteen digits', '+1234567890223456', ['invalid', '+1234567890223456']], ['alphanumeric sender', ' FAKECO2 ', ['alpha', 'FAKECO2']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS2', ['invalid', 'FAKECOSHOPS2']], ['digits and hyphen without letters', '12-32', ['invalid', '12-32']], ['sender starting with a digit', '2GO', ['alpha', '2GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '123', ['shortcode', '123']], ['two digits too short', '33', ['invalid', '33']], ['six-digit short code', '123453', ['shortcode', '123453']], ['bare long number gains a plus', '425550133', ['longcode', '+425550133']], ['plus long number', '+425550133', ['longcode', '+425550133']], ['plus with too few digits', '+12345', ['invalid', '+12345']], ['plus with sixteen digits', '+1234567890323456', ['invalid', '+1234567890323456']], ['alphanumeric sender', ' FAKECO3 ', ['alpha', 'FAKECO3']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS3', ['invalid', 'FAKECOSHOPS3']], ['digits and hyphen without letters', '12-33', ['invalid', '12-33']], ['sender starting with a digit', '3GO', ['alpha', '3GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '124', ['shortcode', '124']], ['two digits too short', '44', ['invalid', '44']], ['six-digit short code', '123454', ['shortcode', '123454']], ['bare long number gains a plus', '425550144', ['longcode', '+425550144']], ['plus long number', '+425550144', ['longcode', '+425550144']], ['plus with too few digits', '+12445', ['invalid', '+12445']], ['plus with sixteen digits', '+1234567890423456', ['invalid', '+1234567890423456']], ['alphanumeric sender', ' FAKECO4 ', ['alpha', 'FAKECO4']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS4', ['invalid', 'FAKECOSHOPS4']], ['digits and hyphen without letters', '12-34', ['invalid', '12-34']], ['sender starting with a digit', '4GO', ['alpha', '4GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]], [['three-digit short code', '125', ['shortcode', '125']], ['two digits too short', '55', ['invalid', '55']], ['six-digit short code', '123455', ['shortcode', '123455']], ['bare long number gains a plus', '425550155', ['longcode', '+425550155']], ['plus long number', '+425550155', ['longcode', '+425550155']], ['plus with too few digits', '+12545', ['invalid', '+12545']], ['plus with sixteen digits', '+1234567890523456', ['invalid', '+1234567890523456']], ['alphanumeric sender', ' FAKECO5 ', ['alpha', 'FAKECO5']], ['eleven-character sender', 'FAKECOSHOPS', ['alpha', 'FAKECOSHOPS']], ['twelve-character sender', 'FAKECOSHOPS5', ['invalid', 'FAKECOSHOPS5']], ['digits and hyphen without letters', '12-35', ['invalid', '12-35']], ['sender starting with a digit', '5GO', ['alpha', '5GO']], ['asterisk rejected', 'FAKE*CO', ['invalid', 'FAKE*CO']], ['space allowed', 'FAKE CO', ['alpha', 'FAKE CO']]]]
for label, arg, expected in fixtures[N - 1]:
    check(label, solve(arg), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
three-digit short code['shortcode', '121']['shortcode', '121']Passed
two digits too short['invalid', '11']['invalid', '11']Passed
six-digit short code['shortcode', '123451']['shortcode', '123451']Passed
bare long number gains a plus['longcode', '+425550111']['longcode', '+425550111']Passed
plus long number['longcode', '+425550111']['longcode', '+425550111']Passed
plus with too few digits['invalid', '+12145']['invalid', '+12145']Passed
plus with sixteen digits['invalid', '+1234567890123456']['invalid', '+1234567890123456']Passed
alphanumeric sender['alpha', 'FAKECO1']['alpha', 'FAKECO1']Passed
eleven-character sender['alpha', 'FAKECOSHOPS']['alpha', 'FAKECOSHOPS']Passed
twelve-character sender['invalid', 'FAKECOSHOPS1']['invalid', 'FAKECOSHOPS1']Passed
digits and hyphen without letters['invalid', '12-31']['invalid', '12-31']Passed
sender starting with a digit['alpha', '1GO']['alpha', '1GO']Passed
asterisk rejected['invalid', 'FAKE*CO']['invalid', 'FAKE*CO']Passed
space allowed['alpha', 'FAKE CO']['alpha', 'FAKE CO']Passed

SHA-256 / fb44e76efa4a0ec345206f03b593b6faae0a2d67463db03410463907641e059c

Verification & scope

A deterministic toy contract over synthetic, obviously fictitious telephone numbers and toy country tables. The rules are stipulated for this model only and make no claim of conformance with any numbering plan or telecommunications standard. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:52:24.426169+00:00.

Case digest / 8afd5918abbfaacd3518c77a66c1408ca5a4362284bd95a5832d361704049226