Not Future Check Examples
Three real-world scenarios that show how the Not Future check is typically used in production: catching a clock or time zone problem on order timestamps, validating manually entered dates, and auditing a sensor feed mid-cleanup. The first two run at 100% coverage and report Record Anomalies; the third lowers coverage and reports a Shape Anomaly instead.
The situation: Orders are written by several regional services. An order timestamp ahead of the present moment means one of those services is converting time zones in the wrong direction, and every report that buckets orders by day will place those orders in tomorrow.
Check configuration
| Field | Value |
|---|---|
| Rule | Not Future |
| Field | ordered_at |
| Filter | (none) |
| Custom Anomaly Description | Off |
| Coverage | 100% |
| Owner | (check creator) |
| Anomaly Assignee | (Order Platform team) |
| Description | The order timestamp can never be in the future. |
| Tags | timeliness, plausibility |
| Additional Metadata | jira: DATA-10400 |
| Status | Active |
Payload
{
"description": "The order timestamp can never be in the future.",
"rule": "notFuture",
"fields": ["ordered_at"],
"container_id": 145,
"coverage": 1,
"filter": null,
"properties": {},
"tags": ["timeliness", "plausibility"],
"additional_metadata": {"jira": "DATA-10400"},
"anomaly_message_field": null,
"template_id": null,
"status": "Active",
"owner_id": 7,
"default_anomaly_assignee_id": 12
}
Sample Data (evaluated during a Scan run on 11 March 2026)
| order_id | ordered_at | region |
|---|---|---|
| O-001 | 2026-03-11 08:14:00 | EU |
| O-002 | 2026-03-12 21:40:00 | APAC |
| O-003 | (null) | EU |
What gets flagged
O-002 carries a timestamp more than a day ahead of the Scan: the APAC service added the offset instead of subtracting it. O-003 has no timestamp and passes without firing an anomaly. Coverage is 100%, so the failing row is reported as a Record Anomaly.
Record Anomaly
The field 'ordered_at' has value 2026-03-12 21:40:00, which is a future date/time
Flowchart
graph TD
A["No filter, evaluate all rows"] --> B["Read ordered_at"]
B --> C{"Is value NULL?"}
C -->|Yes| D["Row passes"]
C -->|No| E{"Is ordered_at earlier than now?"}
E -->|Yes| D
E -->|No| F["Flag row.<br/>Record Anomaly per failing row."]
Equivalent SQL
The situation: Support agents type the incident date by hand. A mistyped year puts the incident decades ahead and pushes it out of every reporting window. Draft tickets are excluded with a filter, because agents fill the date in only when the ticket is submitted.
Check configuration
| Field | Value |
|---|---|
| Rule | Not Future |
| Field | incident_date |
| Filter | status <> 'draft' |
| Custom Anomaly Description | Off |
| Coverage | 100% |
| Owner | (check creator) |
| Anomaly Assignee | (Support Operations) |
| Description | A submitted incident date can never be in the future. |
| Tags | manual-entry, plausibility |
| Additional Metadata | jira: DATA-10422 |
| Status | Active |
Payload
{
"description": "A submitted incident date can never be in the future.",
"rule": "notFuture",
"fields": ["incident_date"],
"container_id": 512,
"coverage": 1,
"filter": "status <> 'draft'",
"properties": {},
"tags": ["manual-entry", "plausibility"],
"additional_metadata": {"jira": "DATA-10422"},
"anomaly_message_field": null,
"template_id": null,
"status": "Active",
"owner_id": 7,
"default_anomaly_assignee_id": 47
}
Sample Data (filtered to status <> 'draft', evaluated on 11 March 2026)
| ticket_id | status | incident_date |
|---|---|---|
| T-01 | submitted | 2026-03-04 |
| T-02 | submitted | 2062-03-05 |
| T-03 | submitted | 2026-02-28 |
Why the filter matters
The filter runs before the comparison, so draft tickets, where the agent has not entered a date yet, are never evaluated and cannot inflate the violation count.
What gets flagged
T-02 was typed as 2062 instead of 2026, a transposed digit that puts the incident 36 years ahead. Coverage is 100%, so the failure is reported as a Record Anomaly, and the message ends with the filter that scoped the evaluation.
Record Anomaly
The field 'incident_date' has value 2062-03-05, which is a future date/time [filter: status <> 'draft']
Flowchart
graph TD
A["Apply filter: status <> 'draft'"] --> B["Read incident_date"]
B --> C{"Is incident_date earlier than now?"}
C -->|Yes| D["Row passes"]
C -->|No| E["Flag row.<br/>Anomaly message ends with<br/>[filter: status <> 'draft']"]
Equivalent SQL
The situation: Field devices stamp their own readings. A handful run on clocks that drift ahead until the next sync, so a small share of readings legitimately arrives slightly in the future while a firmware fix rolls out. Coverage is lowered to 97% so the check tracks the problem without failing every Scan.
Check configuration
| Field | Value |
|---|---|
| Rule | Not Future |
| Field | reading_at |
| Filter | (none) |
| Custom Anomaly Description | Off |
| Coverage | 97% |
| Owner | (check creator) |
| Anomaly Assignee | (IoT Platform team) |
| Description | Sensor readings must not be stamped in the future. |
| Tags | iot, clock-drift |
| Additional Metadata | jira: DATA-10441 |
| Status | Active |
Payload
{
"description": "Sensor readings must not be stamped in the future.",
"rule": "notFuture",
"fields": ["reading_at"],
"container_id": 733,
"coverage": 0.97,
"filter": null,
"properties": {},
"tags": ["iot", "clock-drift"],
"additional_metadata": {"jira": "DATA-10441"},
"anomaly_message_field": null,
"template_id": null,
"status": "Active",
"owner_id": 7,
"default_anomaly_assignee_id": 41
}
Sample Data (evaluated during a Scan run at 10:00 on 11 March 2026)
| reading_id | device | reading_at |
|---|---|---|
| R-01 | dev-0021 | 2026-03-11 09:58:12 |
| R-02 | dev-0088 | 2026-03-11 14:31:07 |
| R-03 | dev-0102 | 2026-03-11 16:02:55 |
| R-04 | dev-0034 | (null) |
What gets flagged
dev-0088 and dev-0102 are running hours ahead of real time and have not synced yet. R-04 reported no timestamp, so it passes but still counts in the scanned total. Only 50% of the rows pass, well below the 97% coverage threshold, so the check reports a single Shape Anomaly for the dataset with a sample of the offending rows. Coverage below 100% does not produce Record Anomalies.
Shape Anomaly
For the field 'reading_at', 50.000% of 4 records (2) contain future dates/times
Flowchart
graph TD
A["No filter, evaluate all rows"] --> B["Read reading_at"]
B --> C{"Is value NULL?"}
C -->|Yes| D["Row passes"]
C -->|No| E{"Is reading_at earlier than now?"}
E -->|Yes| D
E -->|No| F["Flag row.<br/>Passing rate falls below the 97%<br/>coverage, so one Shape Anomaly is reported."]
Equivalent SQL
See Also
-
Best Practices
Guidelines for choosing the right field, handling clock skew, and picking between Not Future and a fixed bound.
-
Permissions
The team permission each action needs: view, create, edit, archive, restore, and delete.
-
How It Works
The complete reference: definition, field scope, what "now" means, array handling, NULL handling, filter behavior, and coverage.
-
Anomaly Reporting
The anomaly messages the check produces, what the numbers mean, Source Records highlighting, and Custom Anomaly Description.