FAILURE MAP
← Case archive

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

Sleeve taper decrease schedule: base interval · case 01

A 90-row taper with 8 decreases plans intervals that overrun the sleeve length.

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

ROOT CAUSE

The base interval is rounded up, so the faster rate is the longer one and counts go negative.

VERIFIED REPAIR

Use the floor of rows/pairs as the base interval.

Unsuccessful approach: Rounding to nearest overruns whenever the fractional part is at least one half.

Case contract

Top-down sleeve from upper_sts to cuff_sts, decreasing 2 stitches per decrease row within rows rows. Errors: cuff wider ("error: cuff wider than upper arm"), odd difference ("error: odd difference"), rows fewer than decrease rows ("error: not enough rows"). pairs = difference/2; a = rows // pairs; y = rows - a*pairs decreases every a+1 rows, x = pairs-y every a rows. Return [[a, x], [a+1, y]] omitting a zero count; [] for no decreases.

Why this case matters

Pattern writers turn a stitch-count change over a length into "decrease every N rows X times".

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(cuff_sts, upper_sts, rows):
    diff = upper_sts - cuff_sts
    if diff < 0:
        return 'error: cuff wider than upper arm'
    if diff % 2:
        return 'error: odd difference'
    pairs = diff // 2
    if pairs == 0:
        return []
    a = math.ceil(rows / pairs)
    if a == 0:
        return 'error: not enough rows'
    y = rows - a * pairs
    x = pairs - y
    plan = []
    if x:
        plan.append([a, x])
    if y:
        plan.append([a + 1, y])
    return plan
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['even schedule', [48, 64, 80], [[10, 8]]], ['two rates', [44, 60, 90], [[11, 6], [12, 2]]],
  ['odd difference', [48, 53, 60], 'error: odd difference'],
  ['regression: base interval', [50, 74, 100], [[8, 8], [9, 4]]],
  ['repair check: base interval', [56, 68, 10], [[1, 2], [2, 4]]],
  ['generated control 1', [40, 48, 60], [[15, 4]]],
  ['generated control 2', [45, 50, 60], 'error: odd difference'],
  ['generated control 3', [56, 63, 5], 'error: odd difference']],
 [['two rates', [44, 60, 90], [[11, 6], [12, 2]]], ['odd difference', [48, 53, 60], 'error: odd difference'],
  ['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['regression: base interval', [48, 56, 10], [[2, 2], [3, 2]]],
  ['repair check: base interval', [51, 75, 90], [[7, 6], [8, 6]]],
  ['generated control 1', [50, 57, 60], 'error: odd difference'],
  ['generated control 2', [60, 67, 5], 'error: odd difference'], ['generated control 3', [48, 48, 10], []]],
 [['odd difference', [48, 53, 60], 'error: odd difference'],
  ['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['regression: base interval', [56, 80, 40], [[3, 8], [4, 4]]],
  ['repair check: base interval', [40, 64, 90], [[7, 6], [8, 6]]],
  ['generated control 1', [48, 55, 40], 'error: odd difference'],
  ['generated control 2', [56, 76, 40], [[4, 10]]],
  ['generated control 3', [60, 67, 40], 'error: odd difference']],
 [['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['even schedule', [48, 64, 80], [[10, 8]]],
  ['regression: base interval', [44, 56, 100], [[16, 2], [17, 4]]],
  ['repair check: base interval', [56, 68, 5], 'error: not enough rows'],
  ['generated control 1', [60, 65, 60], 'error: odd difference'],
  ['generated control 2', [56, 58, 100], [[100, 1]]],
  ['generated control 3', [60, 67, 10], 'error: odd difference']],
 [['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['even schedule', [48, 64, 80], [[10, 8]]], ['two rates', [44, 60, 90], [[11, 6], [12, 2]]],
  ['regression: base interval', [56, 76, 72], [[7, 8], [8, 2]]],
  ['repair check: base interval', [45, 75, 40], [[2, 5], [3, 10]]],
  ['generated control 1', [48, 53, 5], 'error: odd difference'],
  ['generated control 2', [50, 74, 72], [[6, 12]]], ['generated control 3', [60, 68, 100], [[25, 4]]]]]
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
even schedule[[10, 8]][[10, 8]]Passed
two rates[[12, 14], [13, -6]][[11, 6], [12, 2]]Failed
odd differenceerror: odd differenceerror: odd differencePassed
regression: base interval[[9, 20], [10, -8]][[8, 8], [9, 4]]Failed
repair check: base interval[[2, 8], [3, -2]][[1, 2], [2, 4]]Failed
generated control 1[[15, 4]][[15, 4]]Passed
generated control 2error: odd differenceerror: odd differencePassed
generated control 3error: odd differenceerror: odd differencePassed

SHA-256 / 52d2ff0c3eb0c3b464a561976ec93b4ae6800500f3026ca5673891757184f310

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(cuff_sts, upper_sts, rows):
    diff = upper_sts - cuff_sts
    if diff < 0:
        return 'error: cuff wider than upper arm'
    if diff % 2:
        return 'error: odd difference'
    pairs = diff // 2
    if pairs == 0:
        return []
    a = round(rows / pairs)
    if a == 0:
        return 'error: not enough rows'
    y = rows - a * pairs
    x = pairs - y
    plan = []
    if x:
        plan.append([a, x])
    if y:
        plan.append([a + 1, y])
    return plan
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['even schedule', [48, 64, 80], [[10, 8]]], ['two rates', [44, 60, 90], [[11, 6], [12, 2]]],
  ['odd difference', [48, 53, 60], 'error: odd difference'],
  ['regression: base interval', [50, 74, 100], [[8, 8], [9, 4]]],
  ['repair check: base interval', [56, 68, 10], [[1, 2], [2, 4]]],
  ['generated control 1', [40, 48, 60], [[15, 4]]],
  ['generated control 2', [45, 50, 60], 'error: odd difference'],
  ['generated control 3', [56, 63, 5], 'error: odd difference']],
 [['two rates', [44, 60, 90], [[11, 6], [12, 2]]], ['odd difference', [48, 53, 60], 'error: odd difference'],
  ['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['regression: base interval', [48, 56, 10], [[2, 2], [3, 2]]],
  ['repair check: base interval', [51, 75, 90], [[7, 6], [8, 6]]],
  ['generated control 1', [50, 57, 60], 'error: odd difference'],
  ['generated control 2', [60, 67, 5], 'error: odd difference'], ['generated control 3', [48, 48, 10], []]],
 [['odd difference', [48, 53, 60], 'error: odd difference'],
  ['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['regression: base interval', [56, 80, 40], [[3, 8], [4, 4]]],
  ['repair check: base interval', [40, 64, 90], [[7, 6], [8, 6]]],
  ['generated control 1', [48, 55, 40], 'error: odd difference'],
  ['generated control 2', [56, 76, 40], [[4, 10]]],
  ['generated control 3', [60, 67, 40], 'error: odd difference']],
 [['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['even schedule', [48, 64, 80], [[10, 8]]],
  ['regression: base interval', [44, 56, 100], [[16, 2], [17, 4]]],
  ['repair check: base interval', [56, 68, 5], 'error: not enough rows'],
  ['generated control 1', [60, 65, 60], 'error: odd difference'],
  ['generated control 2', [56, 58, 100], [[100, 1]]],
  ['generated control 3', [60, 67, 10], 'error: odd difference']],
 [['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['even schedule', [48, 64, 80], [[10, 8]]], ['two rates', [44, 60, 90], [[11, 6], [12, 2]]],
  ['regression: base interval', [56, 76, 72], [[7, 8], [8, 2]]],
  ['repair check: base interval', [45, 75, 40], [[2, 5], [3, 10]]],
  ['generated control 1', [48, 53, 5], 'error: odd difference'],
  ['generated control 2', [50, 74, 72], [[6, 12]]], ['generated control 3', [60, 68, 100], [[25, 4]]]]]
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
even schedule[[10, 8]][[10, 8]]Passed
two rates[[11, 6], [12, 2]][[11, 6], [12, 2]]Passed
odd differenceerror: odd differenceerror: odd differencePassed
regression: base interval[[8, 8], [9, 4]][[8, 8], [9, 4]]Passed
repair check: base interval[[2, 8], [3, -2]][[1, 2], [2, 4]]Failed
generated control 1[[15, 4]][[15, 4]]Passed
generated control 2error: odd differenceerror: odd differencePassed
generated control 3error: odd differenceerror: odd differencePassed

SHA-256 / 7d1b0684a61abc7755a3afcf17868af65b0ea2595d7135d28c90c1e38de1439f

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(cuff_sts, upper_sts, rows):
    diff = upper_sts - cuff_sts
    if diff < 0:
        return 'error: cuff wider than upper arm'
    if diff % 2:
        return 'error: odd difference'
    pairs = diff // 2
    if pairs == 0:
        return []
    a = rows // pairs
    if a == 0:
        return 'error: not enough rows'
    y = rows - a * pairs
    x = pairs - y
    plan = []
    if x:
        plan.append([a, x])
    if y:
        plan.append([a + 1, y])
    return plan
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['even schedule', [48, 64, 80], [[10, 8]]], ['two rates', [44, 60, 90], [[11, 6], [12, 2]]],
  ['odd difference', [48, 53, 60], 'error: odd difference'],
  ['regression: base interval', [50, 74, 100], [[8, 8], [9, 4]]],
  ['repair check: base interval', [56, 68, 10], [[1, 2], [2, 4]]],
  ['generated control 1', [40, 48, 60], [[15, 4]]],
  ['generated control 2', [45, 50, 60], 'error: odd difference'],
  ['generated control 3', [56, 63, 5], 'error: odd difference']],
 [['two rates', [44, 60, 90], [[11, 6], [12, 2]]], ['odd difference', [48, 53, 60], 'error: odd difference'],
  ['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['regression: base interval', [48, 56, 10], [[2, 2], [3, 2]]],
  ['repair check: base interval', [51, 75, 90], [[7, 6], [8, 6]]],
  ['generated control 1', [50, 57, 60], 'error: odd difference'],
  ['generated control 2', [60, 67, 5], 'error: odd difference'], ['generated control 3', [48, 48, 10], []]],
 [['odd difference', [48, 53, 60], 'error: odd difference'],
  ['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['regression: base interval', [56, 80, 40], [[3, 8], [4, 4]]],
  ['repair check: base interval', [40, 64, 90], [[7, 6], [8, 6]]],
  ['generated control 1', [48, 55, 40], 'error: odd difference'],
  ['generated control 2', [56, 76, 40], [[4, 10]]],
  ['generated control 3', [60, 67, 40], 'error: odd difference']],
 [['too few rows', [40, 70, 10], 'error: not enough rows'],
  ['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['even schedule', [48, 64, 80], [[10, 8]]],
  ['regression: base interval', [44, 56, 100], [[16, 2], [17, 4]]],
  ['repair check: base interval', [56, 68, 5], 'error: not enough rows'],
  ['generated control 1', [60, 65, 60], 'error: odd difference'],
  ['generated control 2', [56, 58, 100], [[100, 1]]],
  ['generated control 3', [60, 67, 10], 'error: odd difference']],
 [['cuff wider', [60, 50, 60], 'error: cuff wider than upper arm'],
  ['even schedule', [48, 64, 80], [[10, 8]]], ['two rates', [44, 60, 90], [[11, 6], [12, 2]]],
  ['regression: base interval', [56, 76, 72], [[7, 8], [8, 2]]],
  ['repair check: base interval', [45, 75, 40], [[2, 5], [3, 10]]],
  ['generated control 1', [48, 53, 5], 'error: odd difference'],
  ['generated control 2', [50, 74, 72], [[6, 12]]], ['generated control 3', [60, 68, 100], [[25, 4]]]]]
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
even schedule[[10, 8]][[10, 8]]Passed
two rates[[11, 6], [12, 2]][[11, 6], [12, 2]]Passed
odd differenceerror: odd differenceerror: odd differencePassed
regression: base interval[[8, 8], [9, 4]][[8, 8], [9, 4]]Passed
repair check: base interval[[1, 2], [2, 4]][[1, 2], [2, 4]]Passed
generated control 1[[15, 4]][[15, 4]]Passed
generated control 2error: odd differenceerror: odd differencePassed
generated control 3error: odd differenceerror: odd differencePassed

SHA-256 / dd046106c9a6f0f80cbcc2855acbe0a41e057ff6d32f80eb6df369b46028382a

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:31.736440+00:00.

Case digest / 2b24fbb2ed8261158569594cf8c0980559815c8e26cf65a117faf484c6f3d160