FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 widtherror: pieceerror: piecePassed
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 1error: pieceerror: piecePassed
generated control 2error: pieceerror: piecePassed
generated control 3error: pieceerror: piecePassed

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 fixtureActualExpectedOutcome
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 widtherror: pieceerror: piecePassed
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 1error: pieceerror: piecePassed
generated control 2error: pieceerror: piecePassed
generated control 3error: pieceerror: piecePassed

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