{"abstract":"A right-ascension adapter ignores the declared hours unit.","category":"Astronomical coordinate conventions","checks":6,"contract":"Return toy RA in degrees modulo 360; unit is hours or degrees; one hour is stipulated as 15 degrees.","evaluation_group":"model-e43760e83eb09f9a","failed_approach":"Converting all right ascensions multiplies values already in degrees.","family":"z-astronomy-ra-unit-tag","id":"FA-12146","implementations":{"attempt":{"sha256":"6048bb2fd7ffbfaae31505ef1e6fe6be0f471eca6880766317fa0d5d45e25a9e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(value, unit):\n    return value * 15 % 360\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('hour input', solve(N, \"hours\"), 15*N)\ncheck('degree input', solve(N, \"degrees\"), N)\ncheck('one full day', solve(24, \"hours\"), 0)\ncheck('negative hour', solve(-N, \"hours\"), 360-15*N)\ncheck('degree wrap', solve(360+N, \"degrees\"), N)\ncheck('zero', solve(0, \"hours\"), 0)\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":"c9d8a8d2c5292029ab9f6be0efbb83e62c2921392ad76361f9c1d7c58ed23e81","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(value, unit):\n    return value % 360\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('hour input', solve(N, \"hours\"), 15*N)\ncheck('degree input', solve(N, \"degrees\"), N)\ncheck('one full day', solve(24, \"hours\"), 0)\ncheck('negative hour', solve(-N, \"hours\"), 360-15*N)\ncheck('degree wrap', solve(360+N, \"degrees\"), N)\ncheck('zero', solve(0, \"hours\"), 0)\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":"9e2f1df7c38e0bc021655abfd150b2711d3ef5144ad0eb2142cfed48862615e5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(value, unit):\n    return (value * 15 if unit == 'hours' else value) % 360\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('hour input', solve(N, \"hours\"), 15*N)\ncheck('degree input', solve(N, \"degrees\"), N)\ncheck('one full day', solve(24, \"hours\"), 0)\ncheck('negative hour', solve(-N, \"hours\"), 360-15*N)\ncheck('degree wrap', solve(360+N, \"degrees\"), N)\ncheck('zero', solve(0, \"hours\"), 0)\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":"Deterministic stipulated adapter model; no ephemeris, physical accuracy, or production astronomy library claims. 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":"z-astronomy-ra-unit-tag","generated_at":"2026-09-29T14:38:54.282499+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Astronomical catalog and observation adapters must preserve the declared coordinate convention across software boundaries.","repair":"Convert explicitly tagged hours to degrees and preserve degrees.","root_cause":"A field name is treated as a sufficient unit specification.","sha256":"52cb4dae1615df4ce8d1a49d188d3468e92afe0abec510e34b85387d1f0042be","title":"A right-ascension adapter ignores the declared hours unit · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.539,"exit_code":1,"observations":[{"actual":15,"check":"hour input","expected":15,"passed":true},{"actual":15,"check":"degree input","expected":1,"passed":false},{"actual":0,"check":"one full day","expected":0,"passed":true},{"actual":345,"check":"negative hour","expected":345,"passed":true},{"actual":15,"check":"degree wrap","expected":1,"passed":false},{"actual":0,"check":"zero","expected":0,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"hour input\", \"actual\": 15, \"expected\": 15, \"passed\": true}, {\"check\": \"degree input\", \"actual\": 15, \"expected\": 1, \"passed\": false}, {\"check\": \"one full day\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"negative hour\", \"actual\": 345, \"expected\": 345, \"passed\": true}, {\"check\": \"degree wrap\", \"actual\": 15, \"expected\": 1, \"passed\": false}, {\"check\": \"zero\", \"actual\": 0, \"expected\": 0, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.089,"exit_code":1,"observations":[{"actual":1,"check":"hour input","expected":15,"passed":false},{"actual":1,"check":"degree input","expected":1,"passed":true},{"actual":24,"check":"one full day","expected":0,"passed":false},{"actual":359,"check":"negative hour","expected":345,"passed":false},{"actual":1,"check":"degree wrap","expected":1,"passed":true},{"actual":0,"check":"zero","expected":0,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"hour input\", \"actual\": 1, \"expected\": 15, \"passed\": false}, {\"check\": \"degree input\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"one full day\", \"actual\": 24, \"expected\": 0, \"passed\": false}, {\"check\": \"negative hour\", \"actual\": 359, \"expected\": 345, \"passed\": false}, {\"check\": \"degree wrap\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"zero\", \"actual\": 0, \"expected\": 0, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.7,"exit_code":0,"observations":[{"actual":15,"check":"hour input","expected":15,"passed":true},{"actual":1,"check":"degree input","expected":1,"passed":true},{"actual":0,"check":"one full day","expected":0,"passed":true},{"actual":345,"check":"negative hour","expected":345,"passed":true},{"actual":1,"check":"degree wrap","expected":1,"passed":true},{"actual":0,"check":"zero","expected":0,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"hour input\", \"actual\": 15, \"expected\": 15, \"passed\": true}, {\"check\": \"degree input\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"one full day\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"negative hour\", \"actual\": 345, \"expected\": 345, \"passed\": true}, {\"check\": \"degree wrap\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"zero\", \"actual\": 0, \"expected\": 0, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}