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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: separator equivalence | None | 01:02:03:04 | Failed |
| regression variant: separator equivalence | None | 00:00:59:02 | Failed |
| partial repair probe: separator equivalence | 06:25:02:06 | 06:25:02:06 | Passed |
| partial repair variant: separator equivalence | 00:24:03:29 | 00:24:03:29 | Passed |
| boundary control | 00:00:01:00 | 00:00:01:00 | Passed |
| boundary control | 23:59:59:24 | 23:59:59:24 | Passed |
| normal control | 00:00:01:02 | 00:00:01:02 | Passed |
| normal control | 00:00:04:03 | 00:00:04:03 | Passed |
| normal control | 00:00:01:00 | 00:00:01:00 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: separator equivalence | 01:02:03:04 | 01:02:03:04 | Passed |
| regression variant: separator equivalence | 00:00:59:02 | 00:00:59:02 | Passed |
| partial repair probe: separator equivalence | None | 06:25:02:06 | Failed |
| partial repair variant: separator equivalence | None | 00:24:03:29 | Failed |
| boundary control | 00:00:01:00 | 00:00:01:00 | Passed |
| boundary control | 23:59:59:24 | 23:59:59:24 | Passed |
| normal control | 00:00:01:02 | 00:00:01:02 | Passed |
| normal control | 00:00:04:03 | 00:00:04:03 | Passed |
| normal control | 00:00:01:00 | 00:00:01:00 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: separator equivalence | 01:02:03:04 | 01:02:03:04 | Passed |
| regression variant: separator equivalence | 00:00:59:02 | 00:00:59:02 | Passed |
| partial repair probe: separator equivalence | 06:25:02:06 | 06:25:02:06 | Passed |
| partial repair variant: separator equivalence | 00:24:03:29 | 00:24:03:29 | Passed |
| boundary control | 00:00:01:00 | 00:00:01:00 | Passed |
| boundary control | 23:59:59:24 | 23:59:59:24 | Passed |
| normal control | 00:00:01:02 | 00:00:01:02 | Passed |
| normal control | 00:00:04:03 | 00:00:04:03 | Passed |
| normal control | 00:00:01:00 | 00:00:01:00 | Passed |
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