// fire#
A caller fires a signal by posting in a #alpha-channel on Discord, OR by submitting /caller/new on the dashboard. Both paths produce the same normalized signal payload — the dashboard's compose form is the same shape the Discord bot parses out of a message.
The signal includes: venue, market identifier, side, max entry price, confidence, optional thesis, optional target + stop prices, optional invalidation criteria, optional tags, optional catalyst date.
// parse + validate#
Sage parses the message (Discord path) or the form body (dashboard path) into a structured record. The caller's id, tier-at-time, server timestamp, and source IP are stamped server-side — the audit row is forge-resistant by construction.
Validation: the caller must hold the verified-caller role or higher. Markets that don't resolve to a known venue + slug fall to a 'pending' state and re-resolve at post time. Out-of-range prices (anything not 0.01–0.99) get rejected with an inline error.
// post + notify#
Sage posts the standardized embed to the caller's channel (or fnf-only / dashboard-draft per the caller's choice).
If the caller chose 'dm subscribers,' Sage's fan-out queue DMs everyone following that caller. The DM payload includes the venue, market, side, max entry, confidence, and a link straight back to the venue page. The 'urgent · dm all FNF' mode bypasses quiet hours; the others honor them.
If 'auto-copy eligible' is set + the subscriber has auto-copy on for this caller, the bot will (when execution ships) place the trade on their custodial wallet — within their per-trade and per-day caps.
// mark#
Sage's marketMonitor polls each venue every 5 seconds for the markets it tracks. Every signal's mark (current YES price for the market it fired on) updates from that tick stream.
The PnL bps on a signal row is the live mark vs the caller's max entry, computed each refresh. If the side is YES, PnL is positive when the mark has moved up; if NO, positive when mark has moved down.
// settle + score#
When the market resolves, the realized PnL freezes. YES contracts pay $1 if the event happened, $0 if it didn't. The signal's realizedBps reflects the move from caller's max entry to the final price.
The CallerPnl service rolls up every closed signal into the leaderboard stats — hit rate, avg edge bps, 7d / 30d / all-time PnL. Verified status is gated by these aggregates (positive expected value over a minimum sample, no manipulation patterns).
Every step is in /ops/audit. A signal that fires + resolves leaves a paper trail of: who fired, when, what tier they held, what the venue confirmed, who got the DM, who auto-copied, who claimed.
