Your CI/CD pipeline runs before every deploy. Your LLM prompt tests pass. You ship.
Three days later, your users notice the AI outputs look different. The JSON format changed. The tone shifted. The classifier is returning wrong labels.
Your tests all still pass.
Why Standard Tests Miss This
CI/CD tests for LLM applications check what you changed. They don't check what the LLM provider changed while your code sat unchanged in production.
Here's the timeline of a typical silent model drift incident:
- Day 0: OpenAI pushes a model update (no notification sent)
- Day 0–2: Your prompts run in production with subtly different outputs
- Day 2–7: Users start noticing. Support tickets appear.
- Day 7: You finally trace it back to a model change. Your CI was green the whole time.
The Three Types of LLM Tests
Type 1: Unit tests on prompt templates
Test that your code correctly constructs the prompt string. Doesn't touch the LLM at all. Won't catch model changes.
Type 2: Integration tests in CI (with real API calls)
Run your prompts against the actual model in your test suite. Catches your changes. But only runs on your deployments — not when the model changes between your deploys.
Type 3: Continuous scheduled behavioral tests
Run your prompts against the model on a fixed schedule (hourly), compare to a baseline, alert on drift. This is what catches silent provider-side updates.
Most teams have Type 1. Some have Type 2. Almost none have Type 3 — and that's the gap.
What Type 3 Looks Like in Practice
# What DriftWatch runs hourly for you:
# 1. Run prompt against your chosen model
response = llm.complete(prompt)
# 2. Score against baseline
drift_score = score_drift(
baseline=stored_baseline,
current=response,
validators=["is_valid_json", "has_keys:name,age"]
)
# 3. Alert if above threshold
if drift_score > 0.3:
send_alert(f"Drift detected: {drift_score:.3f}")
The key insight: you need this running independently of your deployment pipeline, triggered by time — not by your code changes.
Real Incident: GPT-4o-2024-08-06 in January 2025
Developers using the dated version of GPT-4o (supposedly frozen) reported in r/LLMDevs that their structured output prompts started adding preamble text to JSON responses:
# Before
{"name": "Alex", "age": 32}
# After (model changed, same version string)
Here is the extracted JSON:
{"name": "Alex", "age": 32}
json.loads() now throws a JSONDecodeError. Silent breakage. Every CI test was green. The integration tests passed. The unit tests passed.
The only thing that would have caught this: a continuous scheduled test running hourly against the API.
The Practical Fix
Add one more layer to your LLM testing strategy:
- Unit tests → verify your prompt construction logic
- CI integration tests → verify your prompts work before deploy
- Continuous monitoring → verify the model still behaves as expected, even when you haven't deployed anything
DriftWatch handles #3. Free tier, 3 prompts, 5-minute setup.
When GPT-5.2 changed on February 10, 2026, DriftWatch users would have seen an alert within 60 minutes. Standard CI/CD caught nothing — there was no deploy.
📊 See a live drift detection demo →
🔍 Start monitoring free →
If you're wondering what continuous LLM monitoring actually looks like in practice, we wrote about building DriftWatch — the service we use to catch these regressions.
Top comments (0)