4eb50ce880
City AI can return a partially streamed JSON string when the provider truncates output. The fallback previously kept an unfinished clause such as '但TAF显示', which made the forecast explanation look broken even though earlier evidence was usable. Constraint: Provider JSON can be truncated after useful fields have already streamed Rejected: Drop all partial AI text | would lose valid METAR interpretation already returned before truncation Confidence: high Scope-risk: narrow Tested: pytest city AI truncation regression tests Tested: npm run build Not-tested: Live DeepSeek provider response