FA-17926 / Time representation / Open access
RTC mode validation ignores forbidden PM bit or rejects valid PM · case 01
The decoded time state disagrees with the explicit regression oracle for mode_valid.
ROOT CAUSE
RTC mode validation ignores forbidden PM bit or rejects valid PM.
VERIFIED REPAIR
Preserve the declared coordinate and state contract at mode_valid: mode_valid = r['twelve'] or not r['pm'].
Unsuccessful approach: The partial correction still substitutes not r['pm'] 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['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 = True
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 | [True, 1, 0, 0] | [False, 1, 0, 0] | Failed |
| 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 / 33b02d91bda35487923092b9b1f2225f799d4c3aeb38afd752fee7beee049abd
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['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 = 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 | [False, 12, 59, 59] | [True, 12, 59, 59] | Failed |
| 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 | [False, 13, 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 / 67a755f20ef953a860500e660f477f1bd356c040cf3c6000f84f9d1cae9524ab
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:52.410103+00:00.
Case digest / 69adf4d1526355f985e9a9edfd4e8c9f4db8f11c8a572b6809acf1fbca89dc8b