Remplace les Line type="stepAfter" par type="monotone" (courbe lissée,
demandé) et bascule LineChart -> ComposedChart pour ajouter une Area
(dégradé sky-400) sous la courbe "Actuel", avec un filtre glow sur la ligne
(défini mais jamais utilisé auparavant). Légende simplifiée en puces
colorées au lieu de segments de trait, cohérent avec le reste de l'app.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Nouvel onglet principal "Scénario", logique inversée par rapport aux autres
onglets Taux : au lieu de déduire une probabilité depuis les prix de marché,
l'utilisateur choisit lui-même un scénario de hikes/cuts à chaque réunion FOMC
et l'outil déduit où devrait se situer le SOFR implicite si ce scénario se
réalisait — exactement la logique de CME SOFRWatch.
Méthodologie (2 spreads, comme SOFRWatch) :
SOFR implicite ≈ borne basse Fed + (EFFR − borne basse) + (SOFR − EFFR)
CME calcule ces spreads depuis les prix forward des futures SOFR 1 mois vs Fed
Funds (SR1−ZQ, données de marché propriétaires). On les approxime avec la
moyenne réalisée historique EFFR/SOFR (FRED, gratuit) — limite clairement
documentée dans l'UI et le code, ce n'est pas un prix forward-looking.
- app/api/scenario-spreads/route.ts : calcule les 2 spreads depuis FRED
(EFFR, SOFR, fenêtre ~60j) + la fourchette Fed actuelle (rate_decisions.json).
- components/ScenarioTab.tsx : constructeur de scénario par réunion FOMC
(réutilise les dates déjà maintenues dans rate-probabilities.json), chart
comparatif "Votre scénario" vs "Marché (OIS)" sur l'échelle SOFR.
Vérifié en direct : les spreads calculés (EFFR +13bps, SOFR-EFFR -1bps)
donnent un SOFR implicite actuel de 3.62%, qui correspond exactement au SOFR
réel du jour — et les clics sur le constructeur de scénario cumulent
correctement (step-line vérifié visuellement sur 2 hikes successifs).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Nouveau sous-onglet "Atlanta Fed" dans le bloc OIS de la card USD, méthodologie
alternative aux 30-day Fed Fund Futures demandée : distribution du niveau de
taux Fed déduite des options sur futures SOFR 3 mois (CME), publiée
quotidiennement par la Fed d'Atlanta (Market Probability Tracker). Affiche
Cut/Hold/Hike, la fourchette de taux SOFR implicite (25e-75e percentile), et
la distribution complète par fourchette de 25bps pour la fenêtre trimestrielle
la plus proche.
- .github/scripts/fetch-atlanta-mpt.mjs : télécharge et parse mpt_histdata.xlsx
(Atlanta Fed) avec un lecteur ZIP/OOXML maison — le paquet npm "xlsx" a des
CVE critiques non patchées sur le registre public (SheetJS a arrêté d'y
publier), donc pas de dépendance ajoutée pour ça.
- .github/workflows/fetch-atlanta-mpt.yml : quotidien (donnée mise à jour 1x/jour
par l'Atlanta Fed), + déclenchement manuel.
- lib/atlantaFedMpt.ts + app/api/macro/route.ts : expose la donnée (USD only)
via l'API macro existante.
Sous-onglet "Réunions" (USD) : ajout du libellé de méthodologie demandé —
"Probabilités = somme des % associés à chaque fourchette au-dessus/en-dessous
de la fourchette actuelle · Investing.com Fed Rate Monitor, calculées à partir
des 30-day Fed Fund Futures (CME)".
Vérifié en direct : les deux sous-onglets s'affichent et les chiffres
correspondent aux données brutes (72.4% hike / 1.1% cut / distribution
27.2-45.7-21.4-5.7% pour la fenêtre Sep 2026).
Note en marge (hors scope, découverte pendant les tests) : /api/expectations
prend ~24s à répondre, ce qui bloque l'affichage complet du dashboard
(Promise.allSettled attend les 8 fetches). À investiguer séparément.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Le commit précédent a gardé par erreur la version distante (1 point dégradé,
même run bloqué 403) au lieu de la mienne : pendant un `git rebase`,
--ours/--theirs sont inversés par rapport à un merge classique (--ours =
branche cible/origin, pas le commit en cours de replay). Re-fetch confirme
à nouveau 12 réunions FOMC depuis mon IP.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Root cause confirmée en direct dans les logs du run GH Actions du 2026-07-08
15:10 : investing.com renvoie 403 spécifiquement aux IPs des runners GitHub
Actions (bloc anti-bot par réputation IP — mon IP locale passe sans problème,
la même page se parse parfaitement, 12 réunions). C'est intermittent par
nature selon la rotation d'IP de GitHub.
Le vrai bug n'était pas le scraping mais l'absence total de filet de
sécurité : dès qu'un run se prenait ce 403, le code écrasait la vraie courbe
FOMC multi-réunions (12 points, table Investing.com) par le fallback
InvestingLive — un unique point "year-end" — et cette dégradation restait
visible dans data/rate-probabilities.json jusqu'au prochain run qui réussissait
à passer. D'où le symptôme : "parfois ça marche et c'est correct, parfois ça
bug et affiche peu de données fausses" pour les sous-onglets Courbe/Probas/
Réunions de la card USD.
Deux corrections dans fetch-rate-data.mjs :
1. Retry (3 tentatives, backoff 2s/4s/6s) sur le fetch Investing.com — couvre
les échecs vraiment transitoires (n'aide pas contre un blocage IP qui
persiste sur tout le run, d'où le point 2).
2. Filet de sécurité : si le résultat du jour n'a qu'1 réunion (signature du
fallback IL dégradé) alors qu'une vraie courbe multi-réunions existait déjà
dans le fichier, on la conserve au lieu de l'écraser.
Vérifié : (a) le scrape Investing.com refonctionne depuis ma machine (12
réunions FOMC parsées correctement) ; (b) la logique de préservation testée
isolément avec un cas simulé de dégradation restaure bien les 12 réunions.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Tri (lib/newsfeed.ts + components/NewsTab.tsx) :
Un bonus "+3h pour les catégories prioritaires" (Guerre/Chef d'État/Crise…)
était appliqué avant le tri par date. En temps normal ça remonte discrètement
une poignée d'articles importants ; mais en période de crise soutenue (conflit
Moyen-Orient actuel), la quasi-totalité des articles matche une de ces
catégories — le bonus s'applique presque partout et casse l'ordre
chronologique au lieu de l'affiner, produisant des blocs par source de plus en
plus vieux au lieu d'un flux unique correctement entrelacé. Vérifié en direct :
54 articles avant fix avec des dizaines d'inversions chronologiques, 0 après.
Le badge visuel "⚡ Prioritaire" reste pour signaler l'importance sans trahir
la fraîcheur réelle.
Flux RSS (lib/newsfeed.ts RSS_FEEDS) — 3 des 6 sources ne contribuaient plus
rien, vérifié en direct :
- ForexLive : /feed/news est une coquille vide (0 <item>) depuis leur
migration Nuxt.js vers investinglive.com — déjà couvert par le scraper
dédié fetchInvestingLiveNews(), aucune perte réelle en le retirant.
- MarketWatch : l'ancien miroir dowjones.io ne sert que des articles vieux
de 1+ an (filtrés par le cutoff 8 jours) → remplacé par l'URL RSS actuelle
(marketwatch.com/rss/topstories, testée fraîche).
- Reuters : feeds.reuters.com n'existe plus (échec DNS, fermé par Reuters il
y a plusieurs années) → remplacé par CNBC Markets (testé frais).
Bloomberg (403 anti-bot) et FinancialJuice (site restructuré) restent à zéro,
déjà connu et accepté (échecs silencieux gérés par try/catch).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Le commit précédent avait les couleurs inversées (fond orange, texte foncé) ;
c'est le design d'origine (fond sombre, texte orange) qui était voulu.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Préférence utilisateur : revient au design FX (amber-500 bg + texte FX
dans la couleur de fond de l'app), généré proprement en PNG à toutes les
tailles (icon.png, apple-icon.png, icon-192/512.png pour le manifest PWA).
Header (app/page.tsx) en hérite automatiquement puisqu'il référence /icon.png.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Le premier crop gardait le carre creme complet + marge transparente autour :
le globe ne remplissait qu'environ 49% de la largeur totale, illisible en
taille onglet (16x16). Recadre desormais sur le bounding box du carre creme
lui-meme (mesure par scan de pixels), ce qui grossit le globe tout en
preservant les coins arrondis de la carte (un premier essai trop serre sur
le globe seul les avait coupes).
Header (app/page.tsx) : remplace l'icone Activity (lucide) generique par le
vrai favicon (/icon.png), agrandi et aligne verticalement avec le titre.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
app/icon.png + app/apple-icon.png (convention Next.js, auto-génère les
balises <link>), manifest.json PWA mis à jour vers les mêmes PNG.
Supprime les anciens SVG placeholder devenus orphelins.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Central bank governance (nouvel onglet Banques centrales) :
- lib/centralBankGovernance.ts + app/api/central-bank-sources : scraping live du
vote de la derniere reunion, dot plot Fed (SEP), et desormais les previsions
macro (PIB + inflation) publiees par chaque BC elle-meme (Fed SEP, Eurosystem
staff projections, BoJ Outlook Report PDF, SNB conditional forecast, BoC MPR,
RBA SMP). GBP/NZD laisses honnetement vides quand aucune source chiffree
fiable n'est accessible (RBNZ bloque par Cloudflare).
- components/CentralBankSourcesTab.tsx : nouvel onglet avec cards par banque.
Taux directeurs + Money Supply M3 :
- data/rate_decisions.json corrige (JPY, EUR, NZD etc. etaient perimes d'1-2
decisions) et desormais auto-maintenu : .github/workflows/update-rate-decisions.yml
(horaire) detecte les changements de taux via Trading Economics et fait
glisser current -> prev sans perte de donnee.
- data/money-supply-m3.json (nouveau) + .github/workflows/fetch-money-supply.yml
(hebdo) : M3 par devise (proxy M2 pour l'USD, la Fed ne publiant plus M3
depuis 2006), affiche dans CurrencyCard.
Calendrier economique elargi :
- lib/calendar-countries.ts, lib/calendar-taxonomy.ts, lib/fxstreetCalendar.ts :
couverture pays elargie + classification des evenements + source FXStreet.
Fix InvestingLive :
- lib/investinglive.ts : l'ancienne API WordPress (wp-json) renvoyait 404 depuis
leur migration Nuxt.js -> reecrit vers api.investinglive.com/api/homepage/articles,
+ fix crash silencieux (Tldr pas toujours un tableau).
Divers :
- .vercel/ ajoute au .gitignore (ne doit jamais etre commite, cf. son propre README).
- scripts/ (lancement PWA, push env Vercel), captures d'ecran, cache InvestingLive.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>