FA-96641 / Phone number formatting / Open access
SMS sender identifier classifier: short plus numbers are long codes · case 01
"+12145" is accepted as a long code.
ROOT CAUSE
The plus branch has no lower length bound.
VERIFIED REPAIR
Require 8..15 digits after the plus.
Unsuccessful approach: Dropping the upper bound instead accepts sixteen digits.
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 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 | ['longcode', '+12145'] | ['invalid', '+12145'] | Failed |
| 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 / 8a2542a4bdd3c918fa1b24cff031dca2af2a47d2feda87e67e2d23c258108c11
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):
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 | ['longcode', '+1234567890123456'] | ['invalid', '+1234567890123456'] | Failed |
| 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 / dcd2874777fe6da95b6faefd47b81cb6d6fee36e46106736ab1f9ec0dca977f9
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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.547359+00:00.
Case digest / a7576a91e6f52b1dae7f65ce95eb3e309def81481be7d4a905dcaf776fe6baa3