{"abstract":"An anemometer reporting exactly at the freshness limit is treated as failed.","category":"Solar tracker geometry","checks":7,"contract":"readings are [value or None, age_s] per anemometer. A reading is valid when value is not None and age <= max_age. Fewer than n_required valid readings: ['stow', 'sensor', None]. Otherwise use the highest valid value: >= stow_at gives ['stow', 'wind', v], else ['track', 'ok', v].","evaluation_group":"w2-solar_tracker_geometry-anemometer-failsafe","failed_approach":"Doubling the age limit accepts stale sensors.","family":"w2-solar_tracker_geometry-anemometer-failsafe-stale-reading-age","id":"FA-93716","implementations":{"attempt":{"sha256":"2f87a27ac51d63d6561028f5f168c59d7a024f2358293c8837026c5fee67f9f7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(readings, max_age, stow_at, n_required):\n    valid = [v for v, age in readings if v is not None and age < max_age * 2]\n    if len(valid) < n_required:\n        return ['stow', 'sensor', None]\n    peak = max(valid)\n    if peak >= stow_at:\n        return ['stow', 'wind', peak]\n    return ['track', 'ok', peak]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[0, 0], [None, 61], [16.5, 60], [8, 30]], 60, 18, 2],\n   ['track', 'ok', 16.5]],\n  ['regression: stale reading age (partial repair)', [[[None, 5], [12, 61], [16.5, 30]], 60, 18, 2],\n   ['stow', 'sensor', None]],\n  ['control 1', [[[14.5, 5], [8, 5], [22, 60]], 60, 15, 2], ['stow', 'wind', 22]],\n  ['control 2', [[[8, 60], [8, 120]], 60, 18, 1], ['track', 'ok', 8]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[22, 120], [0, 30], [14.5, 0]], 30, 15, 2],\n   ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)', [[[3.5, 61], [12, 120], [12, 30]], 60, 15, 2],\n   ['stow', 'sensor', None]],\n  ['control 1', [[[8, 60], [0, 10], [14.5, 10]], 60, 18, 1], ['track', 'ok', 14.5]],\n  ['control 2', [[[3.5, 61], [22, 61], [22, 10], [16.5, 30]], 60, 18, 1], ['stow', 'wind', 22]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[14.5, 30], [0, 0], [None, 10], [14.5, 60]], 30, 15, 1],\n   ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)', [[[3.5, 10], [14.5, 61], [22, 61]], 60, 15, 1],\n   ['track', 'ok', 3.5]],\n  ['control 1', [[[22, 61], [22, 120]], 30, 18, 2], ['stow', 'sensor', None]],\n  ['control 2', [[[3.5, 30], [15, 0], [None, 61], [None, 30]], 60, 18, 2], ['track', 'ok', 15]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[14.5, 30]], 30, 18, 1], ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)',\n   [[[8, 10], [16.5, 60], [22, 61], [15, 5]], 60, 18, 1], ['track', 'ok', 16.5]],\n  ['control 1', [[[3.5, 5], [22, 30]], 30, 18, 2], ['stow', 'wind', 22]],\n  ['control 2', [[[22, 0], [3.5, 60], [12, 30], [14.5, 5]], 30, 15, 1], ['stow', 'wind', 22]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[16.5, 0], [8, 120], [16.5, 60], [12, 30]], 30, 15, 2],\n   ['stow', 'wind', 16.5]],\n  ['regression: stale reading age (partial repair)',\n   [[[None, 5], [22, 61], [15, 61], [15, 5]], 60, 18, 1], ['track', 'ok', 15]],\n  ['control 1', [[[3.5, 61], [0, 5], [0, 60], [14.5, 120]], 60, 18, 1], ['track', 'ok', 0]],\n  ['control 2', [[[15, 10], [12, 61], [14.5, 60], [None, 60]], 30, 15, 1], ['stow', 'wind', 15]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), 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":"0111f79ffe2ad3c8b71bc8da70752e6b5a1c32ac5c4959a0deb2c188a4b99078","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(readings, max_age, stow_at, n_required):\n    valid = [v for v, age in readings if v is not None and age < max_age]\n    if len(valid) < n_required:\n        return ['stow', 'sensor', None]\n    peak = max(valid)\n    if peak >= stow_at:\n        return ['stow', 'wind', peak]\n    return ['track', 'ok', peak]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[0, 0], [None, 61], [16.5, 60], [8, 30]], 60, 18, 2],\n   ['track', 'ok', 16.5]],\n  ['regression: stale reading age (partial repair)', [[[None, 5], [12, 61], [16.5, 30]], 60, 18, 2],\n   ['stow', 'sensor', None]],\n  ['control 1', [[[14.5, 5], [8, 5], [22, 60]], 60, 15, 2], ['stow', 'wind', 22]],\n  ['control 2', [[[8, 60], [8, 120]], 60, 18, 1], ['track', 'ok', 8]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[22, 120], [0, 30], [14.5, 0]], 30, 15, 2],\n   ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)', [[[3.5, 61], [12, 120], [12, 30]], 60, 15, 2],\n   ['stow', 'sensor', None]],\n  ['control 1', [[[8, 60], [0, 10], [14.5, 10]], 60, 18, 1], ['track', 'ok', 14.5]],\n  ['control 2', [[[3.5, 61], [22, 61], [22, 10], [16.5, 30]], 60, 18, 1], ['stow', 'wind', 22]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[14.5, 30], [0, 0], [None, 10], [14.5, 60]], 30, 15, 1],\n   ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)', [[[3.5, 10], [14.5, 61], [22, 61]], 60, 15, 1],\n   ['track', 'ok', 3.5]],\n  ['control 1', [[[22, 61], [22, 120]], 30, 18, 2], ['stow', 'sensor', None]],\n  ['control 2', [[[3.5, 30], [15, 0], [None, 61], [None, 30]], 60, 18, 2], ['track', 'ok', 15]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[14.5, 30]], 30, 18, 1], ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)',\n   [[[8, 10], [16.5, 60], [22, 61], [15, 5]], 60, 18, 1], ['track', 'ok', 16.5]],\n  ['control 1', [[[3.5, 5], [22, 30]], 30, 18, 2], ['stow', 'wind', 22]],\n  ['control 2', [[[22, 0], [3.5, 60], [12, 30], [14.5, 5]], 30, 15, 1], ['stow', 'wind', 22]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[16.5, 0], [8, 120], [16.5, 60], [12, 30]], 30, 15, 2],\n   ['stow', 'wind', 16.5]],\n  ['regression: stale reading age (partial repair)',\n   [[[None, 5], [22, 61], [15, 61], [15, 5]], 60, 18, 1], ['track', 'ok', 15]],\n  ['control 1', [[[3.5, 61], [0, 5], [0, 60], [14.5, 120]], 60, 18, 1], ['track', 'ok', 0]],\n  ['control 2', [[[15, 10], [12, 61], [14.5, 60], [None, 60]], 30, 15, 1], ['stow', 'wind', 15]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), 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":"c012b35c6822c5293819a208577523bbe82d1395def3d6016a6bb198dc039872","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(readings, max_age, stow_at, n_required):\n    valid = [v for v, age in readings if v is not None and age <= max_age]\n    if len(valid) < n_required:\n        return ['stow', 'sensor', None]\n    peak = max(valid)\n    if peak >= stow_at:\n        return ['stow', 'wind', peak]\n    return ['track', 'ok', peak]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[0, 0], [None, 61], [16.5, 60], [8, 30]], 60, 18, 2],\n   ['track', 'ok', 16.5]],\n  ['regression: stale reading age (partial repair)', [[[None, 5], [12, 61], [16.5, 30]], 60, 18, 2],\n   ['stow', 'sensor', None]],\n  ['control 1', [[[14.5, 5], [8, 5], [22, 60]], 60, 15, 2], ['stow', 'wind', 22]],\n  ['control 2', [[[8, 60], [8, 120]], 60, 18, 1], ['track', 'ok', 8]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[22, 120], [0, 30], [14.5, 0]], 30, 15, 2],\n   ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)', [[[3.5, 61], [12, 120], [12, 30]], 60, 15, 2],\n   ['stow', 'sensor', None]],\n  ['control 1', [[[8, 60], [0, 10], [14.5, 10]], 60, 18, 1], ['track', 'ok', 14.5]],\n  ['control 2', [[[3.5, 61], [22, 61], [22, 10], [16.5, 30]], 60, 18, 1], ['stow', 'wind', 22]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[14.5, 30], [0, 0], [None, 10], [14.5, 60]], 30, 15, 1],\n   ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)', [[[3.5, 10], [14.5, 61], [22, 61]], 60, 15, 1],\n   ['track', 'ok', 3.5]],\n  ['control 1', [[[22, 61], [22, 120]], 30, 18, 2], ['stow', 'sensor', None]],\n  ['control 2', [[[3.5, 30], [15, 0], [None, 61], [None, 30]], 60, 18, 2], ['track', 'ok', 15]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[14.5, 30]], 30, 18, 1], ['track', 'ok', 14.5]],\n  ['regression: stale reading age (partial repair)',\n   [[[8, 10], [16.5, 60], [22, 61], [15, 5]], 60, 18, 1], ['track', 'ok', 16.5]],\n  ['control 1', [[[3.5, 5], [22, 30]], 30, 18, 2], ['stow', 'wind', 22]],\n  ['control 2', [[[22, 0], [3.5, 60], [12, 30], [14.5, 5]], 30, 15, 1], ['stow', 'wind', 22]]],\n [['boundary: reading exactly max_age old', [[[10, 60]], 60, 15, 1], ['track', 'ok', 10]],\n  ['boundary: calm zero reading', [[[0, 5], [None, 5]], 60, 15, 1], ['track', 'ok', 0]],\n  ['boundary: wind at stow limit', [[[15, 5], [4, 5]], 60, 15, 2], ['stow', 'wind', 15]],\n  ['regression: stale reading age', [[[16.5, 0], [8, 120], [16.5, 60], [12, 30]], 30, 15, 2],\n   ['stow', 'wind', 16.5]],\n  ['regression: stale reading age (partial repair)',\n   [[[None, 5], [22, 61], [15, 61], [15, 5]], 60, 18, 1], ['track', 'ok', 15]],\n  ['control 1', [[[3.5, 61], [0, 5], [0, 60], [14.5, 120]], 60, 18, 1], ['track', 'ok', 0]],\n  ['control 2', [[[15, 10], [12, 61], [14.5, 60], [None, 60]], 30, 15, 1], ['stow', 'wind', 15]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), 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":"Deterministic stipulated toy contract for teaching; no claim of conformance with any standard, vendor protocol or production controller. 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":"w2-solar_tracker_geometry-anemometer-failsafe-stale-reading-age","generated_at":"2026-09-29T14:51:57.635456+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Single-axis and dual-axis solar trackers turn a sun direction into actuator commands; a sign, frame or limit mistake points a whole plant away from the sun or into a mechanical stop.","repair":"Accept readings with age <= max_age.","root_cause":"The freshness test is strict.","sha256":"0f1c473e3516161f835de165a4dbfb1f11bc73c8cbf41ed7b29cbf45b6edd84f","title":"Anemometer fail-safe stow voting: stale reading age · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.016,"exit_code":1,"observations":[{"actual":["track","ok",10],"check":"boundary: reading exactly max_age old","expected":["track","ok",10],"passed":true},{"actual":["track","ok",0],"check":"boundary: calm zero reading","expected":["track","ok",0],"passed":true},{"actual":["stow","wind",15],"check":"boundary: wind at stow limit","expected":["stow","wind",15],"passed":true},{"actual":["track","ok",16.5],"check":"regression: stale reading age","expected":["track","ok",16.5],"passed":true},{"actual":["track","ok",16.5],"check":"regression: stale reading age (partial repair)","expected":["stow","sensor",null],"passed":false},{"actual":["stow","wind",22],"check":"control 1","expected":["stow","wind",22],"passed":true},{"actual":["track","ok",8],"check":"control 2","expected":["track","ok",8],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: reading exactly max_age old\", \"actual\": [\"track\", \"ok\", 10], \"expected\": [\"track\", \"ok\", 10], \"passed\": true}, {\"check\": \"boundary: calm zero reading\", \"actual\": [\"track\", \"ok\", 0], \"expected\": [\"track\", \"ok\", 0], \"passed\": true}, {\"check\": \"boundary: wind at stow limit\", \"actual\": [\"stow\", \"wind\", 15], \"expected\": [\"stow\", \"wind\", 15], \"passed\": true}, {\"check\": \"regression: stale reading age\", \"actual\": [\"track\", \"ok\", 16.5], \"expected\": [\"track\", \"ok\", 16.5], \"passed\": true}, {\"check\": \"regression: stale reading age (partial repair)\", \"actual\": [\"track\", \"ok\", 16.5], \"expected\": [\"stow\", \"sensor\", null], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [\"stow\", \"wind\", 22], \"expected\": [\"stow\", \"wind\", 22], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [\"track\", \"ok\", 8], \"expected\": [\"track\", \"ok\", 8], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.396,"exit_code":1,"observations":[{"actual":["stow","sensor",null],"check":"boundary: reading exactly max_age old","expected":["track","ok",10],"passed":false},{"actual":["track","ok",0],"check":"boundary: calm zero reading","expected":["track","ok",0],"passed":true},{"actual":["stow","wind",15],"check":"boundary: wind at stow limit","expected":["stow","wind",15],"passed":true},{"actual":["track","ok",8],"check":"regression: stale reading age","expected":["track","ok",16.5],"passed":false},{"actual":["stow","sensor",null],"check":"regression: stale reading age (partial repair)","expected":["stow","sensor",null],"passed":true},{"actual":["track","ok",14.5],"check":"control 1","expected":["stow","wind",22],"passed":false},{"actual":["stow","sensor",null],"check":"control 2","expected":["track","ok",8],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: reading exactly max_age old\", \"actual\": [\"stow\", \"sensor\", null], \"expected\": [\"track\", \"ok\", 10], \"passed\": false}, {\"check\": \"boundary: calm zero reading\", \"actual\": [\"track\", \"ok\", 0], \"expected\": [\"track\", \"ok\", 0], \"passed\": true}, {\"check\": \"boundary: wind at stow limit\", \"actual\": [\"stow\", \"wind\", 15], \"expected\": [\"stow\", \"wind\", 15], \"passed\": true}, {\"check\": \"regression: stale reading age\", \"actual\": [\"track\", \"ok\", 8], \"expected\": [\"track\", \"ok\", 16.5], \"passed\": false}, {\"check\": \"regression: stale reading age (partial repair)\", \"actual\": [\"stow\", \"sensor\", null], \"expected\": [\"stow\", \"sensor\", null], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [\"track\", \"ok\", 14.5], \"expected\": [\"stow\", \"wind\", 22], \"passed\": false}, {\"check\": \"control 2\", \"actual\": [\"stow\", \"sensor\", null], \"expected\": [\"track\", \"ok\", 8], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.511,"exit_code":0,"observations":[{"actual":["track","ok",10],"check":"boundary: reading exactly max_age old","expected":["track","ok",10],"passed":true},{"actual":["track","ok",0],"check":"boundary: calm zero reading","expected":["track","ok",0],"passed":true},{"actual":["stow","wind",15],"check":"boundary: wind at stow limit","expected":["stow","wind",15],"passed":true},{"actual":["track","ok",16.5],"check":"regression: stale reading age","expected":["track","ok",16.5],"passed":true},{"actual":["stow","sensor",null],"check":"regression: stale reading age (partial repair)","expected":["stow","sensor",null],"passed":true},{"actual":["stow","wind",22],"check":"control 1","expected":["stow","wind",22],"passed":true},{"actual":["track","ok",8],"check":"control 2","expected":["track","ok",8],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: reading exactly max_age old\", \"actual\": [\"track\", \"ok\", 10], \"expected\": [\"track\", \"ok\", 10], \"passed\": true}, {\"check\": \"boundary: calm zero reading\", \"actual\": [\"track\", \"ok\", 0], \"expected\": [\"track\", \"ok\", 0], \"passed\": true}, {\"check\": \"boundary: wind at stow limit\", \"actual\": [\"stow\", \"wind\", 15], \"expected\": [\"stow\", \"wind\", 15], \"passed\": true}, {\"check\": \"regression: stale reading age\", \"actual\": [\"track\", \"ok\", 16.5], \"expected\": [\"track\", \"ok\", 16.5], \"passed\": true}, {\"check\": \"regression: stale reading age (partial repair)\", \"actual\": [\"stow\", \"sensor\", null], \"expected\": [\"stow\", \"sensor\", null], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [\"stow\", \"wind\", 22], \"expected\": [\"stow\", \"wind\", 22], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [\"track\", \"ok\", 8], \"expected\": [\"track\", \"ok\", 8], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}