FA-79891 / Typography line breaking / Open access
Total-fit paragraph demerits: interword gap count · case 01
Every line measures one space too wide and breaks too early.
ROOT CAUSE
Natural width counts one space per word instead of one per gap.
VERIFIED REPAIR
Add space only for the j-i-1 interior gaps.
Unsuccessful approach: Reserving a trailing space unit on non-final lines still narrows every line.
Case contract
Input [word widths, [space, stretch, shrink] per gap, line width, line penalty]. A line i..j has gaps=j-i-1. The last line has zero badness when not overfull. Other lines use ratio shortfall/(stretch*gaps) or /(shrink*gaps); zero stretch with slack or compression past shrink is infeasible; badness=min(10000, floor(100|r|^3+1/2)) and must be <=1000. Fitness 0 tight (r<-1/2), 1 decent (r<=1/2), 2 loose (r<=1), 3 very loose; last line decent. Demerits (lp+b)^2 plus 3000 when adjacent fitness classes differ by more than 1, starting from decent. Return [min total demerits, break list] (ties: first found) or ["infeasible"].
Why this case matters
Line breaking decides where paragraphs wrap on screen and in print; a wrong decision point shifts every following line.
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(x):
words, glue, width, lp = x
sp, st, sh = glue
n = len(words)
def rate(i, j):
gaps = j - i - 1
nat = sum(words[i:j]) + sp * (j - i)
short = width - nat
if j == n and short >= 0:
return 0, 1
if short > 0:
if st * gaps == 0:
return None
r = Fraction(short, st * gaps)
elif short < 0:
if -short > sh * gaps:
return None
r = Fraction(short, sh * gaps)
else:
r = Fraction(0)
b = min(10000, math.floor(100 * abs(r) ** 3 + Fraction(1, 2)))
if b > 1000:
return None
fit = 0 if r < Fraction(-1, 2) else 1 if r <= Fraction(1, 2) else 2 if r <= 1 else 3
return b, fit
best = {(0, 1): (0, [])}
for j in range(1, n + 1):
for i in range(j):
rated = rate(i, j)
if rated is None:
continue
b, fit = rated
for (pos, pfit), (dem, brk) in sorted(best.items()):
if pos != i:
continue
d = dem + (lp + b) ** 2
if abs(fit - pfit) > 1:
d += 3000
key = (j, fit)
if key not in best or d < best[key][0]:
best[key] = (d, brk + [j])
finals = [v for (pos, f), v in best.items() if pos == n]
if not finals:
return ['infeasible']
d, brk = min(finals)
return [d, brk]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('regression: interword gap count', [[4, 1, 7, 4, 5, 5, 4], [3, 3, 1], 23, 50], [8900, [4, 7]]), ('regression: interword gap count', [[2, 1, 3, 5, 5], [3, 1, 0], 20, 50], [5000, [4, 5]]), ('regression: interword gap count', [[1, 3, 1, 2, 2], [3, 2, 1], 10, 10], [629, [3, 5]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[7, 6, 5, 6, 3, 1, 3], [1, 3, 2], 9, 10], ['infeasible']), ('control layout', [[7, 7, 3, 4, 5, 3, 6], [2, 1, 1], 9, 10], ['infeasible'])], [('regression: interword gap count', [[1, 7, 5, 5, 2], [2, 2, 0], 17, 10], [200, [3, 5]]), ('regression: interword gap count', [[4, 3, 1, 4, 3, 5], [2, 1, 2], 24, 10], [244, [5, 6]]), ('regression: interword gap count', [[2, 4, 1, 6, 1, 2, 3, 1], [2, 1, 0], 10, 50], [753000, [2, 4, 7, 8]]), ('regression: interword gap count', [[2, 5, 3, 6, 5], [2, 1, 1], 12, 50], [45000, [3, 5]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[6, 5, 3, 7, 5, 2], [3, 3, 0], 11, 10], ['infeasible']), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]])], [('regression: interword gap count', [[6, 5, 7, 7, 4, 7], [3, 1, 1], 23, 50], [7938, [3, 6]]), ('regression: interword gap count', [[2, 5, 7, 6, 7, 6, 6], [1, 3, 0], 15, 10], ['infeasible']), ('regression: interword gap count', [[3, 5, 7, 2, 2, 1], [2, 3, 1], 11, 1], [27, [2, 4, 6]]), ('regression: interword gap count', [[2, 5, 4, 7, 4, 1, 3], [1, 2, 1], 18, 10], [12200, [4, 7]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('control layout', [[5, 4, 4], [2, 1, 2], 20, 50], [2500, [3]]), ('control layout', [[2, 7, 6, 5, 5], [3, 3, 1], 12, 50], ['infeasible'])], [('regression: interword gap count', [[1, 7, 4, 1, 6, 5, 2, 4], [2, 3, 0], 23, 50], [5981, [4, 8]]), ('regression: interword gap count', [[4, 1, 4, 3, 5, 3, 6], [3, 3, 0], 23, 1], [5, [4, 7]]), ('regression: interword gap count', [[5, 4, 5, 2], [3, 2, 0], 16, 10], [662200, [2, 4]]), ('regression: interword gap count', [[5, 2, 3, 6, 7], [2, 2, 1], 24, 1], [26, [4, 5]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('control layout', [[6, 7, 3, 4, 3, 5], [3, 1, 1], 9, 10], ['infeasible']), ('control layout', [[7, 1, 2], [1, 1, 0], 22, 50], [2500, [3]])], [('regression: interword gap count', [[2, 5, 4, 7, 4, 1, 3], [1, 2, 1], 18, 10], [12200, [4, 7]]), ('regression: interword gap count', [[7, 3, 1, 4, 5, 7, 2, 1], [1, 1, 2], 12, 50], [27500, [2, 5, 8]]), ('regression: interword gap count', [[7, 1, 4, 6, 6, 2, 3], [3, 2, 1], 12, 50], [32938, [2, 4, 6, 7]]), ('regression: interword gap count', [[7, 3, 7, 4, 7, 3, 1, 5], [3, 1, 2], 19, 10], [12344, [3, 6, 8]]), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('control layout', [[7, 4, 7, 2, 4, 2, 1], [2, 1, 0], 17, 10], ['infeasible']), ('control layout', [[4, 1, 1], [1, 3, 2], 15, 50], [2500, [3]])]]
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 |
|---|---|---|---|
| two-line paragraph with loose first line | [629, [2, 4]] | [12200, [3, 4]] | Failed |
| regression: interword gap count | [7916, [3, 6, 7]] | [8900, [4, 7]] | Failed |
| regression: interword gap count | ['infeasible'] | [5000, [4, 5]] | Failed |
| regression: interword gap count | [729, [2, 4, 5]] | [629, [3, 5]] | Failed |
| single word paragraph | [100, [1]] | [100, [1]] | Passed |
| tight then loose lines | [589, [2, 4, 6, 7]] | [20403, [3, 6, 7]] | Failed |
| control layout | ['infeasible'] | ['infeasible'] | Passed |
| control layout | ['infeasible'] | ['infeasible'] | Passed |
SHA-256 / a722d9eca1393e7980b32fae6ca1cd6718a5bfbfdc4c54daa09eb8111158b38f
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(x):
words, glue, width, lp = x
sp, st, sh = glue
n = len(words)
def rate(i, j):
gaps = j - i - 1
nat = sum(words[i:j]) + sp * gaps + (1 if j < n else 0)
short = width - nat
if j == n and short >= 0:
return 0, 1
if short > 0:
if st * gaps == 0:
return None
r = Fraction(short, st * gaps)
elif short < 0:
if -short > sh * gaps:
return None
r = Fraction(short, sh * gaps)
else:
r = Fraction(0)
b = min(10000, math.floor(100 * abs(r) ** 3 + Fraction(1, 2)))
if b > 1000:
return None
fit = 0 if r < Fraction(-1, 2) else 1 if r <= Fraction(1, 2) else 2 if r <= 1 else 3
return b, fit
best = {(0, 1): (0, [])}
for j in range(1, n + 1):
for i in range(j):
rated = rate(i, j)
if rated is None:
continue
b, fit = rated
for (pos, pfit), (dem, brk) in sorted(best.items()):
if pos != i:
continue
d = dem + (lp + b) ** 2
if abs(fit - pfit) > 1:
d += 3000
key = (j, fit)
if key not in best or d < best[key][0]:
best[key] = (d, brk + [j])
finals = [v for (pos, f), v in best.items() if pos == n]
if not finals:
return ['infeasible']
d, brk = min(finals)
return [d, brk]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('regression: interword gap count', [[4, 1, 7, 4, 5, 5, 4], [3, 3, 1], 23, 50], [8900, [4, 7]]), ('regression: interword gap count', [[2, 1, 3, 5, 5], [3, 1, 0], 20, 50], [5000, [4, 5]]), ('regression: interword gap count', [[1, 3, 1, 2, 2], [3, 2, 1], 10, 10], [629, [3, 5]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[7, 6, 5, 6, 3, 1, 3], [1, 3, 2], 9, 10], ['infeasible']), ('control layout', [[7, 7, 3, 4, 5, 3, 6], [2, 1, 1], 9, 10], ['infeasible'])], [('regression: interword gap count', [[1, 7, 5, 5, 2], [2, 2, 0], 17, 10], [200, [3, 5]]), ('regression: interword gap count', [[4, 3, 1, 4, 3, 5], [2, 1, 2], 24, 10], [244, [5, 6]]), ('regression: interword gap count', [[2, 4, 1, 6, 1, 2, 3, 1], [2, 1, 0], 10, 50], [753000, [2, 4, 7, 8]]), ('regression: interword gap count', [[2, 5, 3, 6, 5], [2, 1, 1], 12, 50], [45000, [3, 5]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[6, 5, 3, 7, 5, 2], [3, 3, 0], 11, 10], ['infeasible']), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]])], [('regression: interword gap count', [[6, 5, 7, 7, 4, 7], [3, 1, 1], 23, 50], [7938, [3, 6]]), ('regression: interword gap count', [[2, 5, 7, 6, 7, 6, 6], [1, 3, 0], 15, 10], ['infeasible']), ('regression: interword gap count', [[3, 5, 7, 2, 2, 1], [2, 3, 1], 11, 1], [27, [2, 4, 6]]), ('regression: interword gap count', [[2, 5, 4, 7, 4, 1, 3], [1, 2, 1], 18, 10], [12200, [4, 7]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('control layout', [[5, 4, 4], [2, 1, 2], 20, 50], [2500, [3]]), ('control layout', [[2, 7, 6, 5, 5], [3, 3, 1], 12, 50], ['infeasible'])], [('regression: interword gap count', [[1, 7, 4, 1, 6, 5, 2, 4], [2, 3, 0], 23, 50], [5981, [4, 8]]), ('regression: interword gap count', [[4, 1, 4, 3, 5, 3, 6], [3, 3, 0], 23, 1], [5, [4, 7]]), ('regression: interword gap count', [[5, 4, 5, 2], [3, 2, 0], 16, 10], [662200, [2, 4]]), ('regression: interword gap count', [[5, 2, 3, 6, 7], [2, 2, 1], 24, 1], [26, [4, 5]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('control layout', [[6, 7, 3, 4, 3, 5], [3, 1, 1], 9, 10], ['infeasible']), ('control layout', [[7, 1, 2], [1, 1, 0], 22, 50], [2500, [3]])], [('regression: interword gap count', [[2, 5, 4, 7, 4, 1, 3], [1, 2, 1], 18, 10], [12200, [4, 7]]), ('regression: interword gap count', [[7, 3, 1, 4, 5, 7, 2, 1], [1, 1, 2], 12, 50], [27500, [2, 5, 8]]), ('regression: interword gap count', [[7, 1, 4, 6, 6, 2, 3], [3, 2, 1], 12, 50], [32938, [2, 4, 6, 7]]), ('regression: interword gap count', [[7, 3, 7, 4, 7, 3, 1, 5], [3, 1, 2], 19, 10], [12344, [3, 6, 8]]), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('control layout', [[7, 4, 7, 2, 4, 2, 1], [2, 1, 0], 17, 10], ['infeasible']), ('control layout', [[4, 1, 1], [1, 3, 2], 15, 50], [2500, [3]])]]
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 |
|---|---|---|---|
| two-line paragraph with loose first line | [12200, [2, 4]] | [12200, [3, 4]] | Failed |
| regression: interword gap count | [11816, [3, 6, 7]] | [8900, [4, 7]] | Failed |
| regression: interword gap count | ['infeasible'] | [5000, [4, 5]] | Failed |
| regression: interword gap count | [12200, [3, 5]] | [629, [3, 5]] | Failed |
| single word paragraph | [100, [1]] | [100, [1]] | Passed |
| tight then loose lines | [30604, [2, 4, 6, 7]] | [20403, [3, 6, 7]] | Failed |
| control layout | ['infeasible'] | ['infeasible'] | Passed |
| control layout | ['infeasible'] | ['infeasible'] | Passed |
SHA-256 / 85f48fab426641b474822ea2288b99d21e9156c125791249374529165522a91d
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(x):
words, glue, width, lp = x
sp, st, sh = glue
n = len(words)
def rate(i, j):
gaps = j - i - 1
nat = sum(words[i:j]) + sp * gaps
short = width - nat
if j == n and short >= 0:
return 0, 1
if short > 0:
if st * gaps == 0:
return None
r = Fraction(short, st * gaps)
elif short < 0:
if -short > sh * gaps:
return None
r = Fraction(short, sh * gaps)
else:
r = Fraction(0)
b = min(10000, math.floor(100 * abs(r) ** 3 + Fraction(1, 2)))
if b > 1000:
return None
fit = 0 if r < Fraction(-1, 2) else 1 if r <= Fraction(1, 2) else 2 if r <= 1 else 3
return b, fit
best = {(0, 1): (0, [])}
for j in range(1, n + 1):
for i in range(j):
rated = rate(i, j)
if rated is None:
continue
b, fit = rated
for (pos, pfit), (dem, brk) in sorted(best.items()):
if pos != i:
continue
d = dem + (lp + b) ** 2
if abs(fit - pfit) > 1:
d += 3000
key = (j, fit)
if key not in best or d < best[key][0]:
best[key] = (d, brk + [j])
finals = [v for (pos, f), v in best.items() if pos == n]
if not finals:
return ['infeasible']
d, brk = min(finals)
return [d, brk]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('regression: interword gap count', [[4, 1, 7, 4, 5, 5, 4], [3, 3, 1], 23, 50], [8900, [4, 7]]), ('regression: interword gap count', [[2, 1, 3, 5, 5], [3, 1, 0], 20, 50], [5000, [4, 5]]), ('regression: interword gap count', [[1, 3, 1, 2, 2], [3, 2, 1], 10, 10], [629, [3, 5]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[7, 6, 5, 6, 3, 1, 3], [1, 3, 2], 9, 10], ['infeasible']), ('control layout', [[7, 7, 3, 4, 5, 3, 6], [2, 1, 1], 9, 10], ['infeasible'])], [('regression: interword gap count', [[1, 7, 5, 5, 2], [2, 2, 0], 17, 10], [200, [3, 5]]), ('regression: interword gap count', [[4, 3, 1, 4, 3, 5], [2, 1, 2], 24, 10], [244, [5, 6]]), ('regression: interword gap count', [[2, 4, 1, 6, 1, 2, 3, 1], [2, 1, 0], 10, 50], [753000, [2, 4, 7, 8]]), ('regression: interword gap count', [[2, 5, 3, 6, 5], [2, 1, 1], 12, 50], [45000, [3, 5]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[6, 5, 3, 7, 5, 2], [3, 3, 0], 11, 10], ['infeasible']), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]])], [('regression: interword gap count', [[6, 5, 7, 7, 4, 7], [3, 1, 1], 23, 50], [7938, [3, 6]]), ('regression: interword gap count', [[2, 5, 7, 6, 7, 6, 6], [1, 3, 0], 15, 10], ['infeasible']), ('regression: interword gap count', [[3, 5, 7, 2, 2, 1], [2, 3, 1], 11, 1], [27, [2, 4, 6]]), ('regression: interword gap count', [[2, 5, 4, 7, 4, 1, 3], [1, 2, 1], 18, 10], [12200, [4, 7]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('control layout', [[5, 4, 4], [2, 1, 2], 20, 50], [2500, [3]]), ('control layout', [[2, 7, 6, 5, 5], [3, 3, 1], 12, 50], ['infeasible'])], [('regression: interword gap count', [[1, 7, 4, 1, 6, 5, 2, 4], [2, 3, 0], 23, 50], [5981, [4, 8]]), ('regression: interword gap count', [[4, 1, 4, 3, 5, 3, 6], [3, 3, 0], 23, 1], [5, [4, 7]]), ('regression: interword gap count', [[5, 4, 5, 2], [3, 2, 0], 16, 10], [662200, [2, 4]]), ('regression: interword gap count', [[5, 2, 3, 6, 7], [2, 2, 1], 24, 1], [26, [4, 5]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('control layout', [[6, 7, 3, 4, 3, 5], [3, 1, 1], 9, 10], ['infeasible']), ('control layout', [[7, 1, 2], [1, 1, 0], 22, 50], [2500, [3]])], [('regression: interword gap count', [[2, 5, 4, 7, 4, 1, 3], [1, 2, 1], 18, 10], [12200, [4, 7]]), ('regression: interword gap count', [[7, 3, 1, 4, 5, 7, 2, 1], [1, 1, 2], 12, 50], [27500, [2, 5, 8]]), ('regression: interword gap count', [[7, 1, 4, 6, 6, 2, 3], [3, 2, 1], 12, 50], [32938, [2, 4, 6, 7]]), ('regression: interword gap count', [[7, 3, 7, 4, 7, 3, 1, 5], [3, 1, 2], 19, 10], [12344, [3, 6, 8]]), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('control layout', [[7, 4, 7, 2, 4, 2, 1], [2, 1, 0], 17, 10], ['infeasible']), ('control layout', [[4, 1, 1], [1, 3, 2], 15, 50], [2500, [3]])]]
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 |
|---|---|---|---|
| two-line paragraph with loose first line | [12200, [3, 4]] | [12200, [3, 4]] | Passed |
| regression: interword gap count | [8900, [4, 7]] | [8900, [4, 7]] | Passed |
| regression: interword gap count | [5000, [4, 5]] | [5000, [4, 5]] | Passed |
| regression: interword gap count | [629, [3, 5]] | [629, [3, 5]] | Passed |
| single word paragraph | [100, [1]] | [100, [1]] | Passed |
| tight then loose lines | [20403, [3, 6, 7]] | [20403, [3, 6, 7]] | Passed |
| control layout | ['infeasible'] | ['infeasible'] | Passed |
| control layout | ['infeasible'] | ['infeasible'] | Passed |
SHA-256 / 36ad92d8bbce11cf3b382ff09a783db20e8b7f06af86a077368fda4b3711dc8e
Verification & scope
A deterministic toy typesetting model with integer widths and a stipulated rule set; it does not claim conformance to any engine. 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:48.851254+00:00.
Case digest / ea6904dbbd359be6d7bf0d2b162c52b4af0176fdb44655ce4106b0d2071382e2