FAILURE MAP
← Case archive

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

Knitting chart row reader: WS swap and direction · case 01

Wrong-side rows tell the knitter to knit stitches that should be purled.

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

ROOT CAUSE

WS rows are read left-to-right but symbols are not converted to their WS equivalents.

VERIFIED REPAIR

Swap each symbol for its WS equivalent and read left-to-right.

Unsuccessful approach: Reversing the row after swapping reads WS rows in the RS direction.

Case contract

chart rows are listed bottom-up (row 1 first), cells left-to-right as drawn. Rounds and RS rows read right-to-left unchanged. Flat WS rows (even rows, or odd rows when start_ws) read left-to-right with swaps k<->p, k2tog->p2tog, ssk->ssp, yo stays. Runs of identical stitches merge: k/p as "k3", others as "yo" or "yo x2". Row outside 1..len -> error.

Why this case matters

Chart readers must flip reading direction and stitch meaning on wrong-side rows.

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(chart, row, in_round, start_ws):
    SWAP = {'k': 'p', 'p': 'k', 'k2tog': 'p2tog', 'ssk': 'ssp', 'yo': 'yo'}
    if not 1 <= row <= len(chart):
        return 'error: no such row'
    cells = list(chart[row - 1])
    ws = (not in_round) and ((row % 2 == 0) != start_ws)
    if ws:
        seq = list(cells)
    else:
        seq = cells[::-1]
    out = []
    for c in seq:
        if out and out[-1][0] == c:
            out[-1][1] += 1
        else:
            out.append([c, 1])
    return ', '.join(c + str(n) if c in ('k', 'p') else (c if n == 1 else '%s x%d' % (c, n)) for c, n in out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['regression: WS swap and direction',
   [[['yo', 'yo', 'k', 'p', 'k', 'yo', 'yo'], ['p', 'yo', 'yo', 'yo', 'ssk', 'ssk', 'k'],
     ['yo', 'k', 'k2tog', 'yo', 'p', 'p', 'ssk']],
    3, False, True],
   'yo, p1, p2tog, yo, k2, ssp'],
  ['repair check: WS swap and direction',
   [[['k2tog', 'yo', 'yo', 'k2tog', 'ssk', 'yo', 'ssk', 'ssk'],
     ['p', 'k', 'yo', 'ssk', 'yo', 'k', 'yo', 'yo'],
     ['ssk', 'ssk', 'k2tog', 'k2tog', 'ssk', 'yo', 'ssk', 'yo'],
     ['ssk', 'k2tog', 'p', 'ssk', 'k', 'p', 'yo', 'yo']],
    2, False, False],
   'k1, p1, yo, ssp, yo, p1, yo x2'],
  ['generated control 1',
   [[['ssk', 'k2tog', 'yo', 'yo', 'k'], ['ssk', 'p', 'ssk', 'p', 'k'], ['k2tog', 'k', 'ssk', 'ssk', 'yo']], 3,
    False, False],
   'yo, ssk x2, k1, k2tog'],
  ['generated control 2',
   [[['k2tog', 'yo', 'yo', 'k', 'p', 'ssk'], ['ssk', 'k', 'p', 'p', 'p', 'k2tog'],
     ['k2tog', 'k', 'ssk', 'yo', 'p', 'k2tog'], ['ssk', 'ssk', 'k2tog', 'p', 'ssk', 'ssk']],
    1, False, False],
   'ssk, p1, k1, yo x2, k2tog'],
  ['generated control 3',
   [[['p', 'p', 'k', 'p', 'yo', 'yo'], ['p', 'k2tog', 'yo', 'p', 'ssk', 'k2tog'],
     ['k2tog', 'yo', 'yo', 'ssk', 'k2tog', 'k'], ['k', 'yo', 'ssk', 'yo', 'yo', 'k'],
     ['k2tog', 'yo', 'yo', 'yo', 'k', 'k']],
    4, False, False],
   'p1, yo, ssp, yo x2, p1']],
 [['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['regression: WS swap and direction',
   [[['k', 'k2tog', 'k2tog'], ['k', 'yo', 'p'], ['ssk', 'k', 'yo'], ['yo', 'ssk', 'yo'], ['yo', 'p', 'ssk']],
    2, False, False],
   'p1, yo, k1'],
  ['repair check: WS swap and direction',
   [[['ssk', 'yo', 'yo', 'k2tog'], ['ssk', 'p', 'yo', 'p']], 2, False, False], 'ssp, k1, yo, k1'],
  ['generated control 1',
   [[['yo', 'ssk', 'k', 'yo', 'yo', 'yo', 'k', 'ssk'],
     ['k2tog', 'p', 'k2tog', 'yo', 'ssk', 'yo', 'yo', 'k2tog'],
     ['k2tog', 'yo', 'p', 'ssk', 'k', 'ssk', 'ssk', 'k2tog'],
     ['ssk', 'ssk', 'k', 'yo', 'ssk', 'k', 'k', 'p']],
    3, True, False],
   'k2tog, ssk x2, k1, ssk, p1, yo, k2tog'],
  ['generated control 2',
   [[['yo', 'k2tog', 'ssk', 'yo', 'ssk', 'p', 'k2tog', 'yo'],
     ['p', 'k2tog', 'p', 'k', 'k2tog', 'ssk', 'ssk', 'p']],
    1, True, True],
   'yo, k2tog, p1, ssk, yo, ssk, k2tog, yo'],
  ['generated control 3',
   [[['k2tog', 'k', 'yo', 'yo', 'yo', 'k2tog', 'ssk', 'k2tog'],
     ['yo', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'ssk', 'p']],
    1, False, False],
   'k2tog, ssk, k2tog, yo x3, k1, k2tog']],
 [['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['regression: WS swap and direction',
   [[['yo', 'yo', 'k', 'p', 'k2tog', 'p'], ['ssk', 'p', 'p', 'ssk', 'yo', 'ssk'],
     ['yo', 'ssk', 'k', 'ssk', 'p', 'ssk'], ['p', 'p', 'ssk', 'yo', 'yo', 'k2tog'],
     ['k2tog', 'ssk', 'p', 'p', 'p', 'ssk']],
    2, False, False],
   'ssp, k2, ssp, yo, ssp'],
  ['repair check: WS swap and direction',
   [[['yo', 'p', 'yo', 'yo', 'yo'], ['ssk', 'k2tog', 'k2tog', 'p', 'yo'],
     ['yo', 'k2tog', 'ssk', 'k2tog', 'yo'], ['yo', 'k2tog', 'ssk', 'p', 'k'], ['p', 'ssk', 'k', 'k', 'yo'],
     ['k2tog', 'p', 'k', 'p', 'yo']],
    6, False, False],
   'p2tog, k1, p1, k1, yo'],
  ['generated control 1',
   [[['yo', 'yo', 'k2tog', 'k2tog', 'ssk', 'k2tog', 'p'],
     ['ssk', 'ssk', 'k2tog', 'p', 'k2tog', 'k2tog', 'k2tog'], ['yo', 'p', 'ssk', 'ssk', 'k', 'k2tog', 'p'],
     ['k', 'ssk', 'k', 'ssk', 'yo', 'k2tog', 'ssk']],
    1, False, False],
   'p1, k2tog, ssk, k2tog x2, yo x2'],
  ['generated control 2',
   [[['ssk', 'yo', 'k2tog', 'k', 'yo', 'yo', 'yo', 'ssk'],
     ['k2tog', 'k2tog', 'k', 'p', 'p', 'k2tog', 'yo', 'yo'],
     ['k2tog', 'ssk', 'k2tog', 'yo', 'k2tog', 'k', 'k2tog', 'k2tog']],
    3, True, False],
   'k2tog x2, k1, k2tog, yo, k2tog, ssk, k2tog'],
  ['generated control 3',
   [[['k2tog', 'k', 'k', 'k2tog', 'k2tog', 'k'], ['k', 'ssk', 'yo', 'ssk', 'yo', 'k'],
     ['yo', 'k2tog', 'k2tog', 'p', 'yo', 'p'], ['p', 'k', 'ssk', 'p', 'k', 'yo']],
    2, True, True],
   'k1, yo, ssk, yo, ssk, k1']],
 [['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['regression: WS swap and direction',
   [[['p', 'p', 'yo', 'yo', 'ssk', 'yo'], ['k2tog', 'ssk', 'k', 'k2tog', 'yo', 'p']], 2, False, False],
   'p2tog, ssp, p1, p2tog, yo, k1'],
  ['repair check: WS swap and direction',
   [[['k2tog', 'p', 'k', 'p', 'ssk', 'p', 'p', 'yo'], ['yo', 'ssk', 'k', 'k2tog', 'ssk', 'p', 'p', 'k2tog'],
     ['k2tog', 'k', 'ssk', 'k', 'ssk', 'k2tog', 'yo', 'k2tog']],
    3, False, True],
   'p2tog, p1, ssp, p1, ssp, p2tog, yo, p2tog'],
  ['generated control 1',
   [[['k', 'k', 'yo', 'k', 'p', 'k2tog', 'ssk'], ['yo', 'ssk', 'k', 'p', 'p', 'yo', 'k']], 2, True, False],
   'k1, yo, p2, k1, ssk, yo'],
  ['generated control 2',
   [[['p', 'ssk', 'yo', 'k2tog', 'ssk', 'yo', 'yo'], ['ssk', 'p', 'p', 'p', 'k', 'k', 'p'],
     ['k2tog', 'k', 'k', 'ssk', 'k', 'ssk', 'k'], ['k', 'p', 'ssk', 'ssk', 'k', 'yo', 'yo'],
     ['k', 'k2tog', 'p', 'yo', 'k2tog', 'p', 'k2tog']],
    1, False, False],
   'yo x2, ssk, k2tog, yo, ssk, p1'],
  ['generated control 3',
   [[['ssk', 'k2tog', 'ssk', 'p', 'ssk', 'p'], ['ssk', 'k', 'k', 'k2tog', 'p', 'ssk'],
     ['yo', 'yo', 'p', 'ssk', 'p', 'k']],
    1, True, False],
   'p1, ssk, p1, ssk, k2tog, ssk']],
 [['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['regression: WS swap and direction',
   [[['k2tog', 'k', 'k', 'k', 'yo', 'k2tog', 'ssk', 'ssk'], ['ssk', 'k', 'ssk', 'p', 'p', 'k', 'p', 'k2tog'],
     ['k2tog', 'p', 'k', 'k2tog', 'k2tog', 'ssk', 'yo', 'k2tog'],
     ['k', 'p', 'k2tog', 'k2tog', 'yo', 'k2tog', 'p', 'yo'],
     ['ssk', 'p', 'yo', 'p', 'p', 'k2tog', 'yo', 'k2tog']],
    1, False, True],
   'p2tog, p3, yo, p2tog, ssp x2'],
  ['repair check: WS swap and direction',
   [[['ssk', 'k2tog', 'k', 'k', 'yo', 'yo', 'yo', 'yo'], ['ssk', 'p', 'p', 'yo', 'ssk', 'p', 'p', 'k'],
     ['yo', 'k', 'ssk', 'yo', 'k2tog', 'k', 'k', 'p'],
     ['ssk', 'p', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'k']],
    3, False, True],
   'yo, p1, ssp, yo, p2tog, p2, k1'],
  ['generated control 1',
   [[['ssk', 'ssk', 'ssk', 'yo'], ['ssk', 'k', 'yo', 'yo'], ['k2tog', 'k', 'k2tog', 'yo'],
     ['k', 'k', 'k', 'k2tog'], ['p', 'k', 'p', 'p']],
    5, True, False],
   'p2, k1, p1'],
  ['generated control 2',
   [[['k2tog', 'ssk', 'yo', 'k', 'yo', 'yo', 'k'], ['k2tog', 'k2tog', 'k', 'ssk', 'k', 'yo', 'k2tog'],
     ['ssk', 'ssk', 'k', 'p', 'p', 'k2tog', 'p']],
    2, False, False],
   'p2tog x2, p1, ssp, p1, yo, p2tog'],
  ['generated control 3',
   [[['k2tog', 'p', 'p', 'p'], ['p', 'yo', 'k', 'k'], ['k2tog', 'k', 'k', 'ssk']], 1, True, False],
   'p3, k2tog']]]
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
RS rowk2tog, yo, p1, k2k2tog, yo, p1, k2Passed
WS row swappedp2, k1, ssk, k1k2, p1, ssp, p1Failed
in the roundk1, sskk1, sskPassed
regression: WS swap and directionyo, k1, k2tog, yo, p2, sskyo, p1, p2tog, yo, k2, sspFailed
repair check: WS swap and directionp1, k1, yo, ssk, yo, k1, yo x2k1, p1, yo, ssp, yo, p1, yo x2Failed
generated control 1yo, ssk x2, k1, k2togyo, ssk x2, k1, k2togPassed
generated control 2ssk, p1, k1, yo x2, k2togssk, p1, k1, yo x2, k2togPassed
generated control 3k1, yo, ssk, yo x2, k1p1, yo, ssp, yo x2, p1Failed

SHA-256 / c4cd459770dc59c48076aed3e6ecae218c58c15083715c8d89bc25900ca8d059

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(chart, row, in_round, start_ws):
    SWAP = {'k': 'p', 'p': 'k', 'k2tog': 'p2tog', 'ssk': 'ssp', 'yo': 'yo'}
    if not 1 <= row <= len(chart):
        return 'error: no such row'
    cells = list(chart[row - 1])
    ws = (not in_round) and ((row % 2 == 0) != start_ws)
    if ws:
        seq = [SWAP.get(c, c) for c in cells[::-1]]
    else:
        seq = cells[::-1]
    out = []
    for c in seq:
        if out and out[-1][0] == c:
            out[-1][1] += 1
        else:
            out.append([c, 1])
    return ', '.join(c + str(n) if c in ('k', 'p') else (c if n == 1 else '%s x%d' % (c, n)) for c, n in out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['regression: WS swap and direction',
   [[['yo', 'yo', 'k', 'p', 'k', 'yo', 'yo'], ['p', 'yo', 'yo', 'yo', 'ssk', 'ssk', 'k'],
     ['yo', 'k', 'k2tog', 'yo', 'p', 'p', 'ssk']],
    3, False, True],
   'yo, p1, p2tog, yo, k2, ssp'],
  ['repair check: WS swap and direction',
   [[['k2tog', 'yo', 'yo', 'k2tog', 'ssk', 'yo', 'ssk', 'ssk'],
     ['p', 'k', 'yo', 'ssk', 'yo', 'k', 'yo', 'yo'],
     ['ssk', 'ssk', 'k2tog', 'k2tog', 'ssk', 'yo', 'ssk', 'yo'],
     ['ssk', 'k2tog', 'p', 'ssk', 'k', 'p', 'yo', 'yo']],
    2, False, False],
   'k1, p1, yo, ssp, yo, p1, yo x2'],
  ['generated control 1',
   [[['ssk', 'k2tog', 'yo', 'yo', 'k'], ['ssk', 'p', 'ssk', 'p', 'k'], ['k2tog', 'k', 'ssk', 'ssk', 'yo']], 3,
    False, False],
   'yo, ssk x2, k1, k2tog'],
  ['generated control 2',
   [[['k2tog', 'yo', 'yo', 'k', 'p', 'ssk'], ['ssk', 'k', 'p', 'p', 'p', 'k2tog'],
     ['k2tog', 'k', 'ssk', 'yo', 'p', 'k2tog'], ['ssk', 'ssk', 'k2tog', 'p', 'ssk', 'ssk']],
    1, False, False],
   'ssk, p1, k1, yo x2, k2tog'],
  ['generated control 3',
   [[['p', 'p', 'k', 'p', 'yo', 'yo'], ['p', 'k2tog', 'yo', 'p', 'ssk', 'k2tog'],
     ['k2tog', 'yo', 'yo', 'ssk', 'k2tog', 'k'], ['k', 'yo', 'ssk', 'yo', 'yo', 'k'],
     ['k2tog', 'yo', 'yo', 'yo', 'k', 'k']],
    4, False, False],
   'p1, yo, ssp, yo x2, p1']],
 [['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['regression: WS swap and direction',
   [[['k', 'k2tog', 'k2tog'], ['k', 'yo', 'p'], ['ssk', 'k', 'yo'], ['yo', 'ssk', 'yo'], ['yo', 'p', 'ssk']],
    2, False, False],
   'p1, yo, k1'],
  ['repair check: WS swap and direction',
   [[['ssk', 'yo', 'yo', 'k2tog'], ['ssk', 'p', 'yo', 'p']], 2, False, False], 'ssp, k1, yo, k1'],
  ['generated control 1',
   [[['yo', 'ssk', 'k', 'yo', 'yo', 'yo', 'k', 'ssk'],
     ['k2tog', 'p', 'k2tog', 'yo', 'ssk', 'yo', 'yo', 'k2tog'],
     ['k2tog', 'yo', 'p', 'ssk', 'k', 'ssk', 'ssk', 'k2tog'],
     ['ssk', 'ssk', 'k', 'yo', 'ssk', 'k', 'k', 'p']],
    3, True, False],
   'k2tog, ssk x2, k1, ssk, p1, yo, k2tog'],
  ['generated control 2',
   [[['yo', 'k2tog', 'ssk', 'yo', 'ssk', 'p', 'k2tog', 'yo'],
     ['p', 'k2tog', 'p', 'k', 'k2tog', 'ssk', 'ssk', 'p']],
    1, True, True],
   'yo, k2tog, p1, ssk, yo, ssk, k2tog, yo'],
  ['generated control 3',
   [[['k2tog', 'k', 'yo', 'yo', 'yo', 'k2tog', 'ssk', 'k2tog'],
     ['yo', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'ssk', 'p']],
    1, False, False],
   'k2tog, ssk, k2tog, yo x3, k1, k2tog']],
 [['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['regression: WS swap and direction',
   [[['yo', 'yo', 'k', 'p', 'k2tog', 'p'], ['ssk', 'p', 'p', 'ssk', 'yo', 'ssk'],
     ['yo', 'ssk', 'k', 'ssk', 'p', 'ssk'], ['p', 'p', 'ssk', 'yo', 'yo', 'k2tog'],
     ['k2tog', 'ssk', 'p', 'p', 'p', 'ssk']],
    2, False, False],
   'ssp, k2, ssp, yo, ssp'],
  ['repair check: WS swap and direction',
   [[['yo', 'p', 'yo', 'yo', 'yo'], ['ssk', 'k2tog', 'k2tog', 'p', 'yo'],
     ['yo', 'k2tog', 'ssk', 'k2tog', 'yo'], ['yo', 'k2tog', 'ssk', 'p', 'k'], ['p', 'ssk', 'k', 'k', 'yo'],
     ['k2tog', 'p', 'k', 'p', 'yo']],
    6, False, False],
   'p2tog, k1, p1, k1, yo'],
  ['generated control 1',
   [[['yo', 'yo', 'k2tog', 'k2tog', 'ssk', 'k2tog', 'p'],
     ['ssk', 'ssk', 'k2tog', 'p', 'k2tog', 'k2tog', 'k2tog'], ['yo', 'p', 'ssk', 'ssk', 'k', 'k2tog', 'p'],
     ['k', 'ssk', 'k', 'ssk', 'yo', 'k2tog', 'ssk']],
    1, False, False],
   'p1, k2tog, ssk, k2tog x2, yo x2'],
  ['generated control 2',
   [[['ssk', 'yo', 'k2tog', 'k', 'yo', 'yo', 'yo', 'ssk'],
     ['k2tog', 'k2tog', 'k', 'p', 'p', 'k2tog', 'yo', 'yo'],
     ['k2tog', 'ssk', 'k2tog', 'yo', 'k2tog', 'k', 'k2tog', 'k2tog']],
    3, True, False],
   'k2tog x2, k1, k2tog, yo, k2tog, ssk, k2tog'],
  ['generated control 3',
   [[['k2tog', 'k', 'k', 'k2tog', 'k2tog', 'k'], ['k', 'ssk', 'yo', 'ssk', 'yo', 'k'],
     ['yo', 'k2tog', 'k2tog', 'p', 'yo', 'p'], ['p', 'k', 'ssk', 'p', 'k', 'yo']],
    2, True, True],
   'k1, yo, ssk, yo, ssk, k1']],
 [['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['regression: WS swap and direction',
   [[['p', 'p', 'yo', 'yo', 'ssk', 'yo'], ['k2tog', 'ssk', 'k', 'k2tog', 'yo', 'p']], 2, False, False],
   'p2tog, ssp, p1, p2tog, yo, k1'],
  ['repair check: WS swap and direction',
   [[['k2tog', 'p', 'k', 'p', 'ssk', 'p', 'p', 'yo'], ['yo', 'ssk', 'k', 'k2tog', 'ssk', 'p', 'p', 'k2tog'],
     ['k2tog', 'k', 'ssk', 'k', 'ssk', 'k2tog', 'yo', 'k2tog']],
    3, False, True],
   'p2tog, p1, ssp, p1, ssp, p2tog, yo, p2tog'],
  ['generated control 1',
   [[['k', 'k', 'yo', 'k', 'p', 'k2tog', 'ssk'], ['yo', 'ssk', 'k', 'p', 'p', 'yo', 'k']], 2, True, False],
   'k1, yo, p2, k1, ssk, yo'],
  ['generated control 2',
   [[['p', 'ssk', 'yo', 'k2tog', 'ssk', 'yo', 'yo'], ['ssk', 'p', 'p', 'p', 'k', 'k', 'p'],
     ['k2tog', 'k', 'k', 'ssk', 'k', 'ssk', 'k'], ['k', 'p', 'ssk', 'ssk', 'k', 'yo', 'yo'],
     ['k', 'k2tog', 'p', 'yo', 'k2tog', 'p', 'k2tog']],
    1, False, False],
   'yo x2, ssk, k2tog, yo, ssk, p1'],
  ['generated control 3',
   [[['ssk', 'k2tog', 'ssk', 'p', 'ssk', 'p'], ['ssk', 'k', 'k', 'k2tog', 'p', 'ssk'],
     ['yo', 'yo', 'p', 'ssk', 'p', 'k']],
    1, True, False],
   'p1, ssk, p1, ssk, k2tog, ssk']],
 [['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['regression: WS swap and direction',
   [[['k2tog', 'k', 'k', 'k', 'yo', 'k2tog', 'ssk', 'ssk'], ['ssk', 'k', 'ssk', 'p', 'p', 'k', 'p', 'k2tog'],
     ['k2tog', 'p', 'k', 'k2tog', 'k2tog', 'ssk', 'yo', 'k2tog'],
     ['k', 'p', 'k2tog', 'k2tog', 'yo', 'k2tog', 'p', 'yo'],
     ['ssk', 'p', 'yo', 'p', 'p', 'k2tog', 'yo', 'k2tog']],
    1, False, True],
   'p2tog, p3, yo, p2tog, ssp x2'],
  ['repair check: WS swap and direction',
   [[['ssk', 'k2tog', 'k', 'k', 'yo', 'yo', 'yo', 'yo'], ['ssk', 'p', 'p', 'yo', 'ssk', 'p', 'p', 'k'],
     ['yo', 'k', 'ssk', 'yo', 'k2tog', 'k', 'k', 'p'],
     ['ssk', 'p', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'k']],
    3, False, True],
   'yo, p1, ssp, yo, p2tog, p2, k1'],
  ['generated control 1',
   [[['ssk', 'ssk', 'ssk', 'yo'], ['ssk', 'k', 'yo', 'yo'], ['k2tog', 'k', 'k2tog', 'yo'],
     ['k', 'k', 'k', 'k2tog'], ['p', 'k', 'p', 'p']],
    5, True, False],
   'p2, k1, p1'],
  ['generated control 2',
   [[['k2tog', 'ssk', 'yo', 'k', 'yo', 'yo', 'k'], ['k2tog', 'k2tog', 'k', 'ssk', 'k', 'yo', 'k2tog'],
     ['ssk', 'ssk', 'k', 'p', 'p', 'k2tog', 'p']],
    2, False, False],
   'p2tog x2, p1, ssp, p1, yo, p2tog'],
  ['generated control 3',
   [[['k2tog', 'p', 'p', 'p'], ['p', 'yo', 'k', 'k'], ['k2tog', 'k', 'k', 'ssk']], 1, True, False],
   'p3, k2tog']]]
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
RS rowk2tog, yo, p1, k2k2tog, yo, p1, k2Passed
WS row swappedp1, ssp, p1, k2k2, p1, ssp, p1Failed
in the roundk1, sskk1, sskPassed
regression: WS swap and directionssp, k2, yo, p2tog, p1, yoyo, p1, p2tog, yo, k2, sspFailed
repair check: WS swap and directionyo x2, p1, yo, ssp, yo, p1, k1k1, p1, yo, ssp, yo, p1, yo x2Failed
generated control 1yo, ssk x2, k1, k2togyo, ssk x2, k1, k2togPassed
generated control 2ssk, p1, k1, yo x2, k2togssk, p1, k1, yo x2, k2togPassed
generated control 3p1, yo x2, ssp, yo, p1p1, yo, ssp, yo x2, p1Failed

SHA-256 / fc0edb87d4301c479cb18dcb6e29b0595ddfbe34955b1c72fcf077e4aec0cffe

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(chart, row, in_round, start_ws):
    SWAP = {'k': 'p', 'p': 'k', 'k2tog': 'p2tog', 'ssk': 'ssp', 'yo': 'yo'}
    if not 1 <= row <= len(chart):
        return 'error: no such row'
    cells = list(chart[row - 1])
    ws = (not in_round) and ((row % 2 == 0) != start_ws)
    if ws:
        seq = [SWAP.get(c, c) for c in cells]
    else:
        seq = cells[::-1]
    out = []
    for c in seq:
        if out and out[-1][0] == c:
            out[-1][1] += 1
        else:
            out.append([c, 1])
    return ', '.join(c + str(n) if c in ('k', 'p') else (c if n == 1 else '%s x%d' % (c, n)) for c, n in out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['regression: WS swap and direction',
   [[['yo', 'yo', 'k', 'p', 'k', 'yo', 'yo'], ['p', 'yo', 'yo', 'yo', 'ssk', 'ssk', 'k'],
     ['yo', 'k', 'k2tog', 'yo', 'p', 'p', 'ssk']],
    3, False, True],
   'yo, p1, p2tog, yo, k2, ssp'],
  ['repair check: WS swap and direction',
   [[['k2tog', 'yo', 'yo', 'k2tog', 'ssk', 'yo', 'ssk', 'ssk'],
     ['p', 'k', 'yo', 'ssk', 'yo', 'k', 'yo', 'yo'],
     ['ssk', 'ssk', 'k2tog', 'k2tog', 'ssk', 'yo', 'ssk', 'yo'],
     ['ssk', 'k2tog', 'p', 'ssk', 'k', 'p', 'yo', 'yo']],
    2, False, False],
   'k1, p1, yo, ssp, yo, p1, yo x2'],
  ['generated control 1',
   [[['ssk', 'k2tog', 'yo', 'yo', 'k'], ['ssk', 'p', 'ssk', 'p', 'k'], ['k2tog', 'k', 'ssk', 'ssk', 'yo']], 3,
    False, False],
   'yo, ssk x2, k1, k2tog'],
  ['generated control 2',
   [[['k2tog', 'yo', 'yo', 'k', 'p', 'ssk'], ['ssk', 'k', 'p', 'p', 'p', 'k2tog'],
     ['k2tog', 'k', 'ssk', 'yo', 'p', 'k2tog'], ['ssk', 'ssk', 'k2tog', 'p', 'ssk', 'ssk']],
    1, False, False],
   'ssk, p1, k1, yo x2, k2tog'],
  ['generated control 3',
   [[['p', 'p', 'k', 'p', 'yo', 'yo'], ['p', 'k2tog', 'yo', 'p', 'ssk', 'k2tog'],
     ['k2tog', 'yo', 'yo', 'ssk', 'k2tog', 'k'], ['k', 'yo', 'ssk', 'yo', 'yo', 'k'],
     ['k2tog', 'yo', 'yo', 'yo', 'k', 'k']],
    4, False, False],
   'p1, yo, ssp, yo x2, p1']],
 [['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['regression: WS swap and direction',
   [[['k', 'k2tog', 'k2tog'], ['k', 'yo', 'p'], ['ssk', 'k', 'yo'], ['yo', 'ssk', 'yo'], ['yo', 'p', 'ssk']],
    2, False, False],
   'p1, yo, k1'],
  ['repair check: WS swap and direction',
   [[['ssk', 'yo', 'yo', 'k2tog'], ['ssk', 'p', 'yo', 'p']], 2, False, False], 'ssp, k1, yo, k1'],
  ['generated control 1',
   [[['yo', 'ssk', 'k', 'yo', 'yo', 'yo', 'k', 'ssk'],
     ['k2tog', 'p', 'k2tog', 'yo', 'ssk', 'yo', 'yo', 'k2tog'],
     ['k2tog', 'yo', 'p', 'ssk', 'k', 'ssk', 'ssk', 'k2tog'],
     ['ssk', 'ssk', 'k', 'yo', 'ssk', 'k', 'k', 'p']],
    3, True, False],
   'k2tog, ssk x2, k1, ssk, p1, yo, k2tog'],
  ['generated control 2',
   [[['yo', 'k2tog', 'ssk', 'yo', 'ssk', 'p', 'k2tog', 'yo'],
     ['p', 'k2tog', 'p', 'k', 'k2tog', 'ssk', 'ssk', 'p']],
    1, True, True],
   'yo, k2tog, p1, ssk, yo, ssk, k2tog, yo'],
  ['generated control 3',
   [[['k2tog', 'k', 'yo', 'yo', 'yo', 'k2tog', 'ssk', 'k2tog'],
     ['yo', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'ssk', 'p']],
    1, False, False],
   'k2tog, ssk, k2tog, yo x3, k1, k2tog']],
 [['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['regression: WS swap and direction',
   [[['yo', 'yo', 'k', 'p', 'k2tog', 'p'], ['ssk', 'p', 'p', 'ssk', 'yo', 'ssk'],
     ['yo', 'ssk', 'k', 'ssk', 'p', 'ssk'], ['p', 'p', 'ssk', 'yo', 'yo', 'k2tog'],
     ['k2tog', 'ssk', 'p', 'p', 'p', 'ssk']],
    2, False, False],
   'ssp, k2, ssp, yo, ssp'],
  ['repair check: WS swap and direction',
   [[['yo', 'p', 'yo', 'yo', 'yo'], ['ssk', 'k2tog', 'k2tog', 'p', 'yo'],
     ['yo', 'k2tog', 'ssk', 'k2tog', 'yo'], ['yo', 'k2tog', 'ssk', 'p', 'k'], ['p', 'ssk', 'k', 'k', 'yo'],
     ['k2tog', 'p', 'k', 'p', 'yo']],
    6, False, False],
   'p2tog, k1, p1, k1, yo'],
  ['generated control 1',
   [[['yo', 'yo', 'k2tog', 'k2tog', 'ssk', 'k2tog', 'p'],
     ['ssk', 'ssk', 'k2tog', 'p', 'k2tog', 'k2tog', 'k2tog'], ['yo', 'p', 'ssk', 'ssk', 'k', 'k2tog', 'p'],
     ['k', 'ssk', 'k', 'ssk', 'yo', 'k2tog', 'ssk']],
    1, False, False],
   'p1, k2tog, ssk, k2tog x2, yo x2'],
  ['generated control 2',
   [[['ssk', 'yo', 'k2tog', 'k', 'yo', 'yo', 'yo', 'ssk'],
     ['k2tog', 'k2tog', 'k', 'p', 'p', 'k2tog', 'yo', 'yo'],
     ['k2tog', 'ssk', 'k2tog', 'yo', 'k2tog', 'k', 'k2tog', 'k2tog']],
    3, True, False],
   'k2tog x2, k1, k2tog, yo, k2tog, ssk, k2tog'],
  ['generated control 3',
   [[['k2tog', 'k', 'k', 'k2tog', 'k2tog', 'k'], ['k', 'ssk', 'yo', 'ssk', 'yo', 'k'],
     ['yo', 'k2tog', 'k2tog', 'p', 'yo', 'p'], ['p', 'k', 'ssk', 'p', 'k', 'yo']],
    2, True, True],
   'k1, yo, ssk, yo, ssk, k1']],
 [['out of range', [[['k']], 3, False, False], 'error: no such row'],
  ['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['regression: WS swap and direction',
   [[['p', 'p', 'yo', 'yo', 'ssk', 'yo'], ['k2tog', 'ssk', 'k', 'k2tog', 'yo', 'p']], 2, False, False],
   'p2tog, ssp, p1, p2tog, yo, k1'],
  ['repair check: WS swap and direction',
   [[['k2tog', 'p', 'k', 'p', 'ssk', 'p', 'p', 'yo'], ['yo', 'ssk', 'k', 'k2tog', 'ssk', 'p', 'p', 'k2tog'],
     ['k2tog', 'k', 'ssk', 'k', 'ssk', 'k2tog', 'yo', 'k2tog']],
    3, False, True],
   'p2tog, p1, ssp, p1, ssp, p2tog, yo, p2tog'],
  ['generated control 1',
   [[['k', 'k', 'yo', 'k', 'p', 'k2tog', 'ssk'], ['yo', 'ssk', 'k', 'p', 'p', 'yo', 'k']], 2, True, False],
   'k1, yo, p2, k1, ssk, yo'],
  ['generated control 2',
   [[['p', 'ssk', 'yo', 'k2tog', 'ssk', 'yo', 'yo'], ['ssk', 'p', 'p', 'p', 'k', 'k', 'p'],
     ['k2tog', 'k', 'k', 'ssk', 'k', 'ssk', 'k'], ['k', 'p', 'ssk', 'ssk', 'k', 'yo', 'yo'],
     ['k', 'k2tog', 'p', 'yo', 'k2tog', 'p', 'k2tog']],
    1, False, False],
   'yo x2, ssk, k2tog, yo, ssk, p1'],
  ['generated control 3',
   [[['ssk', 'k2tog', 'ssk', 'p', 'ssk', 'p'], ['ssk', 'k', 'k', 'k2tog', 'p', 'ssk'],
     ['yo', 'yo', 'p', 'ssk', 'p', 'k']],
    1, True, False],
   'p1, ssk, p1, ssk, k2tog, ssk']],
 [['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
   'k2tog, yo, p1, k2'],
  ['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
   'k2, p1, ssp, p1'],
  ['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
  ['regression: WS swap and direction',
   [[['k2tog', 'k', 'k', 'k', 'yo', 'k2tog', 'ssk', 'ssk'], ['ssk', 'k', 'ssk', 'p', 'p', 'k', 'p', 'k2tog'],
     ['k2tog', 'p', 'k', 'k2tog', 'k2tog', 'ssk', 'yo', 'k2tog'],
     ['k', 'p', 'k2tog', 'k2tog', 'yo', 'k2tog', 'p', 'yo'],
     ['ssk', 'p', 'yo', 'p', 'p', 'k2tog', 'yo', 'k2tog']],
    1, False, True],
   'p2tog, p3, yo, p2tog, ssp x2'],
  ['repair check: WS swap and direction',
   [[['ssk', 'k2tog', 'k', 'k', 'yo', 'yo', 'yo', 'yo'], ['ssk', 'p', 'p', 'yo', 'ssk', 'p', 'p', 'k'],
     ['yo', 'k', 'ssk', 'yo', 'k2tog', 'k', 'k', 'p'],
     ['ssk', 'p', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'k']],
    3, False, True],
   'yo, p1, ssp, yo, p2tog, p2, k1'],
  ['generated control 1',
   [[['ssk', 'ssk', 'ssk', 'yo'], ['ssk', 'k', 'yo', 'yo'], ['k2tog', 'k', 'k2tog', 'yo'],
     ['k', 'k', 'k', 'k2tog'], ['p', 'k', 'p', 'p']],
    5, True, False],
   'p2, k1, p1'],
  ['generated control 2',
   [[['k2tog', 'ssk', 'yo', 'k', 'yo', 'yo', 'k'], ['k2tog', 'k2tog', 'k', 'ssk', 'k', 'yo', 'k2tog'],
     ['ssk', 'ssk', 'k', 'p', 'p', 'k2tog', 'p']],
    2, False, False],
   'p2tog x2, p1, ssp, p1, yo, p2tog'],
  ['generated control 3',
   [[['k2tog', 'p', 'p', 'p'], ['p', 'yo', 'k', 'k'], ['k2tog', 'k', 'k', 'ssk']], 1, True, False],
   'p3, k2tog']]]
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
RS rowk2tog, yo, p1, k2k2tog, yo, p1, k2Passed
WS row swappedk2, p1, ssp, p1k2, p1, ssp, p1Passed
in the roundk1, sskk1, sskPassed
regression: WS swap and directionyo, p1, p2tog, yo, k2, sspyo, p1, p2tog, yo, k2, sspPassed
repair check: WS swap and directionk1, p1, yo, ssp, yo, p1, yo x2k1, p1, yo, ssp, yo, p1, yo x2Passed
generated control 1yo, ssk x2, k1, k2togyo, ssk x2, k1, k2togPassed
generated control 2ssk, p1, k1, yo x2, k2togssk, p1, k1, yo x2, k2togPassed
generated control 3p1, yo, ssp, yo x2, p1p1, yo, ssp, yo x2, p1Passed

SHA-256 / 52a028df8b2252d414d1100727e82de1f0b59c885e9a04fdaa4222f4b07b8486

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

Case digest / 38e95aa86841b2da8899ebab017fab38e483a6eb6a8fde5ae7411cc9e594738c