FA-97556 / Knitting and sewing pattern grading / Open access
Seam and hem allowance cutter: hem replaces seam allowance · case 01
Hemmed pieces are cut a seam allowance too long.
ROOT CAUSE
The hem allowance is added on top of the bottom seam allowance instead of replacing it.
THE FAILURE
The hem allowance is added on top of the bottom seam allowance instead of replacing it.
Unsuccessful approach: Dropping the top allowance cuts pieces short at the shoulder.
Case contract
Pieces [name, finished_w, finished_h, on_fold, hemmed]. Cut width = w/2 + sa when cut on the fold (no allowance on the fold), else w + 2*sa. Cut height = h + sa (top) + (hem if hemmed else sa). Fabric area counts the unfolded piece (2*cut width for fold pieces) * cut height, summed and half-up to cm^2. A non-positive finished dimension -> "error: piece". Return [[name, cut_w, cut_h] floats, area].
Why this case matters
Pattern drafting software adds seam and hem allowances and handles place-on-fold pieces.
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(pieces, sa, hem):
S = Fraction(str(sa))
H = Fraction(str(hem))
out = []
area = Fraction(0)
for name, w, h, fold, hemmed in pieces:
W = Fraction(str(w))
Hh = Fraction(str(h))
if W <= 0 or Hh <= 0:
return 'error: piece'
cw = W / 2 + S if fold else W + 2 * S
ch = Hh + S + S + (H if hemmed else 0)
out.append([name, float(cw), float(ch)])
area += (2 * cw if fold else cw) * ch
return [out, math.floor(area + Fraction(1, 2))]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['regression: hem replaces seam allowance',
[[['back0', 25, 40, False, True], ['back1', 20, 62.5, True, False], ['sleeve2', 25, 55, False, False],
['facing3', 20, 40, False, False]],
1, 2.5],
[[['back0', 27.0, 43.5], ['back1', 11.0, 64.5], ['sleeve2', 27.0, 57.0], ['facing3', 22.0, 42.0]], 5057]],
['repair check: hem replaces seam allowance', [[['yoke0', 50, 40, False, True]], 1.6, 3],
[[['yoke0', 53.2, 44.6]], 2373]],
['generated control 1',
[[['front0', 0, 15, False, True], ['back1', 0, 0, False, True], ['facing2', 0, 55, False, True]], 1, 4],
'error: piece'],
['generated control 2',
[[['back0', 50, 62.5, False, False], ['facing1', 50, 15, True, False], ['facing2', 20, 0, True, False]],
1.6, 2.5],
'error: piece'],
['generated control 3', [[['back0', 0, 40, False, False]], 1.6, 4], 'error: piece']],
[['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['regression: hem replaces seam allowance',
[[['yoke0', 25, 62.5, False, False], ['yoke1', 50, 55, False, False], ['yoke2', 42, 55, False, False],
['back3', 25, 55, False, True]],
1.5, 3],
[[['yoke0', 28.0, 65.5], ['yoke1', 53.0, 58.0], ['yoke2', 45.0, 58.0], ['back3', 28.0, 59.5]], 9184]],
['repair check: hem replaces seam allowance',
[[['facing0', 25, 40, False, False], ['facing1', 25, 55, True, True], ['back2', 50, 15, False, True],
['sleeve3', 42, 55, False, True]],
2, 4],
[[['facing0', 29.0, 44.0], ['facing1', 14.5, 61.0], ['back2', 54.0, 21.0], ['sleeve3', 46.0, 61.0]],
6985]],
['generated control 1', [[['front0', 25, 0, True, False], ['front1', 30.5, 40, False, False]], 1, 3],
'error: piece'],
['generated control 2', [[['front0', 20, 62.5, True, False], ['front1', 0, 55, False, False]], 1, 4],
'error: piece'],
['generated control 3',
[[['front0', 50, 55, False, False], ['facing1', 20, 15, False, True], ['yoke2', 0, 0, False, True]], 2, 4],
'error: piece']],
[['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['regression: hem replaces seam allowance', [[['back0', 25, 55, True, True]], 1.5, 2.5],
[[['back0', 14.0, 59.0]], 1652]],
['repair check: hem replaces seam allowance', [[['yoke0', 50, 62.5, True, False]], 1, 3],
[[['yoke0', 26.0, 64.5]], 3354]],
['generated control 1',
[[['sleeve0', 30.5, 55, False, True], ['sleeve1', 30.5, 0, False, True], ['facing2', 25, 55, False, True]],
1.5, 3],
'error: piece'],
['generated control 2',
[[['back0', 50, 0, True, True], ['sleeve1', 25, 62.5, False, True], ['facing2', 20, 55, False, True]], 1.5,
4],
'error: piece'],
['generated control 3', [[['sleeve0', 0, 0, False, False], ['facing1', 0, 55, False, True]], 1.6, 2.5],
'error: piece']],
[['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['regression: hem replaces seam allowance', [[['yoke0', 20, 15, False, True]], 1.5, 4],
[[['yoke0', 23.0, 20.5]], 472]],
['repair check: hem replaces seam allowance', [[['facing0', 42, 62.5, False, False]], 1.6, 2.5],
[[['facing0', 45.2, 65.7]], 2970]],
['generated control 1', [[['back0', 42, 0, False, True], ['facing1', 42, 15, False, True]], 1, 2.5],
'error: piece'],
['generated control 2',
[[['facing0', 42, 40, False, True], ['front1', 0, 55, True, False], ['yoke2', 42, 15, True, True],
['facing3', 25, 40, True, True]],
1.5, 2.5],
'error: piece'],
['generated control 3', [[['yoke0', 20, 0, False, False]], 1.5, 2.5], 'error: piece']],
[['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['regression: hem replaces seam allowance',
[[['front0', 50, 55, False, False], ['sleeve1', 25, 55, False, True]], 1.5, 2.5],
[[['front0', 53.0, 58.0], ['sleeve1', 28.0, 59.0]], 4726]],
['repair check: hem replaces seam allowance',
[[['facing0', 20, 62.5, True, False], ['yoke1', 20, 40, False, False]], 1.5, 3],
[[['facing0', 11.5, 65.5], ['yoke1', 23.0, 43.0]], 2496]],
['generated control 1',
[[['facing0', 20, 0, False, False], ['front1', 0, 0, False, True], ['front2', 42, 15, True, False]], 1,
2.5],
'error: piece'],
['generated control 2',
[[['facing0', 50, 15, False, False], ['facing1', 25, 40, False, False], ['sleeve2', 42, 40, True, False]],
2, 3],
[[['facing0', 54.0, 19.0], ['facing1', 29.0, 44.0], ['sleeve2', 23.0, 44.0]], 4326]],
['generated control 3', [[['back0', 30.5, 62.5, True, False]], 1.6, 3], [[['back0', 16.85, 65.7]], 2214]]]]
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 |
|---|---|---|---|
| plain piece | [[['back', 43.0, 66.0]], 2838] | [[['back', 43.0, 64.5]], 2774] | Failed |
| fold piece | [[['front', 22.5, 58.0]], 2610] | [[['front', 22.5, 58.0]], 2610] | Passed |
| zero width | error: piece | error: piece | Passed |
| regression: hem replaces seam allowance | [[['back0', 27.0, 44.5], ['back1', 11.0, 64.5], ['sleeve2', 27.0, 57.0], ['facing3', 22.0, 42.0]], 5084] | [[['back0', 27.0, 43.5], ['back1', 11.0, 64.5], ['sleeve2', 27.0, 57.0], ['facing3', 22.0, 42.0]], 5057] | Failed |
| repair check: hem replaces seam allowance | [[['yoke0', 53.2, 46.2]], 2458] | [[['yoke0', 53.2, 44.6]], 2373] | Failed |
| generated control 1 | error: piece | error: piece | Passed |
| generated control 2 | error: piece | error: piece | Passed |
| generated control 3 | error: piece | error: piece | Passed |
SHA-256 / c905358ff8bcae668fd7392036a375b9d4aa9df9ed5406f0e1271e7517e5acf1
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(pieces, sa, hem):
S = Fraction(str(sa))
H = Fraction(str(hem))
out = []
area = Fraction(0)
for name, w, h, fold, hemmed in pieces:
W = Fraction(str(w))
Hh = Fraction(str(h))
if W <= 0 or Hh <= 0:
return 'error: piece'
cw = W / 2 + S if fold else W + 2 * S
ch = Hh + (H if hemmed else S)
out.append([name, float(cw), float(ch)])
area += (2 * cw if fold else cw) * ch
return [out, math.floor(area + Fraction(1, 2))]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['regression: hem replaces seam allowance',
[[['back0', 25, 40, False, True], ['back1', 20, 62.5, True, False], ['sleeve2', 25, 55, False, False],
['facing3', 20, 40, False, False]],
1, 2.5],
[[['back0', 27.0, 43.5], ['back1', 11.0, 64.5], ['sleeve2', 27.0, 57.0], ['facing3', 22.0, 42.0]], 5057]],
['repair check: hem replaces seam allowance', [[['yoke0', 50, 40, False, True]], 1.6, 3],
[[['yoke0', 53.2, 44.6]], 2373]],
['generated control 1',
[[['front0', 0, 15, False, True], ['back1', 0, 0, False, True], ['facing2', 0, 55, False, True]], 1, 4],
'error: piece'],
['generated control 2',
[[['back0', 50, 62.5, False, False], ['facing1', 50, 15, True, False], ['facing2', 20, 0, True, False]],
1.6, 2.5],
'error: piece'],
['generated control 3', [[['back0', 0, 40, False, False]], 1.6, 4], 'error: piece']],
[['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['regression: hem replaces seam allowance',
[[['yoke0', 25, 62.5, False, False], ['yoke1', 50, 55, False, False], ['yoke2', 42, 55, False, False],
['back3', 25, 55, False, True]],
1.5, 3],
[[['yoke0', 28.0, 65.5], ['yoke1', 53.0, 58.0], ['yoke2', 45.0, 58.0], ['back3', 28.0, 59.5]], 9184]],
['repair check: hem replaces seam allowance',
[[['facing0', 25, 40, False, False], ['facing1', 25, 55, True, True], ['back2', 50, 15, False, True],
['sleeve3', 42, 55, False, True]],
2, 4],
[[['facing0', 29.0, 44.0], ['facing1', 14.5, 61.0], ['back2', 54.0, 21.0], ['sleeve3', 46.0, 61.0]],
6985]],
['generated control 1', [[['front0', 25, 0, True, False], ['front1', 30.5, 40, False, False]], 1, 3],
'error: piece'],
['generated control 2', [[['front0', 20, 62.5, True, False], ['front1', 0, 55, False, False]], 1, 4],
'error: piece'],
['generated control 3',
[[['front0', 50, 55, False, False], ['facing1', 20, 15, False, True], ['yoke2', 0, 0, False, True]], 2, 4],
'error: piece']],
[['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['regression: hem replaces seam allowance', [[['back0', 25, 55, True, True]], 1.5, 2.5],
[[['back0', 14.0, 59.0]], 1652]],
['repair check: hem replaces seam allowance', [[['yoke0', 50, 62.5, True, False]], 1, 3],
[[['yoke0', 26.0, 64.5]], 3354]],
['generated control 1',
[[['sleeve0', 30.5, 55, False, True], ['sleeve1', 30.5, 0, False, True], ['facing2', 25, 55, False, True]],
1.5, 3],
'error: piece'],
['generated control 2',
[[['back0', 50, 0, True, True], ['sleeve1', 25, 62.5, False, True], ['facing2', 20, 55, False, True]], 1.5,
4],
'error: piece'],
['generated control 3', [[['sleeve0', 0, 0, False, False], ['facing1', 0, 55, False, True]], 1.6, 2.5],
'error: piece']],
[['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['regression: hem replaces seam allowance', [[['yoke0', 20, 15, False, True]], 1.5, 4],
[[['yoke0', 23.0, 20.5]], 472]],
['repair check: hem replaces seam allowance', [[['facing0', 42, 62.5, False, False]], 1.6, 2.5],
[[['facing0', 45.2, 65.7]], 2970]],
['generated control 1', [[['back0', 42, 0, False, True], ['facing1', 42, 15, False, True]], 1, 2.5],
'error: piece'],
['generated control 2',
[[['facing0', 42, 40, False, True], ['front1', 0, 55, True, False], ['yoke2', 42, 15, True, True],
['facing3', 25, 40, True, True]],
1.5, 2.5],
'error: piece'],
['generated control 3', [[['yoke0', 20, 0, False, False]], 1.5, 2.5], 'error: piece']],
[['fold piece', [[['front', 42, 55, True, False]], 1.5, 3], [[['front', 22.5, 58.0]], 2610]],
['zero width', [[['yoke', 0, 10, False, False]], 1, 2], 'error: piece'],
['plain piece', [[['back', 40, 60, False, True]], 1.5, 3], [[['back', 43.0, 64.5]], 2774]],
['regression: hem replaces seam allowance',
[[['front0', 50, 55, False, False], ['sleeve1', 25, 55, False, True]], 1.5, 2.5],
[[['front0', 53.0, 58.0], ['sleeve1', 28.0, 59.0]], 4726]],
['repair check: hem replaces seam allowance',
[[['facing0', 20, 62.5, True, False], ['yoke1', 20, 40, False, False]], 1.5, 3],
[[['facing0', 11.5, 65.5], ['yoke1', 23.0, 43.0]], 2496]],
['generated control 1',
[[['facing0', 20, 0, False, False], ['front1', 0, 0, False, True], ['front2', 42, 15, True, False]], 1,
2.5],
'error: piece'],
['generated control 2',
[[['facing0', 50, 15, False, False], ['facing1', 25, 40, False, False], ['sleeve2', 42, 40, True, False]],
2, 3],
[[['facing0', 54.0, 19.0], ['facing1', 29.0, 44.0], ['sleeve2', 23.0, 44.0]], 4326]],
['generated control 3', [[['back0', 30.5, 62.5, True, False]], 1.6, 3], [[['back0', 16.85, 65.7]], 2214]]]]
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 |
|---|---|---|---|
| plain piece | [[['back', 43.0, 63.0]], 2709] | [[['back', 43.0, 64.5]], 2774] | Failed |
| fold piece | [[['front', 22.5, 56.5]], 2543] | [[['front', 22.5, 58.0]], 2610] | Failed |
| zero width | error: piece | error: piece | Passed |
| regression: hem replaces seam allowance | [[['back0', 27.0, 42.5], ['back1', 11.0, 63.5], ['sleeve2', 27.0, 56.0], ['facing3', 22.0, 41.0]], 4959] | [[['back0', 27.0, 43.5], ['back1', 11.0, 64.5], ['sleeve2', 27.0, 57.0], ['facing3', 22.0, 42.0]], 5057] | Failed |
| repair check: hem replaces seam allowance | [[['yoke0', 53.2, 43.0]], 2288] | [[['yoke0', 53.2, 44.6]], 2373] | Failed |
| generated control 1 | error: piece | error: piece | Passed |
| generated control 2 | error: piece | error: piece | Passed |
| generated control 3 | error: piece | error: piece | Passed |
SHA-256 / ee44de858a2900d3eb526d1df7ba89a1fbec284d9cc5031004fc22d56ffaee6b
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗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:33.339111+00:00.
Case digest / 721d12acdc1b474e0edbe359fc1dbcc16345af1b0ea05977cb093f772d6da6a7