FAILURE MAP
← Case archive

FA-37351 / Table interactions / Open access

Table fill handle repetition: source protection · case 01

The table source protection result violates the stipulated table fill handle repetition contract.

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

ROOT CAUSE

The source protection decision uses 'if False:' instead of 'if sr0<=r<=sr1 and sc0<=c<=sc1:'.

VERIFIED REPAIR

Apply the complete source protection rule: if sr0<=r<=sr1 and sc0<=c<=sc1:.

Unsuccessful approach: The attempted repair 'if sr0<=r<=sr1 or sc0<=c<=sc1:' still loses a required part of the table contract.

Case contract

Fill repeats the source rectangle modulo its original row/column origin, excludes the source itself, respects axis constraints and individual readonly cells, clips targets to table bounds, and emits patches in row-major order.

Why this case matters

An offline table UI model isolates table fill handle repetition, including adversarial row/column relationships.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rows, cols, source, target, grid, locked, axis):
    sr0,sr1,sc0,sc1=source
    tr0,tr1,tc0,tc1=target
    patches=[]
    for r in range(tr0,tr1+1):
        for c in range(tc0,tc1+1):
            if False: continue
            if not (0<=r<len(rows) and 0<=c<len(cols)): continue
            if (rows[r],cols[c]) in locked: continue
            rr=sr0+(r-sr0)%(sr1-sr0+1)
            cc=sc0+(c-sc0)%(sc1-sc0+1)
            if axis=='vertical' and not sc0<=c<=sc1: continue
            if axis=='horizontal' and not sr0<=r<=sr1: continue
            patches.append((rows[r],cols[c],grid[rr][cc]))
    return patches
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,1+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 7), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 2:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,2+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 8), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 3:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,3+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 9), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 4:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,4+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 10), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 5:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,5+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 11), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

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
vertical pattern[['r0', 'b', 10], ['r0', 'c', 11], ['r1', 'b', 7], ['r1', 'c', 7], ['r2', 'b', 10], ['r2', 'c', 11], ['r3', 'b', 7], ['r3', 'c', 7], ['r4', 'b', 10], ['r4', 'c', 11]][['r0', 'b', 10], ['r0', 'c', 11], ['r3', 'b', 7], ['r3', 'c', 7], ['r4', 'b', 10], ['r4', 'c', 11]]Failed
horizontal pattern[['r1', 'a', 8], ['r1', 'b', 7], ['r1', 'c', 8], ['r1', 'd', 7], ['r1', 'e', 8], ['r2', 'a', 13], ['r2', 'b', 12], ['r2', 'c', 13], ['r2', 'd', 12], ['r2', 'e', 13]][['r1', 'a', 8], ['r1', 'd', 7], ['r1', 'e', 8], ['r2', 'a', 13], ['r2', 'd', 12], ['r2', 'e', 13]]Failed
locked cell[['r0', 'a', 1], ['r0', 'b', 2], ['r1', 'b', 2], ['r2', 'a', 1], ['r2', 'b', 2]][['r1', 'b', 2], ['r2', 'a', 1], ['r2', 'b', 2]]Failed
source only[['r0', 'a', 1]][]Failed
negative viewport[['r0', 'a', 1], ['r0', 'b', 1], ['r1', 'a', 1], ['r1', 'b', 1]][['r0', 'b', 1], ['r1', 'a', 1], ['r1', 'b', 1]]Failed
single seed[['r0', 'a', 7], ['r0', 'b', 7], ['r1', 'a', 7], ['r1', 'b', 7]][['r0', 'b', 7], ['r1', 'a', 7], ['r1', 'b', 7]]Failed

SHA-256 / d05f2954c75f40ad9aaaaba3ee5981d3baa321cf603d99488fbfd022c836af2d

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rows, cols, source, target, grid, locked, axis):
    sr0,sr1,sc0,sc1=source
    tr0,tr1,tc0,tc1=target
    patches=[]
    for r in range(tr0,tr1+1):
        for c in range(tc0,tc1+1):
            if sr0<=r<=sr1 or sc0<=c<=sc1: continue
            if not (0<=r<len(rows) and 0<=c<len(cols)): continue
            if (rows[r],cols[c]) in locked: continue
            rr=sr0+(r-sr0)%(sr1-sr0+1)
            cc=sc0+(c-sc0)%(sc1-sc0+1)
            if axis=='vertical' and not sc0<=c<=sc1: continue
            if axis=='horizontal' and not sr0<=r<=sr1: continue
            patches.append((rows[r],cols[c],grid[rr][cc]))
    return patches
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,1+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 7), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 2:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,2+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 8), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 3:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,3+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 9), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 4:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,4+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 10), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 5:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,5+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 11), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

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
vertical pattern[][['r0', 'b', 10], ['r0', 'c', 11], ['r3', 'b', 7], ['r3', 'c', 7], ['r4', 'b', 10], ['r4', 'c', 11]]Failed
horizontal pattern[][['r1', 'a', 8], ['r1', 'd', 7], ['r1', 'e', 8], ['r2', 'a', 13], ['r2', 'd', 12], ['r2', 'e', 13]]Failed
locked cell[][['r1', 'b', 2], ['r2', 'a', 1], ['r2', 'b', 2]]Failed
source only[][]Passed
negative viewport[['r1', 'b', 1]][['r0', 'b', 1], ['r1', 'a', 1], ['r1', 'b', 1]]Failed
single seed[['r1', 'b', 7]][['r0', 'b', 7], ['r1', 'a', 7], ['r1', 'b', 7]]Failed

SHA-256 / 76fa3ced195fca4e7b77145a5fb4b378ea1e7a9d3534fd3fe30efa21f66a52ad

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rows, cols, source, target, grid, locked, axis):
    sr0,sr1,sc0,sc1=source
    tr0,tr1,tc0,tc1=target
    patches=[]
    for r in range(tr0,tr1+1):
        for c in range(tc0,tc1+1):
            if sr0<=r<=sr1 and sc0<=c<=sc1: continue
            if not (0<=r<len(rows) and 0<=c<len(cols)): continue
            if (rows[r],cols[c]) in locked: continue
            rr=sr0+(r-sr0)%(sr1-sr0+1)
            cc=sc0+(c-sc0)%(sc1-sc0+1)
            if axis=='vertical' and not sc0<=c<=sc1: continue
            if axis=='horizontal' and not sr0<=r<=sr1: continue
            patches.append((rows[r],cols[c],grid[rr][cc]))
    return patches
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,1+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 7), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 2:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,2+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 8), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 3:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,3+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 9), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 4:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,4+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 10), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

if N == 5:
    check('vertical pattern', solve(['r0','r1','r2','r3','r4'], ['a','b','c','d'], (1,2,1,2), (0,4,0,3), [[1,2,3,4],[5,5+6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], [], 'vertical'), [('r0', 'b', 10), ('r0', 'c', 11), ('r3', 'b', 11), ('r3', 'c', 7), ('r4', 'b', 10), ('r4', 'c', 11)])
    check('horizontal pattern', solve(['r0','r1','r2','r3'], ['a','b','c','d','e'], (1,2,1,2), (0,3,0,4), [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]], [], 'horizontal'), [('r1', 'a', 8), ('r1', 'd', 7), ('r1', 'e', 8), ('r2', 'a', 13), ('r2', 'd', 12), ('r2', 'e', 13)])
    check('locked cell', solve(['r0','r1','r2'], ['a','b'], (0,0,0,1), (0,2,0,1), [[1,2],[3,4],[5,6]], [('r1','a')], 'vertical'), [('r1', 'b', 2), ('r2', 'a', 1), ('r2', 'b', 2)])
    check('source only', solve(['r0'], ['a'], (0,0,0,0), (0,0,0,0), [[1]], [], 'both'), [])
    check('negative viewport', solve(['r0','r1'], ['a','b'], (0,0,0,0), (-1,1,-1,1), [[1,2],[3,4]], [], 'both'), [('r0', 'b', 1), ('r1', 'a', 1), ('r1', 'b', 1)])
    check('single seed', solve(['r0','r1'], ['a','b'], (0,0,0,0), (0,1,0,1), [[7,2],[3,4]], [], 'both'), [('r0', 'b', 7), ('r1', 'a', 7), ('r1', 'b', 7)])

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
vertical pattern[['r0', 'b', 10], ['r0', 'c', 11], ['r3', 'b', 7], ['r3', 'c', 7], ['r4', 'b', 10], ['r4', 'c', 11]][['r0', 'b', 10], ['r0', 'c', 11], ['r3', 'b', 7], ['r3', 'c', 7], ['r4', 'b', 10], ['r4', 'c', 11]]Passed
horizontal pattern[['r1', 'a', 8], ['r1', 'd', 7], ['r1', 'e', 8], ['r2', 'a', 13], ['r2', 'd', 12], ['r2', 'e', 13]][['r1', 'a', 8], ['r1', 'd', 7], ['r1', 'e', 8], ['r2', 'a', 13], ['r2', 'd', 12], ['r2', 'e', 13]]Passed
locked cell[['r1', 'b', 2], ['r2', 'a', 1], ['r2', 'b', 2]][['r1', 'b', 2], ['r2', 'a', 1], ['r2', 'b', 2]]Passed
source only[][]Passed
negative viewport[['r0', 'b', 1], ['r1', 'a', 1], ['r1', 'b', 1]][['r0', 'b', 1], ['r1', 'a', 1], ['r1', 'b', 1]]Passed
single seed[['r0', 'b', 7], ['r1', 'a', 7], ['r1', 'b', 7]][['r0', 'b', 7], ['r1', 'a', 7], ['r1', 'b', 7]]Passed

SHA-256 / a3797d064a7aa65ea464c4c12eaaf568bbeb30c0b96da20f9360dd9f2fd357d3

Verification & scope

The source rectangle is nonempty and within the rectangular grid; target coordinates and lock pairs are integral/stable. Deterministic offline table UI model; no browser, DOM, framework, or standards conformance is claimed. 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:43:00.346286+00:00.

Case digest / ed9476f2adcac6fa91b9dde5d40d225248d5f7d947b7f2210dc4a7a07b469ad8