# goaskbid.com — deploy & operate

The live page **is** the deliverable: a single `index.html` at the repo root.
Repo: `Goaskbid/goaskbid-site` · branch `main` · GitHub Pages serves from the branch.

---

## A. Upload (GitHub web UI — no terminal needed)

1. Go to `github.com/Goaskbid/goaskbid-site`.
2. **Add file → Upload files**.
3. Drag **`index.html`** into the drop zone (it must land at the repo ROOT, not in a folder).
4. Scroll down, **Commit changes** directly to `main`.
5. Pages rebuilds automatically (~30–90s). Open **goaskbid.com** and **hard-refresh**:
   - Windows: `Ctrl+F5` · Mac: `Cmd+Shift+R` (or an Incognito window) to beat the cache.

That alone updates the dashboard. The page ships with embedded fallback data, so it
works immediately even before any data files are present.

### To get the FULL instrument set live (see section C)
Also upload, the same way (drag the folder contents, keep the paths):
- `data/latest-snapshot.json`, `data/last-known-good.json`, `data/site-status.json`
- `tools/catalog.py`, `tools/refresh_data.py`, `tools/validate_snapshot.py`
- `.github/workflows/nightly-refresh.yml`

Then **Actions → Nightly data refresh → Run workflow** to fill all instruments now
instead of waiting for the 01:15 UTC cron. The workflow only commits the `data/*.json`
files; the data commit triggers a normal Pages rebuild.

---

## B. What changed (this round)
- Background logo sits **behind** the opaque panels (z-index 1) — it shows in the
  gutters/margins and is hidden where a card covers it. Bigger (560px) and slower (150s).
- Ticker tapes scroll (paused only under OS "reduce motion").
- **Hover tooltips** on scores, the regime gauge, instrument names, whole rows, the
  zone legend, universe tabs, chips, column headers, deltas and the seven components.
- **Selected chips** are highlighted in their own line colour (border + ring + tint).
- The "Market note" copy no longer says it is auto-generated.

---

## C. What the site does when live — the instrument set

The engine carries **106 instruments** across six universes:
- Countries (26), Sectors & sub-sectors (17), Styles & factors (13),
- Macro & commodities (18 = 9 rates + 9 commodities), Crypto (12), FX (20 pairs + DXY).

**How the data fills in:**
- The page first fetches `data/latest-snapshot.json` (the live file). Whatever is in
  that file is what the site shows.
- If that fetch fails, it falls back to the data embedded inside `index.html`. The
  embedded set is a **verified-real subset** (fewer instruments — e.g. only a handful
  of FX pairs) so the page is never empty and never shows invented numbers.
- The nightly Action rebuilds `data/latest-snapshot.json` with the full 106 from live
  feeds. So: upload everything + run the workflow once → the live site shows all 106.
  Before that first run, you'll see the smaller embedded subset.

**Where the numbers come from (resilient by design):**
- FX uses the European Central Bank reference rates first (keyless, reliable), and
  derives every pair + the dollar index from the EUR base via verified cross-rates.
- Equities/sectors/factors/commodities/rates use Yahoo history; crypto uses CoinGecko.
- Each instrument is fetched independently. If one feed is briefly down, that single
  instrument keeps its last-known-good value — the board never shows a hole, and it
  never fabricates a number to fill one.
- Russia was removed: it was the only instrument with no working public feed.

**Scoring:** seven price-based signals per instrument — momentum (vs 120-day average),
strength (52-week range), breadth (20-day participation), a put/call-style options proxy,
volatility (inverted), safe-haven (drawdown) and credit (risk-adjusted trend) — blended
0–100. Equities use all seven equally. FX, crypto and commodities re-weight toward trend
and volatility and lean off the equity-only signals (put/call, credit, breadth), so each
asset class is read on its own terms while keeping the same 0–100 scale. Colours are
inverted on purpose: green = fear, red = greed.

New instruments need no front-end work: sorting, flags/badges and line colours all
fall back gracefully, so adding to `catalog.py` is enough.
