* fix(panels): always fire background RPC refresh after bootstrap render
Bootstrap hydration (getHydratedData) is one-shot — once rendered from
it, panels never refresh and can show stale or partial data indefinitely.
Affected panels: MacroSignals, ETFFlows, Stablecoins, FuelPrices,
GulfEconomies, GroceryBasket, BigMac.
Pattern: render from bootstrap immediately for fast first paint, then
fire a background RPC call that silently updates the panel with live
data. Errors during background refresh are suppressed when bootstrap
data is already visible (no error flash over valid data).
* fix(panels): guard background RPC refresh against empty response overwriting bootstrap
Empty RPC responses (200 + empty array) no longer overwrite valid bootstrap
data with error/unavailable state across all 7 affected panels:
- ETFFlowsPanel, StablecoinPanel: wrap this.data assignment in
`if (fresh.xxx?.length || !this.data)` guard
- FuelPricesPanel, GulfEconomiesPanel, GroceryBasketPanel, BigMacPanel:
add `!data.xxx?.length` check in background .then() before calling render
- MacroSignalsPanel: return false early when error suppressed to skip
redundant renderPanel() call
* fix(hormuz): fix noUncheckedIndexedAccess TypeScript errors
* fix(todos): add blank lines around headings (markdownlint MD022)
* fix(hormuz): add missing hormuz-tracker service + fix implicit any in HormuzPanel
* revert: remove HormuzPanel.ts from this branch (belongs in PR #2210)