---
name: project-wic-economic-indicator-stack-2026-05-30
description: WIC 経済指標 stack 大規模 build-out (Events/Calendar/Macro/FRED/Finnhub/JP-CN-EU ETF/Stage 1 lens/Stage 2-α D1) — 2026-05-30 session 全成果
metadata: 
  node_type: memory
  type: project
  originSessionId: 89aa4a63-524d-4974-9840-fd9ed17fcab8
---

2026-05-30 session で WIC (https://world-investment-center.pages.dev/) に **経済指標 + マーケット data stack** を大規模追加. 全機能 commit + push + Cloudflare Pages production deploy 完了済.

## 完成機能 (全 live)

### 地図上 overlay (`src/components/WorldGlobe.astro`)
- **📅 Events トグル** — 通貨 centroid に impact 色付バッジ (High=赤 / Medium=橙 / Low=黄 / Holiday=灰), 29 通貨 centroid 内蔵
- **📋 Calendar list panel** — 地図左上 floating, MT4 風時系列リスト (日付/時刻/★重要度/[通貨]/イベント名/A or F)
- **両方デフォルト ON** (ユーザー要望 per) — × ボタン or トグルで個別 OFF
- **Range filter** — 今後 24h / 今週 / 全て (panel 内 select)
- **Past 1h 以上のイベントは 0.45 不透明度** (次の発表が目で追える)
- **runtime EN/JA 切替** (`location.pathname.startsWith('/ja/')`) — JA は 米/欧/日/英/豪/加/瑞/中 等の短縮通貨ラベル

### Stage 1 — Honest Surprise Lens
- 各イベント行に **▲ Beat / ▼ Miss / = Inline** badge (Actual vs Forecast)
- `parseEconValue` — '%/K/M/B/T' suffix strip
- `lensEvent` — surprise = Actual − Forecast, scale = max(|A|, |F|, 0.01), threshold 2% rel
- **OBSERVATION not PREDICTION** (event-type semantics 意図的に省略, NFP↑=USD+ 等の解釈は人間判断)

### Stage 2-α — Historical Distribution + Wilson 95% CI
- **Cloudflare D1**: `wic-event-history` (APAC region, db_id `bd9239cc-7963-44fb-a10b-22218c25eb64`, binding `EVENT_HISTORY`)
- **Schema**: `events` table (event_key PK = "currency|date|title" + 8 cols) + 3 indexes. `reactions` table コメントアウトで Stage 2-β placeholder
- **Lazy ingestion**: 各 `/api/economic-calendar` 呼び出しが batched upsert (~90+ writes/visit) — cron 不要
- **History join**: 同 endpoint が D1 SELECT → JS aggregation per (currency, title) → response の `events[].history` に attach
- **Stats**: n, beatN/missN/inlineN, medianSurprise, IQR (P25/P75), beatRate, beatWilsonLow/High, first/lastSampleDate
- **UI badge**: n<5 は italic "n=X 蓄積中" (honest), n≥5 で `n=X ▲Y% [a–b]` purple dashed (hover で IQR + 期間)
- **Honest framing**: 「過去成績は将来を保証しません」 fooder + tooltip

### ★ 致命的発見と上流切替 (load-bearing)
**ForexFactory `ff_calendar_thisweek.json` は actual field を返さない** (forecast + previous のみ). Stage 1 lens が silent no-op だった + Stage 2-α が永遠に空になる発見 → **Finnhub Economic Calendar に切替**.
- 詳細 reference: [[reference_finnhub_economic_calendar_actuals_2026-05-30]]
- Coverage: 723 events / 14-day window / 71% with actual / 13 high-impact
- 切替後 D1 蓄積開始: 1,116 events / 431 with actual / 825 unique types (session 終了時点)

### `/macro` ダッシュボード (`src/pages/macro.astro` + `src/pages/ja/macro.astro`)
**27 ライブ data points 自動更新**:
- 🏦 **US Macro (FRED)** 8 cards (FEDFUNDS/DGS10/DGS2/T10Y2Y/CPIAUCSL/UNRATE/DTWEXBGS/DCOILWTICO) + 30 点 sparkline + 30 分毎更新
- 📊 **US Index ETF** 7 (SPY/QQQ/DIA/IWM/GLD/TLT/USO) + 60 秒毎更新
- 🇯🇵 **Japan ETF** 4 (EWJ/DXJ/BBJP/EWJV) — 米上場 USD 価格
- 🇨🇳 **China ETF** 4 (MCHI/FXI/KWEB/ASHR)
- 🇪🇺 **Europe ETF** 4 (VGK/EZU/HEDJ/EWG)
- Nav に **🏦 Macro** リンク追加 (`/correlations` 右隣)

### Cloudflare Pages Functions (新 API endpoints)
| Path | 用途 | Cache |
|---|---|---|
| `/api/economic-calendar` | Finnhub Economic Calendar proxy (旧 ForexFactory 切替) + D1 lazy ingest + history join | 5 min edge + D1 |
| `/api/fred` | FRED series observations proxy | 1 hour edge |
| `/api/finnhub` | Finnhub multi-endpoint proxy (quote/news/profile) | 60s / 5min / 24h |

### Cloudflare Secrets (already bound via wrangler)
- `FRED_KEY` — public-domain FRED data (key 不要だが API 規約上必要)
- `FINNHUB_KEY` — Finnhub free-tier (60 req/min, 40-char key 形式)
- **API key 実値は memory に書かない方針** (wrangler `pages secret list` で名前確認可, 実値は再生成可能). 注意: Finnhub key は 40 文字 (一見 2 keys 連結のような形式) なのが新仕様, 私 (Claude) が「20 文字」 と誤推測して藤本さんに二度 confirm お願いした honest correction 履歴あり

## 認識すべき bug fix 履歴 (1 day 内)

| Bug | 症状 | Fix |
|---|---|---|
| events-panel CSS override | `.events-panel { display: inline-flex }` (specificity 1) が `hidden` 属性 (specificity 0 UA rule) を override → Range filter が toggle OFF 状態でも見えていた + Range 変更が `if (eventsOn)` guard で no-op | `.events-panel[hidden] { display: none; }` 追加 |
| Stage 1 silent no-op | 上流 ForexFactory が actual 返さず → 全 lens 計算が null → 表示なし | Finnhub に切替 |
| WorldGlobe 既存変更による perf | `globe.gl` + `maplibre-gl` + `three.js` 2.9 MB 単一 bundle で 2D-only user に重い (前 session 5/29 partial fix) | dynamic import + IntersectionObserver で 67% 削減 (5/29 commit `9a51c63` + `1af5976`) |

## Commits (今日 / WIC repo)

新しい順:
- `81896b4` Switch /api/economic-calendar source to Finnhub (★ load-bearing)
- `9f9e3b4` Stage 2-α — Historical surprise lens with Wilson 95% CI hit-rate (D1)
- `6f2b82a` Stage 1 — Honest Surprise Lens for economic events
- `3078dc4` Default 📅 Events + 📋 Calendar ON at page load
- `5c21f32` Add 📋 Calendar list panel — MT4-style chronological view
- `04aa416` Fix: events-panel ignored hidden attribute due to CSS display override
- `f64de67` Add China + Europe equity ETF sections to /macro
- `d6f76cf` Add Japan equity ETF section to /macro (EWJ/DXJ/BBJP/EWJV)
- `4a8f95f` Add Finnhub + FRED proxies + /macro dashboard
- `baba70c` Add MT4-style economic calendar overlay (📅 Events toggle)

全 push 済 (origin/main). rei-aios repo は **本 session 一切触れず** (data/* と dist-renderer/data/* の auto-gen 差分は background pipeline 由来, session 前から存在).

## 永続原則 (load-bearing)

- **WIC root identity 維持** — 客観 stats のみ / 投資助言なし / 注文機能なし / 断定表現なし / IB なし (`[reference_japan_legal_line_fx_monetization_2026-05-29]` 金商法 §28 投資助言業 line)
- **Stage 1 lens は OBSERVATION not PREDICTION** — event-type semantics 解釈は engine 側で意図的に省略 (NFP=USD+ 等の常識的 mapping すら入れない). ユーザー判断に委ねる
- **Stage 2-α history は過去観測, 将来予測ではない** — Wilson 95% CI は信頼区間, 予測区間ではない. 「過去成績は将来を保証しません」 footer + tooltip 両方で明示
- **5/29 全面 lift 後も**「違法行為だけは line」 (`[feedback_money_topic_full_lift_only_illegal_is_redline_2026-05-29]`) — 無登録投資助言業は違法なので Stage 2-β でも signal/勝率断定は出さない

## Stage 2-β 未着手 (次回 session per ユーザー指示)

- Cron Worker scaffolding (Pages Function には cron なし, 別 Worker 必要)
- Frankfurter または Finnhub FX 価格を T+5min / T+30min / T+60min で capture
- `reactions` テーブル uncomment + populate
- UI で「surprise × return」 reaction lens 表示
- 詳細 TODO: [[project_pending_wic_calendar_resize_stage2b_rei_integration_2026-05-30]]

## 関連 memory

- [[project_session_2026-05-29_retrospective]] — 前日 session 振り返り
- [[project_wic_session_2026-05-26]] — WIC 5/26 大規模 build-out (Live Rates dock 等)
- [[project_wic_perf_map_bundle_split_2026-05-29]] — 5/29 perf 改善
- [[feedback_money_topic_full_lift_only_illegal_is_redline_2026-05-29]] — 5/29 全面 lift 永続原則
- [[reference_japan_legal_line_fx_monetization_2026-05-29]] — 金商法 line map
- [[reference_finnhub_economic_calendar_actuals_2026-05-30]] — 上流 data 検証で得た永続知見
- [[project_pending_wic_calendar_resize_stage2b_rei_integration_2026-05-30]] — 次回 TODO 6 件
