{"abstract":"The adapter reports an incorrect mean hour angle while other fields remain valid.","category":"Astronomical coordinate conventions","checks":6,"contract":"All angular values are exact model degrees. East longitude is positive. Local mean sidereal angle is gmst+lon, apparent sidereal includes eqeq, apparent RA is ra+dra. Hour angle is sidereal minus RA, normalized into [0,360). No Earth rotation is calculated. Output fields are defined by: local_mean = (d['gmst']+d['lon'])%360; local_apparent = (d['gmst']+d['lon']+d['eqeq'])%360; apparent_ra = (d['ra']+d['dra'])%360; mean_hour_angle = (d['gmst']+d['lon']-d['ra'])%360; apparent_hour_angle = (d['gmst']+d['lon']+d['eqeq']-d['ra']-d['dra'])%360; meridian_ra = (d['gmst']+d['lon']+d['eqeq']-d['dra'])%360","evaluation_group":"astro-sidereal-hour-angle-adapter","failed_approach":"A partial convention repair still uses (d['gmst']+d['lon']-d['ra'])%180","family":"s3-astronomical-coordinate-conventions-sidereal-hour-angle-adapter-mean_hour_angle","id":"FA-55216","implementations":{"attempt":{"sha256":"fdf47622c327ecf3f65b96ebd7c2ef9f5240e5c50e22f031387ffc2def53b752","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(d):\n    return {'local_mean': (d['gmst']+d['lon'])%360, 'local_apparent': (d['gmst']+d['lon']+d['eqeq'])%360, 'apparent_ra': (d['ra']+d['dra'])%360, 'mean_hour_angle': (d['gmst']+d['lon']-d['ra'])%180, 'apparent_hour_angle': (d['gmst']+d['lon']+d['eqeq']-d['ra']-d['dra'])%360, 'meridian_ra': (d['gmst']+d['lon']+d['eqeq']-d['dra'])%360}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = {1: [({'gmst': 100, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 130, 'local_apparent': 132, 'apparent_ra': 53, 'mean_hour_angle': 80, 'apparent_hour_angle': 79, 'meridian_ra': 129}), ({'gmst': 100, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 60, 'local_apparent': 62, 'apparent_ra': 53, 'mean_hour_angle': 10, 'apparent_hour_angle': 9, 'meridian_ra': 59}), ({'gmst': 100, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 130, 'local_apparent': 130, 'apparent_ra': 50, 'mean_hour_angle': 80, 'apparent_hour_angle': 80, 'meridian_ra': 130}), ({'gmst': 350, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 20, 'local_apparent': 22, 'apparent_ra': 8, 'mean_hour_angle': 15, 'apparent_hour_angle': 14, 'meridian_ra': 19}), ({'gmst': 100, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 130, 'local_apparent': 132, 'apparent_ra': 303, 'mean_hour_angle': 190, 'apparent_hour_angle': 189, 'meridian_ra': 129}), ({'gmst': 100, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 100, 'local_apparent': 97, 'apparent_ra': 48, 'mean_hour_angle': 50, 'apparent_hour_angle': 49, 'meridian_ra': 99})], 2: [({'gmst': 101, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 131, 'local_apparent': 133, 'apparent_ra': 53, 'mean_hour_angle': 81, 'apparent_hour_angle': 80, 'meridian_ra': 130}), ({'gmst': 101, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 61, 'local_apparent': 63, 'apparent_ra': 53, 'mean_hour_angle': 11, 'apparent_hour_angle': 10, 'meridian_ra': 60}), ({'gmst': 101, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 131, 'local_apparent': 131, 'apparent_ra': 50, 'mean_hour_angle': 81, 'apparent_hour_angle': 81, 'meridian_ra': 131}), ({'gmst': 351, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 21, 'local_apparent': 23, 'apparent_ra': 8, 'mean_hour_angle': 16, 'apparent_hour_angle': 15, 'meridian_ra': 20}), ({'gmst': 101, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 131, 'local_apparent': 133, 'apparent_ra': 303, 'mean_hour_angle': 191, 'apparent_hour_angle': 190, 'meridian_ra': 130}), ({'gmst': 101, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 101, 'local_apparent': 98, 'apparent_ra': 48, 'mean_hour_angle': 51, 'apparent_hour_angle': 50, 'meridian_ra': 100})], 3: [({'gmst': 102, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 132, 'local_apparent': 134, 'apparent_ra': 53, 'mean_hour_angle': 82, 'apparent_hour_angle': 81, 'meridian_ra': 131}), ({'gmst': 102, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 62, 'local_apparent': 64, 'apparent_ra': 53, 'mean_hour_angle': 12, 'apparent_hour_angle': 11, 'meridian_ra': 61}), ({'gmst': 102, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 132, 'local_apparent': 132, 'apparent_ra': 50, 'mean_hour_angle': 82, 'apparent_hour_angle': 82, 'meridian_ra': 132}), ({'gmst': 352, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 22, 'local_apparent': 24, 'apparent_ra': 8, 'mean_hour_angle': 17, 'apparent_hour_angle': 16, 'meridian_ra': 21}), ({'gmst': 102, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 132, 'local_apparent': 134, 'apparent_ra': 303, 'mean_hour_angle': 192, 'apparent_hour_angle': 191, 'meridian_ra': 131}), ({'gmst': 102, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 102, 'local_apparent': 99, 'apparent_ra': 48, 'mean_hour_angle': 52, 'apparent_hour_angle': 51, 'meridian_ra': 101})], 4: [({'gmst': 103, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 133, 'local_apparent': 135, 'apparent_ra': 53, 'mean_hour_angle': 83, 'apparent_hour_angle': 82, 'meridian_ra': 132}), ({'gmst': 103, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 63, 'local_apparent': 65, 'apparent_ra': 53, 'mean_hour_angle': 13, 'apparent_hour_angle': 12, 'meridian_ra': 62}), ({'gmst': 103, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 133, 'local_apparent': 133, 'apparent_ra': 50, 'mean_hour_angle': 83, 'apparent_hour_angle': 83, 'meridian_ra': 133}), ({'gmst': 353, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 23, 'local_apparent': 25, 'apparent_ra': 8, 'mean_hour_angle': 18, 'apparent_hour_angle': 17, 'meridian_ra': 22}), ({'gmst': 103, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 133, 'local_apparent': 135, 'apparent_ra': 303, 'mean_hour_angle': 193, 'apparent_hour_angle': 192, 'meridian_ra': 132}), ({'gmst': 103, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 103, 'local_apparent': 100, 'apparent_ra': 48, 'mean_hour_angle': 53, 'apparent_hour_angle': 52, 'meridian_ra': 102})], 5: [({'gmst': 104, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 134, 'local_apparent': 136, 'apparent_ra': 53, 'mean_hour_angle': 84, 'apparent_hour_angle': 83, 'meridian_ra': 133}), ({'gmst': 104, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 64, 'local_apparent': 66, 'apparent_ra': 53, 'mean_hour_angle': 14, 'apparent_hour_angle': 13, 'meridian_ra': 63}), ({'gmst': 104, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 134, 'local_apparent': 134, 'apparent_ra': 50, 'mean_hour_angle': 84, 'apparent_hour_angle': 84, 'meridian_ra': 134}), ({'gmst': 354, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 24, 'local_apparent': 26, 'apparent_ra': 8, 'mean_hour_angle': 19, 'apparent_hour_angle': 18, 'meridian_ra': 23}), ({'gmst': 104, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 134, 'local_apparent': 136, 'apparent_ra': 303, 'mean_hour_angle': 194, 'apparent_hour_angle': 193, 'meridian_ra': 133}), ({'gmst': 104, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 104, 'local_apparent': 101, 'apparent_ra': 48, 'mean_hour_angle': 54, 'apparent_hour_angle': 53, 'meridian_ra': 103})]}\nfor i, (record, expected) in enumerate(fixtures[N]):\n    check('astronomical fixture %s' % i, solve(record), 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":"cef775b068a918ae6f89a9bcbcc115f277a723a12124261d3176a24168f5842c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(d):\n    return {'local_mean': (d['gmst']+d['lon'])%360, 'local_apparent': (d['gmst']+d['lon']+d['eqeq'])%360, 'apparent_ra': (d['ra']+d['dra'])%360, 'mean_hour_angle': (d['ra']-d['gmst']-d['lon'])%360, 'apparent_hour_angle': (d['gmst']+d['lon']+d['eqeq']-d['ra']-d['dra'])%360, 'meridian_ra': (d['gmst']+d['lon']+d['eqeq']-d['dra'])%360}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = {1: [({'gmst': 100, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 130, 'local_apparent': 132, 'apparent_ra': 53, 'mean_hour_angle': 80, 'apparent_hour_angle': 79, 'meridian_ra': 129}), ({'gmst': 100, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 60, 'local_apparent': 62, 'apparent_ra': 53, 'mean_hour_angle': 10, 'apparent_hour_angle': 9, 'meridian_ra': 59}), ({'gmst': 100, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 130, 'local_apparent': 130, 'apparent_ra': 50, 'mean_hour_angle': 80, 'apparent_hour_angle': 80, 'meridian_ra': 130}), ({'gmst': 350, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 20, 'local_apparent': 22, 'apparent_ra': 8, 'mean_hour_angle': 15, 'apparent_hour_angle': 14, 'meridian_ra': 19}), ({'gmst': 100, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 130, 'local_apparent': 132, 'apparent_ra': 303, 'mean_hour_angle': 190, 'apparent_hour_angle': 189, 'meridian_ra': 129}), ({'gmst': 100, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 100, 'local_apparent': 97, 'apparent_ra': 48, 'mean_hour_angle': 50, 'apparent_hour_angle': 49, 'meridian_ra': 99})], 2: [({'gmst': 101, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 131, 'local_apparent': 133, 'apparent_ra': 53, 'mean_hour_angle': 81, 'apparent_hour_angle': 80, 'meridian_ra': 130}), ({'gmst': 101, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 61, 'local_apparent': 63, 'apparent_ra': 53, 'mean_hour_angle': 11, 'apparent_hour_angle': 10, 'meridian_ra': 60}), ({'gmst': 101, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 131, 'local_apparent': 131, 'apparent_ra': 50, 'mean_hour_angle': 81, 'apparent_hour_angle': 81, 'meridian_ra': 131}), ({'gmst': 351, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 21, 'local_apparent': 23, 'apparent_ra': 8, 'mean_hour_angle': 16, 'apparent_hour_angle': 15, 'meridian_ra': 20}), ({'gmst': 101, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 131, 'local_apparent': 133, 'apparent_ra': 303, 'mean_hour_angle': 191, 'apparent_hour_angle': 190, 'meridian_ra': 130}), ({'gmst': 101, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 101, 'local_apparent': 98, 'apparent_ra': 48, 'mean_hour_angle': 51, 'apparent_hour_angle': 50, 'meridian_ra': 100})], 3: [({'gmst': 102, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 132, 'local_apparent': 134, 'apparent_ra': 53, 'mean_hour_angle': 82, 'apparent_hour_angle': 81, 'meridian_ra': 131}), ({'gmst': 102, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 62, 'local_apparent': 64, 'apparent_ra': 53, 'mean_hour_angle': 12, 'apparent_hour_angle': 11, 'meridian_ra': 61}), ({'gmst': 102, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 132, 'local_apparent': 132, 'apparent_ra': 50, 'mean_hour_angle': 82, 'apparent_hour_angle': 82, 'meridian_ra': 132}), ({'gmst': 352, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 22, 'local_apparent': 24, 'apparent_ra': 8, 'mean_hour_angle': 17, 'apparent_hour_angle': 16, 'meridian_ra': 21}), ({'gmst': 102, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 132, 'local_apparent': 134, 'apparent_ra': 303, 'mean_hour_angle': 192, 'apparent_hour_angle': 191, 'meridian_ra': 131}), ({'gmst': 102, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 102, 'local_apparent': 99, 'apparent_ra': 48, 'mean_hour_angle': 52, 'apparent_hour_angle': 51, 'meridian_ra': 101})], 4: [({'gmst': 103, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 133, 'local_apparent': 135, 'apparent_ra': 53, 'mean_hour_angle': 83, 'apparent_hour_angle': 82, 'meridian_ra': 132}), ({'gmst': 103, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 63, 'local_apparent': 65, 'apparent_ra': 53, 'mean_hour_angle': 13, 'apparent_hour_angle': 12, 'meridian_ra': 62}), ({'gmst': 103, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 133, 'local_apparent': 133, 'apparent_ra': 50, 'mean_hour_angle': 83, 'apparent_hour_angle': 83, 'meridian_ra': 133}), ({'gmst': 353, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 23, 'local_apparent': 25, 'apparent_ra': 8, 'mean_hour_angle': 18, 'apparent_hour_angle': 17, 'meridian_ra': 22}), ({'gmst': 103, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 133, 'local_apparent': 135, 'apparent_ra': 303, 'mean_hour_angle': 193, 'apparent_hour_angle': 192, 'meridian_ra': 132}), ({'gmst': 103, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 103, 'local_apparent': 100, 'apparent_ra': 48, 'mean_hour_angle': 53, 'apparent_hour_angle': 52, 'meridian_ra': 102})], 5: [({'gmst': 104, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 134, 'local_apparent': 136, 'apparent_ra': 53, 'mean_hour_angle': 84, 'apparent_hour_angle': 83, 'meridian_ra': 133}), ({'gmst': 104, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 64, 'local_apparent': 66, 'apparent_ra': 53, 'mean_hour_angle': 14, 'apparent_hour_angle': 13, 'meridian_ra': 63}), ({'gmst': 104, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 134, 'local_apparent': 134, 'apparent_ra': 50, 'mean_hour_angle': 84, 'apparent_hour_angle': 84, 'meridian_ra': 134}), ({'gmst': 354, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 24, 'local_apparent': 26, 'apparent_ra': 8, 'mean_hour_angle': 19, 'apparent_hour_angle': 18, 'meridian_ra': 23}), ({'gmst': 104, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 134, 'local_apparent': 136, 'apparent_ra': 303, 'mean_hour_angle': 194, 'apparent_hour_angle': 193, 'meridian_ra': 133}), ({'gmst': 104, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 104, 'local_apparent': 101, 'apparent_ra': 48, 'mean_hour_angle': 54, 'apparent_hour_angle': 53, 'meridian_ra': 103})]}\nfor i, (record, expected) in enumerate(fixtures[N]):\n    check('astronomical fixture %s' % i, solve(record), 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"},"fixed":{"sha256":"b07be2936bb304c385d2d3d7615fe06ae3fd00d379a9a98700c506bc0e000365","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(d):\n    return {'local_mean': (d['gmst']+d['lon'])%360, 'local_apparent': (d['gmst']+d['lon']+d['eqeq'])%360, 'apparent_ra': (d['ra']+d['dra'])%360, 'mean_hour_angle': (d['gmst']+d['lon']-d['ra'])%360, 'apparent_hour_angle': (d['gmst']+d['lon']+d['eqeq']-d['ra']-d['dra'])%360, 'meridian_ra': (d['gmst']+d['lon']+d['eqeq']-d['dra'])%360}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = {1: [({'gmst': 100, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 130, 'local_apparent': 132, 'apparent_ra': 53, 'mean_hour_angle': 80, 'apparent_hour_angle': 79, 'meridian_ra': 129}), ({'gmst': 100, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 60, 'local_apparent': 62, 'apparent_ra': 53, 'mean_hour_angle': 10, 'apparent_hour_angle': 9, 'meridian_ra': 59}), ({'gmst': 100, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 130, 'local_apparent': 130, 'apparent_ra': 50, 'mean_hour_angle': 80, 'apparent_hour_angle': 80, 'meridian_ra': 130}), ({'gmst': 350, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 20, 'local_apparent': 22, 'apparent_ra': 8, 'mean_hour_angle': 15, 'apparent_hour_angle': 14, 'meridian_ra': 19}), ({'gmst': 100, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 130, 'local_apparent': 132, 'apparent_ra': 303, 'mean_hour_angle': 190, 'apparent_hour_angle': 189, 'meridian_ra': 129}), ({'gmst': 100, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 100, 'local_apparent': 97, 'apparent_ra': 48, 'mean_hour_angle': 50, 'apparent_hour_angle': 49, 'meridian_ra': 99})], 2: [({'gmst': 101, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 131, 'local_apparent': 133, 'apparent_ra': 53, 'mean_hour_angle': 81, 'apparent_hour_angle': 80, 'meridian_ra': 130}), ({'gmst': 101, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 61, 'local_apparent': 63, 'apparent_ra': 53, 'mean_hour_angle': 11, 'apparent_hour_angle': 10, 'meridian_ra': 60}), ({'gmst': 101, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 131, 'local_apparent': 131, 'apparent_ra': 50, 'mean_hour_angle': 81, 'apparent_hour_angle': 81, 'meridian_ra': 131}), ({'gmst': 351, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 21, 'local_apparent': 23, 'apparent_ra': 8, 'mean_hour_angle': 16, 'apparent_hour_angle': 15, 'meridian_ra': 20}), ({'gmst': 101, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 131, 'local_apparent': 133, 'apparent_ra': 303, 'mean_hour_angle': 191, 'apparent_hour_angle': 190, 'meridian_ra': 130}), ({'gmst': 101, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 101, 'local_apparent': 98, 'apparent_ra': 48, 'mean_hour_angle': 51, 'apparent_hour_angle': 50, 'meridian_ra': 100})], 3: [({'gmst': 102, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 132, 'local_apparent': 134, 'apparent_ra': 53, 'mean_hour_angle': 82, 'apparent_hour_angle': 81, 'meridian_ra': 131}), ({'gmst': 102, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 62, 'local_apparent': 64, 'apparent_ra': 53, 'mean_hour_angle': 12, 'apparent_hour_angle': 11, 'meridian_ra': 61}), ({'gmst': 102, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 132, 'local_apparent': 132, 'apparent_ra': 50, 'mean_hour_angle': 82, 'apparent_hour_angle': 82, 'meridian_ra': 132}), ({'gmst': 352, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 22, 'local_apparent': 24, 'apparent_ra': 8, 'mean_hour_angle': 17, 'apparent_hour_angle': 16, 'meridian_ra': 21}), ({'gmst': 102, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 132, 'local_apparent': 134, 'apparent_ra': 303, 'mean_hour_angle': 192, 'apparent_hour_angle': 191, 'meridian_ra': 131}), ({'gmst': 102, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 102, 'local_apparent': 99, 'apparent_ra': 48, 'mean_hour_angle': 52, 'apparent_hour_angle': 51, 'meridian_ra': 101})], 4: [({'gmst': 103, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 133, 'local_apparent': 135, 'apparent_ra': 53, 'mean_hour_angle': 83, 'apparent_hour_angle': 82, 'meridian_ra': 132}), ({'gmst': 103, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 63, 'local_apparent': 65, 'apparent_ra': 53, 'mean_hour_angle': 13, 'apparent_hour_angle': 12, 'meridian_ra': 62}), ({'gmst': 103, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 133, 'local_apparent': 133, 'apparent_ra': 50, 'mean_hour_angle': 83, 'apparent_hour_angle': 83, 'meridian_ra': 133}), ({'gmst': 353, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 23, 'local_apparent': 25, 'apparent_ra': 8, 'mean_hour_angle': 18, 'apparent_hour_angle': 17, 'meridian_ra': 22}), ({'gmst': 103, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 133, 'local_apparent': 135, 'apparent_ra': 303, 'mean_hour_angle': 193, 'apparent_hour_angle': 192, 'meridian_ra': 132}), ({'gmst': 103, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 103, 'local_apparent': 100, 'apparent_ra': 48, 'mean_hour_angle': 53, 'apparent_hour_angle': 52, 'meridian_ra': 102})], 5: [({'gmst': 104, 'lon': 30, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 134, 'local_apparent': 136, 'apparent_ra': 53, 'mean_hour_angle': 84, 'apparent_hour_angle': 83, 'meridian_ra': 133}), ({'gmst': 104, 'lon': -40, 'eqeq': 2, 'ra': 50, 'dra': 3}, {'local_mean': 64, 'local_apparent': 66, 'apparent_ra': 53, 'mean_hour_angle': 14, 'apparent_hour_angle': 13, 'meridian_ra': 63}), ({'gmst': 104, 'lon': 30, 'eqeq': 0, 'ra': 50, 'dra': 0}, {'local_mean': 134, 'local_apparent': 134, 'apparent_ra': 50, 'mean_hour_angle': 84, 'apparent_hour_angle': 84, 'meridian_ra': 134}), ({'gmst': 354, 'lon': 30, 'eqeq': 2, 'ra': 5, 'dra': 3}, {'local_mean': 24, 'local_apparent': 26, 'apparent_ra': 8, 'mean_hour_angle': 19, 'apparent_hour_angle': 18, 'meridian_ra': 23}), ({'gmst': 104, 'lon': 30, 'eqeq': 2, 'ra': 300, 'dra': 3}, {'local_mean': 134, 'local_apparent': 136, 'apparent_ra': 303, 'mean_hour_angle': 194, 'apparent_hour_angle': 193, 'meridian_ra': 133}), ({'gmst': 104, 'lon': 0, 'eqeq': -3, 'ra': 50, 'dra': -2}, {'local_mean': 104, 'local_apparent': 101, 'apparent_ra': 48, 'mean_hour_angle': 54, 'apparent_hour_angle': 53, 'meridian_ra': 103})]}\nfor i, (record, expected) in enumerate(fixtures[N]):\n    check('astronomical fixture %s' % i, solve(record), 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":"Explicitly stipulated finite algebraic adapter; no standards conformance, physical accuracy, or production-library claim. Inputs are the documented finite valid model domain. 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-astronomical-coordinate-conventions-sidereal-hour-angle-adapter-mean_hour_angle","generated_at":"2026-09-29T14:45:55.718500+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Catalog, detector, sky-coordinate, and spectroscopy adapters must preserve the association between numeric coordinates and their declared reference conventions.","repair":"Preserve the declared model convention at this site: (d['gmst']+d['lon']-d['ra'])%360","root_cause":"Hour-angle orientation or full-turn range is replaced by an unsigned half-circle. Faulty expression: (d['ra']-d['gmst']-d['lon'])%360","sha256":"1cb2f15098103c6085237a1117f1faa3c785a4f78161d1aaead567e085396eeb","title":"Sidereal hour angle adapter: Hour-angle orientation or full-turn range is replaced by an unsigned half-circle · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.851,"exit_code":1,"observations":[{"actual":{"apparent_hour_angle":79,"apparent_ra":53,"local_apparent":132,"local_mean":130,"mean_hour_angle":80,"meridian_ra":129},"check":"astronomical fixture 0","expected":{"apparent_hour_angle":79,"apparent_ra":53,"local_apparent":132,"local_mean":130,"mean_hour_angle":80,"meridian_ra":129},"passed":true},{"actual":{"apparent_hour_angle":9,"apparent_ra":53,"local_apparent":62,"local_mean":60,"mean_hour_angle":10,"meridian_ra":59},"check":"astronomical fixture 1","expected":{"apparent_hour_angle":9,"apparent_ra":53,"local_apparent":62,"local_mean":60,"mean_hour_angle":10,"meridian_ra":59},"passed":true},{"actual":{"apparent_hour_angle":80,"apparent_ra":50,"local_apparent":130,"local_mean":130,"mean_hour_angle":80,"meridian_ra":130},"check":"astronomical fixture 2","expected":{"apparent_hour_angle":80,"apparent_ra":50,"local_apparent":130,"local_mean":130,"mean_hour_angle":80,"meridian_ra":130},"passed":true},{"actual":{"apparent_hour_angle":14,"apparent_ra":8,"local_apparent":22,"local_mean":20,"mean_hour_angle":15,"meridian_ra":19},"check":"astronomical fixture 3","expected":{"apparent_hour_angle":14,"apparent_ra":8,"local_apparent":22,"local_mean":20,"mean_hour_angle":15,"meridian_ra":19},"passed":true},{"actual":{"apparent_hour_angle":189,"apparent_ra":303,"local_apparent":132,"local_mean":130,"mean_hour_angle":10,"meridian_ra":129},"check":"astronomical fixture 4","expected":{"apparent_hour_angle":189,"apparent_ra":303,"local_apparent":132,"local_mean":130,"mean_hour_angle":190,"meridian_ra":129},"passed":false},{"actual":{"apparent_hour_angle":49,"apparent_ra":48,"local_apparent":97,"local_mean":100,"mean_hour_angle":50,"meridian_ra":99},"check":"astronomical fixture 5","expected":{"apparent_hour_angle":49,"apparent_ra":48,"local_apparent":97,"local_mean":100,"mean_hour_angle":50,"meridian_ra":99},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"astronomical fixture 0\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 53, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 79, \"meridian_ra\": 129}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 53, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 79, \"meridian_ra\": 129}, \"passed\": true}, {\"check\": \"astronomical fixture 1\", \"actual\": {\"local_mean\": 60, \"local_apparent\": 62, \"apparent_ra\": 53, \"mean_hour_angle\": 10, \"apparent_hour_angle\": 9, \"meridian_ra\": 59}, \"expected\": {\"local_mean\": 60, \"local_apparent\": 62, \"apparent_ra\": 53, \"mean_hour_angle\": 10, \"apparent_hour_angle\": 9, \"meridian_ra\": 59}, \"passed\": true}, {\"check\": \"astronomical fixture 2\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 130, \"apparent_ra\": 50, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 80, \"meridian_ra\": 130}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 130, \"apparent_ra\": 50, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 80, \"meridian_ra\": 130}, \"passed\": true}, {\"check\": \"astronomical fixture 3\", \"actual\": {\"local_mean\": 20, \"local_apparent\": 22, \"apparent_ra\": 8, \"mean_hour_angle\": 15, \"apparent_hour_angle\": 14, \"meridian_ra\": 19}, \"expected\": {\"local_mean\": 20, \"local_apparent\": 22, \"apparent_ra\": 8, \"mean_hour_angle\": 15, \"apparent_hour_angle\": 14, \"meridian_ra\": 19}, \"passed\": true}, {\"check\": \"astronomical fixture 4\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 303, \"mean_hour_angle\": 10, \"apparent_hour_angle\": 189, \"meridian_ra\": 129}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 303, \"mean_hour_angle\": 190, \"apparent_hour_angle\": 189, \"meridian_ra\": 129}, \"passed\": false}, {\"check\": \"astronomical fixture 5\", \"actual\": {\"local_mean\": 100, \"local_apparent\": 97, \"apparent_ra\": 48, \"mean_hour_angle\": 50, \"apparent_hour_angle\": 49, \"meridian_ra\": 99}, \"expected\": {\"local_mean\": 100, \"local_apparent\": 97, \"apparent_ra\": 48, \"mean_hour_angle\": 50, \"apparent_hour_angle\": 49, \"meridian_ra\": 99}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.827,"exit_code":1,"observations":[{"actual":{"apparent_hour_angle":79,"apparent_ra":53,"local_apparent":132,"local_mean":130,"mean_hour_angle":280,"meridian_ra":129},"check":"astronomical fixture 0","expected":{"apparent_hour_angle":79,"apparent_ra":53,"local_apparent":132,"local_mean":130,"mean_hour_angle":80,"meridian_ra":129},"passed":false},{"actual":{"apparent_hour_angle":9,"apparent_ra":53,"local_apparent":62,"local_mean":60,"mean_hour_angle":350,"meridian_ra":59},"check":"astronomical fixture 1","expected":{"apparent_hour_angle":9,"apparent_ra":53,"local_apparent":62,"local_mean":60,"mean_hour_angle":10,"meridian_ra":59},"passed":false},{"actual":{"apparent_hour_angle":80,"apparent_ra":50,"local_apparent":130,"local_mean":130,"mean_hour_angle":280,"meridian_ra":130},"check":"astronomical fixture 2","expected":{"apparent_hour_angle":80,"apparent_ra":50,"local_apparent":130,"local_mean":130,"mean_hour_angle":80,"meridian_ra":130},"passed":false},{"actual":{"apparent_hour_angle":14,"apparent_ra":8,"local_apparent":22,"local_mean":20,"mean_hour_angle":345,"meridian_ra":19},"check":"astronomical fixture 3","expected":{"apparent_hour_angle":14,"apparent_ra":8,"local_apparent":22,"local_mean":20,"mean_hour_angle":15,"meridian_ra":19},"passed":false},{"actual":{"apparent_hour_angle":189,"apparent_ra":303,"local_apparent":132,"local_mean":130,"mean_hour_angle":170,"meridian_ra":129},"check":"astronomical fixture 4","expected":{"apparent_hour_angle":189,"apparent_ra":303,"local_apparent":132,"local_mean":130,"mean_hour_angle":190,"meridian_ra":129},"passed":false},{"actual":{"apparent_hour_angle":49,"apparent_ra":48,"local_apparent":97,"local_mean":100,"mean_hour_angle":310,"meridian_ra":99},"check":"astronomical fixture 5","expected":{"apparent_hour_angle":49,"apparent_ra":48,"local_apparent":97,"local_mean":100,"mean_hour_angle":50,"meridian_ra":99},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"astronomical fixture 0\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 53, \"mean_hour_angle\": 280, \"apparent_hour_angle\": 79, \"meridian_ra\": 129}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 53, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 79, \"meridian_ra\": 129}, \"passed\": false}, {\"check\": \"astronomical fixture 1\", \"actual\": {\"local_mean\": 60, \"local_apparent\": 62, \"apparent_ra\": 53, \"mean_hour_angle\": 350, \"apparent_hour_angle\": 9, \"meridian_ra\": 59}, \"expected\": {\"local_mean\": 60, \"local_apparent\": 62, \"apparent_ra\": 53, \"mean_hour_angle\": 10, \"apparent_hour_angle\": 9, \"meridian_ra\": 59}, \"passed\": false}, {\"check\": \"astronomical fixture 2\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 130, \"apparent_ra\": 50, \"mean_hour_angle\": 280, \"apparent_hour_angle\": 80, \"meridian_ra\": 130}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 130, \"apparent_ra\": 50, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 80, \"meridian_ra\": 130}, \"passed\": false}, {\"check\": \"astronomical fixture 3\", \"actual\": {\"local_mean\": 20, \"local_apparent\": 22, \"apparent_ra\": 8, \"mean_hour_angle\": 345, \"apparent_hour_angle\": 14, \"meridian_ra\": 19}, \"expected\": {\"local_mean\": 20, \"local_apparent\": 22, \"apparent_ra\": 8, \"mean_hour_angle\": 15, \"apparent_hour_angle\": 14, \"meridian_ra\": 19}, \"passed\": false}, {\"check\": \"astronomical fixture 4\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 303, \"mean_hour_angle\": 170, \"apparent_hour_angle\": 189, \"meridian_ra\": 129}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 303, \"mean_hour_angle\": 190, \"apparent_hour_angle\": 189, \"meridian_ra\": 129}, \"passed\": false}, {\"check\": \"astronomical fixture 5\", \"actual\": {\"local_mean\": 100, \"local_apparent\": 97, \"apparent_ra\": 48, \"mean_hour_angle\": 310, \"apparent_hour_angle\": 49, \"meridian_ra\": 99}, \"expected\": {\"local_mean\": 100, \"local_apparent\": 97, \"apparent_ra\": 48, \"mean_hour_angle\": 50, \"apparent_hour_angle\": 49, \"meridian_ra\": 99}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.828,"exit_code":0,"observations":[{"actual":{"apparent_hour_angle":79,"apparent_ra":53,"local_apparent":132,"local_mean":130,"mean_hour_angle":80,"meridian_ra":129},"check":"astronomical fixture 0","expected":{"apparent_hour_angle":79,"apparent_ra":53,"local_apparent":132,"local_mean":130,"mean_hour_angle":80,"meridian_ra":129},"passed":true},{"actual":{"apparent_hour_angle":9,"apparent_ra":53,"local_apparent":62,"local_mean":60,"mean_hour_angle":10,"meridian_ra":59},"check":"astronomical fixture 1","expected":{"apparent_hour_angle":9,"apparent_ra":53,"local_apparent":62,"local_mean":60,"mean_hour_angle":10,"meridian_ra":59},"passed":true},{"actual":{"apparent_hour_angle":80,"apparent_ra":50,"local_apparent":130,"local_mean":130,"mean_hour_angle":80,"meridian_ra":130},"check":"astronomical fixture 2","expected":{"apparent_hour_angle":80,"apparent_ra":50,"local_apparent":130,"local_mean":130,"mean_hour_angle":80,"meridian_ra":130},"passed":true},{"actual":{"apparent_hour_angle":14,"apparent_ra":8,"local_apparent":22,"local_mean":20,"mean_hour_angle":15,"meridian_ra":19},"check":"astronomical fixture 3","expected":{"apparent_hour_angle":14,"apparent_ra":8,"local_apparent":22,"local_mean":20,"mean_hour_angle":15,"meridian_ra":19},"passed":true},{"actual":{"apparent_hour_angle":189,"apparent_ra":303,"local_apparent":132,"local_mean":130,"mean_hour_angle":190,"meridian_ra":129},"check":"astronomical fixture 4","expected":{"apparent_hour_angle":189,"apparent_ra":303,"local_apparent":132,"local_mean":130,"mean_hour_angle":190,"meridian_ra":129},"passed":true},{"actual":{"apparent_hour_angle":49,"apparent_ra":48,"local_apparent":97,"local_mean":100,"mean_hour_angle":50,"meridian_ra":99},"check":"astronomical fixture 5","expected":{"apparent_hour_angle":49,"apparent_ra":48,"local_apparent":97,"local_mean":100,"mean_hour_angle":50,"meridian_ra":99},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"astronomical fixture 0\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 53, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 79, \"meridian_ra\": 129}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 53, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 79, \"meridian_ra\": 129}, \"passed\": true}, {\"check\": \"astronomical fixture 1\", \"actual\": {\"local_mean\": 60, \"local_apparent\": 62, \"apparent_ra\": 53, \"mean_hour_angle\": 10, \"apparent_hour_angle\": 9, \"meridian_ra\": 59}, \"expected\": {\"local_mean\": 60, \"local_apparent\": 62, \"apparent_ra\": 53, \"mean_hour_angle\": 10, \"apparent_hour_angle\": 9, \"meridian_ra\": 59}, \"passed\": true}, {\"check\": \"astronomical fixture 2\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 130, \"apparent_ra\": 50, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 80, \"meridian_ra\": 130}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 130, \"apparent_ra\": 50, \"mean_hour_angle\": 80, \"apparent_hour_angle\": 80, \"meridian_ra\": 130}, \"passed\": true}, {\"check\": \"astronomical fixture 3\", \"actual\": {\"local_mean\": 20, \"local_apparent\": 22, \"apparent_ra\": 8, \"mean_hour_angle\": 15, \"apparent_hour_angle\": 14, \"meridian_ra\": 19}, \"expected\": {\"local_mean\": 20, \"local_apparent\": 22, \"apparent_ra\": 8, \"mean_hour_angle\": 15, \"apparent_hour_angle\": 14, \"meridian_ra\": 19}, \"passed\": true}, {\"check\": \"astronomical fixture 4\", \"actual\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 303, \"mean_hour_angle\": 190, \"apparent_hour_angle\": 189, \"meridian_ra\": 129}, \"expected\": {\"local_mean\": 130, \"local_apparent\": 132, \"apparent_ra\": 303, \"mean_hour_angle\": 190, \"apparent_hour_angle\": 189, \"meridian_ra\": 129}, \"passed\": true}, {\"check\": \"astronomical fixture 5\", \"actual\": {\"local_mean\": 100, \"local_apparent\": 97, \"apparent_ra\": 48, \"mean_hour_angle\": 50, \"apparent_hour_angle\": 49, \"meridian_ra\": 99}, \"expected\": {\"local_mean\": 100, \"local_apparent\": 97, \"apparent_ra\": 48, \"mean_hour_angle\": 50, \"apparent_hour_angle\": 49, \"meridian_ra\": 99}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}