Commit Graph

236 Commits

Author SHA1 Message Date
OpenSquared
ff551deecd feat: instrument model 2026-07-03 17:20:22 +02:00
OpenSquared
2bb8109eb4 feat: instrument model 2026-07-03 16:03:59 +02:00
OpenSquared
2d8cccec07 feat: instrument model 2026-07-03 15:34:48 +02:00
OpenSquared
05ee909ee4 feat: instrument model 2026-07-03 13:27:09 +02:00
OpenSquared
90f894e5c6 feat: instrument model 2026-07-03 11:55:51 +02:00
OpenSquared
352fd48e46 feat: instrument model 2026-07-03 11:25:13 +02:00
OpenSquared
8f51e0de7b feat: instrument model 2026-07-03 11:00:23 +02:00
OpenSquared
c3e9b21bda feat: instrument model 2026-07-03 10:17:02 +02:00
OpenSquared
f4e57e9d84 feat: instrument model 2026-07-03 09:59:26 +02:00
OpenSquared
980c797f53 feat: instrument model 2026-07-03 09:43:39 +02:00
OpenSquared
d9e9d30889 feat: instrument model 2026-07-03 00:31:30 +02:00
OpenSquared
a8ee808937 feat: instrument model 2026-07-03 00:04:37 +02:00
OpenSquared
ff6f0b390d feat: instrument model 2026-07-02 23:36:06 +02:00
OpenSquared
e2144d93e9 feat: instrument model 2026-07-02 22:46:55 +02:00
OpenSquared
7f7c343c9e feat: instrument model 2026-07-02 22:34:16 +02:00
OpenSquared
aecbdc9929 feat: instrument model 2026-07-02 20:31:30 +02:00
OpenSquared
ae5865a156 feat: pressure 2026-07-02 18:07:21 +02:00
OpenSquared
82739e8140 feat: instrument analysis 2026-07-02 14:21:57 +02:00
OpenSquared
0d5ad88b1c feat: causal graph 2026-07-02 13:57:43 +02:00
OpenSquared
5081514898 feat: calendar 2026-07-02 11:27:45 +02:00
OpenSquared
e1681edffc feat: causal lab 2026-07-01 21:01:00 +02:00
OpenSquared
1829335ad1 feat: macro series 2026-07-01 17:38:33 +02:00
OpenSquared
776c19e1ae feat: macro series 2026-07-01 15:58:47 +02:00
OpenSquared
292d2c6413 feat: bank forceasts 2026-06-30 21:47:20 +02:00
OpenSquared
bb614936c3 feat: macro series 2026-06-30 19:08:33 +02:00
OpenSquared
b8a1d2ad07 feat: instrument analysis 2026-06-30 18:45:12 +02:00
OpenSquared
479b2b7b05 feat: instrument analysis 2026-06-30 18:31:43 +02:00
OpenSquared
75489a54bd feat: instrument analysis 2026-06-30 18:09:29 +02:00
OpenSquared
c3cebc2d7e feat: instrument analysis 2026-06-30 17:23:51 +02:00
OpenSquared
7f3cce69b9 feat: instrument analysis 2026-06-30 17:03:36 +02:00
OpenSquared
9711f0921c feat: instrument analysis 2026-06-30 16:56:27 +02:00
OpenSquared
ecb9b74b20 feat: instrument analysis 2026-06-30 16:50:26 +02:00
OpenSquared
9ffcfeeb71 feat: instrument analysis 2026-06-30 16:32:08 +02:00
OpenSquared
9904c066b2 feat: instrument analysis 2026-06-30 16:15:39 +02:00
OpenSquared
69ca36bd7e feat: market event 2026-06-30 13:55:03 +02:00
OpenSquared
2b1a43a093 feat: market event 2026-06-30 12:22:14 +02:00
OpenSquared
12c298cf83 fix: graphe calculation 2026-06-30 12:00:42 +02:00
OpenSquared
05d2a2c841 fix: add save buttons at bottom of grammar panel in causal editor
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 11:17:43 +02:00
OpenSquared
9e929cf47f feat: export current graph as grammar with copy button for external AI analysis
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 09:36:34 +02:00
OpenSquared
f9dddb7184 feat: graph patch grammar DSL for causal editor
New grammar panel replaces free-text AI prompt with a two-step workflow:
1. NL to Grammar: GPT-4o converts description to patch ops (new endpoint ai-to-grammar)
2. Apply: frontend parser applies grammar locally without AI

Grammar syntax: (+|-|~)(node|edge|coef|input|instruments) key=val key=val
Sign shortcuts: + positive, - negative, = neutral
Auto-positions new nodes when x/y omitted.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 09:30:17 +02:00
OpenSquared
9a1e943be0 feat: multi-tab instrument analysis
Each /instruments/:id navigation opens a persistent tab in the TabBar.
Multiple instruments can be open simultaneously — state is preserved when switching.

- TabsContext: adds instrumentIds[], openInstrument(), closeInstrument()
- TabBar: renders instrument tabs (teal, monospaced, TrendingUp icon) after static tabs, separated by a divider
- InstrumentDashboard: accepts instrumentIdProp so keep-alive instances use the right id regardless of URL
- App: InstrumentRoute registers the tab on navigation; InstrumentKeepAlive mounts one dashboard per open instrument; NormalRoutes hides on instrument paths (hidden div, Routes still fires)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 09:17:05 +02:00
OpenSquared
230ce3ff2b fix: prevent Nouveau button overflow in editor base panel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 09:11:58 +02:00
OpenSquared
40d6f14901 feat: causal lab — chip filters, editor zoom, AI modify prompt
Library:
- Color chip filters: category (with per-category colors), sub_type, instrument
- Date range filter (created_at) + text search
- Category labels unified to cover event_calendar, fundamental, calendar_event etc.
- Editer button on selected template → opens in editor tab
- Show created_at + created_by in template detail

Editor:
- Accepts initialId prop so Library can pre-load a template
- AI Modify zone: textarea prompt + button calls /api/causal-lab/template/{id}/ai-modify
- Returns modified graph_json from GPT-4o, applied live — user reviews then saves

Backend:
- New POST /api/causal-lab/template/{id}/ai-modify endpoint
  - Sends current graph_json + user prompt to GPT-4o
  - Returns validated modified graph_json (nodes/edges required)
  - Does not auto-save (user controls save)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 09:04:15 +02:00
OpenSquared
589faa633b feat: improve causal graph readability — scale positions, bigger fonts, less overlap
- Scale node positions by 1.55x to spread graph vertically/horizontally
- Increase node size: 120x42 -> 130x48 (normal), 130x50 -> 140x54 (editor)
- Bigger label font: 11px -> 12px inside nodes
- Edge labels: 8.5px -> 9.5px, lag/decay: 8px -> 9px
- Better label stagger along bezier: lag at t=0.13, label at t=0.42, decay at t=0.84
- Larger perpendicular offset: 10px -> 16px (less overlap on diagonal edges)
- SVG height: 480 -> 560 (normal), 540 -> 620 (editor)
- Use scaledNodes array for node rendering to apply position transform

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 08:46:07 +02:00
OpenSquared
b33d06cb97 debug: add db_state display + raw pred_json, expand YFINANCE_MAP
YFINANCE_MAP now includes GBPUSD, USDJPY, USDCHF, AUDUSD, NZDUSD, USDCAD, XAGUSD, NASDAQ, DAX, FTSE, WTI, US30Y, DXY.
Frontend diagnostic panel shows db_state rows after Recalculer and raw prediction_json prefix per event.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 23:31:15 +02:00
OpenSquared
05236c31f3 fix: preserve debug info across snapshot re-fetch + widen refresh filter
- refreshDebug state lives in parent (InstrumentDashboard) so it survives
  fetchSnapshotSilent re-render (ExplanationScore no longer loses debugInfo
  when onRefreshDone triggers setLoading → unmount)
- fetchSnapshotSilent: re-fetches snapshot without setLoading(true) so
  ExplanationScore stays mounted with its state
- Refresh filter now catches rows where prediction_json is empty even if
  actual_json is populated, and handles '[]' / null variants

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 23:20:17 +02:00
OpenSquared
c73bedd7d0 debug: expose full inputs/outputs in Recalculer response for diagnosis
_run_auto_analysis now returns a rich dict {ok, inputs, node_values, actual_moves, error}
instead of bool. The refresh endpoint captures and forwards:
- inputs: what values were fed to evaluate_graph
- node_keys: which nodes were computed in prediction
- actual_moves: actual price pips fetched
- run_error: exception message if it failed

Frontend shows all of this after clicking Recalculer so the root cause is visible.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 23:09:49 +02:00
OpenSquared
c93eba7a7f fix: compute surprise_pct from actual/expected when NULL for auto-analysis scoring
Events with surprise_pct=NULL (bootstrap or older events) got inputs={} → evaluate_graph
returned {} → prediction_json='{}' → all scores showed 'En attente'.

Three-step fallback in _run_auto_analysis:
1. Use event.surprise_pct if set (existing behaviour)
2. Compute from actual_value / expected_value stored in market_events
3. Look up most recent ff_calendar release by currency + date

Frontend diagnostic now shows surprise_pct per event and exposes actual/expected
in the refresh result panel to make the source visible.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 22:54:57 +02:00
OpenSquared
959c2825df feat: instrument analysis 2026-06-29 22:38:50 +02:00
OpenSquared
ce96e55314 feat: instrument analysis 2026-06-29 22:24:24 +02:00