14 Commits

Author SHA1 Message Date
caty21 3a384eb820 fix: OIS indisponible sur toutes les cards + transparence sur l'instrument utilisé
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>
2026-07-14 23:09:50 +02:00
caty21 50ae11c3c4 feat: remplace Atlanta Fed par des futures Euribor/SONIA réels pour EUR/GBP
- 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>
2026-07-09 11:55:35 +02:00
caty21 03d601379f fix: RBNZ MPS — le retry curl ne se déclenchait jamais sur un 403
curl sans --fail sort avec le code 0 même sur une erreur HTTP (il écrit juste
la page d'erreur sur stdout), donc le try/catch du wrapper de retry ne
capturait rien : le blocage Cloudflare éventuel des IPs GitHub Actions
n'aurait jamais bénéficié des tentatives supplémentaires. Ajoute --fail (+ un
court backoff entre tentatives) pour que le retry serve réellement à quelque
chose.
2026-07-09 09:06:47 +02:00
caty21 465a81a27c feat: RBNZ — automatise la découverte + lecture du Monetary Policy Statement
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>
2026-07-08 23:46:31 +02:00
caty21 274c7f534e feat: Atlanta Fed MPT (options SOFR) + libellé méthodologie Réunions USD
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>
2026-07-08 22:05:35 +02:00
caty21 356940a76a fix: courbe OIS USD écrasée par un fallback dégradé quand investing.com bloque GitHub Actions
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>
2026-07-08 20:44:20 +02:00
caty21 0657b50c07 feat: banques centrales (vote+dot plot+previsions), calendrier elargi, fix InvestingLive, M3 auto
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>
2026-07-08 16:47:59 +02:00
caty21 416c5348f2 fix: GitHub Actions push permission + submodule + dashboard Taux tab
- add permissions: contents: write + persist-credentials to workflow
- git rm --cached Market-Signal-Finder (submodule sans .gitmodules)
- consolide OIS+STIR en onglet Taux (3 sous-onglets: Courbe/Probabilités/Réunions)
- header summary: 1 ligne, fix bug Hold/Hold, taux actuel dans légende chart
- cache stale: seuil 48h → 7j pour dev local
- stale-while-revalidate: affiche cache immédiatement, refetch en arrière-plan (10s)
- redesign tooltip chart Courbe (Actuel/Sem. préc./Δsem. en bps)
- YAxis affiche taux complets (3.63% vs .63 tronqué)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 17:05:50 +02:00
caty21 eca5800372 fix: InvestingLive URL (/centralbank/events), procure.ch PMI title, remove signals badge
- investinglive.ts / expectations/route.ts / fetch-rate-data.mjs : try 4 URL variants
  (/centralbank/ or /news/, events or event) to handle site restructure
- calendar/route.ts: displayTitle catches procure.ch prefix to return PMI Manufacturier
- page.tsx: remove divergenceCount badge and unused Zap import

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 10:45:15 +02:00
caty21 2673686743 feat: replace rateprobability.com with CME FedWatch + Investing.com scrapers
- fetch-rate-data.mjs: CME FedWatch (USD), Investing.com rate monitors (all CBs),
  InvestingLive (fallback) — plus aucune dépendance à rateprobability.com
- lib/rateprobability.ts: suppression des appels live rateprobability.com,
  source unique = cache GitHub Actions (data/rate-probabilities.json)
- Logs détaillés pour debugger le premier run GitHub Actions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 13:35:14 +02:00
caty21 1e88b02acd feat: enable TradingView drawing toolbar + add GitHub Actions workflow
- TvAdvancedChart: hide_top_toolbar false → outils de dessin visibles
- GitHub Actions: workflow fetch-rate-data.yml (cron horaire)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 11:47:18 +02:00
caty21 cb52cfad1a fix: TvChart embed-widget-advanced-chart (candlestick, no symbol restriction), unique instance IDs, CHF/SNB trial, NZD candlestick in ReportTab 2026-06-27 23:09:02 +02:00
caty21 a978f19088 fix: Sem. préc. HEAD→GET, prevMeetings cache, remove footer
- investinglive: tryUrl HEAD→GET + res.body?.cancel() (WordPress bloque HEAD)
  fenêtre recherche article préc. élargie 21→28 jours
- rateprobability: CBRatePath + prevMeetings/prevWeekDate, loadPrevWeekCachedBody()
  fetchAllCBPaths enrichit prevMeetings depuis snapshot GitHub Actions
- fetch-rate-data.mjs: rotation current→previousWeek (5–9 jours) pour Rate Curve
- CurrencyCard: rateCurveData préfère prevMeetings (exact/meeting) > ilDelta (approx)
  légende hasPrevCurve pilote affichage ligne bleue et label date
- page.tsx: suppression footer Sources/LLM, remplacement par pb-12

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:40:48 +02:00
caty21 b82c680f83 fix: GitHub Actions cache fallback + diagnostic logging for rate-probabilities
- 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>
2026-06-27 16:33:38 +02:00