feat(feeds): ECB CISS European financial stress index (#2278) (#2334)

* feat(feeds): ECB CISS European financial stress seeder + GetEuFsi RPC (#2278)

- New seed-fsi-eu.mjs fetches ECB CISS (0-1 systemic stress index for Euro area)
  via SDMX-JSON REST API (free, no auth); TTL=604800s (7d, weekly data cadence)
- New GetEuFsi RPC in EconomicService with proto + handler; cache tier: slow
- FSIPanel now shows EU CISS gauge below US FSI with label thresholds:
  Low<0.2, Moderate<0.4, Elevated<0.6, High>=0.6
- Registered economic:fsi-eu:v1 in health.js BOOTSTRAP_KEYS + SEED_META,
  bootstrap.js, cache-keys.ts BOOTSTRAP_TIERS; hydrated via getHydratedData('euFsi')
- All 2348 test:data tests pass; typecheck + typecheck:api clean

* fix(ecb-ciss): address code review findings on PR #2334

- Raise FSI_EU_TTL from 604800s (7d) to 864000s (10d) to match other
  weekly seeds (bigmac, groceryBasket, fuelPrices) and provide a 3-day
  buffer against cron-drift or missed Saturday runs
- Format latestDate via toLocaleDateString() in FSIPanel CISS section
  instead of displaying the raw ISO string (e.g. "2025-04-04")

* fix(ecb-ciss): address Greptile review comments on PR #2334

- Fix misleading "Daily frequency" comment in seed-fsi-eu.mjs (SDMX
  uses 'D' series key but only Friday/weekly observations are present)
- Replace latestValue > 0 guards with Number.isFinite() in FSIPanel.ts
  so a valid CISS reading of exactly 0 is not incorrectly excluded

* chore: regenerate proto outputs after rebase
This commit is contained in:
Elie Habib
2026-03-27 11:07:17 +04:00
committed by GitHub
parent 1d0846fa98
commit 4438ef587f
14 changed files with 422 additions and 24 deletions

View File

@@ -624,6 +624,32 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/Error'
/api/economic/v1/get-eu-fsi:
get:
tags:
- EconomicService
summary: GetEuFsi
description: GetEuFsi retrieves the ECB CISS (Composite Indicator of Systemic Stress) for the Euro area.
operationId: GetEuFsi
responses:
"200":
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/GetEuFsiResponse'
"400":
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
Error:
@@ -1739,3 +1765,31 @@ components:
value:
type: number
format: double
GetEuFsiRequest:
type: object
GetEuFsiResponse:
type: object
properties:
latestValue:
type: number
format: double
latestDate:
type: string
label:
type: string
history:
type: array
items:
$ref: '#/components/schemas/EuFsiObservation'
seededAt:
type: string
unavailable:
type: boolean
EuFsiObservation:
type: object
properties:
date:
type: string
value:
type: number
format: double