FAILURE MAP
← Case archive

FA-97706 / Knitting and sewing pattern grading / Open access

Full and small bust adjustment: per-side amount · case 01

The FBA spreads each side by the full adjustment.

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

ROOT CAUSE

The total adjustment is applied to each side.

VERIFIED REPAIR

Split the total between the two sides.

Unsuccessful approach: Quartering halves the adjustment again.

Case contract

d = full - high bust (cm); negative -> "error: measurements". Cup index = floor(d/2.5) capped at the last of AA, A, B, C, D, DD, E. delta = index - index(drafted_cup). kind "none", "FBA" (delta > 0) or "SBA". Total adjustment 2.5 cm per cup, per side = total/2; if per side > 4 cm append " (redraft)". Return [cup, kind, per_side float].

Why this case matters

Sewists compare their cup size to the pattern draft cup and perform full or small bust adjustments.

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(high_bust, full_bust, drafted_cup):
    CUPS = ['AA', 'A', 'B', 'C', 'D', 'DD', 'E']
    d = Fraction(str(full_bust)) - Fraction(str(high_bust))
    if d < 0:
        return 'error: measurements'
    idx = min(math.floor(d / Fraction(5, 2)), len(CUPS) - 1)
    cup = CUPS[idx]
    delta = idx - CUPS.index(drafted_cup)
    total = Fraction(5, 2) * abs(delta)
    per = total
    kind = 'none' if delta == 0 else 'FBA' if delta > 0 else 'SBA'
    if per > 4:
        kind += ' (redraft)'
    return [cup, kind, float(per)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['regression: per-side amount', [88, 92, 'C'], ['A', 'SBA', 2.5]],
  ['repair check: per-side amount', [80, 82.5, 'D'], ['A', 'SBA', 3.75]],
  ['generated control 1', [80, 82.5, 'C'], ['A', 'SBA', 2.5]],
  ['generated control 2', [84, 94, 'B'], ['D', 'FBA', 2.5]],
  ['generated control 3', [96, 100, 'A'], ['A', 'none', 0.0]]],
 [['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['regression: per-side amount', [96, 111, 'C'], ['E', 'FBA', 3.75]],
  ['repair check: per-side amount', [84, 91.5, 'A'], ['C', 'FBA', 2.5]],
  ['generated control 1', [96, 95, 'C'], 'error: measurements'],
  ['generated control 2', [80, 97.5, 'D'], ['E', 'FBA', 2.5]],
  ['generated control 3', [92.5, 97.5, 'D'], ['B', 'SBA', 2.5]]],
 [['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['regression: per-side amount', [84, 91.5, 'D'], ['C', 'SBA', 1.25]],
  ['repair check: per-side amount', [80, 89, 'B'], ['C', 'FBA', 1.25]],
  ['generated control 1', [80, 84, 'B'], ['A', 'SBA', 1.25]],
  ['generated control 2', [84, 101.5, 'A'], ['E', 'FBA (redraft)', 6.25]],
  ['generated control 3', [92.5, 107.5, 'A'], ['E', 'FBA (redraft)', 6.25]]],
 [['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['regression: per-side amount', [84, 85, 'A'], ['AA', 'SBA', 1.25]],
  ['repair check: per-side amount', [88, 89, 'C'], ['AA', 'SBA', 3.75]],
  ['generated control 1', [96, 106, 'A'], ['D', 'FBA', 3.75]],
  ['generated control 2', [84, 84, 'D'], ['AA', 'SBA (redraft)', 5.0]],
  ['generated control 3', [88, 95.5, 'B'], ['C', 'FBA', 1.25]]],
 [['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['regression: per-side amount', [84, 85, 'D'], ['AA', 'SBA (redraft)', 5.0]],
  ['repair check: per-side amount', [80, 97.5, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['generated control 1', [84, 83, 'D'], 'error: measurements'],
  ['generated control 2', [88, 87, 'A'], 'error: measurements'],
  ['generated control 3', [84, 96.5, 'C'], ['DD', 'FBA', 2.5]]]]
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
matches draft['B', 'none', 0.0]['B', 'none', 0.0]Passed
big FBA['E', 'FBA (redraft)', 10.0]['E', 'FBA (redraft)', 5.0]Failed
small bust['AA', 'SBA (redraft)', 7.5]['AA', 'SBA', 3.75]Failed
regression: per-side amount['A', 'SBA (redraft)', 5.0]['A', 'SBA', 2.5]Failed
repair check: per-side amount['A', 'SBA (redraft)', 7.5]['A', 'SBA', 3.75]Failed
generated control 1['A', 'SBA (redraft)', 5.0]['A', 'SBA', 2.5]Failed
generated control 2['D', 'FBA (redraft)', 5.0]['D', 'FBA', 2.5]Failed
generated control 3['A', 'none', 0.0]['A', 'none', 0.0]Passed

SHA-256 / 892ade4b1cd245231a152ea5670c8c12a6e329bdc9ab0065eb89006a540f74ca

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(high_bust, full_bust, drafted_cup):
    CUPS = ['AA', 'A', 'B', 'C', 'D', 'DD', 'E']
    d = Fraction(str(full_bust)) - Fraction(str(high_bust))
    if d < 0:
        return 'error: measurements'
    idx = min(math.floor(d / Fraction(5, 2)), len(CUPS) - 1)
    cup = CUPS[idx]
    delta = idx - CUPS.index(drafted_cup)
    total = Fraction(5, 2) * abs(delta)
    per = total / 4
    kind = 'none' if delta == 0 else 'FBA' if delta > 0 else 'SBA'
    if per > 4:
        kind += ' (redraft)'
    return [cup, kind, float(per)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['regression: per-side amount', [88, 92, 'C'], ['A', 'SBA', 2.5]],
  ['repair check: per-side amount', [80, 82.5, 'D'], ['A', 'SBA', 3.75]],
  ['generated control 1', [80, 82.5, 'C'], ['A', 'SBA', 2.5]],
  ['generated control 2', [84, 94, 'B'], ['D', 'FBA', 2.5]],
  ['generated control 3', [96, 100, 'A'], ['A', 'none', 0.0]]],
 [['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['regression: per-side amount', [96, 111, 'C'], ['E', 'FBA', 3.75]],
  ['repair check: per-side amount', [84, 91.5, 'A'], ['C', 'FBA', 2.5]],
  ['generated control 1', [96, 95, 'C'], 'error: measurements'],
  ['generated control 2', [80, 97.5, 'D'], ['E', 'FBA', 2.5]],
  ['generated control 3', [92.5, 97.5, 'D'], ['B', 'SBA', 2.5]]],
 [['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['regression: per-side amount', [84, 91.5, 'D'], ['C', 'SBA', 1.25]],
  ['repair check: per-side amount', [80, 89, 'B'], ['C', 'FBA', 1.25]],
  ['generated control 1', [80, 84, 'B'], ['A', 'SBA', 1.25]],
  ['generated control 2', [84, 101.5, 'A'], ['E', 'FBA (redraft)', 6.25]],
  ['generated control 3', [92.5, 107.5, 'A'], ['E', 'FBA (redraft)', 6.25]]],
 [['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['regression: per-side amount', [84, 85, 'A'], ['AA', 'SBA', 1.25]],
  ['repair check: per-side amount', [88, 89, 'C'], ['AA', 'SBA', 3.75]],
  ['generated control 1', [96, 106, 'A'], ['D', 'FBA', 3.75]],
  ['generated control 2', [84, 84, 'D'], ['AA', 'SBA (redraft)', 5.0]],
  ['generated control 3', [88, 95.5, 'B'], ['C', 'FBA', 1.25]]],
 [['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['regression: per-side amount', [84, 85, 'D'], ['AA', 'SBA (redraft)', 5.0]],
  ['repair check: per-side amount', [80, 97.5, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['generated control 1', [84, 83, 'D'], 'error: measurements'],
  ['generated control 2', [88, 87, 'A'], 'error: measurements'],
  ['generated control 3', [84, 96.5, 'C'], ['DD', 'FBA', 2.5]]]]
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
matches draft['B', 'none', 0.0]['B', 'none', 0.0]Passed
big FBA['E', 'FBA', 2.5]['E', 'FBA (redraft)', 5.0]Failed
small bust['AA', 'SBA', 1.875]['AA', 'SBA', 3.75]Failed
regression: per-side amount['A', 'SBA', 1.25]['A', 'SBA', 2.5]Failed
repair check: per-side amount['A', 'SBA', 1.875]['A', 'SBA', 3.75]Failed
generated control 1['A', 'SBA', 1.25]['A', 'SBA', 2.5]Failed
generated control 2['D', 'FBA', 1.25]['D', 'FBA', 2.5]Failed
generated control 3['A', 'none', 0.0]['A', 'none', 0.0]Passed

SHA-256 / 3173e2494488103bbd56a57ea064d1e0f19c629eac8c863b4f3f90646f199b5a

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(high_bust, full_bust, drafted_cup):
    CUPS = ['AA', 'A', 'B', 'C', 'D', 'DD', 'E']
    d = Fraction(str(full_bust)) - Fraction(str(high_bust))
    if d < 0:
        return 'error: measurements'
    idx = min(math.floor(d / Fraction(5, 2)), len(CUPS) - 1)
    cup = CUPS[idx]
    delta = idx - CUPS.index(drafted_cup)
    total = Fraction(5, 2) * abs(delta)
    per = total / 2
    kind = 'none' if delta == 0 else 'FBA' if delta > 0 else 'SBA'
    if per > 4:
        kind += ' (redraft)'
    return [cup, kind, float(per)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['regression: per-side amount', [88, 92, 'C'], ['A', 'SBA', 2.5]],
  ['repair check: per-side amount', [80, 82.5, 'D'], ['A', 'SBA', 3.75]],
  ['generated control 1', [80, 82.5, 'C'], ['A', 'SBA', 2.5]],
  ['generated control 2', [84, 94, 'B'], ['D', 'FBA', 2.5]],
  ['generated control 3', [96, 100, 'A'], ['A', 'none', 0.0]]],
 [['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['regression: per-side amount', [96, 111, 'C'], ['E', 'FBA', 3.75]],
  ['repair check: per-side amount', [84, 91.5, 'A'], ['C', 'FBA', 2.5]],
  ['generated control 1', [96, 95, 'C'], 'error: measurements'],
  ['generated control 2', [80, 97.5, 'D'], ['E', 'FBA', 2.5]],
  ['generated control 3', [92.5, 97.5, 'D'], ['B', 'SBA', 2.5]]],
 [['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['regression: per-side amount', [84, 91.5, 'D'], ['C', 'SBA', 1.25]],
  ['repair check: per-side amount', [80, 89, 'B'], ['C', 'FBA', 1.25]],
  ['generated control 1', [80, 84, 'B'], ['A', 'SBA', 1.25]],
  ['generated control 2', [84, 101.5, 'A'], ['E', 'FBA (redraft)', 6.25]],
  ['generated control 3', [92.5, 107.5, 'A'], ['E', 'FBA (redraft)', 6.25]]],
 [['negative difference', [90, 89, 'B'], 'error: measurements'],
  ['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['regression: per-side amount', [84, 85, 'A'], ['AA', 'SBA', 1.25]],
  ['repair check: per-side amount', [88, 89, 'C'], ['AA', 'SBA', 3.75]],
  ['generated control 1', [96, 106, 'A'], ['D', 'FBA', 3.75]],
  ['generated control 2', [84, 84, 'D'], ['AA', 'SBA (redraft)', 5.0]],
  ['generated control 3', [88, 95.5, 'B'], ['C', 'FBA', 1.25]]],
 [['matches draft', [88, 93, 'B'], ['B', 'none', 0.0]],
  ['big FBA', [84, 101, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['small bust', [92.5, 94, 'C'], ['AA', 'SBA', 3.75]],
  ['regression: per-side amount', [84, 85, 'D'], ['AA', 'SBA (redraft)', 5.0]],
  ['repair check: per-side amount', [80, 97.5, 'B'], ['E', 'FBA (redraft)', 5.0]],
  ['generated control 1', [84, 83, 'D'], 'error: measurements'],
  ['generated control 2', [88, 87, 'A'], 'error: measurements'],
  ['generated control 3', [84, 96.5, 'C'], ['DD', 'FBA', 2.5]]]]
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
matches draft['B', 'none', 0.0]['B', 'none', 0.0]Passed
big FBA['E', 'FBA (redraft)', 5.0]['E', 'FBA (redraft)', 5.0]Passed
small bust['AA', 'SBA', 3.75]['AA', 'SBA', 3.75]Passed
regression: per-side amount['A', 'SBA', 2.5]['A', 'SBA', 2.5]Passed
repair check: per-side amount['A', 'SBA', 3.75]['A', 'SBA', 3.75]Passed
generated control 1['A', 'SBA', 2.5]['A', 'SBA', 2.5]Passed
generated control 2['D', 'FBA', 2.5]['D', 'FBA', 2.5]Passed
generated control 3['A', 'none', 0.0]['A', 'none', 0.0]Passed

SHA-256 / d66aab38a54a37477ec93849e8cb5718ea3753004d5a47c89a8113d98bac5ad1

Verification & scope

A deterministic toy contract stated in full here; it is a bounded teaching model, not an authoritative reference or standards implementation. 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:52:34.809111+00:00.

Case digest / 58c3fae30f29aac59981a74f2553f4f70a58fdbaa772609dee0b633d97ef5880