{"abstract":"The tab workspace reports an incorrect scroll limit.","category":"Tab interfaces","checks":7,"contract":"Reveal a tab in a horizontally scrolled strip using its full bounds; account for pinned strip width and clamp to content scroll limits.","contract_signature":"x","evaluation_group":"s3-tabs-strip-reveal","failed_approach":"The partial repair max(0,x['total']-x['viewport']+x['pinned']) still violates a workspace boundary or normal case.","family":"s3-tab-interfaces-strip-reveal-scroll-limit","id":"FA-35601","implementations":{"attempt":{"sha256":"3d8a1c487b52146311a01f66ccdab7e1868a4272996b134203c27190d7422e6b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    r0 = x['scroll']+x['pinned']\n    r1 = x['scroll']+x['viewport']\n    r2 = x['left']<x['scroll']+x['pinned']\n    r3 = x['right']>x['scroll']+x['viewport']\n    r4 = max(0,x['total']-x['viewport']+x['pinned'])\n    r5 = max(0,min(x['total']-x['viewport'], x['left']-x['pinned'] if x['left']<x['scroll']+x['pinned'] else max(x['scroll'],x['right']-x['viewport'])))\n    return [r0,r1,r2,r3,r4,r5]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = {1: [({'left': 130, 'right': 210, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, False, True, 300, 110]), ({'left': 80, 'right': 110, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, True, False, 300, 60]), ({'left': 110, 'right': 140, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, True, False, 300, 90]), ({'left': 0, 'right': 30, 'scroll': 0, 'viewport': 100, 'pinned': 20, 'total': 400}, [20, 100, True, False, 300, 0]), ({'left': 350, 'right': 400, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, False, True, 300, 300]), ({'left': 130, 'right': 210, 'scroll': 100, 'viewport': 100, 'pinned': 0, 'total': 400}, [100, 200, False, True, 300, 110]), ({'left': 120, 'right': 200, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, False, False, 300, 100])], 2: [({'left': 260, 'right': 420, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, False, True, 600, 220]), ({'left': 160, 'right': 220, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, True, False, 600, 120]), ({'left': 220, 'right': 280, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, True, False, 600, 180]), ({'left': 0, 'right': 60, 'scroll': 0, 'viewport': 200, 'pinned': 40, 'total': 800}, [40, 200, True, False, 600, 0]), ({'left': 700, 'right': 800, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, False, True, 600, 600]), ({'left': 260, 'right': 420, 'scroll': 200, 'viewport': 200, 'pinned': 0, 'total': 800}, [200, 400, False, True, 600, 220]), ({'left': 240, 'right': 400, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, False, False, 600, 200])], 3: [({'left': 390, 'right': 630, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, False, True, 900, 330]), ({'left': 240, 'right': 330, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, True, False, 900, 180]), ({'left': 330, 'right': 420, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, True, False, 900, 270]), ({'left': 0, 'right': 90, 'scroll': 0, 'viewport': 300, 'pinned': 60, 'total': 1200}, [60, 300, True, False, 900, 0]), ({'left': 1050, 'right': 1200, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, False, True, 900, 900]), ({'left': 390, 'right': 630, 'scroll': 300, 'viewport': 300, 'pinned': 0, 'total': 1200}, [300, 600, False, True, 900, 330]), ({'left': 360, 'right': 600, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, False, False, 900, 300])], 4: [({'left': 520, 'right': 840, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, False, True, 1200, 440]), ({'left': 320, 'right': 440, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, True, False, 1200, 240]), ({'left': 440, 'right': 560, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, True, False, 1200, 360]), ({'left': 0, 'right': 120, 'scroll': 0, 'viewport': 400, 'pinned': 80, 'total': 1600}, [80, 400, True, False, 1200, 0]), ({'left': 1400, 'right': 1600, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, False, True, 1200, 1200]), ({'left': 520, 'right': 840, 'scroll': 400, 'viewport': 400, 'pinned': 0, 'total': 1600}, [400, 800, False, True, 1200, 440]), ({'left': 480, 'right': 800, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, False, False, 1200, 400])], 5: [({'left': 650, 'right': 1050, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, False, True, 1500, 550]), ({'left': 400, 'right': 550, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, True, False, 1500, 300]), ({'left': 550, 'right': 700, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, True, False, 1500, 450]), ({'left': 0, 'right': 150, 'scroll': 0, 'viewport': 500, 'pinned': 100, 'total': 2000}, [100, 500, True, False, 1500, 0]), ({'left': 1750, 'right': 2000, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, False, True, 1500, 1500]), ({'left': 650, 'right': 1050, 'scroll': 500, 'viewport': 500, 'pinned': 0, 'total': 2000}, [500, 1000, False, True, 1500, 550]), ({'left': 600, 'right': 1000, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, False, False, 1500, 500])]}\nfor i, (inputs, expected) in enumerate(fixtures[N]):\n    check(\"workspace regression \"+str(i), solve(inputs), expected)\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":"0076f1604a8bc17a0313550fe589875f3cc47735321487338f634ed05245437a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    r0 = x['scroll']+x['pinned']\n    r1 = x['scroll']+x['viewport']\n    r2 = x['left']<x['scroll']+x['pinned']\n    r3 = x['right']>x['scroll']+x['viewport']\n    r4 = x['total']\n    r5 = max(0,min(x['total']-x['viewport'], x['left']-x['pinned'] if x['left']<x['scroll']+x['pinned'] else max(x['scroll'],x['right']-x['viewport'])))\n    return [r0,r1,r2,r3,r4,r5]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = {1: [({'left': 130, 'right': 210, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, False, True, 300, 110]), ({'left': 80, 'right': 110, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, True, False, 300, 60]), ({'left': 110, 'right': 140, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, True, False, 300, 90]), ({'left': 0, 'right': 30, 'scroll': 0, 'viewport': 100, 'pinned': 20, 'total': 400}, [20, 100, True, False, 300, 0]), ({'left': 350, 'right': 400, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, False, True, 300, 300]), ({'left': 130, 'right': 210, 'scroll': 100, 'viewport': 100, 'pinned': 0, 'total': 400}, [100, 200, False, True, 300, 110]), ({'left': 120, 'right': 200, 'scroll': 100, 'viewport': 100, 'pinned': 20, 'total': 400}, [120, 200, False, False, 300, 100])], 2: [({'left': 260, 'right': 420, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, False, True, 600, 220]), ({'left': 160, 'right': 220, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, True, False, 600, 120]), ({'left': 220, 'right': 280, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, True, False, 600, 180]), ({'left': 0, 'right': 60, 'scroll': 0, 'viewport': 200, 'pinned': 40, 'total': 800}, [40, 200, True, False, 600, 0]), ({'left': 700, 'right': 800, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, False, True, 600, 600]), ({'left': 260, 'right': 420, 'scroll': 200, 'viewport': 200, 'pinned': 0, 'total': 800}, [200, 400, False, True, 600, 220]), ({'left': 240, 'right': 400, 'scroll': 200, 'viewport': 200, 'pinned': 40, 'total': 800}, [240, 400, False, False, 600, 200])], 3: [({'left': 390, 'right': 630, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, False, True, 900, 330]), ({'left': 240, 'right': 330, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, True, False, 900, 180]), ({'left': 330, 'right': 420, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, True, False, 900, 270]), ({'left': 0, 'right': 90, 'scroll': 0, 'viewport': 300, 'pinned': 60, 'total': 1200}, [60, 300, True, False, 900, 0]), ({'left': 1050, 'right': 1200, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, False, True, 900, 900]), ({'left': 390, 'right': 630, 'scroll': 300, 'viewport': 300, 'pinned': 0, 'total': 1200}, [300, 600, False, True, 900, 330]), ({'left': 360, 'right': 600, 'scroll': 300, 'viewport': 300, 'pinned': 60, 'total': 1200}, [360, 600, False, False, 900, 300])], 4: [({'left': 520, 'right': 840, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, False, True, 1200, 440]), ({'left': 320, 'right': 440, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, True, False, 1200, 240]), ({'left': 440, 'right': 560, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, True, False, 1200, 360]), ({'left': 0, 'right': 120, 'scroll': 0, 'viewport': 400, 'pinned': 80, 'total': 1600}, [80, 400, True, False, 1200, 0]), ({'left': 1400, 'right': 1600, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, False, True, 1200, 1200]), ({'left': 520, 'right': 840, 'scroll': 400, 'viewport': 400, 'pinned': 0, 'total': 1600}, [400, 800, False, True, 1200, 440]), ({'left': 480, 'right': 800, 'scroll': 400, 'viewport': 400, 'pinned': 80, 'total': 1600}, [480, 800, False, False, 1200, 400])], 5: [({'left': 650, 'right': 1050, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, False, True, 1500, 550]), ({'left': 400, 'right': 550, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, True, False, 1500, 300]), ({'left': 550, 'right': 700, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, True, False, 1500, 450]), ({'left': 0, 'right': 150, 'scroll': 0, 'viewport': 500, 'pinned': 100, 'total': 2000}, [100, 500, True, False, 1500, 0]), ({'left': 1750, 'right': 2000, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, False, True, 1500, 1500]), ({'left': 650, 'right': 1050, 'scroll': 500, 'viewport': 500, 'pinned': 0, 'total': 2000}, [500, 1000, False, True, 1500, 550]), ({'left': 600, 'right': 1000, 'scroll': 500, 'viewport': 500, 'pinned': 100, 'total': 2000}, [600, 1000, False, False, 1500, 500])]}\nfor i, (inputs, expected) in enumerate(fixtures[N]):\n    check(\"workspace regression \"+str(i), solve(inputs), expected)\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":"Finite stipulated workspace snapshots only. Independent result fields describe observable obligations, not a full UI runtime. 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-tab-interfaces-strip-reveal-scroll-limit","generated_at":"2026-09-29T14:42:43.264832+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Offline tab/panel workspace behavior; no browser or desktop framework is emulated.","root_cause":"The scroll limit decision uses x['total'] instead of max(0,x['total']-x['viewport']).","sha256":"638f12e7cbdb80043fbe0dd9591b5eee811df8332e17d06cc1ea9b9291592dd5","title":"Strip reveal: scroll limit · 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.211,"exit_code":1,"observations":[{"actual":[120,200,false,true,320,110],"check":"workspace regression 0","expected":[120,200,false,true,300,110],"passed":false},{"actual":[120,200,true,false,320,60],"check":"workspace regression 1","expected":[120,200,true,false,300,60],"passed":false},{"actual":[120,200,true,false,320,90],"check":"workspace regression 2","expected":[120,200,true,false,300,90],"passed":false},{"actual":[20,100,true,false,320,0],"check":"workspace regression 3","expected":[20,100,true,false,300,0],"passed":false},{"actual":[120,200,false,true,320,300],"check":"workspace regression 4","expected":[120,200,false,true,300,300],"passed":false},{"actual":[100,200,false,true,300,110],"check":"workspace regression 5","expected":[100,200,false,true,300,110],"passed":true},{"actual":[120,200,false,false,320,100],"check":"workspace regression 6","expected":[120,200,false,false,300,100],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"workspace regression 0\", \"actual\": [120, 200, false, true, 320, 110], \"expected\": [120, 200, false, true, 300, 110], \"passed\": false}, {\"check\": \"workspace regression 1\", \"actual\": [120, 200, true, false, 320, 60], \"expected\": [120, 200, true, false, 300, 60], \"passed\": false}, {\"check\": \"workspace regression 2\", \"actual\": [120, 200, true, false, 320, 90], \"expected\": [120, 200, true, false, 300, 90], \"passed\": false}, {\"check\": \"workspace regression 3\", \"actual\": [20, 100, true, false, 320, 0], \"expected\": [20, 100, true, false, 300, 0], \"passed\": false}, {\"check\": \"workspace regression 4\", \"actual\": [120, 200, false, true, 320, 300], \"expected\": [120, 200, false, true, 300, 300], \"passed\": false}, {\"check\": \"workspace regression 5\", \"actual\": [100, 200, false, true, 300, 110], \"expected\": [100, 200, false, true, 300, 110], \"passed\": true}, {\"check\": \"workspace regression 6\", \"actual\": [120, 200, false, false, 320, 100], \"expected\": [120, 200, false, false, 300, 100], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.098,"exit_code":1,"observations":[{"actual":[120,200,false,true,400,110],"check":"workspace regression 0","expected":[120,200,false,true,300,110],"passed":false},{"actual":[120,200,true,false,400,60],"check":"workspace regression 1","expected":[120,200,true,false,300,60],"passed":false},{"actual":[120,200,true,false,400,90],"check":"workspace regression 2","expected":[120,200,true,false,300,90],"passed":false},{"actual":[20,100,true,false,400,0],"check":"workspace regression 3","expected":[20,100,true,false,300,0],"passed":false},{"actual":[120,200,false,true,400,300],"check":"workspace regression 4","expected":[120,200,false,true,300,300],"passed":false},{"actual":[100,200,false,true,400,110],"check":"workspace regression 5","expected":[100,200,false,true,300,110],"passed":false},{"actual":[120,200,false,false,400,100],"check":"workspace regression 6","expected":[120,200,false,false,300,100],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"workspace regression 0\", \"actual\": [120, 200, false, true, 400, 110], \"expected\": [120, 200, false, true, 300, 110], \"passed\": false}, {\"check\": \"workspace regression 1\", \"actual\": [120, 200, true, false, 400, 60], \"expected\": [120, 200, true, false, 300, 60], \"passed\": false}, {\"check\": \"workspace regression 2\", \"actual\": [120, 200, true, false, 400, 90], \"expected\": [120, 200, true, false, 300, 90], \"passed\": false}, {\"check\": \"workspace regression 3\", \"actual\": [20, 100, true, false, 400, 0], \"expected\": [20, 100, true, false, 300, 0], \"passed\": false}, {\"check\": \"workspace regression 4\", \"actual\": [120, 200, false, true, 400, 300], \"expected\": [120, 200, false, true, 300, 300], \"passed\": false}, {\"check\": \"workspace regression 5\", \"actual\": [100, 200, false, true, 400, 110], \"expected\": [100, 200, false, true, 300, 110], \"passed\": false}, {\"check\": \"workspace regression 6\", \"actual\": [120, 200, false, false, 400, 100], \"expected\": [120, 200, false, false, 300, 100], \"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."}}