Splitting the validation stages into sync-blocking versus async-background by failure consequence is the right mental model, and the tiered early-exit pattern is what keeps the p99 sane. The stage I have found hardest to budget is the grounding evaluator, since vector-similarity latency scales with retrieved-context size, so streaming chunk-based checks help but the block-on-failure decision gets fuzzy mid-stream. How are you handling a grounding failure that only surfaces after you have already streamed tokens to the user?
Splitting the validation stages into sync-blocking versus async-background by failure consequence is the right mental model, and the tiered early-exit pattern is what keeps the p99 sane. The stage I have found hardest to budget is the grounding evaluator, since vector-similarity latency scales with retrieved-context size, so streaming chunk-based checks help but the block-on-failure decision gets fuzzy mid-stream. How are you handling a grounding failure that only surfaces after you have already streamed tokens to the user?