Viska · Engineering & Maintenance

Data Lineage & Pipeline Health

Every source that feeds viska.gg — how its data is pulled, where it lands in the database, which panels consume it, and whether the stream is live, lagging, blocked, or dark. A living page: it reads the database on every load and turns red on its own when a pipeline breaks.

SCHEMATIC — reference for the ViskaFront build · live state proven against the DB 2026-07-01 · DB contract: public.v_data_lineage_health
5 live
1 empty
3 dark
1 manual
0 blocked
0 stale

Zone A · The lineage flow — shareable hero

source → ingestion → DB relation → dashboard panels · one lane per stream · edge tint = status · the curated, legible view of the 369-node architecture graph (not the raw graph).

Interactive Brokers
the portfolio · broker
13:30
n8n flex pull → flex-apply-svc
re-parses Flex XML authoritatively
T+1
trading.nav_snapshots
+ positions_current · 29 holdings
live
Forsida KPIsIskNavTrendStodur
ran 2026-06-30 · covers 2026-06-29
Mímir research
news & research feed
ingest watcher → feed_items
sentiment + ticker + theme tags
public.feed_items
15,939 rows
live
IntelResearchFeed
ran 2026-07-01 · continuous
Broker research
conviction engine
scored → broker_theme_calls
theme conviction, corroboration
public.broker_theme_calls
212 rows
live
ConvictionThemu
ran 2026-07-01
Central Bank of Iceland
USD/ISK official rate
fx cron → fx_rates
daily rate capture
no flow
public.fx_rates
0 rows
empty
CurrencyToggleIskNavTrend
producer wired, not flowing — verify vs fund.fx_usd_isk_latest
Fund ops (manual)
official ISK NAV / share register
manual entry
operator-set figure
fund_isk_nav_history
15 rows
manual
IskNavTrendForsida
set 2026-05-29 · no auto producer
IBKR / rate sources
derived surfaces
derived → allocation / benchmark / monthly_pnl
already computed in DB
allocation_history · benchmark_metrics · monthly_pnl
26 · 12 · 9 rows
dark
AllocationChartSummaryCardsMonthlyPnlChart
data present — FE assumes empty (wiring drift)

Zone B · Stream table — maintenance grid (admin)

every column from the read-contract · sortable · filter chips per status ("show only blocked / dark").

StreamSourceCadenceDB relationClocksRowsPanelsStatus
ibkr_positionsInteractive Brokersdaily Mon-Satpublic.positions_current06-30 · 06-2929StodurForsidalive
ibkr_navInteractive Brokersdaily Mon-Sattrading.nav_snapshots06-30 · 06-2927Forsida KPIsIskNavTrendlive
news_feedMímir researchcontinuouspublic.feed_items07-0115,939IntelResearchFeedlive
research_feedMímir researchdailypublic.research_feed07-01188Intellive
convictionBroker researchdailypublic.broker_theme_calls07-01212ConvictionThemulive
fx_iskCentral Bank of Icelanddailypublic.fx_rates0CurrencyToggleempty
isk_navManual (fund ops)manualfund_isk_nav_history05-2915IskNavTrendmanual
allocationInteractive Brokersdailypublic.allocation_history26AllocationChartdark
benchmarkPublic rate sourcesdailypublic.benchmark_metrics12SummaryCardsdark
monthly_pnlInteractive Brokersmonthlypublic.monthly_pnl9MonthlyPnlChartdark

Zone C · Legend

live

Pipeline fired within its cadence, rows present. Flowing normally.

stale

Has data, but the heartbeat is older than its expected lag. Investigate the producer.

blocked

Last run failed. The pipeline errored — highest-priority fix.

empty

Producer is wired but no rows yet. Not yet flowing (e.g. FX capture).

dark

Data is in the database, but no dashboard panel consumes it yet. A roadmap signal, not a failure.

manual

Operator-entered, no automated producer. Refreshed by hand (e.g. the ISK NAV headline).

How to read this page. Each stream carries two clocks. The heartbeat is when the pipeline last ran; the data date is what day the data covers. For the broker feed these differ by one settled day (T+1) on purpose — a heartbeat today delivering yesterday's statement is healthy, not late. The status pill always reflects the heartbeat, so a normal T+1 lag never shows as a problem. If a number on the dashboard looks wrong, find its stream here: the status says whether the data is current, and the chain says which step to check.
DB read-contract — the FE reads status, never re-derives it: select * from public.v_data_lineage_health · columns stream_key, source_system, ingestion, target_relation, panels[], cadence, row_count, last_run, data_as_of, heartbeat_status, status · granted to authenticated · migration 20260701-01-v-data-lineage-health.sql.