Commit Graph

346 Commits

Author SHA1 Message Date
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
5e37cd81a2 fix: pass prediction_json and actual_json through to snapshot events
The filtered event dict was built with explicit fields and omitted these two columns,
so the frontend always received null despite the DB having valid data.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 23:34:32 +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
af73b77cba fix: ensure actual_json is computed for auto-generated templates
Auto-generated templates had no lag_days on edges → effective_lag_days=0 →
_drift_metrics used exact-date daily bar (often empty) → actual_json='{}' →
comprehensionScore returned null even after prediction_json was populated.

- Default effective_lag_days=5 when computed as 0 in _run_auto_analysis
- Add lag_days:3 to all auto-generated template edges in _build_graph_json_from_spec

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 23:05:10 +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
OpenSquared
4c85d9d23b feat: market event 2026-06-29 21:40:44 +02:00
OpenSquared
b223f50f8b feat: market event 2026-06-29 21:16:29 +02:00
OpenSquared
5e819b5b67 feat: instrument analysis 2026-06-29 20:44:03 +02:00
OpenSquared
f4a55a8009 feat: desk ia 2026-06-29 20:21:52 +02:00
OpenSquared
551ebc3ef4 feat: desk ia 2026-06-29 19:50:18 +02:00
OpenSquared
f7acca2152 feat: desk ia 2026-06-29 17:16:57 +02:00
OpenSquared
69418ab650 feat: desk ia 2026-06-29 15:45:21 +02:00
OpenSquared
9c30b58f22 feat: market event 2026-06-29 14:41:25 +02:00
OpenSquared
bec6d5590a feat: causal lab 2026-06-29 14:33:26 +02:00
OpenSquared
ac441ad5cb feat: market event 2026-06-29 12:49:12 +02:00
OpenSquared
79593a8fd3 feat: instrument analysis 2026-06-29 12:38:28 +02:00
OpenSquared
495ccfdee4 feat: market event 2026-06-29 11:48:52 +02:00
OpenSquared
30b478ca72 feat: market event 2026-06-29 11:45:00 +02:00
OpenSquared
c5d1f7b4bc feat: causal lab 2026-06-29 11:37:35 +02:00
OpenSquared
394580c8c8 feat: causal lab 2026-06-29 11:35:24 +02:00
OpenSquared
7ac7c4c619 feat: market event 2026-06-29 11:27:28 +02:00
OpenSquared
4be3ad9ce3 feat: market event 2026-06-29 11:15:08 +02:00
OpenSquared
9f90c97461 feat: market event 2026-06-29 11:05:25 +02:00
OpenSquared
bcdf1fbf2e feat: causal lab 2026-06-29 10:32:18 +02:00
OpenSquared
67bfd8e777 feat: tab bar 2026-06-29 09:23:26 +02:00
OpenSquared
45e5504256 feat: tab bar 2026-06-29 08:56:10 +02:00
OpenSquared
97077af369 feat: market event 2026-06-29 08:14:25 +02:00
OpenSquared
5e65424500 feat: instrument analysis 2026-06-29 00:06:14 +02:00
OpenSquared
3bcecdab09 feat: instrument analysis 2026-06-28 23:43:52 +02:00
OpenSquared
3d7b3e47c9 feat: instrument analysis 2026-06-28 23:28:21 +02:00
OpenSquared
5a0aa30d60 feat: instrument analysis 2026-06-28 23:07:20 +02:00
OpenSquared
aba599cec7 feat: causal lab 2026-06-28 18:15:56 +02:00
OpenSquared
6ebbf4326e feat: causal lab 2026-06-28 18:08:09 +02:00
OpenSquared
c286c7c000 feat: desk IA 2026-06-28 17:14:40 +02:00
OpenSquared
bab09a1b09 feat: causal lab 2026-06-28 17:03:37 +02:00
OpenSquared
6a683411ed feat: instrument analysis 2026-06-28 16:57:16 +02:00
OpenSquared
e4e17330b4 feat: instrument analysis 2026-06-28 16:36:28 +02:00
OpenSquared
0693d41d91 feat: causal lab 2026-06-28 15:50:51 +02:00
OpenSquared
1e44557551 feat:: causal lab 2026-06-28 15:38:19 +02:00
OpenSquared
863ba67610 feat: causal lab 2026-06-28 14:18:43 +02:00
OpenSquared
20f1897211 feat: instrument analysis 2026-06-28 13:52:34 +02:00
OpenSquared
b5d4eb71e7 feat: instrument analysis 2026-06-28 13:35:29 +02:00