FA-74291 / Feature flag rollout bucketing / Open access
Timestamp targeting clause: Booleans are treated as epoch milliseconds · case 01
A user attribute true compares as 1 ms after the epoch and matches "before" clauses.
ROOT CAUSE
bool values pass the int/float check because bool subclasses int.
VERIFIED REPAIR
Reject booleans before numeric handling.
Unsuccessful approach: Rejecting only True still accepts False as the epoch.
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, (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),
('timestamp pair sample 1', ['2023-11-14T23:13:20+01:00', 'on', True], False),
('timestamp pair sample 2', [0, 'before', 1700000000000], True),
('timestamp pair sample 3', [1700000000, 'after', 1700000000001], False)],
[('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),
('timestamp pair sample 6', [True, 'after', 1700000000001], False),
('timestamp pair sample 25', [False, 'before', '2023-11-14T22:13:20Z'], False),
('timestamp pair sample 54', [False, 'before', '2023-11-14T22:13:20Z'], 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 48', [False, 'before', 1699999999999], False),
('timestamp pair sample 54', [False, 'before', '2023-11-14T22:13:20Z'], 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 4', [1700000000001, 'after', False], False),
('timestamp pair sample 16', ['2023-11-14T22:13:20Z', 'before', True], False),
('timestamp pair sample 44', [True, '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),
('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 28', [True, 'before', 1700000000001], False),
('timestamp pair sample 48', [False, 'before', 1699999999999], 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| ISO clause converts to milliseconds | True | True | Passed |
| boolean user value is unusable | True | False | Failed |
| false user value is unusable | True | False | Failed |
| equal timestamps are not before | False | False | Passed |
| one millisecond earlier is before | True | True | Passed |
| timestamp pair sample 1 | False | False | Passed |
| timestamp pair sample 2 | True | True | Passed |
| timestamp pair sample 3 | False | False | Passed |
SHA-256 / a6fe3601324ae1ea72e69e6965a037b336188651fca7e69f4b6950a8c6711ce6
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 v is True:
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),
('timestamp pair sample 1', ['2023-11-14T23:13:20+01:00', 'on', True], False),
('timestamp pair sample 2', [0, 'before', 1700000000000], True),
('timestamp pair sample 3', [1700000000, 'after', 1700000000001], False)],
[('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),
('timestamp pair sample 6', [True, 'after', 1700000000001], False),
('timestamp pair sample 25', [False, 'before', '2023-11-14T22:13:20Z'], False),
('timestamp pair sample 54', [False, 'before', '2023-11-14T22:13:20Z'], 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 48', [False, 'before', 1699999999999], False),
('timestamp pair sample 54', [False, 'before', '2023-11-14T22:13:20Z'], 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 4', [1700000000001, 'after', False], False),
('timestamp pair sample 16', ['2023-11-14T22:13:20Z', 'before', True], False),
('timestamp pair sample 44', [True, '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),
('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 28', [True, 'before', 1700000000001], False),
('timestamp pair sample 48', [False, 'before', 1699999999999], 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| ISO clause converts to milliseconds | True | True | Passed |
| boolean user value is unusable | False | False | Passed |
| false user value is unusable | True | False | Failed |
| equal timestamps are not before | False | False | Passed |
| one millisecond earlier is before | True | True | Passed |
| timestamp pair sample 1 | False | False | Passed |
| timestamp pair sample 2 | True | True | Passed |
| timestamp pair sample 3 | False | False | Passed |
SHA-256 / eda4a0ff44e23dd41600f5410173ab60dd4cb8d582a26bc863df00516a9b65f6
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),
('timestamp pair sample 1', ['2023-11-14T23:13:20+01:00', 'on', True], False),
('timestamp pair sample 2', [0, 'before', 1700000000000], True),
('timestamp pair sample 3', [1700000000, 'after', 1700000000001], False)],
[('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),
('timestamp pair sample 6', [True, 'after', 1700000000001], False),
('timestamp pair sample 25', [False, 'before', '2023-11-14T22:13:20Z'], False),
('timestamp pair sample 54', [False, 'before', '2023-11-14T22:13:20Z'], 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 48', [False, 'before', 1699999999999], False),
('timestamp pair sample 54', [False, 'before', '2023-11-14T22:13:20Z'], 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 4', [1700000000001, 'after', False], False),
('timestamp pair sample 16', ['2023-11-14T22:13:20Z', 'before', True], False),
('timestamp pair sample 44', [True, '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),
('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 28', [True, 'before', 1700000000001], False),
('timestamp pair sample 48', [False, 'before', 1699999999999], 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| ISO clause converts to milliseconds | True | True | Passed |
| boolean user value is unusable | False | False | Passed |
| false user value is unusable | False | False | Passed |
| equal timestamps are not before | False | False | Passed |
| one millisecond earlier is before | True | True | Passed |
| timestamp pair sample 1 | False | False | Passed |
| timestamp pair sample 2 | True | True | Passed |
| timestamp pair sample 3 | False | False | Passed |
SHA-256 / ff03827e82c048645a5049dacc27b5ade6c4527b8cddaf9eb8cdad4b0d4f8fb9
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.232364+00:00.
Case digest / e6a12e85924f67f4639e9a465562df155195e125106249b1b6cb735e4d2058c7