{"abstract":"Indeterminate progress is announced as zero completion.","category":"Assistive semantics","checks":7,"contract":"Indeterminate indicators omit numeric value and are busy; determinate values clamp, percentages normalize the range, zero-span means complete, and busy reflects explicit state.","evaluation_group":"xi-progress","failed_approach":"Reporting not busy hides ongoing indeterminate work.","family":"xi-progress-indeterminate","id":"FA-8731","implementations":{"attempt":{"sha256":"bcedce4882e0ac15cba3a830f5365de0cb626be492485a4f999c110d607f5cfc","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(value, minimum, maximum, label, busy):\n    if value is None: return {'role':'progressbar', 'label':label, 'busy':False}\n    value = max(minimum, min(value, maximum))\n    ratio = (value-minimum)/(maximum-minimum) if maximum > minimum else 1\n    return {'role':'progressbar', 'label':label, 'busy':busy, 'value':value, 'percent':round(ratio*100)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('indeterminate', solve(None, 0, 100, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True})\ncheck('below', solve(-5, 10, 30, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True, 'value': 10, 'percent': 0})\ncheck('above', solve(40, 10, 30, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 30, 'percent': 100})\ncheck('offset', solve(20, 10, 30, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True, 'value': 20, 'percent': 50})\ncheck('empty range', solve(10, 10, 10, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 10, 'percent': 100})\ncheck('parameterized progress range', solve(2*N,N,3*N,'Task',True), dict(role='progressbar',label='Task',busy=True,value=2*N,percent=50))\nfor repetition in range(N):\n    check('repeat empty range', solve(10, 10, 10, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 10, 'percent': 100})\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":"f33237f0f3610712cc1eafa09ca4a087095578fc914b170e0f8d5837a64a7f54","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(value, minimum, maximum, label, busy):\n    if value is None: return {'role':'progressbar', 'label':label, 'busy':True, 'value':0}\n    value = max(minimum, min(value, maximum))\n    ratio = (value-minimum)/(maximum-minimum) if maximum > minimum else 1\n    return {'role':'progressbar', 'label':label, 'busy':busy, 'value':value, 'percent':round(ratio*100)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('indeterminate', solve(None, 0, 100, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True})\ncheck('below', solve(-5, 10, 30, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True, 'value': 10, 'percent': 0})\ncheck('above', solve(40, 10, 30, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 30, 'percent': 100})\ncheck('offset', solve(20, 10, 30, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True, 'value': 20, 'percent': 50})\ncheck('empty range', solve(10, 10, 10, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 10, 'percent': 100})\ncheck('parameterized progress range', solve(2*N,N,3*N,'Task',True), dict(role='progressbar',label='Task',busy=True,value=2*N,percent=50))\nfor repetition in range(N):\n    check('repeat empty range', solve(10, 10, 10, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 10, 'percent': 100})\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":"56d1db0e38e5408b333be054bfcc8baf39a216863a244e7db6dc8a2ee1cc10f7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(value, minimum, maximum, label, busy):\n    if value is None: return {'role':'progressbar', 'label':label, 'busy':True}\n    value = max(minimum, min(value, maximum))\n    ratio = (value-minimum)/(maximum-minimum) if maximum > minimum else 1\n    return {'role':'progressbar', 'label':label, 'busy':busy, 'value':value, 'percent':round(ratio*100)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('indeterminate', solve(None, 0, 100, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True})\ncheck('below', solve(-5, 10, 30, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True, 'value': 10, 'percent': 0})\ncheck('above', solve(40, 10, 30, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 30, 'percent': 100})\ncheck('offset', solve(20, 10, 30, 'Upload', True), {'role': 'progressbar', 'label': 'Upload', 'busy': True, 'value': 20, 'percent': 50})\ncheck('empty range', solve(10, 10, 10, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 10, 'percent': 100})\ncheck('parameterized progress range', solve(2*N,N,3*N,'Task',True), dict(role='progressbar',label='Task',busy=True,value=2*N,percent=50))\nfor repetition in range(N):\n    check('repeat empty range', solve(10, 10, 10, 'Upload', False), {'role': 'progressbar', 'label': 'Upload', 'busy': False, 'value': 10, 'percent': 100})\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-progress-indeterminate","generated_at":"2026-09-29T14:38:23.831147+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"A deterministic model of progress indicator representation; this isolates one interface invariant without requiring a browser.","repair":"Implement the indeterminate operation as `if value is None: return {'role':'progressbar', 'label':label, 'busy':True}`.","root_cause":"The indeterminate operation uses `if value is None: return {'role':'progressbar', 'label':label, 'busy':True, 'value':0}` where the contract requires `if value is None: return {'role':'progressbar', 'label':label, 'busy':True}`.","sha256":"7fbfcd2855b8df1b03d1cf79d8f5ed86be2d0a6e99c076e501f89b3cd8ca651a","title":"Progress indicator representation: Indeterminate progress is announced as zero completion · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.607,"exit_code":1,"observations":[{"actual":{"busy":false,"label":"Upload","role":"progressbar"},"check":"indeterminate","expected":{"busy":true,"label":"Upload","role":"progressbar"},"passed":false},{"actual":{"busy":true,"label":"Upload","percent":0,"role":"progressbar","value":10},"check":"below","expected":{"busy":true,"label":"Upload","percent":0,"role":"progressbar","value":10},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":30},"check":"above","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":30},"passed":true},{"actual":{"busy":true,"label":"Upload","percent":50,"role":"progressbar","value":20},"check":"offset","expected":{"busy":true,"label":"Upload","percent":50,"role":"progressbar","value":20},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"check":"empty range","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"passed":true},{"actual":{"busy":true,"label":"Task","percent":50,"role":"progressbar","value":2},"check":"parameterized progress range","expected":{"busy":true,"label":"Task","percent":50,"role":"progressbar","value":2},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"check":"repeat empty range","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"indeterminate\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true}, \"passed\": false}, {\"check\": \"below\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 10, \"percent\": 0}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 10, \"percent\": 0}, \"passed\": true}, {\"check\": \"above\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 30, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 30, \"percent\": 100}, \"passed\": true}, {\"check\": \"offset\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 20, \"percent\": 50}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 20, \"percent\": 50}, \"passed\": true}, {\"check\": \"empty range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"passed\": true}, {\"check\": \"parameterized progress range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Task\", \"busy\": true, \"value\": 2, \"percent\": 50}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Task\", \"busy\": true, \"value\": 2, \"percent\": 50}, \"passed\": true}, {\"check\": \"repeat empty range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.872,"exit_code":1,"observations":[{"actual":{"busy":true,"label":"Upload","role":"progressbar","value":0},"check":"indeterminate","expected":{"busy":true,"label":"Upload","role":"progressbar"},"passed":false},{"actual":{"busy":true,"label":"Upload","percent":0,"role":"progressbar","value":10},"check":"below","expected":{"busy":true,"label":"Upload","percent":0,"role":"progressbar","value":10},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":30},"check":"above","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":30},"passed":true},{"actual":{"busy":true,"label":"Upload","percent":50,"role":"progressbar","value":20},"check":"offset","expected":{"busy":true,"label":"Upload","percent":50,"role":"progressbar","value":20},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"check":"empty range","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"passed":true},{"actual":{"busy":true,"label":"Task","percent":50,"role":"progressbar","value":2},"check":"parameterized progress range","expected":{"busy":true,"label":"Task","percent":50,"role":"progressbar","value":2},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"check":"repeat empty range","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"indeterminate\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 0}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true}, \"passed\": false}, {\"check\": \"below\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 10, \"percent\": 0}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 10, \"percent\": 0}, \"passed\": true}, {\"check\": \"above\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 30, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 30, \"percent\": 100}, \"passed\": true}, {\"check\": \"offset\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 20, \"percent\": 50}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 20, \"percent\": 50}, \"passed\": true}, {\"check\": \"empty range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"passed\": true}, {\"check\": \"parameterized progress range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Task\", \"busy\": true, \"value\": 2, \"percent\": 50}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Task\", \"busy\": true, \"value\": 2, \"percent\": 50}, \"passed\": true}, {\"check\": \"repeat empty range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":37.572,"exit_code":0,"observations":[{"actual":{"busy":true,"label":"Upload","role":"progressbar"},"check":"indeterminate","expected":{"busy":true,"label":"Upload","role":"progressbar"},"passed":true},{"actual":{"busy":true,"label":"Upload","percent":0,"role":"progressbar","value":10},"check":"below","expected":{"busy":true,"label":"Upload","percent":0,"role":"progressbar","value":10},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":30},"check":"above","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":30},"passed":true},{"actual":{"busy":true,"label":"Upload","percent":50,"role":"progressbar","value":20},"check":"offset","expected":{"busy":true,"label":"Upload","percent":50,"role":"progressbar","value":20},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"check":"empty range","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"passed":true},{"actual":{"busy":true,"label":"Task","percent":50,"role":"progressbar","value":2},"check":"parameterized progress range","expected":{"busy":true,"label":"Task","percent":50,"role":"progressbar","value":2},"passed":true},{"actual":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"check":"repeat empty range","expected":{"busy":false,"label":"Upload","percent":100,"role":"progressbar","value":10},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"indeterminate\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true}, \"passed\": true}, {\"check\": \"below\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 10, \"percent\": 0}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 10, \"percent\": 0}, \"passed\": true}, {\"check\": \"above\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 30, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 30, \"percent\": 100}, \"passed\": true}, {\"check\": \"offset\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 20, \"percent\": 50}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": true, \"value\": 20, \"percent\": 50}, \"passed\": true}, {\"check\": \"empty range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"passed\": true}, {\"check\": \"parameterized progress range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Task\", \"busy\": true, \"value\": 2, \"percent\": 50}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Task\", \"busy\": true, \"value\": 2, \"percent\": 50}, \"passed\": true}, {\"check\": \"repeat empty range\", \"actual\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"expected\": {\"role\": \"progressbar\", \"label\": \"Upload\", \"busy\": false, \"value\": 10, \"percent\": 100}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}