FAILURE MAP
← Case archive

FA-74301 / Feature flag rollout bucketing / Open access

Timestamp targeting clause: Offset timestamps are read as UTC · case 01

A clause user value of 23:13:20+01:00 is treated as 23:13:20 UTC, an hour late.

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

ROOT CAUSE

The parser reads the first 19 characters and ignores whatever zone suffix follows.

VERIFIED REPAIR

Accept only strings ending in "Z" with the exact 20-character layout.

Unsuccessful approach: Also accepting "+00:00" admits a spelling the contract rejects.

Case contract

Values are epoch milliseconds (int or float) or UTC strings exactly "YYYY-MM-DDTHH:MM:SSZ" converted to milliseconds; booleans, other strings and invalid dates are unusable and make the clause false. op before means user < clause, after means user > clause (strict); other ops are false.

Why this case matters

Date clauses schedule launches and trials; unit and timezone slips shift them by days or years.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
N = 1
observations = []
def solve(user_value, op, clause_value):
    def ms(v):
        if isinstance(v, bool):
            return None
        if isinstance(v, (int, float)):
            return v
        if isinstance(v, str) and len(v) >= 19:
            try:
                d = datetime.datetime.strptime(v[:19], '%Y-%m-%dT%H:%M:%S').replace(tzinfo=datetime.timezone.utc)
            except ValueError:
                return None
            return int(d.timestamp()) * 1000
        return None
    a, b = ms(user_value), ms(clause_value)
    if a is None or b is None:
        return False
    if op == 'before':
        return a < b
    if op == 'after':
        return a > b
    return False
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ISO clause converts to milliseconds', [1700000000001, 'after', '2023-11-14T22:13:20Z'], True),
  ('boolean user value is unusable', [True, 'after', 0], False),
  ('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 1', ['2023-11-14T23:13:20+01:00', 'on', True], False),
  ('timestamp pair sample 2', [0, 'before', 1700000000000], True)],
 [('boolean user value is unusable', [True, 'after', 0], False),
  ('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 6', [True, 'after', 1700000000001], False),
  ('timestamp pair sample 24', ['2023-11-14T23:13:20+01:00', 'after', 0], False)],
 [('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 11', ['soon', 'after', 1700000000001], False),
  ('timestamp pair sample 12', ['2023-11-14T22:13:21Z', 'after', 1700000000001], True),
  ('timestamp pair sample 13', [1700000000, 'before', 1700000000], False)],
 [('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('invalid calendar date is unusable', ['2023-02-30T00:00:00Z', 'before', 1800000000000], False),
  ('timestamp pair sample 16', ['2023-11-14T22:13:20Z', 'before', True], False),
  ('timestamp pair sample 17', [1699999999999, 'before', 1], False),
  ('timestamp pair sample 24', ['2023-11-14T23:13:20+01:00', 'after', 0], False)],
 [('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('invalid calendar date is unusable', ['2023-02-30T00:00:00Z', 'before', 1800000000000], False),
  ('seconds epoch compared as milliseconds', [1700000000, 'before', '2023-11-14T22:13:20Z'], True),
  ('timestamp pair sample 21', ['soon', 'after', '2023-11-14T22:13:20Z'], False),
  ('timestamp pair sample 22', ['2023-11-14T22:13:20Z', 'after', '2023-11-14T22:13:20+00:00'], False),
  ('timestamp pair sample 23', [1700000000, 'before', False], False)]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
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
ISO clause converts to millisecondsTrueTruePassed
boolean user value is unusableFalseFalsePassed
false user value is unusableFalseFalsePassed
equal timestamps are not beforeFalseFalsePassed
one millisecond earlier is beforeTrueTruePassed
explicit UTC offset spelling is unusableTrueFalseFailed
timestamp pair sample 1FalseFalsePassed
timestamp pair sample 2TrueTruePassed

SHA-256 / 16d2ddfc9906772f9090db8586856ac7964e1061de26f7c162c67ba74445cafa

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
N = 1
observations = []
def solve(user_value, op, clause_value):
    def ms(v):
        if isinstance(v, bool):
            return None
        if isinstance(v, (int, float)):
            return v
        if isinstance(v, str) and (len(v) == 20 and v.endswith('Z') or len(v) == 25 and v.endswith('+00:00')):
            try:
                d = datetime.datetime.strptime(v[:19] + 'Z', '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=datetime.timezone.utc)
            except ValueError:
                return None
            return int(d.timestamp()) * 1000
        return None
    a, b = ms(user_value), ms(clause_value)
    if a is None or b is None:
        return False
    if op == 'before':
        return a < b
    if op == 'after':
        return a > b
    return False
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ISO clause converts to milliseconds', [1700000000001, 'after', '2023-11-14T22:13:20Z'], True),
  ('boolean user value is unusable', [True, 'after', 0], False),
  ('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 1', ['2023-11-14T23:13:20+01:00', 'on', True], False),
  ('timestamp pair sample 2', [0, 'before', 1700000000000], True)],
 [('boolean user value is unusable', [True, 'after', 0], False),
  ('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 6', [True, 'after', 1700000000001], False),
  ('timestamp pair sample 24', ['2023-11-14T23:13:20+01:00', 'after', 0], False)],
 [('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 11', ['soon', 'after', 1700000000001], False),
  ('timestamp pair sample 12', ['2023-11-14T22:13:21Z', 'after', 1700000000001], True),
  ('timestamp pair sample 13', [1700000000, 'before', 1700000000], False)],
 [('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('invalid calendar date is unusable', ['2023-02-30T00:00:00Z', 'before', 1800000000000], False),
  ('timestamp pair sample 16', ['2023-11-14T22:13:20Z', 'before', True], False),
  ('timestamp pair sample 17', [1699999999999, 'before', 1], False),
  ('timestamp pair sample 24', ['2023-11-14T23:13:20+01:00', 'after', 0], False)],
 [('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('invalid calendar date is unusable', ['2023-02-30T00:00:00Z', 'before', 1800000000000], False),
  ('seconds epoch compared as milliseconds', [1700000000, 'before', '2023-11-14T22:13:20Z'], True),
  ('timestamp pair sample 21', ['soon', 'after', '2023-11-14T22:13:20Z'], False),
  ('timestamp pair sample 22', ['2023-11-14T22:13:20Z', 'after', '2023-11-14T22:13:20+00:00'], False),
  ('timestamp pair sample 23', [1700000000, 'before', False], False)]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
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
ISO clause converts to millisecondsTrueTruePassed
boolean user value is unusableFalseFalsePassed
false user value is unusableFalseFalsePassed
equal timestamps are not beforeFalseFalsePassed
one millisecond earlier is beforeTrueTruePassed
explicit UTC offset spelling is unusableTrueFalseFailed
timestamp pair sample 1FalseFalsePassed
timestamp pair sample 2TrueTruePassed

SHA-256 / a29fd4e4f3d52507423f2f8694e3fbe5d44a8b28c8c707324c1da166e5cd30c1

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
N = 1
observations = []
def solve(user_value, op, clause_value):
    def ms(v):
        if isinstance(v, bool):
            return None
        if isinstance(v, (int, float)):
            return v
        if isinstance(v, str) and len(v) == 20 and v.endswith('Z'):
            try:
                d = datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=datetime.timezone.utc)
            except ValueError:
                return None
            return int(d.timestamp()) * 1000
        return None
    a, b = ms(user_value), ms(clause_value)
    if a is None or b is None:
        return False
    if op == 'before':
        return a < b
    if op == 'after':
        return a > b
    return False
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ISO clause converts to milliseconds', [1700000000001, 'after', '2023-11-14T22:13:20Z'], True),
  ('boolean user value is unusable', [True, 'after', 0], False),
  ('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 1', ['2023-11-14T23:13:20+01:00', 'on', True], False),
  ('timestamp pair sample 2', [0, 'before', 1700000000000], True)],
 [('boolean user value is unusable', [True, 'after', 0], False),
  ('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 6', [True, 'after', 1700000000001], False),
  ('timestamp pair sample 24', ['2023-11-14T23:13:20+01:00', 'after', 0], False)],
 [('false user value is unusable', [False, 'before', 1], False),
  ('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('timestamp pair sample 11', ['soon', 'after', 1700000000001], False),
  ('timestamp pair sample 12', ['2023-11-14T22:13:21Z', 'after', 1700000000001], True),
  ('timestamp pair sample 13', [1700000000, 'before', 1700000000], False)],
 [('equal timestamps are not before', [1700000000000, 'before', '2023-11-14T22:13:20Z'], False),
  ('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('invalid calendar date is unusable', ['2023-02-30T00:00:00Z', 'before', 1800000000000], False),
  ('timestamp pair sample 16', ['2023-11-14T22:13:20Z', 'before', True], False),
  ('timestamp pair sample 17', [1699999999999, 'before', 1], False),
  ('timestamp pair sample 24', ['2023-11-14T23:13:20+01:00', 'after', 0], False)],
 [('one millisecond earlier is before', [1699999999999, 'before', 1700000000000], True),
  ('offset string is unusable', ['2023-11-14T23:13:20+01:00', 'before', '2023-11-14T22:13:21Z'], False),
  ('explicit UTC offset spelling is unusable', ['2023-11-14T22:13:20+00:00', 'before', 1800000000000], False),
  ('invalid calendar date is unusable', ['2023-02-30T00:00:00Z', 'before', 1800000000000], False),
  ('seconds epoch compared as milliseconds', [1700000000, 'before', '2023-11-14T22:13:20Z'], True),
  ('timestamp pair sample 21', ['soon', 'after', '2023-11-14T22:13:20Z'], False),
  ('timestamp pair sample 22', ['2023-11-14T22:13:20Z', 'after', '2023-11-14T22:13:20+00:00'], False),
  ('timestamp pair sample 23', [1700000000, 'before', False], False)]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
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
ISO clause converts to millisecondsTrueTruePassed
boolean user value is unusableFalseFalsePassed
false user value is unusableFalseFalsePassed
equal timestamps are not beforeFalseFalsePassed
one millisecond earlier is beforeTrueTruePassed
explicit UTC offset spelling is unusableFalseFalsePassed
timestamp pair sample 1FalseFalsePassed
timestamp pair sample 2TrueTruePassed

SHA-256 / f2cc9336bc23d6c802aab61f7c5c4c0768367292290a32867594d110b9637471

Verification & scope

A deterministic toy flag-evaluation model with a stipulated contract; it does not reproduce any vendor SDK byte for byte. 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:48:55.381625+00:00.

Case digest / b8d415bd1a1292ac4bfc98c744962c1a08fa1184b284c86a94d8c8ceb4a0d9a0