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.
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 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 | ZXY 9ZZ | None | Failed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| standard seven-character code | None | ZX3 9ZZ | Failed |
| five-character code | Z3 9AB | Z3 9AB | Passed |
| four-character outward | None | ZX3A 1ZZ | Failed |
| double internal space | None | ZX3 9ZZ | Failed |
| lowercase input uppercased | None | ZX3 9ZZ | Failed |
| 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 / 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