Quant Agent — multi-agent quant terminal on Hyperliquid
All checks were successful
deploy / deploy (push) Successful in 7s

Live HL data → in-browser TA → 4-agent committee → LONG/SHORT/SKIP verdict.
Terminal grid command bar + interactive agent-workflow graph. Paper-trading
worker reuses the browser brain (dry-run + Telegram). Forgejo static deploy.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zefiroff 2026-06-09 19:00:13 +04:00
commit f3b533b032
110 changed files with 15045 additions and 0 deletions

View file

@ -0,0 +1,90 @@
# $QUANT Terminal — interface design system
**Direction:** "Carbon Desk" — a serious institutional quant trading terminal (Linear ×
Bloomberg). Dark, dense, calm. The product is the live decision pipeline; the **agent
committee → verdict** is the hero. Reading order everywhere: **CALL → WHY → EVIDENCE**.
**Feel:** precise, quiet, instrument-like. No marketing voice. Craft whispers.
## Depth strategy
**Borders + surface lightness — NO shadows.** Elevation by lightness:
- page `--color-paper` #0B0C0E → panel chrome `--color-panel` #111316 → raised/hover/active
`--color-panel-2` #181B20. Data cells & wells **recede** to `--color-inset` #0E0F12.
- Borders are light-on-dark rgba: `line` .10 (standard), `line-soft` .06 (dividers),
`line-strong` .16 (emphasis / zero-axis). `line-amber` .45 only for the verdict accent.
- Bar/ring tracks use `--color-track` rgba(255,255,255,.09) — a carved channel, never `line-soft`.
## Color
- **One accent: amber `--color-accent` #FFB020** — reserved for "the call" (verdict accent
strip, L4 pipeline dot, active tab, PAPER chip). Do not spread it.
- **Semantic only:** long `#2BD974`, short `#F2444D` (+ `-dim` 14% fills). Never decorative.
- Direction must never be color-only — pair with a glyph/sign (▲ ▼ —, +/).
## Text hierarchy (all AA on panel)
`--color-bone` #E8EAED primary · `--color-bone-dim` #AAB1BA secondary/prose ·
`--color-muted` #828A94 labels · `--color-faint` #727983 captions/ticks.
Rule: value=bone, supporting prose=bone-dim, labels=muted, codes/units/ticks=faint.
## Type
- Display/UI **Geist**, data **Geist Mono**. All numbers mono + `.tnum` (tabular).
- Scale tokens: `--text-micro` 10px · `--text-label` 11px · `--text-read` 12px · `--text-data` 13px.
Big display via inline `clamp()` (verdict glyph clamp(3rem,6vw,5rem)).
- Labels: `.label` (11px, .14em) and `.label-sm` (10px, .1em) are the ONLY label recipes.
Two letter-spacings, not eight.
- Weight: bold (700) reserved for display (verdict glyph, masthead, QUANT). Data = 500/medium.
## Spacing & radius
- 4px base. Panel inset = `px-4 py-3`. Hairline grids via `gap-px` over `bg-line-soft`.
- Radius scale 2/4/6/10. Panels `rounded-md` + `overflow-hidden`; nested wells clip to parent.
## Key patterns
- **Panel**`rounded-md border border-line bg-panel overflow-hidden`; header = `.label` +
faint meta. Accent panel adds a 2px amber top strip as a child div (clean rounded corners).
- **Cell** — recessed `bg-inset`, `.label-sm` over `.tnum` mono value; optional `sub` (agent tag)
and a thin `--color-track` bar.
- **DivergeBar** — the signature: shared zero-axis; LONG fills right (green), SHORT left (red),
SKIP a centred muted tick. Conviction = length. Committee ends in a NET LEAN row whose amber
marker is the aggregate — visually ties votes → verdict.
- **VerdictHero** — full-width band, the hero: clamp() decision glyph in dir color + arrow,
quorum ticks, big ConfidenceRing, then size/TP/SL/RR cells. Amber accent strip.
- **Pipeline** — honest L1→L6 with status dots (live=green, neutral=muted, the call=amber on L4,
off-terminal=faint). Never overclaim what the page doesn't do.
## Terminal layout (workspace)
The terminal is a **multi-pane workspace**, not tabs — everything visible at once like a real desk.
Order: status bar → masthead + coin tabs → reading guide → **VERDICT band on top** (the call,
full width) → 3-column grid `lg:grid-cols-[280px_minmax(0,1fr)_360px]` (stacks to 1 col below lg):
- **Left**`PipelineRail` (vertical L1→L6) + Market + Indicators stat cells (the "numbers").
- **Center** — the candlestick chart (the dominant pane).
- **Right**`AgentGraph` (signature) + Committee analytics list.
`AgentGraph` (`components/viz/AgentGraph.tsx`) is hub-and-spoke: 4 agent nodes feed one central
verdict node; edge colour = vote (long/short/skip), edge weight + node fill = conviction; the
centre shows decision + confidence. Honest (exactly the 4 real agents), animated between states.
## Charts
Charts come from **bklit-ui** (shadcn registry `@bklit`, built on @visx + motion), installed as
source under `src/components/charts/`. The price panel uses the **candlestick-chart**
(`src/components/viz/PriceCandles.tsx`) fed by real Hyperliquid OHLC, themed to Carbon Desk:
`positiveFill=var(--color-long)`, `negativeFill=var(--color-short)`. Dark chart vars are
activated via `class="dark"` on `<html>`. Add more charts with
`npx shadcn@latest add @bklit/<slug>`.
Two gotchas (already handled): (1) the alpha `@visx ParentSize` fails to size under React 19 —
`candlestick-chart.tsx` was patched to use a `useElementSize` ResizeObserver hook instead.
(2) Keep the global `* { min-width: 0 }` reset inside `@layer base`, or it (unlayered) beats
Tailwind's `min-w-*` utilities and breaks `flex-wrap` layouts.
## States
Seeded-vs-live is flagged (verdict shows a "seed · awaiting live" chip when `live===false`);
StatusBar surfaces stale/error (`DATA STALE` when fetch errors or `ago>40s`); footer copy
degrades the "live" claim accordingly. Global amber `:focus-visible` ring on all interactives.