Les 1-2 derniers jours du flux climato `latest` ont souvent 0-1 station
publiée (parfois TN sans TX), produisant des agrégats département nuls ou
non représentatifs. Symptômes côté page dept : TX/TN vides ou tx==tn à
J-1/J-2 sur le graphe, et moyenne 3j/7j figée (computeAnomaly lisait
climato.days brut et retombait sur les mêmes vieux jours complets).
- climato.ts : exposer la couverture réelle par champ (txN/tnN, optionnels,
rétro-compatibles avec le cache 24h).
- [code].astro : `_mergedDay` choisit par champ la source fiable —
climato si couverture >= 50% de la médiane station du dept, sinon SYNOP
(garde >= 3 obs/jour pour éviter tx==tn), sinon valeur fine, sinon null.
Le badge anomalie utilise désormais les 7 derniers jours complets
(finissant J-1) au lieu de climato.days brut, recollant graphe et badge.
Vérifié par simulation sur données réelles (depts 31/75/13) : jours pleins
inchangés (zéro régression), jours récents partiels comblés proprement.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Permet au visiteur de basculer entre la carte du jour et celle de J+1
(toujours présente dans le bulletin MF, sauf entre minuit et la pub de
6h où l'onglet est désactivé avec explication). Réutilise les helpers
existants (currentEcheance, maxColorByDepartement) — pas de fetch
supplémentaire, J et J1 sont déjà dans le snapshot.
Bonus :
- dayLabel calculé depuis "maintenant Paris" plutôt qu'un sample
d'alerte → fonctionne en jour calme tout-vert.
- CLAUDE.md : clarifie que MF officiel est canonique et Opendatasoft
fallback (au lieu de la formulation "le jour où on bascule").
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- vigilance: currentEcheance basée sur productDatetime (jour calme renvoyait J1 à tort)
- normales: dayOfYear extrait en Europe/Paris pour 'now' (UTC mélangeait les jours après minuit)
- meteofrance-auth + CLAUDE.md: header `apikey:` documenté correctement (pas Authorization Bearer)
- cache: SWR — envelope {v, fu}, hard TTL = ttl*6, refresh background avec lock anti-stampede
- vigilance: snapshot last-good (TTL 30j) écrit à chaque fetch, fallback final si MF+ODS KO
- vigilance: nettoyage variable url morte dans fetchOpendatasoft
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Le portail Météo France ne propose pas le flow client_credentials gratuit
(seulement token OAuth2 court 1h, pas viable, ou API Key longue durée).
On simplifie : un seul env METEOFRANCE_API_KEY → Authorization: Bearer.
- lib/meteofrance-auth.ts : suppression du cache token + flow refresh
- .env.tmpl : ref unique vers vault Infra/Météo France API/api_key
- vault item recréé avec api_key (hidden) + created_at + expires_at
- CLAUDE.md projet : section rotation API key
L onglet 24 h n apparaît qu une fois api_key non vide dans le vault.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Astro 5 SSR + ioredis cache Valkey, déployable sur shared-net.
- Vigilance temps réel via Opendatasoft (no-auth, LOv2)
- Carte SVG des 96 départements (gregoiredavid/france-geojson)
- Climato T° 30j par dept (CSV.GZ Météo France, cache 24h)
- Conseils officiels par phénomène (7 types Vigilance)
- /api/health (UptimeRobot) + /api/vigilance (JSON public CORS *)
- Dockerfile multi-stage, CI Forgejo deploy.yml (pattern Reteno)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>