FAILURE MAP
← Case archive

FA-96621 / Phone number formatting / Open access

SMS sender identifier classifier: bare long numbers stay without a plus · case 01

"425550111" is returned without its leading plus.

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

ROOT CAUSE

The digits-only long code is returned as typed.

VERIFIED REPAIR

Prefix "+" to digits-only long codes.

Unsuccessful approach: Prefixing "+1" assumes a country that the digits already contain.

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) <= 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']Failed
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 / 1328f33ed2831d90a318a896f6ca073a567dbc5c7d57e5b93ac434d5596f5855

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', '+1' + 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', '+1425550111']['longcode', '+425550111']Failed
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 / 0d1be29c641f5c95652e94f7cf110b5d5b7e0f7e77327396e6f50c62c1a7fe82

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.424735+00:00.

Case digest / 44e3b1a98d447841fe8621236b2e0a6e188708d83376b9cf00be340742093c3f