FAILURE MAP
← Case archive

FA-95956 / Postal address normalization / Open access

Outward-inward postcode formatter: letter-only outward codes are accepted · case 01

"ZXY 9ZZ" is formatted as valid.

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

ROOT CAUSE

The outward code is not required to contain a digit.

THE FAILURE

The outward code is not required to contain a digit.

Unsuccessful approach: Requiring the digit in the second position rejects outward codes like "ZX3".

Case contract

Remove all whitespace and uppercase. Length must be 5..7. The inward code is the last three characters: digit, letter, letter, where neither letter may be one of C I K M O V. The outward code is the rest: alphanumeric, starting with a letter and containing at least one digit. Return "OUTWARD INWARD" or None.

Why this case matters

Codes whose outward part varies in length must be split from the right; mis-splitting sends deliveries to the wrong sorting district.

1 / The failure

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

N = 1
observations = []
def solve(x):
    s = ''.join(x.split()).upper()
    if not 5 <= len(s) <= 7:
        return None
    out, inw = s[:-3], s[-3:]
    if not (inw[0].isdigit() and inw[1].isalpha() and inw[2].isalpha()):
        return None
    if any(c in 'CIKMOV' for c in inw[1:]):
        return None
    if not (out[0].isalpha() and out.isalnum()):
        return None
    return out + ' ' + inw
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['standard seven-character code', 'ZX3 9ZZ', 'ZX3 9ZZ'], ['five-character code', 'Z39AB', 'Z3 9AB'], ['four-character outward', 'ZX3A1ZZ', 'ZX3A 1ZZ'], ['double internal space', 'ZX3  9ZZ', 'ZX3 9ZZ'], ['lowercase input uppercased', 'zx3 9zz', 'ZX3 9ZZ'], ['lowercase forbidden inward letter', 'zx3 9zk', None], ['inward must be digit-letter-letter', 'ZX3 99Z', None], ['forbidden inward letter', 'ZX3 9AV', None], ['forbidden letters allowed in outward', 'CX3 9ZZ', 'CX3 9ZZ'], ['eight characters rejected', 'ZX3AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX4 9ZZ', 'ZX4 9ZZ'], ['five-character code', 'Z49AB', 'Z4 9AB'], ['four-character outward', 'ZX4A2ZZ', 'ZX4A 2ZZ'], ['double internal space', 'ZX4  9ZZ', 'ZX4 9ZZ'], ['lowercase input uppercased', 'zx4 9zz', 'ZX4 9ZZ'], ['lowercase forbidden inward letter', 'zx4 9zk', None], ['inward must be digit-letter-letter', 'ZX4 99Z', None], ['forbidden inward letter', 'ZX4 9AV', None], ['forbidden letters allowed in outward', 'CX4 9ZZ', 'CX4 9ZZ'], ['eight characters rejected', 'ZX4AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX5 9ZZ', 'ZX5 9ZZ'], ['five-character code', 'Z59AB', 'Z5 9AB'], ['four-character outward', 'ZX5A3ZZ', 'ZX5A 3ZZ'], ['double internal space', 'ZX5  9ZZ', 'ZX5 9ZZ'], ['lowercase input uppercased', 'zx5 9zz', 'ZX5 9ZZ'], ['lowercase forbidden inward letter', 'zx5 9zk', None], ['inward must be digit-letter-letter', 'ZX5 99Z', None], ['forbidden inward letter', 'ZX5 9AV', None], ['forbidden letters allowed in outward', 'CX5 9ZZ', 'CX5 9ZZ'], ['eight characters rejected', 'ZX5AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX6 9ZZ', 'ZX6 9ZZ'], ['five-character code', 'Z69AB', 'Z6 9AB'], ['four-character outward', 'ZX6A4ZZ', 'ZX6A 4ZZ'], ['double internal space', 'ZX6  9ZZ', 'ZX6 9ZZ'], ['lowercase input uppercased', 'zx6 9zz', 'ZX6 9ZZ'], ['lowercase forbidden inward letter', 'zx6 9zk', None], ['inward must be digit-letter-letter', 'ZX6 99Z', None], ['forbidden inward letter', 'ZX6 9AV', None], ['forbidden letters allowed in outward', 'CX6 9ZZ', 'CX6 9ZZ'], ['eight characters rejected', 'ZX6AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX7 9ZZ', 'ZX7 9ZZ'], ['five-character code', 'Z79AB', 'Z7 9AB'], ['four-character outward', 'ZX7A5ZZ', 'ZX7A 5ZZ'], ['double internal space', 'ZX7  9ZZ', 'ZX7 9ZZ'], ['lowercase input uppercased', 'zx7 9zz', 'ZX7 9ZZ'], ['lowercase forbidden inward letter', 'zx7 9zk', None], ['inward must be digit-letter-letter', 'ZX7 99Z', None], ['forbidden inward letter', 'ZX7 9AV', None], ['forbidden letters allowed in outward', 'CX7 9ZZ', 'CX7 9ZZ'], ['eight characters rejected', 'ZX7AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]]]
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
standard seven-character codeZX3 9ZZZX3 9ZZPassed
five-character codeZ3 9ABZ3 9ABPassed
four-character outwardZX3A 1ZZZX3A 1ZZPassed
double internal spaceZX3 9ZZZX3 9ZZPassed
lowercase input uppercasedZX3 9ZZZX3 9ZZPassed
lowercase forbidden inward letterNoneNonePassed
inward must be digit-letter-letterNoneNonePassed
forbidden inward letterNoneNonePassed
forbidden letters allowed in outwardCX3 9ZZCX3 9ZZPassed
eight characters rejectedNoneNonePassed
outward needs a digitZXY 9ZZNoneFailed

SHA-256 / 283ed260709e5861e818a61b54147201dd8687b9d66c9b7aa21c8f12fc4236e5

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    s = ''.join(x.split()).upper()
    if not 5 <= len(s) <= 7:
        return None
    out, inw = s[:-3], s[-3:]
    if not (inw[0].isdigit() and inw[1].isalpha() and inw[2].isalpha()):
        return None
    if any(c in 'CIKMOV' for c in inw[1:]):
        return None
    if not (out[0].isalpha() and out[1].isdigit() and out.isalnum()):
        return None
    return out + ' ' + inw
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['standard seven-character code', 'ZX3 9ZZ', 'ZX3 9ZZ'], ['five-character code', 'Z39AB', 'Z3 9AB'], ['four-character outward', 'ZX3A1ZZ', 'ZX3A 1ZZ'], ['double internal space', 'ZX3  9ZZ', 'ZX3 9ZZ'], ['lowercase input uppercased', 'zx3 9zz', 'ZX3 9ZZ'], ['lowercase forbidden inward letter', 'zx3 9zk', None], ['inward must be digit-letter-letter', 'ZX3 99Z', None], ['forbidden inward letter', 'ZX3 9AV', None], ['forbidden letters allowed in outward', 'CX3 9ZZ', 'CX3 9ZZ'], ['eight characters rejected', 'ZX3AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX4 9ZZ', 'ZX4 9ZZ'], ['five-character code', 'Z49AB', 'Z4 9AB'], ['four-character outward', 'ZX4A2ZZ', 'ZX4A 2ZZ'], ['double internal space', 'ZX4  9ZZ', 'ZX4 9ZZ'], ['lowercase input uppercased', 'zx4 9zz', 'ZX4 9ZZ'], ['lowercase forbidden inward letter', 'zx4 9zk', None], ['inward must be digit-letter-letter', 'ZX4 99Z', None], ['forbidden inward letter', 'ZX4 9AV', None], ['forbidden letters allowed in outward', 'CX4 9ZZ', 'CX4 9ZZ'], ['eight characters rejected', 'ZX4AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX5 9ZZ', 'ZX5 9ZZ'], ['five-character code', 'Z59AB', 'Z5 9AB'], ['four-character outward', 'ZX5A3ZZ', 'ZX5A 3ZZ'], ['double internal space', 'ZX5  9ZZ', 'ZX5 9ZZ'], ['lowercase input uppercased', 'zx5 9zz', 'ZX5 9ZZ'], ['lowercase forbidden inward letter', 'zx5 9zk', None], ['inward must be digit-letter-letter', 'ZX5 99Z', None], ['forbidden inward letter', 'ZX5 9AV', None], ['forbidden letters allowed in outward', 'CX5 9ZZ', 'CX5 9ZZ'], ['eight characters rejected', 'ZX5AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX6 9ZZ', 'ZX6 9ZZ'], ['five-character code', 'Z69AB', 'Z6 9AB'], ['four-character outward', 'ZX6A4ZZ', 'ZX6A 4ZZ'], ['double internal space', 'ZX6  9ZZ', 'ZX6 9ZZ'], ['lowercase input uppercased', 'zx6 9zz', 'ZX6 9ZZ'], ['lowercase forbidden inward letter', 'zx6 9zk', None], ['inward must be digit-letter-letter', 'ZX6 99Z', None], ['forbidden inward letter', 'ZX6 9AV', None], ['forbidden letters allowed in outward', 'CX6 9ZZ', 'CX6 9ZZ'], ['eight characters rejected', 'ZX6AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]], [['standard seven-character code', 'ZX7 9ZZ', 'ZX7 9ZZ'], ['five-character code', 'Z79AB', 'Z7 9AB'], ['four-character outward', 'ZX7A5ZZ', 'ZX7A 5ZZ'], ['double internal space', 'ZX7  9ZZ', 'ZX7 9ZZ'], ['lowercase input uppercased', 'zx7 9zz', 'ZX7 9ZZ'], ['lowercase forbidden inward letter', 'zx7 9zk', None], ['inward must be digit-letter-letter', 'ZX7 99Z', None], ['forbidden inward letter', 'ZX7 9AV', None], ['forbidden letters allowed in outward', 'CX7 9ZZ', 'CX7 9ZZ'], ['eight characters rejected', 'ZX7AB9ZZ', None], ['outward needs a digit', 'ZXY 9ZZ', None]]]
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
standard seven-character codeNoneZX3 9ZZFailed
five-character codeZ3 9ABZ3 9ABPassed
four-character outwardNoneZX3A 1ZZFailed
double internal spaceNoneZX3 9ZZFailed
lowercase input uppercasedNoneZX3 9ZZFailed
lowercase forbidden inward letterNoneNonePassed
inward must be digit-letter-letterNoneNonePassed
forbidden inward letterNoneNonePassed
forbidden letters allowed in outwardNoneCX3 9ZZFailed
eight characters rejectedNoneNonePassed
outward needs a digitNoneNonePassed

SHA-256 / 328d4aa1031d317e695b6edf1279f828c1fcc9de73e5b02255fdabdbc7017e28

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 11 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.371152+00:00.

Case digest / 2e7ac8801afe00e0084a409a1a312a0be034aaff4f324d9b76e96319695e1e28