Anomaly explorer

Statistical outliers and pattern breaks, before any of them is a case · 14 detectors registered, 11 running, 2 in shadow, 1 dark · last sweep 2m 14s ago · nothing on this page has changed a balance

2 critical findings have been active for more than 20 minutes. MSR31-07 dispatch velocity at HQ_319 collapsed to 11% of baseline at 14:12, and a gate read at G1 has no matching ledger posting. The second one is already case DRF-0142. The first is not a case yet, and that is the correct state until somebody says what it means.

Detector registry

Each card states its model in one line, its class, its last run and what it found. A statistical detector that cannot declare a sample floor cannot be registered.

7 stock7 operational
Gate read without posting
stock
gate read, no ledger row within 15m
ran 12s1 fired
Velocity drop
stock
z < −2.5 · 14d baseline · min n 10
ran 42s3 fired
Negative balance
stock
balance_after < 0 · any key
ran 8s1 fired
Impossible transition
stock
unit state graph · illegal hop
ran 1m 042 fired
Stale in transit
stock
custody held past p95 window
ran 3m 052 fired
Unmatched RFID read
stock
EPC seen, no expected location
ran 26s2 fired
Cover-days outlier
stock
cover < p05 · NULL cover excluded
ran 4h 120 fired
GRN receipt variance
operational
expected vs received > 5%
ran 6m 411 fired
Lead-time outlier
operational
z > 2.5 vs supplier baseline · min n 8
ran 2m 322 fired
Webhook latency
operational
p95 > 500ms · 5min window
ran 36s2 fired
Return-rate spike
operational
per SKU · 7d rolling · min n 12
ran 1m 100 fired
Damage concentration
operational
per carton batch · poisson · shadow
ran 54s3 shadow
Duplicate order pattern
operational
same cart hash within 120s · shadow
ran 1h 020 shadow
Carrier status without scan
stock
source dark · topic not emittable
never runblocked
Carrier status without scan cannot be enabled. ops2's registered event list is six inbound-warehouse strings and none of the reverse-logistics topics exists yet, so the detector is held at source_ready = false and the schema refuses to enable it. It would otherwise run, find nothing, and read as health. The i3 subscription must be registered before the first topic is switched on, or the first hours of events vanish with no trace on either side.
Sort
Time Severity Detector Class Entity Expected to observed z Baseline Action
14:12:18 Critical velocity_drop stk MSR31-07 @ HQ_319 18 /hr→2 /hr −3.82 n 14 · σ 1.7

Evidence · dispatches per hour, 14-day baseline against today

baseline mean 18.2 plus or minus one sigma of 1.7 baseline mean 18.2 per hour 15-07 · 17 per hour 16-07 · 19 17-07 · 15 18-07 · 19 19-07 · 16 20-07 · 19 21-07 · 21 22-07 · 18 23-07 · 17 24-07 · 19 25-07 · 20 26-07 · 18 27-07 · 15 28-07 · 9 · already drifting 29-07 today · 2 per hour · z = −3.82
15-0719-0723-0727-07today
Baseline daysMean 18.2 ± σ 1.7Today, 2 per hour

Interpretation. Dispatch velocity for MSR31-07 collapsed to 11% of baseline at 14:12 and has held for 29 minutes. There is no stockout: sellable is 118 and the reorder buffer is comfortable. There is no price change and no promo ending. Webhook latency for orders/paid is normal at p95 212ms. The two remaining candidates are a Shopify listing change and a picking-area problem at HQ_319, and only one of them is an inventory fact.

This is deliberately not a drift case. No number disagrees with any other number. Promoting it would create a case with no delta and nothing to correct, which is exactly the noise that makes a queue unusable.

Contributing factors, ranked

  • 1Shopify listing demotedmoved from page 1 to page 4 at 14:040.71
  • 2Zero add-to-cart eventslast 38 min, normally 14 per hour0.18
  • 3Picking area not replenishedbay A3 at 4 units since 11:200.07
  • 4Sellable is healthy118 units, buffer 40, no stockout0.03
  • 5Webhook latency normalp95 212ms against a 500ms threshold0.01
Open the listing event Check picking area A3

Promoting carries the whole finding across: baseline, z, the factor weights and this chart become evidence rows on the new case, each with its own digest.

14:36:04 Critical gate_read_without_posting stk EPC E280 6894 0000 4021 8F3C dispatch row→none in 15m n/a invariant DRF-0142
13:58:41 High lead_time_outlier ops Supplier CIC 32.4 days→54.1 days +3.11 n 22 · σ 6.9
13:22:09 High negative_balance stk AQB01 @ MCC >= 0→−4 units n/a invariant
12:47:33 High velocity_drop stk FYN01 @ HQ_319 11 /hr→3 /hr −2.61 n 14 · σ 2.1
12:04:15 High impossible_transition stk EPC E280 6894 0000 3918 2C41 SOLD is terminal→read at YAS floor n/a state graph CNF-0011
11:31:52 Medium stale_in_transit stk TR-0937 · HQ_319 to YAS p95 36h→96h +2.44 n 61 · σ 11h
10:58:20 Medium unmatched_rfid_read stk EPC E280 6894 0000 4188 91A0 HQ_319 bay C→HQ_325 dock n/a invariant
10:22:07 Medium grn_receipt_variance ops INF-2319 line 4 48 units→46 units +2.06 n 18 · σ 1.1 DRF-0127
09:54:11 Medium webhook_latency ops csd · case.transition p95 180ms→840ms +2.31 n 288 · σ 44ms
09:18:44 Medium lead_time_outlier ops Supplier VJ Jewels 18.2 days→27.6 days +2.12 n 14 · σ 4.4
08:41:29 Medium stale_in_transit stk TR-0941 · HQ_319 to MCC p95 36h→72h +2.02 n 61 · σ 11h
08:33:12 Medium webhook_latency ops shopify · orders/paid p95 240ms→620ms +1.98 n 288 · σ 61ms auto-closed
07:56:03 Low unmatched_rfid_read stk EPC E280 6894 0000 4207 3B18 MCC floor→MCC stockroom n/a invariant
07:12:40 Info velocity_drop stk MIN-DIF-012 @ BAS 0.4 /hr→0 /hr n/a n 3 · below min 10 suppressed
06:48:19 Info lead_time_outlier ops Supplier LC Straps 21 days→28 days n/a σ 0 · every prior order 21d suppressed
06:03:55 Info cover_days_outlier stk MIN-2159 @ HQ_319 cover p05 6d→cover NULL n/a no velocity · excluded suppressed
05:41:22 Low damage_concentration ops carton MC-4471 · HQ_319 0 to 1 per carton→5 per carton +2.28 poisson λ 0.4 shadow
04:58:07 Low webhook_latency ops grn · receipt.posted p95 140ms→310ms +1.44 n 288 · σ 38ms auto-closed
21 active · 3 suppressed by the sample floor · 2 auto-closed, both operational Auto-refresh 30s · J K to move · Enter to expand · P to promote

Top entities

Findings in 24h

01
MSR31-07
Sereen Rose · velocity, gate
5
02
Supplier CIC
lead time, receipt variance
4
03
MCC
negative balance, stale transit
3
04
MIN-CNL-019
level divergence, recurring
3
05
HQ_319 bay F
count overdue, read gaps
2
06
TR-0937 and TR-0941
both stale in transit
2
Concentration on one entity across unrelated detectors is a stronger signal than any single z.

Auto-closed today

Operational only

7
EntityDetectorMTTR
shopify orders/paidlatency11m
grn receipt.postedlatency4m
csd case.createdlatency6m
Supplier VJlead_time3h 12
FYB01return_spike42m
ops2 outboxlatency8m
i3 fanoutlatency2m
No stock finding can ever appear in this list. If a negative balance stops being negative, something wrote to the ledger, and that write is exactly the event that needs explaining.

Two rules this page enforces

A stock finding never auto-closes. Operational metrics returning to band is genuinely resolution. A balance returning to band is a write, and deleting the finding deletes the only trace of it. A stock finding that recovers moves to resolved_pending_explanation and still needs a named cause.

A z-score without a sample floor is not a signal. Every statistical detector stores baseline_n and baseline_sigma. Below the floor, or at sigma zero, z_score is NULL with a stated reason and the finding cannot raise a case. Three findings today are in exactly that state and none of them made it into the severity counts.

The same principle governs cover days: 212 of 1,535 SKUs have no computable cover, so the cover detector excludes NULL rather than treating it as infinite.

What promotion carries across

A finding becomes a case with its provenance intact, or it does not become a case at all

On the findingOn the caseWhy it has to travel
detector_code, versiondetector_code, detector_versionFrozen, so retuning the detector later cannot rewrite the history of what raised the case
expected_value, observed_valueside_a_value, side_b_valueThe two numbers that disagree are the case, and they need their authorities named
baseline_n, sigma, z_scoredrift_evidence · derived_calcAn approver signing later must be able to see the statistics the machine used
factors JSONBdrift_explanations seedRanked factors become the first ranked hypotheses, mapped onto the closed catalog
detected_atdetected_atThe SLA clock runs from detection, not from promotion, so a slow triage cannot hide a slow response
entity_kind, entity_refsku_id, location_id or anchorResolved through the ref tables. A finding on an order with no knowable SKU becomes an anchored case, not a guessed one.
payloaddrift_evidence · webhook_payloadWith a content digest, so a signature binds to what was actually shown

A finding that cannot produce a delta cannot produce a case. Today's critical velocity finding is the example: nothing disagrees with anything, so there is no compensating entry to propose and a case would be an empty box with an SLA clock on it.

18 of 21 active findings can raise a case. The other 3 are suppressed by the sample floor and are shown so that "no finding" and "no signal" stay visibly different.

Sweep health

Last 24h

Full sweeps
96 · every 15 min
Rows scanned
1,942,180
p95 sweep time
4.2s
Findings raised
62
Cases raised
4
Suppressed
31 · sample floor
Deduped
118 · same key, live finding
Detector errors
0
Shadow findings
9 · recorded, raised nothing
A detector that errors is never silently skipped: it sets error_text on its run row and appears on ops health.

Shadow mode

Every new detector starts with shadow_only = true. It runs on the full data, writes its findings, and raises nothing. Two are in shadow today.

The exit criterion is not "it looks right". It is a week of shadow findings triaged by a human, with a false-positive rate stated on the detector row before shadow_only can be cleared.

State variants

Five of the eight

Pattern library ↗
Loading

Detector cards keep their grid so the layout does not reflow when counts land.

Empty

Nothing out of band.

All 13 enabled detectors ran within the last 15 minutes and found nothing. The 14th is dark and says so above.

Drift queue
Error

Feed unavailable.

The findings query timed out. Detectors are still running and still writing; only this view is blind.

Zero-filter

No findings match.

3 filters are hiding all 21.

criticaloperationallast 1h
Model stale

Baselines are 3 days old.

The nightly baseline rebuild has not run since 26-07. Every z on this page is computed against a stale mean, so all statistical detectors are held at can_raise_case = false until it does.

Connected to Drift queue Case detail Conflict inspector Correction workbench Approvals Alert rules Incidents 3-way reconcile Unit events Stock health Live inventory Transfers Suppliers GRN and QC Damages Ops health Classifier Rules Audit log