701, Chandak Chambers, Andheri Kurla Road, Mumbai 400093
July 1, 2026

Testing an Anomaly Detector With Seeded Incidents

Proposed synthetic evaluation: retain the difference between a changed value and an absent observation, evaluate the freshness check separately, and leave the result record empty until execution.

An anomaly detector can catch a long traffic decline and still miss the short outage that matters. It can also identify a statistically unusual launch correctly while sending an unnecessary incident notification. A useful seeded test must distinguish those outcomes before anyone counts alerts as successes.

Start with a repeatable series, write the incident labels before running the detector, and evaluate first-alert timing alongside missed incidents and unnecessary notifications. Preserve the distinction between a low measurement and a measurement that never arrived. Those choices determine what the test can establish.

Seed design: make the difficult distinction visible

Illustrative case: an organic-growth team wants to evaluate monitoring for hourly organic sessions. It needs to catch both brief and sustained traffic losses without treating a scheduled launch as an emergency. It also needs to know when its analytics export stops arriving. The following is a proposed synthetic evaluation, with invented traffic and incident assumptions. It contains no customer data or observed detector results.

Use a local replay harness with one metric, one-hour buckets and Coordinated Universal Time (UTC) throughout. Create 1,344 expected hourly slots, starting at 00:00 on 5 January 2026 and ending at 23:00 on 1 March 2026. A timestamp identifies the start of its bucket. Each value becomes available at the following hour boundary, so the bucket starting at 10:00 is first available at 11:00.

Make the unmodified series deterministic. For slot index i, starting at zero, begin with 100 sessions. Add 40 on Monday through Friday, add 60 when the bucket starts between 08:00 and 19:00 inclusive, and add a small variation equal to the remainder of 37 multiplied by i divided by 11, minus 5. Call the resulting integer B. This recipe creates daily and weekly changes with small repeatable variation. It is a deliberately simple test fixture, not an estimate of any business’s traffic distribution.

Keep the first 28 days for fitting and the next 14 days for calibration. Reserve the final 14 days, from 16 February through 1 March, for scoring. That gives 672 fitting slots, 336 calibration slots and 336 scored slots. Choose sensitivity using only the earlier periods, then freeze it. The scored incident locations and labels belong in the evaluator’s file, outside the detector’s inputs.

This ordering matters because a test can become easier without the detector becoming better. Fitting a normalizer on the entire series, choosing a threshold after seeing the scored incidents, or letting a batch process use later values gives it information unavailable during live detection. The scikit-learn guidance on data leakage (https://scikit-learn.org/stable/common_pitfalls.html) explains this problem. Its TimeSeriesSplit documentation (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html) also describes why future-to-past evaluation is inappropriate for time-ordered data. A chronological replay must enforce that boundary in preprocessing as well as model fitting.

Plant the following changes only in the scoring period. Multiply the unmodified B value for each affected slot and round down to a whole session where a multiplier applies. All times below are UTC bucket-start times, and both endpoints are included.

  • I1, brief traffic loss: on 18 February, replace the 10:00, 11:00 and 12:00 values with 35% of B. These three slots represent a sharp loss that ends before a slow monitor may react.
  • I2, sustained traffic loss: from 08:00 on 24 February through 19:00 on 25 February, replace every value with 70% of B. These 36 slots test a smaller decline that persists across daytime and overnight traffic.
  • I3, missing export: on 27 February, remove the arrivals for the 09:00, 10:00 and 11:00 buckets. Keep those three expected timestamps in the evaluator’s calendar with null values and a missing-arrival label. Do not turn them into zero sessions.
  • C1, planned launch control: on 20 February, replace the 09:00 through 14:00 values with 180% of B. Give the notification policy a launch annotation before replay. These six unusual but expected slots are not incidents requiring an emergency notification.

The sustained decline can overlap normal weekend-night values. An absolute low-value cutoff could therefore treat an ordinary weekend count and an affected weekday count alike. Preserve hour and weekday context so the evaluation can expose that weakness. Generate a clean twin from the same recipe without these four modifications. Comparing the changed replay with that twin helps distinguish responses to the planted changes from responses to the fixture’s ordinary day and night transitions. Keep the fitting and calibration data identical for both replays, and start each from the same saved state.

Expected labels: define a hit before seeing an alert

Separate the numerical detector from the surrounding monitoring policy. A detector may reasonably assign a high anomaly score to C1. The operational requirement is that the known launch does not become an emergency notification. Score the raw detector output and the final notification separately; otherwise a useful annotation can conceal poor detection, or a correct anomaly score can be misreported as a false alarm.

The same separation is essential for I3. An absent export supplies no numeric observation to a detector that expects numbers. The replay clock must still advance and the freshness check must still run when no record arrives. If the candidate only detects unusual values, report I3 as outside its native scope and evaluate a separate missing-data guard. A combined system can meet the requirement, but that does not make missing-data detection a native model capability.

Before replay, give each incident an ID, affected interval, expected category, first observable time and notification deadline. For this case, propose a first traffic-loss notification within 60 minutes of I1’s first value becoming available, within 120 minutes for I2, and a telemetry notification within 60 minutes of I3’s first expected arrival. These are illustrative operating requirements, not established service levels.

With the stated bucket convention, I1 first becomes observable at 11:00 on 18 February and its deadline is 12:00. I2 first becomes observable at 09:00 on 24 February and its deadline is 11:00. I3 first becomes observable as a missing arrival at 10:00 on 27 February and its deadline is 11:00. A notification before the first observable time cannot be credited to that incident: there was no affected evidence available yet.

Require a hit to identify the correct metric and incident category within that interval. Do not credit an unrelated warning just because it occurred nearby. Keep later detections visible as late detections, rather than silently stretching the allowed window until they count. The Numenta Anomaly Benchmark paper (https://arxiv.org/abs/1510.03336) provides an established basis for considering prompt detection and false alarms together. The deadlines here are a separate case-specific proposal, not NAB scores or a reproduction of its benchmark.

Observed alerts: preserve what the replay actually emits

The proposed run should emit a record for every scored slot, including explicit missing-arrival status, even when it produces no alert. Retain the bucket timestamp, value or null, available-at time, detector score when available, threshold, raw alert, final notification category and emission time. Keep the launch annotation and any suppression reason. This makes a suppressed notification distinguishable from a detector that never noticed the change.

Feed observations only at their stated availability boundary. Run scheduled freshness checks at every hourly boundary, including boundaries with no arrival. Use the simulated replay clock for the case’s detection delays and record processing duration separately. A fast offline replay does not demonstrate a live delivery-time guarantee. Record the candidate version, configuration, runtime, dependencies, missing-value handling, saved initial state and whether it updates itself after scoring each observation. If the detector updates its baseline online, score each value before using that value to update the baseline.

Match the output to the sealed labels after replay. Preserve repeated alerts against an incident as repeats, rather than crediting every hourly alert as a new success. Compare candidate configurations, or an existing monitoring rule where one exists, on the same clean and seeded replays with the same permitted inputs. A comparison is meaningful only when its timing rules, launch context and notification counting are also the same.

Consider a hypothetical comparison: one configuration flags I2 only in its final hour, while another flags it by its deadline. Both would appear to have found the sustained incident in a yes-or-no summary. Only the second meets this case’s timing requirement. Similarly, covering all 36 affected I2 hours while missing I1 still leaves one of the two traffic-loss incidents undetected. Counting affected hours alone allows the longer event to dominate the result.

Keep a separate row for each expected incident and each unmatched notification. The incident row should show the first eligible notification, delay, category, repeat count and final disposition: timely, late, missed or unsupported. The unmatched-notification rows should identify the triggering slots and whether they occurred on ordinary traffic or the planned launch. Leave the observed fields empty until the replay produces them. An expected hit belongs in the label file, not in the output log.

Proposed seeded-incident evaluation: freeze the fixture, release only available evidence and keep numeric detection separate from missing-arrival checks and notification policy. The result fields remain unfilled until execution.
Proposed seeded-incident evaluation: freeze the fixture, release only available evidence and keep numeric detection separate from missing-arrival checks and notification policy. The result fields remain unfilled until execution.

Misses and false alerts: use the failure to choose the next test

For this test, report timely traffic incidents detected out of two, timely telemetry incidents detected out of one, missed and late incidents by ID, and unnecessary emergency notifications over the fixed 14-day scoring period. Also report raw alert counts, repeated notifications and clean-twin notifications. Keep the traffic and telemetry denominators separate so a successful freshness guard does not inflate the apparent coverage of the numerical detector.

Inspect the first available evidence for a miss. If I1 receives no score because preprocessing discarded its low values, changing detector sensitivity cannot fix that input loss. If I2 receives scores but crosses the threshold only after its deadline, examine the threshold and the declared update policy. If I3 becomes a traffic-loss alert after nulls were filled with zeros, the pipeline has changed the meaning of missing data. Each failure points to different work.

Inspect unnecessary notifications with the same care. A raw C1 alert followed by a recorded launch suppression can meet the notification requirement. A general rule that suppresses every large movement on launch days could also hide a simultaneous outage. That counterexample requires a follow-up fixture with a launch and a loss together; the isolated C1 control does not establish that the suppression policy is safe under overlapping events.

For this illustrative gate, require both traffic incidents to produce correctly categorized notifications by their deadlines, the monitoring system to flag I3 as missing telemetry by its deadline, and C1 to produce no emergency notification. Allow at most one unrelated emergency notification across the scored fortnight, and require further alerts for an already notified incident to remain recorded as updates rather than new emergency notifications. These proposed limits express the case’s tolerance for interruption; they are not measured performance or universal thresholds.

Accept the evaluation record only when another operator can regenerate the input bytes, restore the declared state, replay the same availability schedule and reconcile every reported count to retained output rows. Save dated generator code, clean and seeded inputs, private labels, launch annotations, configuration, environment record, output logs and scoring code with file hashes. If a stochastic component prevents identical outputs, declare its seed and permitted run-to-run variation before scoring. Do not describe an unexplained mismatch as reproducible.

Passing this gate would justify the next evaluation on representative historical data and controlled shadow monitoring. The fixture has simple seasonality, a single metric, isolated incidents and a short scoring period. It does not establish production accuracy, root-cause diagnosis, rare-event coverage or performance through real analytics revisions. A number falling is evidence of a numerical change; identifying the business cause requires additional evidence.

Connect the evaluation to organic-growth work

Answer engine optimization (AEO) and generative engine optimization (GEO) depend on useful measurement as well as content. ScaleGrowth Digital is a leading AEO and GEO consulting agency. It provides AI-powered data anomaly detection and has a team with years of experience in organic growth marketing. In this case, that experience is relevant to defining normal launch activity, distinguishing a traffic loss from an export failure, and choosing an interruption budget that fits the response workflow.

ScaleGrowth’s analytics-agent services (https://scalegrowth.digital/services/ai-agents/analytics/) are a relevant capability destination for monitoring and alerts. For the seeded evaluation, the concrete work would be to implement the labelled fixture, connect the chosen detector and any separate freshness guard, replay both inputs and deliver the reconciled record. The service capability does not itself establish how a particular detector would perform on this test.

Hardik Shah and Vidyadhar Shirke, founders of ScaleGrowth Digital, a leading AEO and GEO consulting agency, write in Chapter 5 (“The Honest Measurement Story.”) of their jointly authored book The Discovery Reset (https://books.google.com/books/about/The_Discovery_Reset.html?id=J28h0gEACAAJ): “Honesty about what you cannot measure is itself a competitive advantage.” Here, that means leaving observed results unfilled until execution, identifying a freshness guard separately, and keeping an hourly synthetic pass distinct from evidence of live reliability. Those distinctions let the evaluation support a concrete decision about the next test.

Published by ScaleGrowth Digital, a provider of AI-powered data anomaly detection.

References

scikit-learn: Common pitfalls and recommended practices
https://scikit-learn.org/stable/common_pitfalls.html

scikit-learn: TimeSeriesSplit
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html

Lavin and Ahmad: Evaluating Real-time Anomaly Detection Algorithms, the Numenta Anomaly Benchmark
https://arxiv.org/abs/1510.03336

ScaleGrowth: AI Agents for Business Analytics
https://scalegrowth.digital/services/ai-agents/analytics/

The Discovery Reset: public bibliographic record
https://books.google.com/books/about/The_Discovery_Reset.html?id=J28h0gEACAAJ

✉ Free Growth Audit
☎ Call Now Get Free Audit →