FA-17891 / Time representation / Open access
RTC hour read reuses a preceding latch generation · case 01
The decoded time state disagrees with the explicit regression oracle for hour.
ROOT CAUSE
RTC hour read reuses a preceding latch generation.
VERIFIED REPAIR
Preserve the declared coordinate and state contract at hour: hour = (r['hour'] >> 4) * 10 + (r['hour'] & 15).
Unsuccessful approach: The partial correction still substitutes ((r['previous_hour'] >> 4)*10+(r['previous_hour']&15)) if r['minute'] == 0 else (r['hour'] >> 4)*10+(r['hour']&15) at the same fault site.
Case contract
Controlled RTC snapshot consists of packed BCD hour/minute/second bytes, an hour-mode flag, PM flag and oscillator-running flag. Decode BCD only if each nibble is decimal. In twelve-hour mode valid hours are 1..12; in twenty-four-hour mode 0..23 and PM is forbidden. A stopped oscillator invalidates the reading. Return valid and 24-hour components. Equal generation stamps before and after register reads are required for a coherent snapshot; previous_hour is stale diagnostic context and must not replace the current hour.
Why this case matters
Clock transfer and timestamp consumers require preserved coordinate, phase, validity and elapsed-time semantics.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(r):
hour = (r['previous_hour'] >> 4)*10+(r['previous_hour']&15)
minute = (r['minute'] >> 4) * 10 + (r['minute'] & 15)
second = (r['second'] >> 4) * 10 + (r['second'] & 15)
bcd = all(0 <= r[k] <= 255 and r[k] >> 4 <= 9 and r[k] & 15 <= 9 for k in ('hour','minute','second')) and r['generation_before'] == r['generation_after']
hour_valid = 1 <= hour <= 12 if r['twelve'] else 0 <= hour <= 23
minute_valid = 0 <= minute <= 59
second_valid = 0 <= second <= 59
mode_valid = r['twelve'] or not r['pm']
converted_hour = hour % 12 + 12 * int(r['pm']) if r['twelve'] else hour
valid = bcd and hour_valid and minute_valid and second_valid and mode_valid and r['running']
return [valid,converted_hour,minute,second]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({'hour': 18, 'minute': 52, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 0, 34, 56])
check('fixture 2', solve({'hour': 18, 'minute': 89, 'second': 89, 'twelve': True, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 12, 59, 59])
check('fixture 3', solve({'hour': 35, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 23, 0, 0])
check('fixture 4', solve({'hour': 0, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 0, 0, 0])
check('fixture 5', solve({'hour': 0, 'minute': 0, 'second': 0, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 0, 0, 0])
check('fixture 6', solve({'hour': 19, 'minute': 0, 'second': 0, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 1, 0, 0])
check('fixture 7', solve({'hour': 16, 'minute': 96, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 10, 60, 0])
check('fixture 8', solve({'hour': 16, 'minute': 0, 'second': 96, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 10, 0, 60])
check('fixture 9', solve({'hour': 26, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 20, 0, 0])
check('fixture 10', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': False, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 1, 0, 0])
check('fixture 11', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': True, 'pm': True, 'running': False, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 13, 0, 0])
check('fixture 12', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': True, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 13, 0, 0])
check('fixture 13', solve({'hour': 16, 'minute': 89, 'second': 88, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 10, 59, 58])
check('fixture 14', solve({'hour': 18, 'minute': 52, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 2}), [False, 0, 34, 56])
variant = [({'hour': 18, 'minute': 1, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 1, 56]), ({'hour': 18, 'minute': 2, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 2, 56]), ({'hour': 18, 'minute': 3, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 3, 56]), ({'hour': 18, 'minute': 4, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 4, 56]), ({'hour': 18, 'minute': 5, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 5, 56])]
check("variant capture", solve(variant[N-1][0]), variant[N-1][1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | [True, 11, 34, 56] | [True, 0, 34, 56] | Failed |
| fixture 2 | [True, 23, 59, 59] | [True, 12, 59, 59] | Failed |
| fixture 3 | [True, 11, 0, 0] | [True, 23, 0, 0] | Failed |
| fixture 4 | [True, 11, 0, 0] | [True, 0, 0, 0] | Failed |
| fixture 5 | [True, 11, 0, 0] | [False, 0, 0, 0] | Failed |
| fixture 6 | [True, 11, 0, 0] | [False, 1, 0, 0] | Failed |
| fixture 7 | [False, 11, 60, 0] | [False, 10, 60, 0] | Failed |
| fixture 8 | [False, 11, 0, 60] | [False, 10, 0, 60] | Failed |
| fixture 9 | [False, 11, 0, 0] | [False, 20, 0, 0] | Failed |
| fixture 10 | [False, 11, 0, 0] | [False, 1, 0, 0] | Failed |
| fixture 11 | [False, 23, 0, 0] | [False, 13, 0, 0] | Failed |
| fixture 12 | [True, 23, 0, 0] | [True, 13, 0, 0] | Failed |
| fixture 13 | [True, 11, 59, 58] | [True, 10, 59, 58] | Failed |
| fixture 14 | [False, 11, 34, 56] | [False, 0, 34, 56] | Failed |
| variant capture | [True, 11, 1, 56] | [True, 0, 1, 56] | Failed |
SHA-256 / 5a12aec45359920f6c3c89fa87246323cf241d90b280c7fc56b09289134ffa29
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(r):
hour = ((r['previous_hour'] >> 4)*10+(r['previous_hour']&15)) if r['minute'] == 0 else (r['hour'] >> 4)*10+(r['hour']&15)
minute = (r['minute'] >> 4) * 10 + (r['minute'] & 15)
second = (r['second'] >> 4) * 10 + (r['second'] & 15)
bcd = all(0 <= r[k] <= 255 and r[k] >> 4 <= 9 and r[k] & 15 <= 9 for k in ('hour','minute','second')) and r['generation_before'] == r['generation_after']
hour_valid = 1 <= hour <= 12 if r['twelve'] else 0 <= hour <= 23
minute_valid = 0 <= minute <= 59
second_valid = 0 <= second <= 59
mode_valid = r['twelve'] or not r['pm']
converted_hour = hour % 12 + 12 * int(r['pm']) if r['twelve'] else hour
valid = bcd and hour_valid and minute_valid and second_valid and mode_valid and r['running']
return [valid,converted_hour,minute,second]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({'hour': 18, 'minute': 52, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 0, 34, 56])
check('fixture 2', solve({'hour': 18, 'minute': 89, 'second': 89, 'twelve': True, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 12, 59, 59])
check('fixture 3', solve({'hour': 35, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 23, 0, 0])
check('fixture 4', solve({'hour': 0, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 0, 0, 0])
check('fixture 5', solve({'hour': 0, 'minute': 0, 'second': 0, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 0, 0, 0])
check('fixture 6', solve({'hour': 19, 'minute': 0, 'second': 0, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 1, 0, 0])
check('fixture 7', solve({'hour': 16, 'minute': 96, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 10, 60, 0])
check('fixture 8', solve({'hour': 16, 'minute': 0, 'second': 96, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 10, 0, 60])
check('fixture 9', solve({'hour': 26, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 20, 0, 0])
check('fixture 10', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': False, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 1, 0, 0])
check('fixture 11', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': True, 'pm': True, 'running': False, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 13, 0, 0])
check('fixture 12', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': True, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 13, 0, 0])
check('fixture 13', solve({'hour': 16, 'minute': 89, 'second': 88, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 10, 59, 58])
check('fixture 14', solve({'hour': 18, 'minute': 52, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 2}), [False, 0, 34, 56])
variant = [({'hour': 18, 'minute': 1, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 1, 56]), ({'hour': 18, 'minute': 2, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 2, 56]), ({'hour': 18, 'minute': 3, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 3, 56]), ({'hour': 18, 'minute': 4, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 4, 56]), ({'hour': 18, 'minute': 5, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 5, 56])]
check("variant capture", solve(variant[N-1][0]), variant[N-1][1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | [True, 0, 34, 56] | [True, 0, 34, 56] | Passed |
| fixture 2 | [True, 12, 59, 59] | [True, 12, 59, 59] | Passed |
| fixture 3 | [True, 11, 0, 0] | [True, 23, 0, 0] | Failed |
| fixture 4 | [True, 11, 0, 0] | [True, 0, 0, 0] | Failed |
| fixture 5 | [True, 11, 0, 0] | [False, 0, 0, 0] | Failed |
| fixture 6 | [True, 11, 0, 0] | [False, 1, 0, 0] | Failed |
| fixture 7 | [False, 10, 60, 0] | [False, 10, 60, 0] | Passed |
| fixture 8 | [False, 11, 0, 60] | [False, 10, 0, 60] | Failed |
| fixture 9 | [False, 11, 0, 0] | [False, 20, 0, 0] | Failed |
| fixture 10 | [False, 11, 0, 0] | [False, 1, 0, 0] | Failed |
| fixture 11 | [False, 23, 0, 0] | [False, 13, 0, 0] | Failed |
| fixture 12 | [True, 23, 0, 0] | [True, 13, 0, 0] | Failed |
| fixture 13 | [True, 10, 59, 58] | [True, 10, 59, 58] | Passed |
| fixture 14 | [False, 0, 34, 56] | [False, 0, 34, 56] | Passed |
| variant capture | [True, 0, 1, 56] | [True, 0, 1, 56] | Passed |
SHA-256 / ed2e8ffbfd1499bf8d9527b9c2ab30cfb284418b380cfec28a7098234bdb806c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(r):
hour = (r['hour'] >> 4) * 10 + (r['hour'] & 15)
minute = (r['minute'] >> 4) * 10 + (r['minute'] & 15)
second = (r['second'] >> 4) * 10 + (r['second'] & 15)
bcd = all(0 <= r[k] <= 255 and r[k] >> 4 <= 9 and r[k] & 15 <= 9 for k in ('hour','minute','second')) and r['generation_before'] == r['generation_after']
hour_valid = 1 <= hour <= 12 if r['twelve'] else 0 <= hour <= 23
minute_valid = 0 <= minute <= 59
second_valid = 0 <= second <= 59
mode_valid = r['twelve'] or not r['pm']
converted_hour = hour % 12 + 12 * int(r['pm']) if r['twelve'] else hour
valid = bcd and hour_valid and minute_valid and second_valid and mode_valid and r['running']
return [valid,converted_hour,minute,second]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({'hour': 18, 'minute': 52, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 0, 34, 56])
check('fixture 2', solve({'hour': 18, 'minute': 89, 'second': 89, 'twelve': True, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 12, 59, 59])
check('fixture 3', solve({'hour': 35, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 23, 0, 0])
check('fixture 4', solve({'hour': 0, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 0, 0, 0])
check('fixture 5', solve({'hour': 0, 'minute': 0, 'second': 0, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 0, 0, 0])
check('fixture 6', solve({'hour': 19, 'minute': 0, 'second': 0, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 1, 0, 0])
check('fixture 7', solve({'hour': 16, 'minute': 96, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 10, 60, 0])
check('fixture 8', solve({'hour': 16, 'minute': 0, 'second': 96, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 10, 0, 60])
check('fixture 9', solve({'hour': 26, 'minute': 0, 'second': 0, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 20, 0, 0])
check('fixture 10', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': False, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 1, 0, 0])
check('fixture 11', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': True, 'pm': True, 'running': False, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [False, 13, 0, 0])
check('fixture 12', solve({'hour': 1, 'minute': 0, 'second': 0, 'twelve': True, 'pm': True, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 13, 0, 0])
check('fixture 13', solve({'hour': 16, 'minute': 89, 'second': 88, 'twelve': False, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}), [True, 10, 59, 58])
check('fixture 14', solve({'hour': 18, 'minute': 52, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 2}), [False, 0, 34, 56])
variant = [({'hour': 18, 'minute': 1, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 1, 56]), ({'hour': 18, 'minute': 2, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 2, 56]), ({'hour': 18, 'minute': 3, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 3, 56]), ({'hour': 18, 'minute': 4, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 4, 56]), ({'hour': 18, 'minute': 5, 'second': 86, 'twelve': True, 'pm': False, 'running': True, 'previous_hour': 17, 'generation_before': 1, 'generation_after': 1}, [True, 0, 5, 56])]
check("variant capture", solve(variant[N-1][0]), variant[N-1][1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | [True, 0, 34, 56] | [True, 0, 34, 56] | Passed |
| fixture 2 | [True, 12, 59, 59] | [True, 12, 59, 59] | Passed |
| fixture 3 | [True, 23, 0, 0] | [True, 23, 0, 0] | Passed |
| fixture 4 | [True, 0, 0, 0] | [True, 0, 0, 0] | Passed |
| fixture 5 | [False, 0, 0, 0] | [False, 0, 0, 0] | Passed |
| fixture 6 | [False, 1, 0, 0] | [False, 1, 0, 0] | Passed |
| fixture 7 | [False, 10, 60, 0] | [False, 10, 60, 0] | Passed |
| fixture 8 | [False, 10, 0, 60] | [False, 10, 0, 60] | Passed |
| fixture 9 | [False, 20, 0, 0] | [False, 20, 0, 0] | Passed |
| fixture 10 | [False, 1, 0, 0] | [False, 1, 0, 0] | Passed |
| fixture 11 | [False, 13, 0, 0] | [False, 13, 0, 0] | Passed |
| fixture 12 | [True, 13, 0, 0] | [True, 13, 0, 0] | Passed |
| fixture 13 | [True, 10, 59, 58] | [True, 10, 59, 58] | Passed |
| fixture 14 | [False, 0, 34, 56] | [False, 0, 34, 56] | Passed |
| variant capture | [True, 0, 1, 56] | [True, 0, 1, 56] | Passed |
SHA-256 / 8d2152526c8b9a73a06f04b84b13ba8e02ac0f1e8dc65d483f51682f9ce4e3d2
Verification & scope
Deterministic integer reference model with stipulated units and policies; not a complete clock, wire standard or platform implementation. 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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:39:51.845340+00:00.
Case digest / a28467b5a67722de07bc8468d7a81d3e8380fc95951da21ce8c07a0ace85eb00