FA-11416 / Accessibility interaction semantics / Open access
A virtual window reports local positions as global set positions · case 01
The first rendered row is announced as item one even when earlier items are offscreen.
ROOT CAUSE
Rendered row index and rendered window length replace logical dataset index and total.
VERIFIED REPAIR
Offset one-based positions and carry the declared total, including the unknown-total sentinel.
Unsuccessful approach: Adding the global offset fixes positions but reporting the window end as total understates a known larger dataset and fabricates unknown totals.
Case contract
Return [identifier,one_based_position,total] for a contiguous rendered window at zero-based offset. total is the full known dataset size or -1 for unknown; fixtures have valid offsets and known totals large enough for the window. An empty window returns [].
Why this case matters
A controlled offline accessibility-data model. It isolates the stated contract; it does not simulate browser accessibility APIs or claim full ARIA conformance.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, offset, total):
return [[item,i+1,len(items)] for i,item in enumerate(items)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('middle window', solve(['a','b'], N, N+10), [['a',N+1,N+10],['b',N+2,N+10]])
check('unknown total', solve(['a'], N, -1), [['a',N+1,-1]])
check('first window', solve([str(N)], 0, N+5), [[str(N),1,N+5]])
check('last window', solve(['a'], N, N+1), [['a',N+1,N+1]])
check('whole set', solve(['a','b'], 0, 2), [['a',1,2],['b',2,2]])
check('empty unknown', solve([], N, -1), [])
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 |
|---|---|---|---|
| middle window | [['a', 1, 2], ['b', 2, 2]] | [['a', 2, 11], ['b', 3, 11]] | Failed |
| unknown total | [['a', 1, 1]] | [['a', 2, -1]] | Failed |
| first window | [['1', 1, 1]] | [['1', 1, 6]] | Failed |
| last window | [['a', 1, 1]] | [['a', 2, 2]] | Failed |
| whole set | [['a', 1, 2], ['b', 2, 2]] | [['a', 1, 2], ['b', 2, 2]] | Passed |
| empty unknown | [] | [] | Passed |
SHA-256 / 1924fcc2a26ffa5b7227c1ae9b614fd3950d3b7b5098f2acd5e9a99ccbf3f94c
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, offset, total):
return [[item,offset+i+1,offset+len(items)] for i,item in enumerate(items)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('middle window', solve(['a','b'], N, N+10), [['a',N+1,N+10],['b',N+2,N+10]])
check('unknown total', solve(['a'], N, -1), [['a',N+1,-1]])
check('first window', solve([str(N)], 0, N+5), [[str(N),1,N+5]])
check('last window', solve(['a'], N, N+1), [['a',N+1,N+1]])
check('whole set', solve(['a','b'], 0, 2), [['a',1,2],['b',2,2]])
check('empty unknown', solve([], N, -1), [])
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 |
|---|---|---|---|
| middle window | [['a', 2, 3], ['b', 3, 3]] | [['a', 2, 11], ['b', 3, 11]] | Failed |
| unknown total | [['a', 2, 2]] | [['a', 2, -1]] | Failed |
| first window | [['1', 1, 1]] | [['1', 1, 6]] | Failed |
| last window | [['a', 2, 2]] | [['a', 2, 2]] | Passed |
| whole set | [['a', 1, 2], ['b', 2, 2]] | [['a', 1, 2], ['b', 2, 2]] | Passed |
| empty unknown | [] | [] | Passed |
SHA-256 / 329ead03919efaa1c74bb3bf5814177d3a7ae0f7ef1fe39b3dc0f79ff28a64f5
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, offset, total):
return [[item,offset+i+1,total] for i,item in enumerate(items)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('middle window', solve(['a','b'], N, N+10), [['a',N+1,N+10],['b',N+2,N+10]])
check('unknown total', solve(['a'], N, -1), [['a',N+1,-1]])
check('first window', solve([str(N)], 0, N+5), [[str(N),1,N+5]])
check('last window', solve(['a'], N, N+1), [['a',N+1,N+1]])
check('whole set', solve(['a','b'], 0, 2), [['a',1,2],['b',2,2]])
check('empty unknown', solve([], N, -1), [])
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 |
|---|---|---|---|
| middle window | [['a', 2, 11], ['b', 3, 11]] | [['a', 2, 11], ['b', 3, 11]] | Passed |
| unknown total | [['a', 2, -1]] | [['a', 2, -1]] | Passed |
| first window | [['1', 1, 6]] | [['1', 1, 6]] | Passed |
| last window | [['a', 2, 2]] | [['a', 2, 2]] | Passed |
| whole set | [['a', 1, 2], ['b', 2, 2]] | [['a', 1, 2], ['b', 2, 2]] | Passed |
| empty unknown | [] | [] | Passed |
SHA-256 / b78e0d61818d324ff06fb68cb80f60ef864546c59d506b4d72ca3dc22be25989
Verification & scope
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:38:47.773207+00:00.
Case digest / e5665bf3d6c3f2671b1c2e7c3899d845b5cef9d7c2634f8f8d8bafcca4794e58