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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| standard seven-character code | ZX3 9ZZ | ZX3 9ZZ | Passed |
| five-character code | Z3 9AB | Z3 9AB | Passed |
| four-character outward | ZX3A 1ZZ | ZX3A 1ZZ | Passed |
| double internal space | ZX3 9ZZ | ZX3 9ZZ | Passed |
| lowercase input uppercased | ZX3 9ZZ | ZX3 9ZZ | Passed |
| lowercase forbidden inward letter | ZX3 9ZK | None | Failed |
| inward must be digit-letter-letter | None | None | Passed |
| forbidden inward letter | ZX3 9AV | None | Failed |
| forbidden letters allowed in outward | CX3 9ZZ | CX3 9ZZ | Passed |
| eight characters rejected | None | None | Passed |
| outward needs a digit | None | None | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| standard seven-character code | ZX3 9ZZ | ZX3 9ZZ | Passed |
| five-character code | Z3 9AB | Z3 9AB | Passed |
| four-character outward | ZX3A 1ZZ | ZX3A 1ZZ | Passed |
| double internal space | ZX3 9ZZ | ZX3 9ZZ | Passed |
| lowercase input uppercased | ZX3 9ZZ | ZX3 9ZZ | Passed |
| lowercase forbidden inward letter | None | None | Passed |
| inward must be digit-letter-letter | None | None | Passed |
| forbidden inward letter | None | None | Passed |
| forbidden letters allowed in outward | None | CX3 9ZZ | Failed |
| eight characters rejected | None | None | Passed |
| outward needs a digit | None | None | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| standard seven-character code | ZX3 9ZZ | ZX3 9ZZ | Passed |
| five-character code | Z3 9AB | Z3 9AB | Passed |
| four-character outward | ZX3A 1ZZ | ZX3A 1ZZ | Passed |
| double internal space | ZX3 9ZZ | ZX3 9ZZ | Passed |
| lowercase input uppercased | ZX3 9ZZ | ZX3 9ZZ | Passed |
| lowercase forbidden inward letter | None | None | Passed |
| inward must be digit-letter-letter | None | None | Passed |
| forbidden inward letter | None | None | Passed |
| forbidden letters allowed in outward | CX3 9ZZ | CX3 9ZZ | Passed |
| eight characters rejected | None | None | Passed |
| outward needs a digit | None | None | Passed |
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