326bfe258e
Users need to know whether a city can be acted on before reading the full explanation. City cards now expose METAR or official-observation freshness, model update timing, market quote freshness, and AI state in a dedicated trust block, while the calendar view groups rows into action-oriented timing buckets with a single reason per city. Constraint: Keep the existing card and calendar data contracts; derive freshness and action reasons from fields already present in the frontend payload. Rejected: Add another long explanatory paragraph | it would repeat the same trust problem instead of making the first glance clearer. Confidence: high Scope-risk: moderate Reversibility: clean Tested: npm run build Not-tested: Live browser visual QA with stale METAR and delayed quote examples.