0eab2fe628
City-card fallback reads now stop using stale METAR or official observations as strong live anchors. A stale observation no longer forces high/low revisions, and both backend and browser AI cache keys include the observation fingerprint so updated report times, receipt times, temperatures, or stale status invalidate old AI text. Constraint: Cached city AI reads must not survive a material observation update Rejected: Let stale METAR trigger observed-break revisions | stale reports can be older than the active temperature path Confidence: high Scope-risk: moderate Tested: pytest tests/test_web_observability.py -q Tested: npm run build