FAILURE MAP
← Case archive

FA-78766 / Broadcast timecode arithmetic / Open access

Operator timecode entry normalization: separator equivalence · case 01

Entries typed with periods on the numeric keypad are rejected.

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

ROOT CAUSE

Only the semicolon is normalized to a colon.

VERIFIED REPAIR

Treat ";", "." and ":" alike.

Unsuccessful approach: Normalizing only periods rejects semicolon entry.

Case contract

Normalize typed timecode. Separators ":", ";" and "." are equivalent. With separators, up to four numeric fields fill from the right (frames last). Without separators, up to eight digits are right-aligned into HH MM SS FF pairs. Field overflow carries through the total frame count, which wraps at 24 hours. Invalid entry returns None.

Why this case matters

Timecode arithmetic errors misplace edits, commercial breaks and captions against the broadcast clock.

1 / The failure

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

N = 1
observations = []
def solve(s, fps):
    s=s.replace(';',':')
    if ':' in s:
        parts=s.split(':')
        if len(parts)>4 or not all(p.isdigit() for p in parts):
            return None
        vals=[0]*(4-len(parts))+[int(p) for p in parts]
    else:
        if not s.isdigit() or len(s)>8:
            return None
        d=s.zfill(8)
        vals=[int(d[i:i+2]) for i in range(0,8,2)]
    h,m,sec,f=vals
    n=((h*60+m)*60+sec)*fps+f
    n%=86400*fps
    return '%02d:%02d:%02d:%02d'%(n//(3600*fps),n//(60*fps)%60,n//fps%60,n%fps)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: separator equivalence', ['1.2.3.4', 25], '01:02:03:04'), ('regression variant: separator equivalence', ['59.2', 24], '00:00:59:02'), ('partial repair probe: separator equivalence', ['30;24;61;30', 24], '06:25:02:06'), ('partial repair variant: separator equivalence', ['24;2;59', 30], '00:24:03:29'), ('boundary control', ['100', 25], '00:00:01:00'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('normal control', ['1:2', 25], '00:00:01:02'), ('normal control', ['99', 24], '00:00:04:03'), ('normal control', ['100', 30], '00:00:01:00')], [('regression: separator equivalence', ['59.10', 24], '00:00:59:10'), ('regression variant: separator equivalence', ['23.1', 30], '00:00:23:01'), ('partial repair probe: separator equivalence', ['30;24;61;1', 24], '06:25:01:01'), ('partial repair variant: separator equivalence', ['1;1;59', 25], '00:01:03:09'), ('boundary control', ['1:2', 25], '00:00:01:02'), ('boundary control', ['100', 25], '00:00:01:00'), ('normal control', ['5959', 24], '00:01:01:11'), ('normal control', ['59:23', 24], '00:00:59:23'), ('normal control', ['', 25], None)], [('regression: separator equivalence', ['59.99', 24], '00:01:03:03'), ('regression variant: separator equivalence', ['59.99.23.24', 24], '12:39:24:00'), ('partial repair probe: separator equivalence', ['59;24;24', 30], '00:59:24:24'), ('partial repair variant: separator equivalence', ['61;1;10', 30], '01:01:01:10'), ('boundary control', ['99', 25], '00:00:03:24'), ('boundary control', ['1:2', 25], '00:00:01:02'), ('normal control', ['10000', 25], '00:01:00:00'), ('normal control', ['61:59:59:24:0', 25], None), ('normal control', ['1000', 24], '00:00:10:00')], [('regression: separator equivalence', ['99.24.0', 24], '01:39:24:00'), ('regression variant: separator equivalence', ['10.59', 25], '00:00:12:09'), ('partial repair probe: separator equivalence', ['10;2;24;2', 25], '10:02:24:02'), ('partial repair variant: separator equivalence', ['59;23', 30], '00:00:59:23'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('boundary control', ['99', 25], '00:00:03:24'), ('normal control', ['2:23:61:99', 25], '02:24:04:24'), ('normal control', ['1:30:10', 30], '00:01:30:10'), ('normal control', ['1;1;1;99;2', 30], None)], [('regression: separator equivalence', ['59.23.99', 30], '00:59:26:09'), ('regression variant: separator equivalence', ['0.1.10', 24], '00:00:01:10'), ('partial repair probe: separator equivalence', ['2;30;61;24', 30], '02:31:01:24'), ('partial repair variant: separator equivalence', ['61;1;99', 30], '01:01:04:09'), ('boundary control', ['100', 25], '00:00:01:00'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('normal control', ['123456789', 25], None), ('normal control', ['10:30', 30], '00:00:11:00'), ('normal control', ['123456', 30], '00:12:35:26')]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), 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
regression: separator equivalenceNone01:02:03:04Failed
regression variant: separator equivalenceNone00:00:59:02Failed
partial repair probe: separator equivalence06:25:02:0606:25:02:06Passed
partial repair variant: separator equivalence00:24:03:2900:24:03:29Passed
boundary control00:00:01:0000:00:01:00Passed
boundary control23:59:59:2423:59:59:24Passed
normal control00:00:01:0200:00:01:02Passed
normal control00:00:04:0300:00:04:03Passed
normal control00:00:01:0000:00:01:00Passed

SHA-256 / 27918398e6589c3600f465a69dddd9daa23ec124a9f14037a9682764feb98503

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(s, fps):
    s=s.replace('.',':')
    if ':' in s:
        parts=s.split(':')
        if len(parts)>4 or not all(p.isdigit() for p in parts):
            return None
        vals=[0]*(4-len(parts))+[int(p) for p in parts]
    else:
        if not s.isdigit() or len(s)>8:
            return None
        d=s.zfill(8)
        vals=[int(d[i:i+2]) for i in range(0,8,2)]
    h,m,sec,f=vals
    n=((h*60+m)*60+sec)*fps+f
    n%=86400*fps
    return '%02d:%02d:%02d:%02d'%(n//(3600*fps),n//(60*fps)%60,n//fps%60,n%fps)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: separator equivalence', ['1.2.3.4', 25], '01:02:03:04'), ('regression variant: separator equivalence', ['59.2', 24], '00:00:59:02'), ('partial repair probe: separator equivalence', ['30;24;61;30', 24], '06:25:02:06'), ('partial repair variant: separator equivalence', ['24;2;59', 30], '00:24:03:29'), ('boundary control', ['100', 25], '00:00:01:00'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('normal control', ['1:2', 25], '00:00:01:02'), ('normal control', ['99', 24], '00:00:04:03'), ('normal control', ['100', 30], '00:00:01:00')], [('regression: separator equivalence', ['59.10', 24], '00:00:59:10'), ('regression variant: separator equivalence', ['23.1', 30], '00:00:23:01'), ('partial repair probe: separator equivalence', ['30;24;61;1', 24], '06:25:01:01'), ('partial repair variant: separator equivalence', ['1;1;59', 25], '00:01:03:09'), ('boundary control', ['1:2', 25], '00:00:01:02'), ('boundary control', ['100', 25], '00:00:01:00'), ('normal control', ['5959', 24], '00:01:01:11'), ('normal control', ['59:23', 24], '00:00:59:23'), ('normal control', ['', 25], None)], [('regression: separator equivalence', ['59.99', 24], '00:01:03:03'), ('regression variant: separator equivalence', ['59.99.23.24', 24], '12:39:24:00'), ('partial repair probe: separator equivalence', ['59;24;24', 30], '00:59:24:24'), ('partial repair variant: separator equivalence', ['61;1;10', 30], '01:01:01:10'), ('boundary control', ['99', 25], '00:00:03:24'), ('boundary control', ['1:2', 25], '00:00:01:02'), ('normal control', ['10000', 25], '00:01:00:00'), ('normal control', ['61:59:59:24:0', 25], None), ('normal control', ['1000', 24], '00:00:10:00')], [('regression: separator equivalence', ['99.24.0', 24], '01:39:24:00'), ('regression variant: separator equivalence', ['10.59', 25], '00:00:12:09'), ('partial repair probe: separator equivalence', ['10;2;24;2', 25], '10:02:24:02'), ('partial repair variant: separator equivalence', ['59;23', 30], '00:00:59:23'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('boundary control', ['99', 25], '00:00:03:24'), ('normal control', ['2:23:61:99', 25], '02:24:04:24'), ('normal control', ['1:30:10', 30], '00:01:30:10'), ('normal control', ['1;1;1;99;2', 30], None)], [('regression: separator equivalence', ['59.23.99', 30], '00:59:26:09'), ('regression variant: separator equivalence', ['0.1.10', 24], '00:00:01:10'), ('partial repair probe: separator equivalence', ['2;30;61;24', 30], '02:31:01:24'), ('partial repair variant: separator equivalence', ['61;1;99', 30], '01:01:04:09'), ('boundary control', ['100', 25], '00:00:01:00'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('normal control', ['123456789', 25], None), ('normal control', ['10:30', 30], '00:00:11:00'), ('normal control', ['123456', 30], '00:12:35:26')]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), 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
regression: separator equivalence01:02:03:0401:02:03:04Passed
regression variant: separator equivalence00:00:59:0200:00:59:02Passed
partial repair probe: separator equivalenceNone06:25:02:06Failed
partial repair variant: separator equivalenceNone00:24:03:29Failed
boundary control00:00:01:0000:00:01:00Passed
boundary control23:59:59:2423:59:59:24Passed
normal control00:00:01:0200:00:01:02Passed
normal control00:00:04:0300:00:04:03Passed
normal control00:00:01:0000:00:01:00Passed

SHA-256 / e291c6b05ddfa68613893acc08bdd3452ed7c9bd443fe75c536adb45d71f476b

3 / The verified repair

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

N = 1
observations = []
def solve(s, fps):
    s=s.replace(';',':').replace('.',':')
    if ':' in s:
        parts=s.split(':')
        if len(parts)>4 or not all(p.isdigit() for p in parts):
            return None
        vals=[0]*(4-len(parts))+[int(p) for p in parts]
    else:
        if not s.isdigit() or len(s)>8:
            return None
        d=s.zfill(8)
        vals=[int(d[i:i+2]) for i in range(0,8,2)]
    h,m,sec,f=vals
    n=((h*60+m)*60+sec)*fps+f
    n%=86400*fps
    return '%02d:%02d:%02d:%02d'%(n//(3600*fps),n//(60*fps)%60,n//fps%60,n%fps)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: separator equivalence', ['1.2.3.4', 25], '01:02:03:04'), ('regression variant: separator equivalence', ['59.2', 24], '00:00:59:02'), ('partial repair probe: separator equivalence', ['30;24;61;30', 24], '06:25:02:06'), ('partial repair variant: separator equivalence', ['24;2;59', 30], '00:24:03:29'), ('boundary control', ['100', 25], '00:00:01:00'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('normal control', ['1:2', 25], '00:00:01:02'), ('normal control', ['99', 24], '00:00:04:03'), ('normal control', ['100', 30], '00:00:01:00')], [('regression: separator equivalence', ['59.10', 24], '00:00:59:10'), ('regression variant: separator equivalence', ['23.1', 30], '00:00:23:01'), ('partial repair probe: separator equivalence', ['30;24;61;1', 24], '06:25:01:01'), ('partial repair variant: separator equivalence', ['1;1;59', 25], '00:01:03:09'), ('boundary control', ['1:2', 25], '00:00:01:02'), ('boundary control', ['100', 25], '00:00:01:00'), ('normal control', ['5959', 24], '00:01:01:11'), ('normal control', ['59:23', 24], '00:00:59:23'), ('normal control', ['', 25], None)], [('regression: separator equivalence', ['59.99', 24], '00:01:03:03'), ('regression variant: separator equivalence', ['59.99.23.24', 24], '12:39:24:00'), ('partial repair probe: separator equivalence', ['59;24;24', 30], '00:59:24:24'), ('partial repair variant: separator equivalence', ['61;1;10', 30], '01:01:01:10'), ('boundary control', ['99', 25], '00:00:03:24'), ('boundary control', ['1:2', 25], '00:00:01:02'), ('normal control', ['10000', 25], '00:01:00:00'), ('normal control', ['61:59:59:24:0', 25], None), ('normal control', ['1000', 24], '00:00:10:00')], [('regression: separator equivalence', ['99.24.0', 24], '01:39:24:00'), ('regression variant: separator equivalence', ['10.59', 25], '00:00:12:09'), ('partial repair probe: separator equivalence', ['10;2;24;2', 25], '10:02:24:02'), ('partial repair variant: separator equivalence', ['59;23', 30], '00:00:59:23'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('boundary control', ['99', 25], '00:00:03:24'), ('normal control', ['2:23:61:99', 25], '02:24:04:24'), ('normal control', ['1:30:10', 30], '00:01:30:10'), ('normal control', ['1;1;1;99;2', 30], None)], [('regression: separator equivalence', ['59.23.99', 30], '00:59:26:09'), ('regression variant: separator equivalence', ['0.1.10', 24], '00:00:01:10'), ('partial repair probe: separator equivalence', ['2;30;61;24', 30], '02:31:01:24'), ('partial repair variant: separator equivalence', ['61;1;99', 30], '01:01:04:09'), ('boundary control', ['100', 25], '00:00:01:00'), ('boundary control', ['23595924', 25], '23:59:59:24'), ('normal control', ['123456789', 25], None), ('normal control', ['10:30', 30], '00:00:11:00'), ('normal control', ['123456', 30], '00:12:35:26')]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), 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
regression: separator equivalence01:02:03:0401:02:03:04Passed
regression variant: separator equivalence00:00:59:0200:00:59:02Passed
partial repair probe: separator equivalence06:25:02:0606:25:02:06Passed
partial repair variant: separator equivalence00:24:03:2900:24:03:29Passed
boundary control00:00:01:0000:00:01:00Passed
boundary control23:59:59:2423:59:59:24Passed
normal control00:00:01:0200:00:01:02Passed
normal control00:00:04:0300:00:04:03Passed
normal control00:00:01:0000:00:01:00Passed

SHA-256 / 548f06c577d137347bda47d09b2c61642fcda57d452542a81d0c49f35d6a7333

Verification & scope

A deterministic bounded teaching model with a stipulated toy contract; it does not claim conformance to SMPTE or any broadcast 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:49:38.563925+00:00.

Case digest / 7e667e651739adf3b4e3dac3260fa746e54926f3019d3cf7de932050c0020ca4