{"abstract":"Relations survive an unexposed source.","category":"Accessibility interaction semantics","checks":9,"contract":"Input [nodes,requests] with nodes [document,id,exposed,defunct] and requests [source_doc,source_id,target_doc,target_id,kind]. Allowed kinds details, controls, describedby. Resolve in document-scoped ID space, reject missing/hidden/defunct sources or targets, self edges, cross-document edges and unsupported kinds. Dedupe identical edges preserving request order. Return [source_id,kind,target_id]. IDs may repeat in different documents. Source and target visibility are direct snapshot flags, not ancestry.","evaluation_group":"s3-accessibility-relation-scope","failed_approach":"The local repair substitutes if source[1] or (not source[0] and si == ti): continue but still mishandles the regression fixtures.","family":"s3-accessibility-relation-scope-source-exposure","id":"FA-53406","implementations":{"attempt":{"sha256":"4fa02bd8dfb5a89a0bdc328844146ba2042a90c15cedaa1d6e3d9622f1499c5b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(data):\n    nodes,requests = data\n    index = {(doc,ident):(visible,dead) for doc,ident,visible,dead in nodes}\n    result = []\n    seen = set()\n    for sd,si,td,ti,kind in requests:\n        if kind not in {'details','controls','describedby'}: continue\n        if sd != td: continue\n        source = index.get((sd,si))\n        target = index.get((td,ti))\n        if source is None or target is None: continue\n        if source[1] or (not source[0] and si == ti): continue\n        if not target[0] or target[1]: continue\n        if si == ti: continue\n        edge = (si,kind,ti)\n        if edge in seen: continue\n        seen.add(edge)\n        result.append(list(edge))\n    return result\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('valid ordered and repeated', solve([[['d','s',True,False],['d','t',True,False],['d',str(N),True,False]],[['d','s','d','t','details'],['d','s','d',str(N),'controls'],['d','s','d','t','details']]],), [['s','details','t'],['s','controls',str(N)]])\ncheck('different kinds same endpoints', solve([[['d','s',True,False],['d','t',True,False]],[['d','s','d','t','details'],['d','s','d','t','controls']]],), [['s','details','t'],['s','controls','t']])\ncheck('cross document collision', solve([[['d','s',True,False],['d','t',False,False],['e','t',True,False]],[['d','s','e','t','details'],['d','s','d','t','details']]],), [])\ncheck('unsupported and self', solve([[['d','s',True,False],['d','t',True,False]],[['d','s','d','t','label'],['d','s','d','s','controls']]],), [])\ncheck('missing endpoints', solve([[['d','s',True,False]],[['d','s','d','missing','details'],['d','gone','d','s','details']]],), [])\ncheck('hidden source', solve([[['d','s',False,False],['d','t',True,False]],[['d','s','d','t','details']]],), [])\ncheck('defunct source', solve([[['d','s',True,True],['d','t',True,False]],[['d','s','d','t','details']]],), [])\ncheck('defunct target', solve([[['d','s',True,False],['d','t',True,True]],[['d','s','d','t','details']]],), [])\ncheck('empty snapshot', solve([[],[]],), [])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"fde2671d9ce0dab8641720be64486275ef4da3e3228c52bd8ca1860ea7b9baf4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(data):\n    nodes,requests = data\n    index = {(doc,ident):(visible,dead) for doc,ident,visible,dead in nodes}\n    result = []\n    seen = set()\n    for sd,si,td,ti,kind in requests:\n        if kind not in {'details','controls','describedby'}: continue\n        if sd != td: continue\n        source = index.get((sd,si))\n        target = index.get((td,ti))\n        if source is None or target is None: continue\n        if source[1]: continue\n        if not target[0] or target[1]: continue\n        if si == ti: continue\n        edge = (si,kind,ti)\n        if edge in seen: continue\n        seen.add(edge)\n        result.append(list(edge))\n    return result\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('valid ordered and repeated', solve([[['d','s',True,False],['d','t',True,False],['d',str(N),True,False]],[['d','s','d','t','details'],['d','s','d',str(N),'controls'],['d','s','d','t','details']]],), [['s','details','t'],['s','controls',str(N)]])\ncheck('different kinds same endpoints', solve([[['d','s',True,False],['d','t',True,False]],[['d','s','d','t','details'],['d','s','d','t','controls']]],), [['s','details','t'],['s','controls','t']])\ncheck('cross document collision', solve([[['d','s',True,False],['d','t',False,False],['e','t',True,False]],[['d','s','e','t','details'],['d','s','d','t','details']]],), [])\ncheck('unsupported and self', solve([[['d','s',True,False],['d','t',True,False]],[['d','s','d','t','label'],['d','s','d','s','controls']]],), [])\ncheck('missing endpoints', solve([[['d','s',True,False]],[['d','s','d','missing','details'],['d','gone','d','s','details']]],), [])\ncheck('hidden source', solve([[['d','s',False,False],['d','t',True,False]],[['d','s','d','t','details']]],), [])\ncheck('defunct source', solve([[['d','s',True,True],['d','t',True,False]],[['d','s','d','t','details']]],), [])\ncheck('defunct target', solve([[['d','s',True,False],['d','t',True,True]],[['d','s','d','t','details']]],), [])\ncheck('empty snapshot', solve([[],[]],), [])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"1d6a529da2749e64a4efc33f320196f650c84c1cf8aaf790cd97f9267c10ab4d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(data):\n    nodes,requests = data\n    index = {(doc,ident):(visible,dead) for doc,ident,visible,dead in nodes}\n    result = []\n    seen = set()\n    for sd,si,td,ti,kind in requests:\n        if kind not in {'details','controls','describedby'}: continue\n        if sd != td: continue\n        source = index.get((sd,si))\n        target = index.get((td,ti))\n        if source is None or target is None: continue\n        if not source[0] or source[1]: continue\n        if not target[0] or target[1]: continue\n        if si == ti: continue\n        edge = (si,kind,ti)\n        if edge in seen: continue\n        seen.add(edge)\n        result.append(list(edge))\n    return result\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('valid ordered and repeated', solve([[['d','s',True,False],['d','t',True,False],['d',str(N),True,False]],[['d','s','d','t','details'],['d','s','d',str(N),'controls'],['d','s','d','t','details']]],), [['s','details','t'],['s','controls',str(N)]])\ncheck('different kinds same endpoints', solve([[['d','s',True,False],['d','t',True,False]],[['d','s','d','t','details'],['d','s','d','t','controls']]],), [['s','details','t'],['s','controls','t']])\ncheck('cross document collision', solve([[['d','s',True,False],['d','t',False,False],['e','t',True,False]],[['d','s','e','t','details'],['d','s','d','t','details']]],), [])\ncheck('unsupported and self', solve([[['d','s',True,False],['d','t',True,False]],[['d','s','d','t','label'],['d','s','d','s','controls']]],), [])\ncheck('missing endpoints', solve([[['d','s',True,False]],[['d','s','d','missing','details'],['d','gone','d','s','details']]],), [])\ncheck('hidden source', solve([[['d','s',False,False],['d','t',True,False]],[['d','s','d','t','details']]],), [])\ncheck('defunct source', solve([[['d','s',True,True],['d','t',True,False]],[['d','s','d','t','details']]],), [])\ncheck('defunct target', solve([[['d','s',True,False],['d','t',True,True]],[['d','s','d','t','details']]],), [])\ncheck('empty snapshot', solve([[],[]],), [])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Stipulated finite adapter contract, not a claim of platform accessibility or ARIA conformance. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-accessibility-relation-scope-source-exposure","generated_at":"2026-09-29T14:45:38.658738+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Offline accessibility bridge model with explicit policy; useful for testing semantic API adapters independently of browser implementations.","repair":"Apply the exact contract at the source exposure decision: if not source[0] or source[1]: continue","root_cause":"The source exposure decision in the relation scope adapter violates its declared contract.","sha256":"4e9addfb811d986ae641ec9b1b9de59f4134305de2705bff08f30391212d2de2","title":"Relations survive an unexposed source · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.28,"exit_code":1,"observations":[{"actual":[["s","details","t"],["s","controls","1"]],"check":"valid ordered and repeated","expected":[["s","details","t"],["s","controls","1"]],"passed":true},{"actual":[["s","details","t"],["s","controls","t"]],"check":"different kinds same endpoints","expected":[["s","details","t"],["s","controls","t"]],"passed":true},{"actual":[],"check":"cross document collision","expected":[],"passed":true},{"actual":[],"check":"unsupported and self","expected":[],"passed":true},{"actual":[],"check":"missing endpoints","expected":[],"passed":true},{"actual":[["s","details","t"]],"check":"hidden source","expected":[],"passed":false},{"actual":[],"check":"defunct source","expected":[],"passed":true},{"actual":[],"check":"defunct target","expected":[],"passed":true},{"actual":[],"check":"empty snapshot","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"valid ordered and repeated\", \"actual\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"1\"]], \"expected\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"1\"]], \"passed\": true}, {\"check\": \"different kinds same endpoints\", \"actual\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"t\"]], \"expected\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"t\"]], \"passed\": true}, {\"check\": \"cross document collision\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsupported and self\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"missing endpoints\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"hidden source\", \"actual\": [[\"s\", \"details\", \"t\"]], \"expected\": [], \"passed\": false}, {\"check\": \"defunct source\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"defunct target\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"empty snapshot\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.46,"exit_code":1,"observations":[{"actual":[["s","details","t"],["s","controls","1"]],"check":"valid ordered and repeated","expected":[["s","details","t"],["s","controls","1"]],"passed":true},{"actual":[["s","details","t"],["s","controls","t"]],"check":"different kinds same endpoints","expected":[["s","details","t"],["s","controls","t"]],"passed":true},{"actual":[],"check":"cross document collision","expected":[],"passed":true},{"actual":[],"check":"unsupported and self","expected":[],"passed":true},{"actual":[],"check":"missing endpoints","expected":[],"passed":true},{"actual":[["s","details","t"]],"check":"hidden source","expected":[],"passed":false},{"actual":[],"check":"defunct source","expected":[],"passed":true},{"actual":[],"check":"defunct target","expected":[],"passed":true},{"actual":[],"check":"empty snapshot","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"valid ordered and repeated\", \"actual\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"1\"]], \"expected\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"1\"]], \"passed\": true}, {\"check\": \"different kinds same endpoints\", \"actual\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"t\"]], \"expected\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"t\"]], \"passed\": true}, {\"check\": \"cross document collision\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsupported and self\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"missing endpoints\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"hidden source\", \"actual\": [[\"s\", \"details\", \"t\"]], \"expected\": [], \"passed\": false}, {\"check\": \"defunct source\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"defunct target\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"empty snapshot\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.749,"exit_code":0,"observations":[{"actual":[["s","details","t"],["s","controls","1"]],"check":"valid ordered and repeated","expected":[["s","details","t"],["s","controls","1"]],"passed":true},{"actual":[["s","details","t"],["s","controls","t"]],"check":"different kinds same endpoints","expected":[["s","details","t"],["s","controls","t"]],"passed":true},{"actual":[],"check":"cross document collision","expected":[],"passed":true},{"actual":[],"check":"unsupported and self","expected":[],"passed":true},{"actual":[],"check":"missing endpoints","expected":[],"passed":true},{"actual":[],"check":"hidden source","expected":[],"passed":true},{"actual":[],"check":"defunct source","expected":[],"passed":true},{"actual":[],"check":"defunct target","expected":[],"passed":true},{"actual":[],"check":"empty snapshot","expected":[],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"valid ordered and repeated\", \"actual\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"1\"]], \"expected\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"1\"]], \"passed\": true}, {\"check\": \"different kinds same endpoints\", \"actual\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"t\"]], \"expected\": [[\"s\", \"details\", \"t\"], [\"s\", \"controls\", \"t\"]], \"passed\": true}, {\"check\": \"cross document collision\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsupported and self\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"missing endpoints\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"hidden source\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"defunct source\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"defunct target\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"empty snapshot\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}