diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 1b54cc5..2860f61 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -27,6 +27,7 @@ {"_type":"issue","id":"islandflow-ayo","title":"Drop stale backlog events from live fanout","description":"Follow-up to live freshness rollout: /ws/live was still fanning out stale backlog events for freshness-gated channels, which kept tape panes in Live feed behind despite active synthetic ingest. Gate fanout and cache ingest by freshness for options/nbbo/equities/flow.","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:26:39Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:26:44Z","started_at":"2026-04-28T21:26:44Z","closed_at":"2026-04-28T21:26:44Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"islandflow-0v6","title":"Fix tape freshness, NBBO coverage, pause controls, and filter popup","description":"Implement the tape fixes requested for synthetic options notional sizing, strict live freshness, live-mode pause/resume behavior, stronger NBBO snapshot coverage, and moving flow filters behind a popup. Includes server-side live cache changes, web terminal state/UI changes, and tests for synthetic pricing, live snapshot freshness/NBBO retention, and live pause/filter interactions.","status":"closed","priority":1,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:02:52Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:13:38Z","started_at":"2026-04-28T21:02:57Z","closed_at":"2026-04-28T21:13:38Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"islandflow-e4r","title":"Implement smart-money flow filtering and synthetic firehose modes","description":"Implement the approved multi-surface plan for named synthetic market profiles, options raw-vs-signal filtering, live/API filter contracts, Tape page client-side flow filters, firehose-readiness improvements, tests, and README updates.","status":"closed","priority":1,"issue_type":"feature","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T20:10:49Z","created_by":"dirtydishes","updated_at":"2026-04-28T20:29:29Z","started_at":"2026-04-28T20:10:53Z","closed_at":"2026-04-28T20:29:29Z","close_reason":"Implemented synthetic market profiles, options signal-path filtering, signal-aware API/replay contracts, Tape page filters, tests, and README updates. Follow-up tracked in islandflow-biq.","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"islandflow-3vr","title":"create ground-up frontend redesign mocks","description":"Generate a set of production-quality app mock redesigns that reuse Islandflow fundamentals in new interface models for evaluation.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-06-11T08:10:00Z","created_by":"dirtydishes","updated_at":"2026-06-11T08:17:51Z","started_at":"2026-06-11T08:10:09Z","closed_at":"2026-06-11T08:17:51Z","close_reason":"Created four ground-up frontend redesign mock routes and documented the work.","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"islandflow-9ns","title":"Refine command deck header","description":"Simplify the overview command deck header after live visual iteration, keeping live status, last tick, replay switching, and active filter controls prominent at the top of the page.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-06-06T11:30:15Z","created_by":"dirtydishes","updated_at":"2026-06-06T11:32:07Z","started_at":"2026-06-06T11:30:25Z","closed_at":"2026-06-06T11:32:07Z","close_reason":"accepted compact command deck header from live iteration, added active filter chips with hover clear controls, and validated web build/tests","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"islandflow-xmi","title":"Resolve conflicts in PR 45","description":"Resolve the merge conflicts blocking Forgejo PR 45, validate the affected code paths, and push the reconciled branch back to Forgejo.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-06-06T03:33:52Z","created_by":"dirtydishes","updated_at":"2026-06-06T03:35:16Z","started_at":"2026-06-06T03:33:58Z","closed_at":"2026-06-06T03:35:16Z","close_reason":"Resolved the PR 45 merge conflict in .beads/issues.jsonl and validated the reconciled tracker file.","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"islandflow-8a6","title":"verify github pages token for docs mirror","description":"The docs mirror workflow now publishes islandflow/docs into dirtydishes/dirtydishes.github.io, but the GitHub Actions secret DOCS_PAGES_TOKEN must exist and have permission to push to that Pages repository. Verify the secret is configured and manually run the Publish Docs workflow after the mirror branch lands.","notes":"Direct manual publish to dirtydishes/dirtydishes.github.io succeeded on 2026-06-01 and https://dirtydishes.github.io/islandflow/docs/ returned HTTP 200. Remaining work is to verify DOCS_PAGES_TOKEN so the islandflow docs mirror workflow can publish future updates automatically.","status":"open","priority":2,"issue_type":"task","owner":"dishes@dpdrm.com","created_at":"2026-05-31T22:12:27Z","created_by":"dirtydishes","updated_at":"2026-06-01T13:45:34Z","dependency_count":0,"dependent_count":0,"comment_count":0} diff --git a/apps/web/app/dashboard-mocks.tsx b/apps/web/app/dashboard-mocks.tsx index 1c23bb1..ad72d8d 100644 --- a/apps/web/app/dashboard-mocks.tsx +++ b/apps/web/app/dashboard-mocks.tsx @@ -7,142 +7,171 @@ type DashboardMockProps = { variant: MockVariant; }; -const variants: Record< - MockVariant, - { - title: string; - premise: string; - mode: string; - layout: string; - } -> = { +type Concept = { + title: string; + shortName: string; + premise: string; + bestFor: string; + layout: string; +}; + +const concepts: Record = { mock1: { - title: "Command Deck", + title: "Evidence Canvas", + shortName: "Canvas", premise: - "Closest to the reference: left navigation, ticker ribbon, dense evidence panes, replay rail.", - mode: "Dense ops", - layout: "classic" + "A selected anomaly becomes the organizing object. Price, options, prints, news, and replay evidence attach around one decision path.", + bestFor: "single-symbol investigation", + layout: "canvas" }, mock2: { - title: "Investigation Stack", + title: "Anomaly Queue", + shortName: "Queue", premise: - "A calmer analyst layout with the selected symbol story in the center and context wrapped around it.", - mode: "Forensic", - layout: "focus" + "The terminal behaves like an alert operations room: ranked work enters from the left, evidence resolves in the center, and confidence checks stay pinned.", + bestFor: "live triage under volume", + layout: "queue" }, mock3: { - title: "Signal Wall", + title: "Replay Room", + shortName: "Replay", premise: - "Prioritizes alert triage and cross-symbol scanning before a user drills into price action.", - mode: "Triage", - layout: "signals" + "Historical sessions become inspectable rooms. The time spine leads, with every event and chart panel synchronized to the replay cursor.", + bestFor: "after-action review", + layout: "replay" }, mock4: { - title: "Replay Lab", + title: "Market Atlas", + shortName: "Atlas", premise: - "A replay-first structure with timeline, event tape, and causality context always visible.", - mode: "Replay", - layout: "replay" + "Symbols are mapped as related territories. Sector pressure, cross-asset flow, and event clusters reveal where attention is concentrating.", + bestFor: "cross-market scanning", + layout: "atlas" } }; -const tickers = [ - ["SPY", "529.18", "+0.23%", "up"], - ["QQQ", "452.47", "+0.31%", "up"], - ["AAPL", "194.88", "+1.22%", "up"], - ["NVDA", "120.19", "-0.41%", "down"], - ["TSLA", "180.72", "+0.72%", "up"], - ["AMZN", "186.31", "+0.35%", "up"], - ["IWM", "205.41", "+0.21%", "up"] +const variantOrder: MockVariant[] = ["mock1", "mock2", "mock3", "mock4"]; + +const symbols = [ + { symbol: "AAPL", price: "194.88", move: "+1.22%", direction: "up", score: 94, sector: "Mega cap tech" }, + { symbol: "NVDA", price: "120.19", move: "-0.41%", direction: "down", score: 81, sector: "AI semis" }, + { symbol: "TSLA", price: "180.72", move: "+0.72%", direction: "up", score: 76, sector: "EV complex" }, + { symbol: "AMZN", price: "186.31", move: "+0.35%", direction: "up", score: 68, sector: "Consumer platform" }, + { symbol: "IWM", price: "205.41", move: "+0.21%", direction: "up", score: 59, sector: "Small caps" } +]; + +const anomalies = [ + { + time: "09:41:10", + symbol: "AAPL", + title: "Dark sweep aligns with call pressure", + value: "$4.32M", + confidence: "High", + direction: "Bullish", + cause: "off-exchange prints led the options burst by 72s" + }, + { + time: "09:40:58", + symbol: "NVDA", + title: "Call wall absorbed at 120", + value: "$2.01M", + confidence: "Medium", + direction: "Mixed", + cause: "quote lift faded after the second split sweep" + }, + { + time: "09:39:47", + symbol: "TSLA", + title: "Momentum classifier fired", + value: "91%", + confidence: "High", + direction: "Bullish", + cause: "volume acceleration exceeded five-session baseline" + }, + { + time: "09:39:12", + symbol: "AMZN", + title: "Large block against tape", + value: "$3.67M", + confidence: "Watch", + direction: "Bearish", + cause: "print direction diverged from sector basket" + } +]; + +const evidence = [ + ["Options", "195 C sweep", "$2.31M", "Bullish"], + ["Equity", "25,000 dark buy", "$4.87M", "Bullish"], + ["News", "AI update crossed", "09:40:21", "Info"], + ["Tape", "Momentum burst", "+1.22%", "Bullish"], + ["Venue", "Off-exchange share", "64%", "Watch"] ]; const optionRows = [ ["2m", "AAPL", "May 17", "195 C", "5,240", "$2.31M", "Sweep", "Bullish"], ["3m", "AAPL", "Jun 21", "200 C", "6,800", "$1.87M", "Block", "Bullish"], - ["4m", "NVDA", "May 24", "120 C", "9,150", "$2.01M", "Split", "Bullish"], + ["4m", "NVDA", "May 24", "120 C", "9,150", "$2.01M", "Split", "Mixed"], ["5m", "TSLA", "Jul 19", "205 C", "10,000", "$3.45M", "Block", "Bullish"], - ["6m", "AMZN", "May 17", "185 P", "4,500", "$1.20M", "Sweep", "Bearish"], - ["7m", "IWM", "Jun 21", "207 C", "3,100", "$712K", "Sweep", "Bullish"], - ["8m", "AAPL", "May 24", "197.5 C", "7,600", "$2.01M", "Block", "Bullish"] + ["6m", "AMZN", "May 17", "185 P", "4,500", "$1.20M", "Sweep", "Bearish"] ]; -const signals = [ - ["09:41:10", "Dark Flow Sweep", "AAPL", "$4.32M", "Bullish"], - ["09:40:58", "Unusual Options Activity", "NVDA", "$2.01M", "Bullish"], - ["09:40:21", "News Catalyst", "AAPL", "AI update", "News"], - ["09:39:47", "Classifier Hit: Momentum", "TSLA", "91%", "Bullish"], - ["09:39:12", "Large Block Trade", "AMZN", "$3.67M", "Bearish"] +const health = [ + ["OPRA", "healthy", "120ms"], + ["CBOE", "healthy", "85ms"], + ["NYSE", "degraded", "412ms"], + ["News", "healthy", "1.2s"] ]; -const feedHealth = [ - ["OPRA Options", "Healthy", "120ms", "2,341"], - ["CBOE Quotes", "Healthy", "85ms", "1,987"], - ["Nasdaq TotalView", "Healthy", "92ms", "3,102"], - ["NYSE Pillar", "Degraded", "412ms", "932"], - ["News", "Healthy", "1.2s", "12"], - ["Dark Pool", "Healthy", "1.0s", "421"] +const timeline = [ + ["09:36", "Baseline drift", "AAPL and QQQ correlation widens"], + ["09:39", "First print", "Dark block appears before visible call lift"], + ["09:41", "Signal fired", "Sweep pressure confirms the print cluster"], + ["09:45", "Replay note", "Price accepted above prior liquidity shelf"] ]; -const darkFlow = [ - ["09:41:05", "AAPL", "Buy", "25,000", "$4.87M", "Sweep"], - ["09:40:51", "AAPL", "Buy", "18,500", "$3.60M", "Sweep"], - ["09:40:35", "AAPL", "Sell", "30,000", "$5.84M", "Block"], - ["09:39:59", "AAPL", "Buy", "12,000", "$2.34M", "Sweep"], - ["09:38:47", "AAPL", "Sell", "21,000", "$4.09M", "Block"] +const atlasGroups = [ + { name: "Mega cap tech", heat: 92, flow: "+$8.4M", symbols: ["AAPL", "MSFT", "AMZN"], x: 12, y: 14 }, + { name: "AI semis", heat: 81, flow: "+$5.1M", symbols: ["NVDA", "AMD", "AVGO"], x: 56, y: 22 }, + { name: "Beta basket", heat: 66, flow: "+$3.8M", symbols: ["TSLA", "COIN", "PLTR"], x: 30, y: 58 }, + { name: "Defensive", heat: 38, flow: "-$1.2M", symbols: ["XLU", "XLV", "PG"], x: 68, y: 64 } ]; -const variantOrder: MockVariant[] = ["mock1", "mock2", "mock3", "mock4"]; - export function DashboardMock({ variant }: DashboardMockProps) { - const config = variants[variant]; + const concept = concepts[variant]; return ( -
- - - {variant === "mock1" ? : null} - {variant === "mock2" ? : null} - {variant === "mock3" ? : null} - {variant === "mock4" ? : null} -
+
+ + {variant === "mock1" ? : null} + {variant === "mock2" ? : null} + {variant === "mock3" ? : null} + {variant === "mock4" ? : null} +
); } -function MockHeader({ - config, - active -}: { - config: (typeof variants)[MockVariant]; - active: MockVariant; -}) { +function MockHeader({ active, concept }: { active: MockVariant; concept: Concept }) { return ( -
-
-