Viska sjóðir · Data Infrastructure

Data Source Map — Wiring Census

Every data source ever surfaced in the Viska universe — its direct connection, what it carries, and whether it is wired in the current production environment. The substrate for building the real Viska dashboards.

As of 2026-06-17 · reconciled against _ARC-STATE-2026-06-17 + 055 blocker census + Viska-Wiki · Supabase project mmqqrlgtlorjazubmcxf (eu-central-1)
31
Live in prod
9
Ready / pending
11
Planned
7
Blocked
4
Not wired
3
Unconfirmed
Live in prod, flowing / verified Ready built, awaiting merge / apply / relay Planned decided, not built Blocked needs upstream unblock Not wired stub, no backend Unconfirmed claimed, unverified

Critical path → live viska.gg dashboards

SRC
IBKR Flex / Activity CSV feeds the book of record
owner: operator + ViskaN8N · ⚠ live-population unconfirmed
DB
PR #15 applies 7 public.* views + 3 raw tables to prod
owner: heph (review) → Hades (apply)
KEY
VITE_SUPABASE_URL / _ANON_KEY loaded into FE build + session
owner: Hades 051 ✓ vault · ViskaFront/operator (sink)
FE
12 streams + /heimildir flip Live, zero code change
owner: ViskaFront ✓ built

Today the dashboard data plane is 0/7 streams live. The FE layer is complete and degrades to fixtures; the gate is entirely upstream — views not yet applied (PR #15) and the publishable key not loaded into the running session. Both clear without any front-end change. A third latent risk: even with views applied, the trading.* importer live-population is unconfirmed — views would resolve but return empty until IBKR data is actually imported.

IBKR — Book of Record

the fund's real book; everything downstream derives from this4
SourceDirect connectionCarriesStatusEvidence
IBKR Flex Web ServiceVM_Backoffice_Full (AF)VISKA_IBKR_FLEX_TOKEN + _QUERY_ID → 2-call GET → statement XML · vault secret/clients/viska/ibkrAcct U22131377 daily snapshot: NAV bridge, per-ccy cash, ~300 execs, ~603 EOD positions, FX, dividends/interest, FIFO PnLReadyHades wired 06-16; token len suspect, needs live test
IBKR Activity Statement CSVF20770172_U22131377Viska-funds-Vault/Raw Sources/Trading Data/ (manual export, Oct'25–Jun'26)423 executions · NAV $13,836,249 · deposits $10.44M · TWR 44.5% · 25 stock positions — the bootstrap bookLivein use as book-of-record bootstrap
ibkr_import.py importerViskaDBActivity CSV → one idempotent SQL txn on stdout → Hades applyLoads CSV into trading.* tables; idempotent transaction, no DB driverReadyratified; double-count incident fixed 06-10
ibkr_fixture.py loaderViskaTradescripts/ibkr_fixture.py — parses CSV into future trading.* view shapesSwap-point adapter: produces v_trades / v_positions_current / v_pnl_monthly / cash / NAV shapesLiveviews replace it later

Supabase — trading schema

book of record, off-PostgREST (direct-Postgres consumers)8
SourceDirect connectionCarriesStatusEvidence
trading.trades · positions_snapshots · nav_snapshots · statements · instruments · instrument_themestrading.* (6 tables) · readable by trading_bot_ro roleBook of record from IBKR import — the substrate the dashboard views project overLiveapplied prod 06-10
trading.candlestrading.candles — EODHD target tableEOD OHLC candles per instrumentBlockedschema applied; unfed pending EODHD
trading.cash_flowstrading.cash_flows — manual ISK rowsOff-IBKR ISK cash (~45M @136), manual entryReadymanual v1 decided
trading.dividends · fees_interest · fx_balancestrading.* (least-privilege, unexposed to bot role)Dividend, fee/interest, and FX balance detail from FlexLiveschema applied 06-10
trading.round_tripsmaterialized view (refresh post-import)FIFO round-trip PnL per underlyingLiveapplied
trading curated viewsv_trades, v_positions_current, v_pnl_monthly, v_nav_latest, statement_summarysecurity_invoker views · v_nav_latest.twr_pct read by n8n morning-briefCurated trading reads for service consumers (Mímir query_trading, morning brief)Liveapplied prod 06-10; twr_pct NULL is n8n data-model item

Dashboard Views — public.* (viska.gg streams)

the 7 FE data contracts + 4 stubs behind the dashboard12
These are what the React dashboard reads. ViskaFront defines the contract (docs/data-contracts.md); ViskaDB conforms the views via PR #15. All 12 are visible live on the /heimildir source page. 0/7 backed streams live today — pending PR #15 apply + key load.
StreamDirect connectionCarriesStatusEvidence
positionspublic.positions_currentticker, name, shares, cost_basis, market_value, theme, sub_group, march_mtd, ytd_mtmBlockedview in PR #15, not applied
aggregatespublic.nav_latest (limit 1)nav_ibkr, nav_total, twr_pct, march_mtd, as_ofBlockedview in PR #15
cashpublic.cash_currentcurrency, local_amount, usd_amount (ISK row = bankabók)Blockedview in PR #15
profilespublic.holdings_profilesticker, description, moatBlockedview in PR #15; copy EMPTY (operator)
historypublic.allocation_historyweek + 9 theme weights + total (allocation chart)Blockedview in PR #15; fed by allocation_snapshots (054 P3)
quotespublic.market_quotes (desc, 50, dedup)source, ticker, price, currency, captured_atUnconfirmedexists in NO migration; fed by 054 P2 (provider undefined)
fxpublic.fx_rates (desc, 20, dedup)base, quote, rate, source, captured_atUnconfirmedexists in NO migration; fed by 054 P2
lastCapturedpublic.market_quotes (latest captured_at)freshness timestamp for the sidebar indicatorUnconfirmeddepends on market_quotes
chat (stub)viska_chat_* (P3)Mímir conversational Q&A in-dashboardNot wiredFE stub; backend tables exist
council (stub)mimir-mastra WS-C SSE (P3)multi-agent debate event streamNot wiredFE stub; WS-C channel pending
signals (stub)signals.v_takes_scoreboardconviction / take-grade feedNot wiredFE stub; view live, not wired to FE
intel (stub)EODHD (P4)market research + news feedNot wiredFE stub; provider not procured

Supabase — signals · corpus · ops schemas

quant council, RAG corpus, monitoring9
SourceDirect connectionCarriesStatusEvidence
signals.universe · signal_runs · backtest_runs · takes · market_candlessignals.* tables (DEFINER views v_signals_latest, v_takes_scoreboard)Quant-engine signal universe, run history, backtests, take gradesLivePR ViskaDB#7 merged; roles 8/8 PASS prod 06-16
corpus.chunkscorpus.chunks · vector(1536) HNSW cosine + FTS ginEmbedded verified-note chunks for RAG, source pointer per chunkLiveapplied prod 06-15, pgvector 0.8.0
corpus.ingest_auditcorpus.ingest_audit (verdict CHECK)Corpus-watcher verdict audit trailLiveapplied 06-15
ops.health_events · heartbeats · component_statusops.* (ops_daemon_rw role)Monitoring M1 — layer1 + watchdog health events, heartbeats, component statusLiveM1 prod 06-11, PR #6, heph-approved

Supabase — public schema (n8n-written + NLP)

conviction engine, ticker NLP, Mímir chat/RAG12
SourceDirect connectionCarriesStatusEvidence
public.fund_themesregistry table · isl_heiti, tier, valid_from/to8 top-level themes (Strategic Time Grid); nav_pct derived not storedLiveconviction mig 06-07
public.snippet_theme_scorestable · ViskaN8N sole writerPer-reference bear/neutral/bull scores + snippet_textLiveconviction-v2 exec 33503 06-17
public.theme_sentiment_scorestable · UPSERT (report_date, theme)Theme-grain sentiment aggregate (P3 aggregator target)Readynew table created; aggregator pending
public.sector_sentiment_scorestable · get_sector_scoresOlder sector-grain sentiment (4 free-text sectors)Liveleft untouched
public.viska_tickerstable · ticker, aliases[], patterns[], themes[], importanceNLP ticker-detection registry (not a holdings table)LiveAMRC→AMRQ fix mig 09/10, F2 12/12
public.theme_score_audit · theme_corroborationviews · n8n_report role grantConviction traceability (bullet ↔ source snippet)Liveconviction-v2 exec 33503
public.viska_chat_userstable · slack ids, access_level, emailMímir Slack allowlistLiveas-built 06-09; legacy grants flagged REVOKE
public.viska_chat_memorytable · session_id slack:{team}:{channel}:{thread}Mímir conversation transcript bufferLive90-day pg_cron prune
Mímir RAG legacy tablesembeddings_main, record_manager_main, doc_manifest_runs, mimir_*, mimir_errorspublic.* + matviewsRAG corpus, ingestion manifests, ops error trackingLiveMímir env provisioning
mastra_* memory tablespublic.mastra_*Mímir agent memoryLiveMímir env provisioning
market_quotes / fx_rates (raw)public.market_quotes_raw, fx_rates_raw, allocation_snapshots054 ingest targets — raw market + allocation rowsBlockedin PR #15, not applied; feed undefined

n8n Workflows

on Pantheon's shared Hostinger instance — Viska is a tenant13
WorkflowDirect connectionCarriesStatusEvidence
Generate Report (conviction)VCjlCVd1jzCuAomgsub-wf · reads live viska_tickers · chainLlm v1.9Scores research snippets bear↔bull vs fund themesLive58/58 exec 33503 06-17; PR #13 OPEN (split required)
Daily Report GeneratoryWvHQU8q8hvmIkEVN8N_REPORT_WEBHOOK_URLDaily research report generationLivePR #3 68bec50; 🔴 unauth webhook (n8n#12)
save-and-sendD7QNNYMFp9NU6mbBSupabase Storage + Outlook sendSaves report blob + emails itLiveReturn-node fix PR #3
Custom Report Pipeline6Kd0KFONz66moJ2WN8N_REPORT_PIPELINE_URL · httpHeaderAuthStorage upsert via HTTP header authLiveJWT rotated hades-426; 🔴 unauth (n8n#12)
mimir-error-triageoTn0mXWKo2jnJxG2N8N_ERROR_TRIAGE_URL · PATCH mimir_errors + SlackRoutes Mímir errors to triage + SlackLivebody-nesting fixed; 🔴 unauth
Dropbox Webhook→LinkGpagw9kZoqh1NEUQN8N_DROPBOX_WEBHOOK_URLCreates public Dropbox linkLive🟡 unauth (n8n#12)
mimir-ingestion-dropboxDropbox → embeddings (text-embedding-3-small)Dropbox document ingestion → vectorsLiveone of 13 active
viska-rss-article-aggregatorRSS in → keyword theme-taggingRSS article aggregation + tagLiveactive
retrieval matviewretrieval.json — pat→ticker joinRAG retrieval matview (chunk top_themes)Liveactive
report-wizardFqV2ZPmYXO3PQmWIpublic formTriggerForm-driven report requestBlockedlive but unsafe; n8n#12 remediation
Viska Corpus WatcheryZEBcxz94H6giYoVheader-auth webhook → gate → OpenAI embed → corpus.chunksVerified-note → embed → corpus insert (idempotent)Readydeployed INACTIVE; gated on webhook secret + caller wiring
IBKR Flex Query (WS-2 P2)Flex Web Service 2-call GETPulls statement XML into trading.*Plannedawaits ViskaN8N relaunch + live token test
Morning-report schedulerdaily 06:30 ET · research-sweep → score → mimir-postAutomated morning brief chain + dead-feed housekeepingPlannedhandoff ViskaRes→ViskaN8N

LLM / Agent Streams

Mímir, ViskaStrat, council5
SourceDirect connectionCarriesStatusEvidence
Mímir (Mastra agent, Slack)/mimir Slack (Socket Mode) · query_trading tool over trading.* views · Railway mimirRAG over corpus + trading-data tools; conversational fund Q&ALiveM1–M5 done 06-17, 1163 tests; 31 commits pending relay
last30days module feedsReddit · HN · Polymarket · GitHub · Braveheadless-safe APIs → 0..1 normalized scoring → synthesisCross-source recent-signal synthesis (finance-analyst preset)LiveM3/M4 shipped 06-17; X/YouTube/Bluesky deferred v2
ViskaStrat quant engine v0nightly 5-family composite → STRAT-* files + signal_runsMomentum/MR/Vol/RelStr/Regime composite per universe tickerBlockedruns on synthetic fixtures until market-data lands
Strategy signal schemasrc/strategy/signal.schema.json (ViskaStrat)Producer→consumer signal contract (conviction, sizing, invalidation)LiveViskaStrat main PR#1 06-10
WSA council take-gradingn8n nightly EOD batch · grades takes vs marketScores council takes against realized market movesPlannedT5

Scrapers · Watchers · Research Sweeps

the inbound research roster12
SourceDirect connectionCarriesStatusEvidence
YouTube roster sweep/youtube-sweep · research/youtube-channels.json (10 channels)Macro/markets video transcripts + digests (Gromen, Fed Guy, All-In…)Livefirst run 06-10 (39 videos)
yt-dlp MCP server@kevinwatt/yt-dlp-mcp · .mcp.jsonCaption / transcript / metadata fetchLivePR #2 f864770
X / Twitter sweep/x-sweep · xAI Responses API (grok-4-fast) · 9 handlesMacro-voice posts (Fejau, Forward Guidance, Chamath…)Livefirst run 06-10 (~$0.006/sweep)
RSS / research sweep/research-sweep · research/sources.json (10 feeds)Substack/blog feeds (Fed Guy, SemiAnalysis, Apollo, Mining.com…)Readylive but roster UNCOMMITTED (needs PR)
Firecrawl news sweepFirecrawl · 19 themes trailing 7dLive news → committee briefLivebrief posted #feed 06-17
Grid-Ramp Radar (Play A).claude/skills/grid-ramp-radar · Strategic Time GridRanks themes by forward intensity ramp → scoped sweepsReadybuilt+tested 06-17 (13/13); pending commit/PR
Committee Brief (Play C)/committee-brief → Slack #feed + wikiScored findings → grid-organized briefReadyPR #10 pending merge; dogfooded 06-17
Contradiction Tracker (B) · Voice Divergence (D) · Deep-Theme Dossier (E)research engines (backlog ViskaRes-006/007/008)Cross-voice contradiction, divergence, deep dossiersPlannedbacklog
Whisper transcriptionwhisper.cpp whisper-cli · WHISPER_MODEL (unset)YouTube transcript Stage-4 fallbackBlockedno ggml model installed; skips cleanly
Off-roster watch surfacesTelegram t.me/+CAoZQ… · IG @theallinpod · LinkedIn · fedguy.comCandidate sources under reviewPlannedto-review / identity TBD

External APIs · Integrations · Hosting

outbound + service connections13
SourceDirect connectionCarriesStatusEvidence
EODHD market dataEODHD API · key → Hades → ViskaN8N candles jobUS+LSE EOD candles, fundamentals, earnings/macro calendarPlannedoperator procures; Polygon/FMP disqualified on LSE
Nasdaq Iceland / First Northmarket-data (prospective) for AMRQIS-listed price/fundamentalsPlannedBoard #8 draft; adopt-before-build
Mímir external API setOpenAI · Cohere · Mideind · Brave · Perplexity · Mistral OCRn8n credentials + Mastra envEmbeddings, rerank, IS grammar, search, OCRLiveMistral re-minted; 7229 embeddings backfilled
Mímir Slack → #feedMIMIR_FEED_WEBHOOK_URL · Block KitPosts research digests / alertsReadybuilt; PR pending smoke
n8n_report postgres crede8FyDG2UzA5VQX9sViska: Supabase Report · DB role n8n_reportn8n→Supabase reads (new views need GRANT SELECT)Liven8n report role grants
Tavily searchPersonal: Tavily (shared instance)Web searchLivepresent; mis-wire corrected
Outlook email sendn8n Outlook node (save-and-send)Outbound report emailLivedaily-report path
Supabase Storagereport blobs via report pipelinesStored report artifactsLivesave-and-send / custom pipeline
Cloudflare Pages — viska-dash / www.viska.ggCF Pages (direct-upload) bound to www.viska.gg · CF Access on status./stjornbord.Dashboard hosting + edge authBlockedNO Supabase Pages env binding — key baked at local build
Supabase Auth (magic-link)@viskasjodir.is + admin@boas.dev DB-trigger whitelistDashboard login (anon sign-ins OFF)Blockedapp built (PR #35); SMTP commented → email unwired
VITE_SUPABASE_URL / _ANON_KEYpublishable key sb_publishable_* → FE clientThe FE→DB connection itselfBlockedin vault (051 ✓) but UNSET in FE session/build

Manual Entry · Knowledge / RAG Sources

operator-maintained + reference corpora7
SourceDirect connectionCarriesStatusEvidence
ISK cash positiontrading.cash_flows (manual rows)~45M ISK @136 — not in IBKR statementReadymanual v1 decided
ticker-themes.jsonViskaTrade/data/ticker-themes.json47/48 traded tickers → theme keysReadyDRAFT pending operator review (carries AMRC err)
viska_tickers.themes[] holding mappublic.viska_tickers.themes[]12/25 holdings → theme; 13 unmapped (no fabrication)Readyseeded prod, partial
Viska-funds-Vault WikiViska-funds-Vault/Wiki/ (124 pages)Doctrine, positions, themes, voices, frameworks, glossary — Mímir RAG sourceLiveseed-unverified
Strategic Time Gridfund-context/viska-strategic-time-grid.md19-theme × 16-quarter expected-intensity grid (drives radar + fund_themes.tier)Livepersisted 06-16; 2027–29 matrix pending
CIO knowledge-base snapshotRaw Sources/Narrative/2026-05-27-cio-knowledge-base.mdTheme registry / narrative SSOTLiveseed
YouTube research note treeresearch/youtube/ (per-video notes)Transcript + digest notes per videoLivedrafts/digests