FA-78461 / Broadcast timecode arithmetic / Open access
Drop-frame label increment: minute carry · case 01
The label after 00:59:59;29 shows minute 60.
ROOT CAUSE
Minutes carry into the hour only above 60.
VERIFIED REPAIR
Carry into the hour when minutes reach 60.
Unsuccessful approach: Carrying at minute 59 skips the last minute of every hour.
Case contract
Given a valid drop-frame label at rate "29.97" (nominal 30, drop 2) or "59.94" (nominal 60, drop 4), return the next label: frames carry into seconds at the nominal rate, seconds into minutes, minutes into hours (wrapping at 24); on entering a new minute not divisible by 10 the first drop labels are skipped.
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
import re
N = 1
observations = []
def solve(tc, rate):
n=30 if rate=='29.97' else 60
drop=2 if n==30 else 4
h,m,s,f=map(int,re.split('[:;]',tc))
f+=1
if f==n:
f=0
s+=1
if s==60:
s=0
m+=1
if m>60:
m=0
h=(h+1)%24
if m%10!=0:
f=drop
return '%02d:%02d:%02d;%02d'%(h,m,s,f)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: minute carry', ['23:59:59;29', '29.97'], '00:00:00;00'), ('regression variant: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('partial repair probe: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('partial repair variant: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('normal control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('normal control', ['09:01:59;29', '29.97'], '09:02:00;02'), ('normal control', ['09:10:59;29', '29.97'], '09:11:00;02')], [('regression: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('regression variant: minute carry', ['09:59:59;59', '59.94'], '10:00:00;00'), ('partial repair probe: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('partial repair variant: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('boundary control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('normal control', ['01:01:01;02', '29.97'], '01:01:01;03'), ('normal control', ['23:09:59;59', '59.94'], '23:10:00;00'), ('normal control', ['09:19:59;58', '59.94'], '09:19:59;59')], [('regression: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('regression variant: minute carry', ['01:59:59;59', '59.94'], '02:00:00;00'), ('partial repair probe: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('partial repair variant: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('boundary control', ['00:00:59;59', '59.94'], '00:01:00;04'), ('boundary control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('normal control', ['23:09:59;29', '29.97'], '23:10:00;00'), ('normal control', ['09:19:00;04', '59.94'], '09:19:00;05'), ('normal control', ['09:01:01;00', '29.97'], '09:01:01;01')], [('regression: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('regression variant: minute carry', ['23:59:59;29', '29.97'], '00:00:00;00'), ('partial repair probe: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('partial repair variant: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('boundary control', ['00:00:59;59', '59.94'], '00:01:00;04'), ('normal control', ['01:29:58;58', '59.94'], '01:29:58;59'), ('normal control', ['23:00:00;00', '59.94'], '23:00:00;01'), ('normal control', ['00:00:01;58', '59.94'], '00:00:01;59')], [('regression: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('regression variant: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('partial repair probe: minute carry', ['09:59:59;59', '59.94'], '10:00:00;00'), ('partial repair variant: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('normal control', ['01:01:59;29', '29.97'], '01:02:00;02'), ('normal control', ['23:29:01;15', '29.97'], '23:29:01;16'), ('normal control', ['23:29:00;04', '59.94'], '23:29:00;05')]]
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: minute carry | 23:60:00;00 | 00:00:00;00 | Failed |
| regression variant: minute carry | 01:60:00;00 | 02:00:00;00 | Failed |
| partial repair probe: minute carry | 00:60:00;00 | 01:00:00;00 | Failed |
| partial repair variant: minute carry | 23:60:00;00 | 00:00:00;00 | Failed |
| boundary control | 00:01:00;02 | 00:01:00;02 | Passed |
| boundary control | 00:01:00;03 | 00:01:00;03 | Passed |
| normal control | 00:10:00;00 | 00:10:00;00 | Passed |
| normal control | 09:02:00;02 | 09:02:00;02 | Passed |
| normal control | 09:11:00;02 | 09:11:00;02 | Passed |
SHA-256 / 748c67847406ca90d93e6db2652a6322806d29caacb0be5e059b657c77972549
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import re
N = 1
observations = []
def solve(tc, rate):
n=30 if rate=='29.97' else 60
drop=2 if n==30 else 4
h,m,s,f=map(int,re.split('[:;]',tc))
f+=1
if f==n:
f=0
s+=1
if s==60:
s=0
m+=1
if m==59:
m=0
h=(h+1)%24
if m%10!=0:
f=drop
return '%02d:%02d:%02d;%02d'%(h,m,s,f)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: minute carry', ['23:59:59;29', '29.97'], '00:00:00;00'), ('regression variant: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('partial repair probe: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('partial repair variant: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('normal control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('normal control', ['09:01:59;29', '29.97'], '09:02:00;02'), ('normal control', ['09:10:59;29', '29.97'], '09:11:00;02')], [('regression: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('regression variant: minute carry', ['09:59:59;59', '59.94'], '10:00:00;00'), ('partial repair probe: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('partial repair variant: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('boundary control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('normal control', ['01:01:01;02', '29.97'], '01:01:01;03'), ('normal control', ['23:09:59;59', '59.94'], '23:10:00;00'), ('normal control', ['09:19:59;58', '59.94'], '09:19:59;59')], [('regression: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('regression variant: minute carry', ['01:59:59;59', '59.94'], '02:00:00;00'), ('partial repair probe: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('partial repair variant: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('boundary control', ['00:00:59;59', '59.94'], '00:01:00;04'), ('boundary control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('normal control', ['23:09:59;29', '29.97'], '23:10:00;00'), ('normal control', ['09:19:00;04', '59.94'], '09:19:00;05'), ('normal control', ['09:01:01;00', '29.97'], '09:01:01;01')], [('regression: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('regression variant: minute carry', ['23:59:59;29', '29.97'], '00:00:00;00'), ('partial repair probe: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('partial repair variant: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('boundary control', ['00:00:59;59', '59.94'], '00:01:00;04'), ('normal control', ['01:29:58;58', '59.94'], '01:29:58;59'), ('normal control', ['23:00:00;00', '59.94'], '23:00:00;01'), ('normal control', ['00:00:01;58', '59.94'], '00:00:01;59')], [('regression: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('regression variant: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('partial repair probe: minute carry', ['09:59:59;59', '59.94'], '10:00:00;00'), ('partial repair variant: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('normal control', ['01:01:59;29', '29.97'], '01:02:00;02'), ('normal control', ['23:29:01;15', '29.97'], '23:29:01;16'), ('normal control', ['23:29:00;04', '59.94'], '23:29:00;05')]]
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: minute carry | 23:60:00;00 | 00:00:00;00 | Failed |
| regression variant: minute carry | 01:60:00;00 | 02:00:00;00 | Failed |
| partial repair probe: minute carry | 00:60:00;00 | 01:00:00;00 | Failed |
| partial repair variant: minute carry | 23:60:00;00 | 00:00:00;00 | Failed |
| boundary control | 00:01:00;02 | 00:01:00;02 | Passed |
| boundary control | 00:01:00;03 | 00:01:00;03 | Passed |
| normal control | 00:10:00;00 | 00:10:00;00 | Passed |
| normal control | 09:02:00;02 | 09:02:00;02 | Passed |
| normal control | 09:11:00;02 | 09:11:00;02 | Passed |
SHA-256 / 2dbd9e6d543989927b9156b2a68c5f23140a3dbbc3599dd8f1caaea15ddf7aab
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import re
N = 1
observations = []
def solve(tc, rate):
n=30 if rate=='29.97' else 60
drop=2 if n==30 else 4
h,m,s,f=map(int,re.split('[:;]',tc))
f+=1
if f==n:
f=0
s+=1
if s==60:
s=0
m+=1
if m==60:
m=0
h=(h+1)%24
if m%10!=0:
f=drop
return '%02d:%02d:%02d;%02d'%(h,m,s,f)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: minute carry', ['23:59:59;29', '29.97'], '00:00:00;00'), ('regression variant: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('partial repair probe: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('partial repair variant: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('normal control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('normal control', ['09:01:59;29', '29.97'], '09:02:00;02'), ('normal control', ['09:10:59;29', '29.97'], '09:11:00;02')], [('regression: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('regression variant: minute carry', ['09:59:59;59', '59.94'], '10:00:00;00'), ('partial repair probe: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('partial repair variant: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('boundary control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('normal control', ['01:01:01;02', '29.97'], '01:01:01;03'), ('normal control', ['23:09:59;59', '59.94'], '23:10:00;00'), ('normal control', ['09:19:59;58', '59.94'], '09:19:59;59')], [('regression: minute carry', ['00:59:59;59', '59.94'], '01:00:00;00'), ('regression variant: minute carry', ['01:59:59;59', '59.94'], '02:00:00;00'), ('partial repair probe: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('partial repair variant: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('boundary control', ['00:00:59;59', '59.94'], '00:01:00;04'), ('boundary control', ['00:09:59;29', '29.97'], '00:10:00;00'), ('normal control', ['23:09:59;29', '29.97'], '23:10:00;00'), ('normal control', ['09:19:00;04', '59.94'], '09:19:00;05'), ('normal control', ['09:01:01;00', '29.97'], '09:01:01;01')], [('regression: minute carry', ['09:59:59;29', '29.97'], '10:00:00;00'), ('regression variant: minute carry', ['23:59:59;29', '29.97'], '00:00:00;00'), ('partial repair probe: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('partial repair variant: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('boundary control', ['00:00:59;59', '59.94'], '00:01:00;04'), ('normal control', ['01:29:58;58', '59.94'], '01:29:58;59'), ('normal control', ['23:00:00;00', '59.94'], '23:00:00;01'), ('normal control', ['00:00:01;58', '59.94'], '00:00:01;59')], [('regression: minute carry', ['00:59:59;29', '29.97'], '01:00:00;00'), ('regression variant: minute carry', ['23:59:59;59', '59.94'], '00:00:00;00'), ('partial repair probe: minute carry', ['09:59:59;59', '59.94'], '10:00:00;00'), ('partial repair variant: minute carry', ['01:59:59;29', '29.97'], '02:00:00;00'), ('boundary control', ['00:00:59;29', '29.97'], '00:01:00;02'), ('boundary control', ['00:01:00;02', '29.97'], '00:01:00;03'), ('normal control', ['01:01:59;29', '29.97'], '01:02:00;02'), ('normal control', ['23:29:01;15', '29.97'], '23:29:01;16'), ('normal control', ['23:29:00;04', '59.94'], '23:29:00;05')]]
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: minute carry | 00:00:00;00 | 00:00:00;00 | Passed |
| regression variant: minute carry | 02:00:00;00 | 02:00:00;00 | Passed |
| partial repair probe: minute carry | 01:00:00;00 | 01:00:00;00 | Passed |
| partial repair variant: minute carry | 00:00:00;00 | 00:00:00;00 | Passed |
| boundary control | 00:01:00;02 | 00:01:00;02 | Passed |
| boundary control | 00:01:00;03 | 00:01:00;03 | Passed |
| normal control | 00:10:00;00 | 00:10:00;00 | Passed |
| normal control | 09:02:00;02 | 09:02:00;02 | Passed |
| normal control | 09:11:00;02 | 09:11:00;02 | Passed |
SHA-256 / d1a7cc0902de6a37bea788cc7ba67bddb6fe71823b54e5213fbac7d12c930636
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:35.361181+00:00.
Case digest / 9acf42f8a365660f1db8a031b45b7d71d9b413689a9f22d2828c0c375f544c52