Le fetch /api/rate-probabilities n'avait aucun fallback cache côté client
(contrairement aux autres widgets) et pouvait planter en bloc si InvestingLive
timeoutait (fetch sans AbortController) - une seule panne coupait les 8 devises
d'un coup au lieu de dégrader devise par devise.
- route.ts : try/catch pour toujours renvoyer un JSON valide
- page.tsx : fallback localStorage si le fetch échoue
- investinglive.ts : timeout 8s sur les fetches vers investinglive.com
- fetch-rate-data.mjs / rateprobability.ts : le pipeline écrit maintenant la
source réelle utilisée par devise (Rate Monitor USD, futures Euribor/SONIA
pour EUR/GBP, InvestingLive pour les 5 autres) et la carte l'affiche
- CurrencyCard.tsx : SourcesPopup corrigé (CME FedWatch retiré, plus de fausse
mention "Rate Monitor" pour les devises qui n'en ont pas)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Retire l'onglet Atlanta Fed MPT (USD) : jugé sans valeur ajoutée réelle.
- EUR/GBP n'avaient qu'un unique point synthétique (agrégat year-end
InvestingLive) gonflé en fausses réunions plates à 0% sur Courbe/
Probabilités/Réunions — d'où l'aspect cassé. Investing.com n'a de Rate
Monitor pré-calculé (comme pour la Fed) ni pour la BCE ni pour la BoE
(404 confirmé), donc pas d'équivalent direct au pipeline USD.
- Remplace ce point unique par un vrai scrape des futures Euribor 3M
(Eurex) et Three-Month SONIA (ICE), cotés sur investing.com (delayed,
gratuit, pas de login) : conversion prix→taux (100−prix), mapping sur
le calendrier réel BCE/BoE (échéance la plus proche ≥ date de réunion,
fenêtre de grâce de 60j au-delà du dernier contrat coté, sinon on
s'arrête plutôt que d'inventer), probabilité approximée avec la
convention bps/25 déjà utilisée pour le fallback InvestingLive.
- Résolution plus grossière que l'USD (mensuelle EUR, trimestrielle GBP)
et clairement étiquetée comme telle dans un footnote dédié.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
rbnz.govt.nz bloque bien ses pages génériques (index, listing) derrière un
challenge Cloudflare, comme déjà documenté — mais vérifié en direct que
sitemap.xml, les pages de contenu individuelles qu'il référence, et les PDF
sous /-/media/ répondent normalement (200, sans challenge). C'est exactement
ce qu'indexerait un moteur de recherche : aucun contournement, juste des
ressources publiques non protégées.
.github/scripts/fetch-rbnz-mps.mjs :
1. Lit sitemap.xml pour trouver la dernière page MPS ("...-filtered-listing-
page/{year}/{month}-{id}/monetary-policy-statement-{month}-{year}")
2. En extrait le lien du PDF officiel
3. Parse le PDF (pdf-parse, déjà utilisé pour BoJ) et extrait la Table 6.5
"Summary of economic projections" (CPI, OCR moyenne annuelle, GDP par
année "March year")
Note technique : le fetch() natif de Node (undici) se prend un 403 sur ces
mêmes URLs alors que curl passe (200, vérifié à la seconde près, même
User-Agent) — Cloudflare fingerprinte la pile TLS/HTTP2 du client, pas
seulement l'en-tête. Le script shell out donc vers curl (préinstallé sur les
runners GitHub Actions).
.github/workflows/fetch-rbnz-mps.yml : quotidien (le MPS n'est publié
qu'~4x/an mais découverte + parsing sont légers), + déclenchement manuel.
lib/centralBankGovernance.ts : fetchRbnzGovernance() expose désormais un vrai
reportPdfUrl/statementUrl (au lieu de null) et un CBForecast — la 8e et
dernière banque centrale de l'onglet Banques centrales à avoir ses
prévisions, malgré le blocage du reste du site RBNZ.
Vérifié en direct : PIB/inflation 2026-2029 extraits correctement (+0.7 à
+3.4% PIB, +3.1 à +2.0% inflation), card RBNZ affiche le bloc "Prévisions"
et un vrai bouton "Rapport PDF" fonctionnel.
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>
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>
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>
- newsfeed.ts: les catégories Discours BC / Chef d'État ne sont retenues que
si le nom propre apparaît dans le TITRE de l'article (pas dans le body)
→ un article UK social avec 'Bailey' dans le body ne sera plus taggué BC
- NewsTab: bouton Analyse déplacé après le titre de l'article (en fin de ligne)
Layout final : [il y a Xh] [Source] [Catégorie] puis Titre... [▼ Analyse]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- newsfeed.ts: pré-filtre macro obligatoire avant applyRules pour ZeroHedge
→ articles non-financiers (social, politique) rejetés même si un prénom de
gouverneur (ex: Bailey) apparaît dans le body
- NewsTab: timestamp (il y a Xh) déplacé en première position avant le nom du
journal sur la ligne de métadonnées; bouton Analyse reste avec le titre
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tooltip: ajout color:#e2e8f0 sur les deux charts (texte invisible sur fond sombre)
- Rate Curve: légende visuelle inline (Actuel blanc / Sem. préc. bleu pointillé)
- Implied Pts: légende couleurs barres (vert Hausse / rose Baisse)
- investinglive.ts tryUrl: cache no-store au lieu de revalidate:21600
(les 404 cachées empêchaient de trouver l'article de la semaine précédente)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- data/rate-probabilities.json: initial seed (6 CBs fresh from rateprobability.com)
- lib/rateprobability.ts: fallback to cache file when live fetch fails (Vercel block)
parseCBBody() reuses same parsing logic; cache valid 4h max
- .github/scripts/fetch-rate-data.mjs: fetch script (run manually or via Actions)
- HTTP status now logged for diagnostics
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- preferredRegion: fra1/lhr1/cdg1 to bypass US cloud IP blocks on rateprobability.com
- Better sec-* headers to pass bot detection (same-origin cors mode)
- cache: no-store on fetch to avoid stale null caching
- Log CB count on each invocation for diagnostics
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two bugs fixed in fetchAllCBPaths / fetchCBPath:
- yearEndImplied was taking the last meeting within 380 days (~mid-2027) instead
of the last meeting of the current calendar year (Dec 2026) — caused bps to be
significantly overstated (e.g. USD showed +40 instead of +29.6)
- IL article bpsYearEnd was overriding rateprobability.com yearEndImplied for all
currencies; now IL only overrides CHF (no RP coverage); other 7 CBs use live OIS
Dashboard yearEndBps now matches rateprobability.com raw API exactly for all CBs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Retail Sales: switch from FRED OECD series (4-6w lag) to Trading Economics real-time scraping
for all 8 currencies; label changed to "Retail Sales MoM"
- Cache TTL: 24h → 1h base + 15min hot when ForexFactory detects recent high-impact event
- Rate probability trend arrows: server-side IL weekly delta (current vs previous Dellamotta article)
with per-metric thresholds (prob ≥3%/10%, bps ≥10/25) and colour coding (sky=dovish, amber=hawkish)
- Cycle phase: replaced FRED trend heuristic with OIS-based logic using peakMeeting.probMovePct,
probIsCut, and yearEndBps; dynamic descriptions include real market numbers
- investinglive.ts: find both current + previous article to compute week-over-week delta server-side
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajout des onglets COT, Weekly Report, TvChart. Refonte Sentiment, News,
Calendar, Drivers. Nouvelles API cot-history et fx-weekly. Intégration FinancialJuice.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Calendrier économique
- Nouvelles sources : TE HTML scraping (483 events/2 sem.) + Investing.com en co-primaires
- Dédupe déterministe par clé currency+category+date (±1j pour policy_rate)
- Filtre catégorie "other", filtre discours CB (fix doublon TE vs Investing)
- CHF/Switzerland via page séparée TE (hors G20)
- Fenêtre 14 jours avec ?startDate=&endDate= passés à TE
- ForexFactory+FRED en secours uniquement si les deux scrapers tombent à vide
Probabilités OIS
- rateprobability.com (7 CBs : FED/ECB/BOJ/BOE/BOC/RBA/RBNZ)
- investinglive.com (Dellamotta) : scan URL-date 14 jours → couvre SNB/CHF manquant
- SNB : 3% probabilité hausse au 19 juin 2026 (source : IL article 2026-05-29)
- rate_expectations.json MAJ : RBNZ 79% hike (corrigé depuis 70% no-change stale)
- Dédup ±1 jour pour policy_rate (fix doublon SNB TE-18/06 vs IL-19/06)
Taux directeurs
- USD : scrapeTeRate() = 3.75% (fin midpoint FRED 3.625%)
- AUD prev : 4.10% (corrigé depuis 4.60%)
- NZD/CHF/JPY/CAD : cohérents avec TE officiel
Yields 10Y souverains
- Nouvelle lib lib/tebonds.ts : scrape TE bonds, données du jour, cache 1h
- Remplace FRED IRLTLT01XXM156N mensuel (JPY/CHF/AUD/NZD avaient 1 mois de retard)
- 8 devises + spread vs USD calculé automatiquement
- /api/yields et /api/drivers utilisent la même lib
Drivers globaux
- BTC : ticker/price Binance (plus précis que 24hr lastPrice)
- HY Spread cache : 86400s → 3600s (données FRED du jour)
- DriversBar : suppression affichage direct US 10Y, tooltip Crb 2-10 affiche US10Y+US2Y
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>