{"abstract":"Lost capture leaves the UI in dragging state.","category":"Direct manipulation","checks":10,"contract":"First pointer captures ownership; only its movement and release affect a drag; cancellation and capture loss clear ownership while preserving position.","contract_signature":"owner, position, event, pointer, delta","evaluation_group":"xi-pointer-capture","failed_approach":"Clearing coordinates moves the control unexpectedly.","family":"xi-pointer-capture-lost-capture","id":"FA-8251","implementations":{"attempt":{"sha256":"9ac324072335c2fd31f4b1d0299b01273b6eb4c8e1138ef0435d7361c8445ee6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(owner, position, event, pointer, delta):\n    if event == 'down': return (pointer if owner is None else owner, position)\n    if event == 'move' and pointer == owner: return (owner, position + delta)\n    if event == 'up' and pointer == owner: return (None, position)\n    if event == 'cancel' and pointer == owner: return (None, position)\n    if event == 'lost': return (None, 0)\n    return (owner, position)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('initial down', solve(None, 4, 'down', 1, 0), (1, 4))\ncheck('second down', solve(1, 4, 'down', 2, 0), (1, 4))\ncheck('other move', solve(1, 4, 'move', 2, 3), (1, 4))\ncheck('owner move', solve(1, 4, 'move', 1, 3), (1, 7))\ncheck('other up', solve(1, 4, 'up', 2, 0), (1, 4))\ncheck('owner up', solve(1, 4, 'up', 1, 0), (None, 4))\ncheck('cancel', solve(1, 4, 'cancel', 1, 0), (None, 4))\ncheck('lost', solve(1, 4, 'lost', 2, 0), (None, 4))\ncheck('parameterized pointer ownership', solve(N, N, 'move', N, N), (N,2*N))\nfor repetition in range(N):\n    check('repeat lost', solve(1, 4, 'lost', 2, 0), (None, 4))\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":"d86cc78693deb46c38d934c2ae2040d18e90f15b0fe635e825ec59e6ab681051","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(owner, position, event, pointer, delta):\n    if event == 'down': return (pointer if owner is None else owner, position)\n    if event == 'move' and pointer == owner: return (owner, position + delta)\n    if event == 'up' and pointer == owner: return (None, position)\n    if event == 'cancel' and pointer == owner: return (None, position)\n    if event == 'lost': return (owner, position)\n    return (owner, position)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('initial down', solve(None, 4, 'down', 1, 0), (1, 4))\ncheck('second down', solve(1, 4, 'down', 2, 0), (1, 4))\ncheck('other move', solve(1, 4, 'move', 2, 3), (1, 4))\ncheck('owner move', solve(1, 4, 'move', 1, 3), (1, 7))\ncheck('other up', solve(1, 4, 'up', 2, 0), (1, 4))\ncheck('owner up', solve(1, 4, 'up', 1, 0), (None, 4))\ncheck('cancel', solve(1, 4, 'cancel', 1, 0), (None, 4))\ncheck('lost', solve(1, 4, 'lost', 2, 0), (None, 4))\ncheck('parameterized pointer ownership', solve(N, N, 'move', N, N), (N,2*N))\nfor repetition in range(N):\n    check('repeat lost', solve(1, 4, 'lost', 2, 0), (None, 4))\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":" 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":"xi-pointer-capture-lost-capture","generated_at":"2026-09-29T14:38:19.688494+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"A deterministic model of pointer-capture ownership; this isolates one interface invariant without requiring a browser.","root_cause":"The lost capture operation uses `if event == 'lost': return (owner, position)` where the contract requires `if event == 'lost': return (None, position)`.","sha256":"037121f835f7c60fe0c541052e14c8d9bfb89a414f496f703b6c476615e3de46","title":"Pointer-capture ownership: Lost capture leaves the UI in dragging state · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":42.755,"exit_code":1,"observations":[{"actual":[1,4],"check":"initial down","expected":[1,4],"passed":true},{"actual":[1,4],"check":"second down","expected":[1,4],"passed":true},{"actual":[1,4],"check":"other move","expected":[1,4],"passed":true},{"actual":[1,7],"check":"owner move","expected":[1,7],"passed":true},{"actual":[1,4],"check":"other up","expected":[1,4],"passed":true},{"actual":[null,4],"check":"owner up","expected":[null,4],"passed":true},{"actual":[null,4],"check":"cancel","expected":[null,4],"passed":true},{"actual":[null,0],"check":"lost","expected":[null,4],"passed":false},{"actual":[1,2],"check":"parameterized pointer ownership","expected":[1,2],"passed":true},{"actual":[null,0],"check":"repeat lost","expected":[null,4],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"initial down\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"second down\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"other move\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"owner move\", \"actual\": [1, 7], \"expected\": [1, 7], \"passed\": true}, {\"check\": \"other up\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"owner up\", \"actual\": [null, 4], \"expected\": [null, 4], \"passed\": true}, {\"check\": \"cancel\", \"actual\": [null, 4], \"expected\": [null, 4], \"passed\": true}, {\"check\": \"lost\", \"actual\": [null, 0], \"expected\": [null, 4], \"passed\": false}, {\"check\": \"parameterized pointer ownership\", \"actual\": [1, 2], \"expected\": [1, 2], \"passed\": true}, {\"check\": \"repeat lost\", \"actual\": [null, 0], \"expected\": [null, 4], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.269,"exit_code":1,"observations":[{"actual":[1,4],"check":"initial down","expected":[1,4],"passed":true},{"actual":[1,4],"check":"second down","expected":[1,4],"passed":true},{"actual":[1,4],"check":"other move","expected":[1,4],"passed":true},{"actual":[1,7],"check":"owner move","expected":[1,7],"passed":true},{"actual":[1,4],"check":"other up","expected":[1,4],"passed":true},{"actual":[null,4],"check":"owner up","expected":[null,4],"passed":true},{"actual":[null,4],"check":"cancel","expected":[null,4],"passed":true},{"actual":[1,4],"check":"lost","expected":[null,4],"passed":false},{"actual":[1,2],"check":"parameterized pointer ownership","expected":[1,2],"passed":true},{"actual":[1,4],"check":"repeat lost","expected":[null,4],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"initial down\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"second down\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"other move\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"owner move\", \"actual\": [1, 7], \"expected\": [1, 7], \"passed\": true}, {\"check\": \"other up\", \"actual\": [1, 4], \"expected\": [1, 4], \"passed\": true}, {\"check\": \"owner up\", \"actual\": [null, 4], \"expected\": [null, 4], \"passed\": true}, {\"check\": \"cancel\", \"actual\": [null, 4], \"expected\": [null, 4], \"passed\": true}, {\"check\": \"lost\", \"actual\": [1, 4], \"expected\": [null, 4], \"passed\": false}, {\"check\": \"parameterized pointer ownership\", \"actual\": [1, 2], \"expected\": [1, 2], \"passed\": true}, {\"check\": \"repeat lost\", \"actual\": [1, 4], \"expected\": [null, 4], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}