FA-97491 / Knitting and sewing pattern grading / Open access
Neckband pick-up counter: vertical ratio · case 01
A 40-row edge picks up 53 stitches instead of 30, flaring the band.
ROOT CAUSE
The 3-per-4-rows ratio is inverted.
VERIFIED REPAIR
Pick up 3 stitches for every 4 rows.
Unsuccessful approach: The 2-in-3 garter ratio does not match the stockinette contract.
Case contract
Edges [kind, count]: vertical picks up 3 per 4 rows, diagonal 9 per 10 rows, each rounded half-up per edge; horizontal picks 1 per stitch; other kinds -> "error: edge". The rib needs a count of multiple*k + plus; adjust the total up to the next such count (unchanged if already valid). Return [raw_total, adjusted].
Why this case matters
Neckbands and button bands pick up stitches at edge ratios and must fit the rib repeat.
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(edges, multiple, plus):
total = 0
for kind, n in edges:
if kind == 'vertical':
total += math.floor(Fraction(4 * n, 3) + Fraction(1, 2))
elif kind == 'horizontal':
total += n
elif kind == 'diagonal':
total += math.floor(Fraction(9 * n, 10) + Fraction(1, 2))
else:
return 'error: edge'
r = (total - plus) % multiple
adjusted = total if r == 0 else total + (multiple - r)
return [total, adjusted]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['regression: vertical ratio', [[['vertical', 30], ['vertical', 41]], 1, 3], [54, 54]],
['repair check: vertical ratio',
[[['vertical', 20], ['vertical', 41], ['horizontal', 20], ['diagonal', 7]], 4, 2], [72, 74]],
['generated control 1', [[['vertical', 20]], 2, 0], [15, 16]],
['generated control 2', [[['vertical', 20], ['vertical', 7]], 2, 1], [20, 21]],
['generated control 3', [[['diagonal', 60], ['vertical', 30], ['vertical', 22], ['horizontal', 22]], 6, 3],
[116, 117]]],
[['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['regression: vertical ratio',
[[['vertical', 18], ['diagonal', 60], ['vertical', 18], ['horizontal', 22]], 6, 2], [104, 104]],
['repair check: vertical ratio', [[['vertical', 22], ['horizontal', 13], ['vertical', 20]], 2, 1],
[45, 45]],
['generated control 1', [[['horizontal', 20], ['diagonal', 60]], 6, 0], [74, 78]],
['generated control 2', [[['diagonal', 60]], 4, 2], [54, 54]],
['generated control 3', [[['vertical', 20], ['vertical', 18]], 6, 1], [29, 31]]],
[['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['regression: vertical ratio', [[['horizontal', 10], ['vertical', 10]], 4, 1], [18, 21]],
['repair check: vertical ratio', [[['vertical', 18]], 4, 1], [14, 17]],
['generated control 1', [[['horizontal', 7], ['diagonal', 7], ['vertical', 7]], 4, 2], [18, 18]],
['generated control 2', [[['vertical', 18], ['horizontal', 18]], 4, 2], [32, 34]],
['generated control 3', [[['horizontal', 60], ['diagonal', 20], ['vertical', 20]], 4, 1], [93, 93]]],
[['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['regression: vertical ratio',
[[['vertical', 60], ['vertical', 10], ['horizontal', 30], ['vertical', 7]], 2, 2], [88, 88]],
['repair check: vertical ratio', [[['vertical', 20], ['diagonal', 41], ['diagonal', 10]], 6, 2], [61, 62]],
['generated control 1', [[['horizontal', 22]], 2, 2], [22, 22]],
['generated control 2', [[['diagonal', 60], ['vertical', 18], ['diagonal', 41], ['vertical', 22]], 1, 2],
[122, 122]],
['generated control 3', [[['horizontal', 7], ['horizontal', 22], ['vertical', 41], ['vertical', 41]], 1, 1],
[91, 91]]],
[['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['regression: vertical ratio', [[['horizontal', 7], ['vertical', 13]], 2, 2], [17, 18]],
['repair check: vertical ratio', [[['vertical', 22], ['horizontal', 18]], 1, 3], [35, 35]],
['generated control 1',
[[['vertical', 18], ['vertical', 13], ['diagonal', 41], ['horizontal', 41], ['curve', 10]], 2, 2],
'error: edge'],
['generated control 2', [[['vertical', 41], ['horizontal', 13], ['vertical', 20], ['vertical', 7]], 1, 0],
[64, 64]],
['generated control 3', [[['horizontal', 41]], 6, 3], [41, 45]]]]
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 |
|---|---|---|---|
| front neck | [128, 130] | [82, 82] | Failed |
| already valid | [22, 22] | [22, 22] | Passed |
| diagonal edge | [12, 12] | [12, 12] | Passed |
| regression: vertical ratio | [95, 95] | [54, 54] | Failed |
| repair check: vertical ratio | [108, 110] | [72, 74] | Failed |
| generated control 1 | [27, 28] | [15, 16] | Failed |
| generated control 2 | [36, 37] | [20, 21] | Failed |
| generated control 3 | [145, 147] | [116, 117] | Failed |
SHA-256 / ddbcd54ee35d6d36fc0b233201e7da2d4bbb3a20f88e514ce985a67bd05b0568
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(edges, multiple, plus):
total = 0
for kind, n in edges:
if kind == 'vertical':
total += math.floor(Fraction(2 * n, 3) + Fraction(1, 2))
elif kind == 'horizontal':
total += n
elif kind == 'diagonal':
total += math.floor(Fraction(9 * n, 10) + Fraction(1, 2))
else:
return 'error: edge'
r = (total - plus) % multiple
adjusted = total if r == 0 else total + (multiple - r)
return [total, adjusted]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['regression: vertical ratio', [[['vertical', 30], ['vertical', 41]], 1, 3], [54, 54]],
['repair check: vertical ratio',
[[['vertical', 20], ['vertical', 41], ['horizontal', 20], ['diagonal', 7]], 4, 2], [72, 74]],
['generated control 1', [[['vertical', 20]], 2, 0], [15, 16]],
['generated control 2', [[['vertical', 20], ['vertical', 7]], 2, 1], [20, 21]],
['generated control 3', [[['diagonal', 60], ['vertical', 30], ['vertical', 22], ['horizontal', 22]], 6, 3],
[116, 117]]],
[['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['regression: vertical ratio',
[[['vertical', 18], ['diagonal', 60], ['vertical', 18], ['horizontal', 22]], 6, 2], [104, 104]],
['repair check: vertical ratio', [[['vertical', 22], ['horizontal', 13], ['vertical', 20]], 2, 1],
[45, 45]],
['generated control 1', [[['horizontal', 20], ['diagonal', 60]], 6, 0], [74, 78]],
['generated control 2', [[['diagonal', 60]], 4, 2], [54, 54]],
['generated control 3', [[['vertical', 20], ['vertical', 18]], 6, 1], [29, 31]]],
[['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['regression: vertical ratio', [[['horizontal', 10], ['vertical', 10]], 4, 1], [18, 21]],
['repair check: vertical ratio', [[['vertical', 18]], 4, 1], [14, 17]],
['generated control 1', [[['horizontal', 7], ['diagonal', 7], ['vertical', 7]], 4, 2], [18, 18]],
['generated control 2', [[['vertical', 18], ['horizontal', 18]], 4, 2], [32, 34]],
['generated control 3', [[['horizontal', 60], ['diagonal', 20], ['vertical', 20]], 4, 1], [93, 93]]],
[['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['regression: vertical ratio',
[[['vertical', 60], ['vertical', 10], ['horizontal', 30], ['vertical', 7]], 2, 2], [88, 88]],
['repair check: vertical ratio', [[['vertical', 20], ['diagonal', 41], ['diagonal', 10]], 6, 2], [61, 62]],
['generated control 1', [[['horizontal', 22]], 2, 2], [22, 22]],
['generated control 2', [[['diagonal', 60], ['vertical', 18], ['diagonal', 41], ['vertical', 22]], 1, 2],
[122, 122]],
['generated control 3', [[['horizontal', 7], ['horizontal', 22], ['vertical', 41], ['vertical', 41]], 1, 1],
[91, 91]]],
[['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['regression: vertical ratio', [[['horizontal', 7], ['vertical', 13]], 2, 2], [17, 18]],
['repair check: vertical ratio', [[['vertical', 22], ['horizontal', 18]], 1, 3], [35, 35]],
['generated control 1',
[[['vertical', 18], ['vertical', 13], ['diagonal', 41], ['horizontal', 41], ['curve', 10]], 2, 2],
'error: edge'],
['generated control 2', [[['vertical', 41], ['horizontal', 13], ['vertical', 20], ['vertical', 7]], 1, 0],
[64, 64]],
['generated control 3', [[['horizontal', 41]], 6, 3], [41, 45]]]]
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 |
|---|---|---|---|
| front neck | [76, 78] | [82, 82] | Failed |
| already valid | [22, 22] | [22, 22] | Passed |
| diagonal edge | [12, 12] | [12, 12] | Passed |
| regression: vertical ratio | [47, 47] | [54, 54] | Failed |
| repair check: vertical ratio | [66, 66] | [72, 74] | Failed |
| generated control 1 | [13, 14] | [15, 16] | Failed |
| generated control 2 | [18, 19] | [20, 21] | Failed |
| generated control 3 | [111, 111] | [116, 117] | Failed |
SHA-256 / 932f86e0b4880a8ba3718b813f3dd77d2bcf5a0da7f45554bb7aff12dc5f14bd
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(edges, multiple, plus):
total = 0
for kind, n in edges:
if kind == 'vertical':
total += math.floor(Fraction(3 * n, 4) + Fraction(1, 2))
elif kind == 'horizontal':
total += n
elif kind == 'diagonal':
total += math.floor(Fraction(9 * n, 10) + Fraction(1, 2))
else:
return 'error: edge'
r = (total - plus) % multiple
adjusted = total if r == 0 else total + (multiple - r)
return [total, adjusted]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['regression: vertical ratio', [[['vertical', 30], ['vertical', 41]], 1, 3], [54, 54]],
['repair check: vertical ratio',
[[['vertical', 20], ['vertical', 41], ['horizontal', 20], ['diagonal', 7]], 4, 2], [72, 74]],
['generated control 1', [[['vertical', 20]], 2, 0], [15, 16]],
['generated control 2', [[['vertical', 20], ['vertical', 7]], 2, 1], [20, 21]],
['generated control 3', [[['diagonal', 60], ['vertical', 30], ['vertical', 22], ['horizontal', 22]], 6, 3],
[116, 117]]],
[['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['regression: vertical ratio',
[[['vertical', 18], ['diagonal', 60], ['vertical', 18], ['horizontal', 22]], 6, 2], [104, 104]],
['repair check: vertical ratio', [[['vertical', 22], ['horizontal', 13], ['vertical', 20]], 2, 1],
[45, 45]],
['generated control 1', [[['horizontal', 20], ['diagonal', 60]], 6, 0], [74, 78]],
['generated control 2', [[['diagonal', 60]], 4, 2], [54, 54]],
['generated control 3', [[['vertical', 20], ['vertical', 18]], 6, 1], [29, 31]]],
[['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['regression: vertical ratio', [[['horizontal', 10], ['vertical', 10]], 4, 1], [18, 21]],
['repair check: vertical ratio', [[['vertical', 18]], 4, 1], [14, 17]],
['generated control 1', [[['horizontal', 7], ['diagonal', 7], ['vertical', 7]], 4, 2], [18, 18]],
['generated control 2', [[['vertical', 18], ['horizontal', 18]], 4, 2], [32, 34]],
['generated control 3', [[['horizontal', 60], ['diagonal', 20], ['vertical', 20]], 4, 1], [93, 93]]],
[['unknown edge', [[['curve', 10]], 2, 0], 'error: edge'],
['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['regression: vertical ratio',
[[['vertical', 60], ['vertical', 10], ['horizontal', 30], ['vertical', 7]], 2, 2], [88, 88]],
['repair check: vertical ratio', [[['vertical', 20], ['diagonal', 41], ['diagonal', 10]], 6, 2], [61, 62]],
['generated control 1', [[['horizontal', 22]], 2, 2], [22, 22]],
['generated control 2', [[['diagonal', 60], ['vertical', 18], ['diagonal', 41], ['vertical', 22]], 1, 2],
[122, 122]],
['generated control 3', [[['horizontal', 7], ['horizontal', 22], ['vertical', 41], ['vertical', 41]], 1, 1],
[91, 91]]],
[['front neck', [[['vertical', 40], ['horizontal', 22], ['vertical', 40]], 4, 2], [82, 82]],
['already valid', [[['horizontal', 22]], 4, 2], [22, 22]],
['diagonal edge', [[['diagonal', 13]], 2, 0], [12, 12]],
['regression: vertical ratio', [[['horizontal', 7], ['vertical', 13]], 2, 2], [17, 18]],
['repair check: vertical ratio', [[['vertical', 22], ['horizontal', 18]], 1, 3], [35, 35]],
['generated control 1',
[[['vertical', 18], ['vertical', 13], ['diagonal', 41], ['horizontal', 41], ['curve', 10]], 2, 2],
'error: edge'],
['generated control 2', [[['vertical', 41], ['horizontal', 13], ['vertical', 20], ['vertical', 7]], 1, 0],
[64, 64]],
['generated control 3', [[['horizontal', 41]], 6, 3], [41, 45]]]]
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 |
|---|---|---|---|
| front neck | [82, 82] | [82, 82] | Passed |
| already valid | [22, 22] | [22, 22] | Passed |
| diagonal edge | [12, 12] | [12, 12] | Passed |
| regression: vertical ratio | [54, 54] | [54, 54] | Passed |
| repair check: vertical ratio | [72, 74] | [72, 74] | Passed |
| generated control 1 | [15, 16] | [15, 16] | Passed |
| generated control 2 | [20, 21] | [20, 21] | Passed |
| generated control 3 | [116, 117] | [116, 117] | Passed |
SHA-256 / 1b0a5fc6cfebc2b84f993b101bb7a735b9f9937727b40ad221770793b6ecc764
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:32.746471+00:00.
Case digest / 26e935b9e6a4f537f4dd3fd075d4497cd2437b0c344257e66b19a01eca6e925d