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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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