The static docs/ dashboard ships a trimmed index.html (monthly + hourly
only), but docs/app.js is a copy of the full local app and unconditionally
bound elements that exist only in the full UI — #auto, #settingsBtn,
#closeSettings, #saveSettings in wire(), and #positions/#ibkrSetup in
applyChrome(). The first missing one ($("auto")) threw, aborting wire()
before the initial load() ran, leaving the page stuck at "connecting…".
Guard each optional binding so a trimmed HTML degrades gracefully. Bump
?v= so phones pull the fixed assets.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The static dashboard left #meta frozen at its initial "connecting…" text
whenever init threw before load()'s try block (e.g. applyChrome, or any
missing element in renderHead/wire) — invisible on mobile where there's no
console. Add window error/unhandledrejection handlers + a try/catch around
the init chain that surface the message in #meta. Also fix the malformed
double-? fetch URL (endpoint() already cache-busts) and bump ?v= on the
app.js/style.css tags so phones pull the fresh assets instead of stale cache.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
calc.evaluate now reports NO POLY when the Kalshi side has data but the
Polymarket slug doesn't resolve (the common case: Polymarket renamed/
dropped a market while Kalshi still trades it). NO KALSHI is the reverse,
NO DATA only when both are missing. User caught this looking at BTC <70k
May: 20 of 118 pairs were silently NO-DATA when the real cause was Poly-
side absence — now visible as a dedicated NO POLY chip + filter button.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds a phone-friendly public dashboard served from docs/ via GitHub Pages:
- docs/index.html, app.js, style.css: monthly + hourly tabs only, no
positions/settings (positions stay on the local Mac UI). Reads
./data/scan.json and ./data/hourly.json instead of /api endpoints.
- gha_alerts.py also writes both snapshots to docs/data/ each cron tick.
- Workflow now commits docs/data/ alongside alerts_state.json.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>