FAILURE MAP
← Case archive

FA-77916 / Subtitle cue timing / Open access

Subtitle frame-rate retiming: scale direction · case 01

After a PAL speed-up conversion subtitles drift later and later behind the dialogue.

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

ROOT CAUSE

The scale factor is inverted to dst/src, stretching the timeline instead of compressing it.

VERIFIED REPAIR

Scale by src/dst.

Unsuccessful approach: Choosing whichever ratio exceeds one fixes speed-ups but still inverts slow-down conversions.

Case contract

Cue times authored against a src frame rate are rescaled for playback at dst by t*src/dst, rounded half up to integer ms. Rates are "N", "N/D", or the aliases "23.976"/"29.97" meaning (N+1)*1000/1001. The end is rounded independently; an end that does not exceed the start becomes start+1.

Why this case matters

Subtitle timing defects shift, hide or overlap captions that viewers depend on for comprehension and accessibility.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(cues, src, dst):
    def rate(r):
        if '/' in r:
            a,b=r.split('/')
            return Fraction(int(a),int(b))
        if '.' in r:
            return Fraction(int(float(r)+0.5)*1000,1001)
        return Fraction(int(r))
    k=rate(dst)/rate(src)
    out=[]
    for start,end in cues:
        rs=math.floor(start*k+Fraction(1,2))
        re_=math.floor(end*k+Fraction(1,2))
        if re_<=rs:
            re_=rs+1
        out.append([rs,re_])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: scale direction', [[[1000, 2000]], '25', '50'], [[500, 1000]]), ('regression variant: scale direction', [[[268354, 268356], [12345, 14346], [0, 42]], '60', '25'], [[644050, 644054], [29628, 34430], [0, 101]]), ('partial repair probe: scale direction', [[[7, 10], [1001, 4303], [12345, 12348], [0, 101]], '25', '29.97'], [[6, 8], [835, 3589], [10298, 10300], [0, 84]]), ('partial repair variant: scale direction', [[[7, 2849], [7, 10], [1, 1001], [7, 3995]], '15', '29.97'], [[4, 1426], [4, 5], [1, 501], [4, 1999]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[1, 1001]], '30000/1001', '29.97'], [[1, 1001]]), ('normal control', [[[999, 2714], [12345, 13345], [1, 2002]], '29.97', '30000/1001'], [[999, 2714], [12345, 13345], [1, 2002]]), ('normal control', [[[1001, 1003], [7, 4855], [12345, 13345]], '50', '50'], [[1001, 1003], [7, 4855], [12345, 13345]])], [('regression: scale direction', [[[1001, 3003]], '24000/1001', '24'], [[1000, 3000]]), ('regression variant: scale direction', [[[999, 3000], [3, 1003], [999, 2960]], '23.976', '60'], [[399, 1199], [1, 401], [399, 1183]]), ('partial repair probe: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair variant: scale direction', [[[1, 3], [1, 4]], '12', '30'], [[0, 1], [0, 2]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('normal control', [[[7, 9], [3, 6], [0, 3], [1, 4]], '24', '23.976'], [[7, 9], [3, 6], [0, 3], [1, 4]]), ('normal control', [[[1001, 1004], [1001, 2001]], '12', '12'], [[1001, 1004], [1001, 2001]]), ('normal control', [[[999, 1999], [3, 2004]], '29.97', '30000/1001'], [[999, 1999], [3, 2004]])], [('regression: scale direction', [[[7, 10], [1001, 4303], [12345, 12348], [0, 101]], '25', '29.97'], [[6, 8], [835, 3589], [10298, 10300], [0, 84]]), ('regression variant: scale direction', [[[1, 4], [7, 9], [12345, 14346], [1001, 1002]], '24000/1001', '12'], [[2, 8], [14, 18], [24665, 28663], [2000, 2002]]), ('partial repair probe: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair variant: scale direction', [[[1001, 2001]], '15', '30'], [[501, 1001]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[0, 1]], '30000/1001', '30000/1001'], [[0, 1]]), ('normal control', [[[7, 9], [3, 4], [0, 1]], '30', '29.97'], [[7, 9], [3, 4], [0, 1]]), ('normal control', [[[7, 10], [3, 5]], '29.97', '29.97'], [[7, 10], [3, 5]])], [('regression: scale direction', [[[540231, 541231], [0, 3]], '50', '29.97'], [[901285, 902954], [0, 5]]), ('regression variant: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair probe: scale direction', [[[583859, 583862], [0, 1000], [3, 6], [881562, 881564]], '25', '30'], [[486549, 486552], [0, 833], [3, 5], [734635, 734637]]), ('partial repair variant: scale direction', [[[1, 4]], '24000/1001', '50'], [[0, 2]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('normal control', [[[1, 2002], [3, 6]], '50', '50'], [[1, 2002], [3, 6]]), ('normal control', [[[1, 2002], [7, 1007], [468417, 472572], [3, 4259]], '12', '12'], [[1, 2002], [7, 1007], [468417, 472572], [3, 4259]]), ('normal control', [[[1, 4], [1, 4]], '50', '50'], [[1, 4], [1, 4]])], [('regression: scale direction', [[[269050, 271051]], '30000/1001', '23.976'], [[336313, 338814]]), ('regression variant: scale direction', [[[583859, 583862], [0, 1000], [3, 6], [881562, 881564]], '25', '30'], [[486549, 486552], [0, 833], [3, 5], [734635, 734637]]), ('partial repair probe: scale direction', [[[999, 4970]], '30', '60'], [[500, 2485]]), ('partial repair variant: scale direction', [[[1, 4995]], '25', '50'], [[1, 2498]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[0, 2]], '30000/1001', '29.97'], [[0, 2]]), ('normal control', [[[12345, 14346], [885325, 885327]], '24000/1001', '24000/1001'], [[12345, 14346], [885325, 885327]]), ('normal control', [[[1001, 3002]], '30000/1001', '30000/1001'], [[1001, 3002]])]]
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: scale direction[[2000, 4000]][[500, 1000]]Failed
regression variant: scale direction[[111814, 111815], [5144, 5978], [0, 18]][[644050, 644054], [29628, 34430], [0, 101]]Failed
partial repair probe: scale direction[[8, 12], [1200, 5158], [14799, 14803], [0, 121]][[6, 8], [835, 3589], [10298, 10300], [0, 84]]Failed
partial repair variant: scale direction[[14, 5692], [14, 20], [2, 2000], [14, 7982]][[4, 1426], [4, 5], [1, 501], [4, 1999]]Failed
boundary control[[5, 6]][[5, 6]]Passed
boundary control[[1, 2], [3, 4]][[1, 2], [3, 4]]Passed
normal control[[1, 1001]][[1, 1001]]Passed
normal control[[999, 2714], [12345, 13345], [1, 2002]][[999, 2714], [12345, 13345], [1, 2002]]Passed
normal control[[1001, 1003], [7, 4855], [12345, 13345]][[1001, 1003], [7, 4855], [12345, 13345]]Passed

SHA-256 / ea4ed75986eb0a7ea4c3c3b3a2c3d67b17917181913e1ab969f7e84429990587

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(cues, src, dst):
    def rate(r):
        if '/' in r:
            a,b=r.split('/')
            return Fraction(int(a),int(b))
        if '.' in r:
            return Fraction(int(float(r)+0.5)*1000,1001)
        return Fraction(int(r))
    k=rate(src)/rate(dst) if rate(src)>rate(dst) else rate(dst)/rate(src)
    out=[]
    for start,end in cues:
        rs=math.floor(start*k+Fraction(1,2))
        re_=math.floor(end*k+Fraction(1,2))
        if re_<=rs:
            re_=rs+1
        out.append([rs,re_])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: scale direction', [[[1000, 2000]], '25', '50'], [[500, 1000]]), ('regression variant: scale direction', [[[268354, 268356], [12345, 14346], [0, 42]], '60', '25'], [[644050, 644054], [29628, 34430], [0, 101]]), ('partial repair probe: scale direction', [[[7, 10], [1001, 4303], [12345, 12348], [0, 101]], '25', '29.97'], [[6, 8], [835, 3589], [10298, 10300], [0, 84]]), ('partial repair variant: scale direction', [[[7, 2849], [7, 10], [1, 1001], [7, 3995]], '15', '29.97'], [[4, 1426], [4, 5], [1, 501], [4, 1999]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[1, 1001]], '30000/1001', '29.97'], [[1, 1001]]), ('normal control', [[[999, 2714], [12345, 13345], [1, 2002]], '29.97', '30000/1001'], [[999, 2714], [12345, 13345], [1, 2002]]), ('normal control', [[[1001, 1003], [7, 4855], [12345, 13345]], '50', '50'], [[1001, 1003], [7, 4855], [12345, 13345]])], [('regression: scale direction', [[[1001, 3003]], '24000/1001', '24'], [[1000, 3000]]), ('regression variant: scale direction', [[[999, 3000], [3, 1003], [999, 2960]], '23.976', '60'], [[399, 1199], [1, 401], [399, 1183]]), ('partial repair probe: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair variant: scale direction', [[[1, 3], [1, 4]], '12', '30'], [[0, 1], [0, 2]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('normal control', [[[7, 9], [3, 6], [0, 3], [1, 4]], '24', '23.976'], [[7, 9], [3, 6], [0, 3], [1, 4]]), ('normal control', [[[1001, 1004], [1001, 2001]], '12', '12'], [[1001, 1004], [1001, 2001]]), ('normal control', [[[999, 1999], [3, 2004]], '29.97', '30000/1001'], [[999, 1999], [3, 2004]])], [('regression: scale direction', [[[7, 10], [1001, 4303], [12345, 12348], [0, 101]], '25', '29.97'], [[6, 8], [835, 3589], [10298, 10300], [0, 84]]), ('regression variant: scale direction', [[[1, 4], [7, 9], [12345, 14346], [1001, 1002]], '24000/1001', '12'], [[2, 8], [14, 18], [24665, 28663], [2000, 2002]]), ('partial repair probe: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair variant: scale direction', [[[1001, 2001]], '15', '30'], [[501, 1001]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[0, 1]], '30000/1001', '30000/1001'], [[0, 1]]), ('normal control', [[[7, 9], [3, 4], [0, 1]], '30', '29.97'], [[7, 9], [3, 4], [0, 1]]), ('normal control', [[[7, 10], [3, 5]], '29.97', '29.97'], [[7, 10], [3, 5]])], [('regression: scale direction', [[[540231, 541231], [0, 3]], '50', '29.97'], [[901285, 902954], [0, 5]]), ('regression variant: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair probe: scale direction', [[[583859, 583862], [0, 1000], [3, 6], [881562, 881564]], '25', '30'], [[486549, 486552], [0, 833], [3, 5], [734635, 734637]]), ('partial repair variant: scale direction', [[[1, 4]], '24000/1001', '50'], [[0, 2]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('normal control', [[[1, 2002], [3, 6]], '50', '50'], [[1, 2002], [3, 6]]), ('normal control', [[[1, 2002], [7, 1007], [468417, 472572], [3, 4259]], '12', '12'], [[1, 2002], [7, 1007], [468417, 472572], [3, 4259]]), ('normal control', [[[1, 4], [1, 4]], '50', '50'], [[1, 4], [1, 4]])], [('regression: scale direction', [[[269050, 271051]], '30000/1001', '23.976'], [[336313, 338814]]), ('regression variant: scale direction', [[[583859, 583862], [0, 1000], [3, 6], [881562, 881564]], '25', '30'], [[486549, 486552], [0, 833], [3, 5], [734635, 734637]]), ('partial repair probe: scale direction', [[[999, 4970]], '30', '60'], [[500, 2485]]), ('partial repair variant: scale direction', [[[1, 4995]], '25', '50'], [[1, 2498]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[0, 2]], '30000/1001', '29.97'], [[0, 2]]), ('normal control', [[[12345, 14346], [885325, 885327]], '24000/1001', '24000/1001'], [[12345, 14346], [885325, 885327]]), ('normal control', [[[1001, 3002]], '30000/1001', '30000/1001'], [[1001, 3002]])]]
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: scale direction[[2000, 4000]][[500, 1000]]Failed
regression variant: scale direction[[644050, 644054], [29628, 34430], [0, 101]][[644050, 644054], [29628, 34430], [0, 101]]Passed
partial repair probe: scale direction[[8, 12], [1200, 5158], [14799, 14803], [0, 121]][[6, 8], [835, 3589], [10298, 10300], [0, 84]]Failed
partial repair variant: scale direction[[14, 5692], [14, 20], [2, 2000], [14, 7982]][[4, 1426], [4, 5], [1, 501], [4, 1999]]Failed
boundary control[[5, 6]][[5, 6]]Passed
boundary control[[1, 2], [3, 4]][[1, 2], [3, 4]]Passed
normal control[[1, 1001]][[1, 1001]]Passed
normal control[[999, 2714], [12345, 13345], [1, 2002]][[999, 2714], [12345, 13345], [1, 2002]]Passed
normal control[[1001, 1003], [7, 4855], [12345, 13345]][[1001, 1003], [7, 4855], [12345, 13345]]Passed

SHA-256 / ebf332296b2f89060448f91d72126fbc33edef15bac451537a6967f0137d4e42

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(cues, src, dst):
    def rate(r):
        if '/' in r:
            a,b=r.split('/')
            return Fraction(int(a),int(b))
        if '.' in r:
            return Fraction(int(float(r)+0.5)*1000,1001)
        return Fraction(int(r))
    k=rate(src)/rate(dst)
    out=[]
    for start,end in cues:
        rs=math.floor(start*k+Fraction(1,2))
        re_=math.floor(end*k+Fraction(1,2))
        if re_<=rs:
            re_=rs+1
        out.append([rs,re_])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: scale direction', [[[1000, 2000]], '25', '50'], [[500, 1000]]), ('regression variant: scale direction', [[[268354, 268356], [12345, 14346], [0, 42]], '60', '25'], [[644050, 644054], [29628, 34430], [0, 101]]), ('partial repair probe: scale direction', [[[7, 10], [1001, 4303], [12345, 12348], [0, 101]], '25', '29.97'], [[6, 8], [835, 3589], [10298, 10300], [0, 84]]), ('partial repair variant: scale direction', [[[7, 2849], [7, 10], [1, 1001], [7, 3995]], '15', '29.97'], [[4, 1426], [4, 5], [1, 501], [4, 1999]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[1, 1001]], '30000/1001', '29.97'], [[1, 1001]]), ('normal control', [[[999, 2714], [12345, 13345], [1, 2002]], '29.97', '30000/1001'], [[999, 2714], [12345, 13345], [1, 2002]]), ('normal control', [[[1001, 1003], [7, 4855], [12345, 13345]], '50', '50'], [[1001, 1003], [7, 4855], [12345, 13345]])], [('regression: scale direction', [[[1001, 3003]], '24000/1001', '24'], [[1000, 3000]]), ('regression variant: scale direction', [[[999, 3000], [3, 1003], [999, 2960]], '23.976', '60'], [[399, 1199], [1, 401], [399, 1183]]), ('partial repair probe: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair variant: scale direction', [[[1, 3], [1, 4]], '12', '30'], [[0, 1], [0, 2]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('normal control', [[[7, 9], [3, 6], [0, 3], [1, 4]], '24', '23.976'], [[7, 9], [3, 6], [0, 3], [1, 4]]), ('normal control', [[[1001, 1004], [1001, 2001]], '12', '12'], [[1001, 1004], [1001, 2001]]), ('normal control', [[[999, 1999], [3, 2004]], '29.97', '30000/1001'], [[999, 1999], [3, 2004]])], [('regression: scale direction', [[[7, 10], [1001, 4303], [12345, 12348], [0, 101]], '25', '29.97'], [[6, 8], [835, 3589], [10298, 10300], [0, 84]]), ('regression variant: scale direction', [[[1, 4], [7, 9], [12345, 14346], [1001, 1002]], '24000/1001', '12'], [[2, 8], [14, 18], [24665, 28663], [2000, 2002]]), ('partial repair probe: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair variant: scale direction', [[[1001, 2001]], '15', '30'], [[501, 1001]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[0, 1]], '30000/1001', '30000/1001'], [[0, 1]]), ('normal control', [[[7, 9], [3, 4], [0, 1]], '30', '29.97'], [[7, 9], [3, 4], [0, 1]]), ('normal control', [[[7, 10], [3, 5]], '29.97', '29.97'], [[7, 10], [3, 5]])], [('regression: scale direction', [[[540231, 541231], [0, 3]], '50', '29.97'], [[901285, 902954], [0, 5]]), ('regression variant: scale direction', [[[3, 6]], '30', '48'], [[2, 4]]), ('partial repair probe: scale direction', [[[583859, 583862], [0, 1000], [3, 6], [881562, 881564]], '25', '30'], [[486549, 486552], [0, 833], [3, 5], [734635, 734637]]), ('partial repair variant: scale direction', [[[1, 4]], '24000/1001', '50'], [[0, 2]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('normal control', [[[1, 2002], [3, 6]], '50', '50'], [[1, 2002], [3, 6]]), ('normal control', [[[1, 2002], [7, 1007], [468417, 472572], [3, 4259]], '12', '12'], [[1, 2002], [7, 1007], [468417, 472572], [3, 4259]]), ('normal control', [[[1, 4], [1, 4]], '50', '50'], [[1, 4], [1, 4]])], [('regression: scale direction', [[[269050, 271051]], '30000/1001', '23.976'], [[336313, 338814]]), ('regression variant: scale direction', [[[583859, 583862], [0, 1000], [3, 6], [881562, 881564]], '25', '30'], [[486549, 486552], [0, 833], [3, 5], [734635, 734637]]), ('partial repair probe: scale direction', [[[999, 4970]], '30', '60'], [[500, 2485]]), ('partial repair variant: scale direction', [[[1, 4995]], '25', '50'], [[1, 2498]]), ('boundary control', [[[5, 6]], '24', '25'], [[5, 6]]), ('boundary control', [[[1, 2], [3, 4]], '23.976', '25'], [[1, 2], [3, 4]]), ('normal control', [[[0, 2]], '30000/1001', '29.97'], [[0, 2]]), ('normal control', [[[12345, 14346], [885325, 885327]], '24000/1001', '24000/1001'], [[12345, 14346], [885325, 885327]]), ('normal control', [[[1001, 3002]], '30000/1001', '30000/1001'], [[1001, 3002]])]]
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: scale direction[[500, 1000]][[500, 1000]]Passed
regression variant: scale direction[[644050, 644054], [29628, 34430], [0, 101]][[644050, 644054], [29628, 34430], [0, 101]]Passed
partial repair probe: scale direction[[6, 8], [835, 3589], [10298, 10300], [0, 84]][[6, 8], [835, 3589], [10298, 10300], [0, 84]]Passed
partial repair variant: scale direction[[4, 1426], [4, 5], [1, 501], [4, 1999]][[4, 1426], [4, 5], [1, 501], [4, 1999]]Passed
boundary control[[5, 6]][[5, 6]]Passed
boundary control[[1, 2], [3, 4]][[1, 2], [3, 4]]Passed
normal control[[1, 1001]][[1, 1001]]Passed
normal control[[999, 2714], [12345, 13345], [1, 2002]][[999, 2714], [12345, 13345], [1, 2002]]Passed
normal control[[1001, 1003], [7, 4855], [12345, 13345]][[1001, 1003], [7, 4855], [12345, 13345]]Passed

SHA-256 / 3cbabb5d6edd767cbdb7ec31092c585b684f75f825e2a1aff15a3323c43e2ca6

Verification & scope

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

Case digest / dad84e3f1977270c6e5593fc3cbfb74bc50b61a00866d0c1d5052859c47e04c5