Live Signals Overhaul, Notification Reliability & Guide v2
Live signal cards get a proper 3-band layout with a price ladder. TP/SL push notifications are deduplicated and routed through a shared dispatcher. The guide is rewritten as a customer-facing tour of every App Drawer page. Veronica stays online when the Groq core is down.
Live signal card rebuilt as three horizontal bands — header strip (engine tag + pair + direction + entry + status pill + pnl), price ladder (SL → Entry → TP1 → TP2 → TP3 → TP4 as a horizontal rail with pip-distance labels), and footer strip (signal age + tap hint). Live signals pulse with a cyan glow + accent top edge so they read as "this is moving".
Replaced the cramped TP chip row with a connected price ladder. SL sits at 5%, Entry at 26%, TP1–4 fan out at 42/58/74/95% so neither edge clips against the card. Hit levels glow green; pip text turns green to match.
TP1/TP2/TP3/TP4 chips now turn green when their hit flag is true, even when the signal status is tp2_hit or higher. Previously TP1 stayed grey because the status-based fallback only matched the latest TP — cascade inference fixes it.
TP/SL pushes no longer fire twice when the engine bot retries the same event. /api/signals/[id]/event diffs the row state before and after the update and only fires the dispatcher on a real false → true transition. Retry POSTs are silent no-ops.
Trade-closed push body now sanitizes the bot payload. Even if the bot stuffs -50 pips 💢 | P&L: -50 pips into pnl_pips, the template extracts the first signed number and renders P&L: −50 pips exactly once. Pipes → middle-dots, emojis stripped from reason_label / tps_secured.
New /api/admin/signals/notify-direct lets ops re-fire a notification for an already-closed signal — used to backfill user phones after a missed TP/SL. Accepts type, tp_hit, pips_secured + auth via service token.
/guide rewritten from scratch as a customer-facing tour of the App Drawer pages only. Plain English (no <code> tags, no route text, no game-speak). "Genesis FX" replaced with "Pulse Markets" everywhere. Grouped by drawer category: Home, Tools, Learn, OS 10X.
New Section 2 "Getting your broker set up" — interactive partner dropdown replaces the deleted /get-started wizard. Live list of active partners from /api/partners/qualified, copy-to-clipboard link + popup window for sign-up. Includes a 5-method funding walkthrough (crypto BTC/ETH/USDT, Trust Wallet, Google Pay, App Store, Play Store).
Picking a partner auto-opens their Pulse Markets signup link in a centered 520×760 popup window. The signup happens in the popup while the guide stays open underneath. The link row also exposes a "Open signup link" button to re-launch the popup if it was dismissed.
Veronica AI chat stays alive even when the Groq core is offline. A rules-based fallback answers the four structured intents the LLM handles — trade-idea signal cards built from live Yahoo prices, curriculum glossary lookups, account context reads, and a structured-intent helper message. Responses are tagged with a "Local fallback" badge so the user knows the AI core is down.
Ordering quiz questions replaced HTML5 drag-and-drop with up/down arrow buttons. Touch devices couldn't reliably grab the 14×14 grip handle — large 34×34 buttons work on every input device. Desktop long-press drag still works via pointer events.
/dashboard/trading and /dashboard/profile now redirect to their collapsed home pages instead of returning 404. The Next.js edge cache no longer holds stale 404s for deleted routes — SW cache bumped + force-dynamic on the redirect handlers.
scripts/fix-nitro-signal.sh reads INTERNAL_API_TOKEN from env, peeks recent NITRO signals via /api/admin/signals/peek, and prints the exact curl template to backfill TP/SL hit state on missed events. Used to repair trades whose engine fired the event to /api/signals/notify instead of /api/signals/[id]/event.
Live Positions and Trade History tabs got the same fixed-height scroll box treatment as Live Signals — 420px desktop / 320px mobile, custom dark scrollbar, top/bottom fade shadows via the local + scroll background-attachment trick.