A triage prompt that works in the demo breaks in production for two reasons. The right queue often depends on who is asking, not what they wrote. And the queues themselves keep changing.
| Pitfall | What it looks like | How to check, before spending anything |
|---|---|---|
| First-queue labels | The prompt learns the old router's habits | Compare first and final queue on a sample. If they differ often, label from the final queue. |
| Time travel | Account data fetched at evaluation time, not ticket time | Freeze the lookup onto the row when the ticket arrives. |
| Rare escalations | Accuracy is high, escalations are missed | Read escalation recall on its own. Put it in the objective. |
| Renamed queues | Old and new labels for the same work | Map old queue names to current ones before training, or drop rows from before the change. |
| Unused context | The lookup returns five fields and the prompt uses two | Check which fields actually change the answer. Stop pasting the rest into every call. |
Tools that run this loop: DSPy and its GEPA optimizer, bpto (ours, open source), and Impromptune, the studio built on it.