FAILURE MAP
← Case archive

FA-17936 / Time representation / Open access

RTC snapshot admits stopped oscillator or contradictory mode bit · case 01

The decoded time state disagrees with the explicit regression oracle for valid.

Verified by executionVariant 1 · 15 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

RTC snapshot admits stopped oscillator or contradictory mode bit.

VERIFIED REPAIR

Preserve the declared coordinate and state contract at valid: valid = bcd and hour_valid and minute_valid and second_valid and mode_valid and r['running'].

Unsuccessful approach: The partial correction still substitutes bcd and hour_valid and minute_valid and second_valid and r['running'] 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 = 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
    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 fixtureActualExpectedOutcome
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[True, 13, 0, 0][False, 13, 0, 0]Failed
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 / 9eb5dbec19b3ac82146db3555b1751856b7c28f495c28da1ddecdd650d5eb2e3

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 = 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 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 fixtureActualExpectedOutcome
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 / a2441fd4aa4fdd5794039437cd5f056dd7bbef912498b27cb8f78583ada6eb0f

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 fixtureActualExpectedOutcome
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.470361+00:00.

Case digest / fcddc8293b2e74063c91742a24edd53f738dee4bce2ea62c58de7fc9bf169b08