FA-95906 / Postal address normalization / Open access
Five-or-nine digit postal code: placeholder plus-four is kept · case 01
"12029-0000" is returned with its placeholder extension instead of "12029".
ROOT CAUSE
Every nine-digit code is rendered in the long form.
THE FAILURE
Every nine-digit code is rendered in the long form.
Unsuccessful approach: Suppressing any extension that ends in "000" also drops a real extension such as "2000".
Case contract
Input a string or an integer. Integers are zero-padded to 5 digits when <= 99999, else to 9. Strings are stripped; a 10-character string with "-" or a space at index 5 loses that separator. Valid results are exactly 5 or 9 ASCII digits; 9 digits render "DDDDD-DDDD" unless the last four are "0000", which renders the 5-digit form. Anything else returns None.
Why this case matters
Postal codes arrive from spreadsheets, forms and legacy files; losing leading zeros or accepting malformed codes misroutes mail and breaks deduplication.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
if isinstance(x, int):
s = str(x).zfill(5) if x <= 99999 else str(x).zfill(9)
else:
s = x.strip()
if len(s) == 10 and s[5] in '- ':
s = s[:5] + s[6:]
if len(s) not in (5, 9) or not s.isdigit():
return None
if len(s) == 9:
return s[:5] + '-' + s[5:]
return s[:5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['plain five-digit code', '12039', '12039'], ['hyphenated plus-four', '12039-4101', '12039-4101'], ['space-separated plus-four', '12039 4101', '12039-4101'], ['spreadsheet integer lost its leading zero', 1231, '01231'], ['eight-digit integer is a nine-digit code with a leading zero', 12345671, '01234-5671'], ['zero plus-four is dropped', '12039-0000', '12039'], ['plus-four ending in three zeros is kept', '12039-2000', '12039-2000'], ['seven digits rejected', '1203912', None], ['ten digits without separator rejected', '1203941017', None], ['slash separator rejected', '12039/4101', None], ['letter O is not zero', '1203O', None], ['surrounding whitespace trimmed', ' 12039\n', '12039']], [['plain five-digit code', '23049', '23049'], ['hyphenated plus-four', '23049-5102', '23049-5102'], ['space-separated plus-four', '23049 5102', '23049-5102'], ['spreadsheet integer lost its leading zero', 1232, '01232'], ['eight-digit integer is a nine-digit code with a leading zero', 12345672, '01234-5672'], ['zero plus-four is dropped', '23049-0000', '23049'], ['plus-four ending in three zeros is kept', '23049-3000', '23049-3000'], ['seven digits rejected', '2304912', None], ['ten digits without separator rejected', '2304951027', None], ['slash separator rejected', '23049/5102', None], ['letter O is not zero', '2304O', None], ['surrounding whitespace trimmed', ' 23049\n', '23049']], [['plain five-digit code', '34059', '34059'], ['hyphenated plus-four', '34059-6103', '34059-6103'], ['space-separated plus-four', '34059 6103', '34059-6103'], ['spreadsheet integer lost its leading zero', 1233, '01233'], ['eight-digit integer is a nine-digit code with a leading zero', 12345673, '01234-5673'], ['zero plus-four is dropped', '34059-0000', '34059'], ['plus-four ending in three zeros is kept', '34059-4000', '34059-4000'], ['seven digits rejected', '3405912', None], ['ten digits without separator rejected', '3405961037', None], ['slash separator rejected', '34059/6103', None], ['letter O is not zero', '3405O', None], ['surrounding whitespace trimmed', ' 34059\n', '34059']], [['plain five-digit code', '45069', '45069'], ['hyphenated plus-four', '45069-7104', '45069-7104'], ['space-separated plus-four', '45069 7104', '45069-7104'], ['spreadsheet integer lost its leading zero', 1234, '01234'], ['eight-digit integer is a nine-digit code with a leading zero', 12345674, '01234-5674'], ['zero plus-four is dropped', '45069-0000', '45069'], ['plus-four ending in three zeros is kept', '45069-5000', '45069-5000'], ['seven digits rejected', '4506912', None], ['ten digits without separator rejected', '4506971047', None], ['slash separator rejected', '45069/7104', None], ['letter O is not zero', '4506O', None], ['surrounding whitespace trimmed', ' 45069\n', '45069']], [['plain five-digit code', '56079', '56079'], ['hyphenated plus-four', '56079-8105', '56079-8105'], ['space-separated plus-four', '56079 8105', '56079-8105'], ['spreadsheet integer lost its leading zero', 1235, '01235'], ['eight-digit integer is a nine-digit code with a leading zero', 12345675, '01234-5675'], ['zero plus-four is dropped', '56079-0000', '56079'], ['plus-four ending in three zeros is kept', '56079-6000', '56079-6000'], ['seven digits rejected', '5607912', None], ['ten digits without separator rejected', '5607981057', None], ['slash separator rejected', '56079/8105', None], ['letter O is not zero', '5607O', None], ['surrounding whitespace trimmed', ' 56079\n', '56079']]]
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 |
|---|---|---|---|
| plain five-digit code | 12039 | 12039 | Passed |
| hyphenated plus-four | 12039-4101 | 12039-4101 | Passed |
| space-separated plus-four | 12039-4101 | 12039-4101 | Passed |
| spreadsheet integer lost its leading zero | 01231 | 01231 | Passed |
| eight-digit integer is a nine-digit code with a leading zero | 01234-5671 | 01234-5671 | Passed |
| zero plus-four is dropped | 12039-0000 | 12039 | Failed |
| plus-four ending in three zeros is kept | 12039-2000 | 12039-2000 | Passed |
| seven digits rejected | None | None | Passed |
| ten digits without separator rejected | None | None | Passed |
| slash separator rejected | None | None | Passed |
| letter O is not zero | None | None | Passed |
| surrounding whitespace trimmed | 12039 | 12039 | Passed |
SHA-256 / 8c753e191477e97b76d981e964b3ac8434fe1700b8d7a911e34ed01d21991563
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
if isinstance(x, int):
s = str(x).zfill(5) if x <= 99999 else str(x).zfill(9)
else:
s = x.strip()
if len(s) == 10 and s[5] in '- ':
s = s[:5] + s[6:]
if len(s) not in (5, 9) or not s.isdigit():
return None
if len(s) == 9 and not s.endswith('000'):
return s[:5] + '-' + s[5:]
return s[:5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['plain five-digit code', '12039', '12039'], ['hyphenated plus-four', '12039-4101', '12039-4101'], ['space-separated plus-four', '12039 4101', '12039-4101'], ['spreadsheet integer lost its leading zero', 1231, '01231'], ['eight-digit integer is a nine-digit code with a leading zero', 12345671, '01234-5671'], ['zero plus-four is dropped', '12039-0000', '12039'], ['plus-four ending in three zeros is kept', '12039-2000', '12039-2000'], ['seven digits rejected', '1203912', None], ['ten digits without separator rejected', '1203941017', None], ['slash separator rejected', '12039/4101', None], ['letter O is not zero', '1203O', None], ['surrounding whitespace trimmed', ' 12039\n', '12039']], [['plain five-digit code', '23049', '23049'], ['hyphenated plus-four', '23049-5102', '23049-5102'], ['space-separated plus-four', '23049 5102', '23049-5102'], ['spreadsheet integer lost its leading zero', 1232, '01232'], ['eight-digit integer is a nine-digit code with a leading zero', 12345672, '01234-5672'], ['zero plus-four is dropped', '23049-0000', '23049'], ['plus-four ending in three zeros is kept', '23049-3000', '23049-3000'], ['seven digits rejected', '2304912', None], ['ten digits without separator rejected', '2304951027', None], ['slash separator rejected', '23049/5102', None], ['letter O is not zero', '2304O', None], ['surrounding whitespace trimmed', ' 23049\n', '23049']], [['plain five-digit code', '34059', '34059'], ['hyphenated plus-four', '34059-6103', '34059-6103'], ['space-separated plus-four', '34059 6103', '34059-6103'], ['spreadsheet integer lost its leading zero', 1233, '01233'], ['eight-digit integer is a nine-digit code with a leading zero', 12345673, '01234-5673'], ['zero plus-four is dropped', '34059-0000', '34059'], ['plus-four ending in three zeros is kept', '34059-4000', '34059-4000'], ['seven digits rejected', '3405912', None], ['ten digits without separator rejected', '3405961037', None], ['slash separator rejected', '34059/6103', None], ['letter O is not zero', '3405O', None], ['surrounding whitespace trimmed', ' 34059\n', '34059']], [['plain five-digit code', '45069', '45069'], ['hyphenated plus-four', '45069-7104', '45069-7104'], ['space-separated plus-four', '45069 7104', '45069-7104'], ['spreadsheet integer lost its leading zero', 1234, '01234'], ['eight-digit integer is a nine-digit code with a leading zero', 12345674, '01234-5674'], ['zero plus-four is dropped', '45069-0000', '45069'], ['plus-four ending in three zeros is kept', '45069-5000', '45069-5000'], ['seven digits rejected', '4506912', None], ['ten digits without separator rejected', '4506971047', None], ['slash separator rejected', '45069/7104', None], ['letter O is not zero', '4506O', None], ['surrounding whitespace trimmed', ' 45069\n', '45069']], [['plain five-digit code', '56079', '56079'], ['hyphenated plus-four', '56079-8105', '56079-8105'], ['space-separated plus-four', '56079 8105', '56079-8105'], ['spreadsheet integer lost its leading zero', 1235, '01235'], ['eight-digit integer is a nine-digit code with a leading zero', 12345675, '01234-5675'], ['zero plus-four is dropped', '56079-0000', '56079'], ['plus-four ending in three zeros is kept', '56079-6000', '56079-6000'], ['seven digits rejected', '5607912', None], ['ten digits without separator rejected', '5607981057', None], ['slash separator rejected', '56079/8105', None], ['letter O is not zero', '5607O', None], ['surrounding whitespace trimmed', ' 56079\n', '56079']]]
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 |
|---|---|---|---|
| plain five-digit code | 12039 | 12039 | Passed |
| hyphenated plus-four | 12039-4101 | 12039-4101 | Passed |
| space-separated plus-four | 12039-4101 | 12039-4101 | Passed |
| spreadsheet integer lost its leading zero | 01231 | 01231 | Passed |
| eight-digit integer is a nine-digit code with a leading zero | 01234-5671 | 01234-5671 | Passed |
| zero plus-four is dropped | 12039 | 12039 | Passed |
| plus-four ending in three zeros is kept | 12039 | 12039-2000 | Failed |
| seven digits rejected | None | None | Passed |
| ten digits without separator rejected | None | None | Passed |
| slash separator rejected | None | None | Passed |
| letter O is not zero | None | None | Passed |
| surrounding whitespace trimmed | 12039 | 12039 | Passed |
SHA-256 / 1fa9f434ddcf289ea7c39b6cfb99cb2f894863338fe42602a1b50b5f81c613d0
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 12 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗Verification & scope
A deterministic toy contract over synthetic, obviously fictitious addresses. The rules are stipulated for this model only and make no claim of conformance with any postal authority 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:18.082227+00:00.
Case digest / 2cba04c7b4349085bcf2c08b4dc7fcb3deb3564140b4ef622713aa4976637c38