Entries, deferrals and rejections posted to #trading-bot, but exits booked by the reconcile loop (bracket stop/take-profit legs that fill at Alpaca) were silent — the two Jun 9 stop-outs produced no message. Viktor asked for a Slack message on each position execution.
- move SlackNotifier to shared/ (now used by trade-executor AND api-gateway)
- add notify_close (ticker/qty/price/realized P&L/reason, win-loss emoji)
- reconcile loop notifies on each booked close, fail-soft; api-gateway config gains slack fields (channel defaults to trading-bot since the env carries only the bot token; chat:write.public covers posting)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>