data/collectors/hyperliquid.py:
- Fixed _handle_trades to handle HL WebSocket trade data as list[dict]
(each trade dict has its own 'coin' field) instead of assuming single dict
- Fixed _poll_funding and _poll_open_interest to guard against
data[0] being list vs dict (mainnet vs testnet response format difference)
data/duckdb_load.py:
- Replaced deprecated duckdb.from_sequence() with executemany() for
l2_snapshots, trades, and funding table inserts (DuckDB 1.5.x API)
Tick runner verified on real mainnet BTC data:
- 324 events (45 L2 + 279 trades), VPIN-gated A-S MM, 1 trade, 98 cancels
- HFT dashboard generated with 8 panels from real tick data