FAILURE MAP
← Case archive

FA-95946 / Postal address normalization / Open access

Outward-inward postcode formatter: forbidden letters checked in the wrong positions · case 01

"ZX3 9AV" passes because only the first inward letter is tested.

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

ROOT CAUSE

Only the first inward letter is checked against the forbidden set.

VERIFIED REPAIR

Check both inward letters, and only them, against C I K M O V.

Unsuccessful approach: Checking the whole code rejects valid outward codes that start with C.

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 inw[1] in 'CIKMOV':
        return None
    if not (out[0].isalpha() and any(c.isdigit() for c in out) 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 letterZX3 9ZKNoneFailed
inward must be digit-letter-letterNoneNonePassed
forbidden inward letterZX3 9AVNoneFailed
forbidden letters allowed in outwardCX3 9ZZCX3 9ZZPassed
eight characters rejectedNoneNonePassed
outward needs a digitNoneNonePassed

SHA-256 / b20d953f8234809fde52f30d20e2ec0484a356e3e1f49a59b5579193bbb729fc

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 s):
        return None
    if not (out[0].isalpha() and any(c.isdigit() for c in out) 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 outwardNoneCX3 9ZZFailed
eight characters rejectedNoneNonePassed
outward needs a digitNoneNonePassed

SHA-256 / 4b72bcdac216f253829b0fc9fa855df24d4175fdf467e3e20cac18bed30db7b3

3 / The verified repair

Exit 0
"""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 any(c.isdigit() for c in out) 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 digitNoneNonePassed

SHA-256 / 66c79c6087a7c927fb00f692d4ce60eee5d169120c6ac2f59fdb10c770a7b020

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

Case digest / 42d14276a96db98931e22709a0d9f2eaa1236111d69524234d5749c48ca17b43