Morning Briefing — Daily Systems Digest

Morning Briefing

One Discord embed every morning that rolls up every automated system into a single glance, so the day starts with one read instead of five. READ-ONLY — it reads local state/logs and the calendar (read scope), never changes anything.

What it reports

Section Source Shows
🔒 System shared_trading_lib/kill_switch.json kill switch ARMED (live) or SAFE (halted) + reason
🔌 Infrastructure live Robinhood login, :8080 socket, crontab -l Robinhood connectivity + buying power, dashboard up, all bot/scanner/watchdog schedules active
🖥️ Host ~/.local/bin/host-status.sh UPS, drive health, disk headroom, pending reboots, host reachability, GPU RTD3 state
💹 Trading eod_balance.csv, each bot’s state.json, Portfolio 2 state last EOD equity (+ change vs prior day), each weekly/0DTE bot’s bias and open/flat status, Portfolio 2 holdings
📅 Today’s Bookings Google Calendar (reused calendar-automation auth) today’s real Sniffspot/Swimply reservations with times; buffer blocks counted separately
💾 Backup ~/backup-projects.log + ~/backup-verify.log last night’s backup archive (daily freshness) and last weekly integrity verification
🌐 Domain ~/domain-monitor.log last bwscomputerservice.com health result

The 🖥️ Host section is a shell-out, not code in this file (added 2026-08-16). All of its logic lives in ~/.local/bin/host-status.sh, so the infrastructure side can change what it reports without ever editing morning-briefing.py again. It is wrapped in the same safe() helper, so a broken collector yields one warning line rather than killing the briefing. Full detail: Daily Host Status.

The Infrastructure section absorbed the old 6:00 AM daily_checkin.py (retired 2026-07-12): the standalone 6 AM system check is folded in here so the morning is two alerts, not more. Because the briefing runs under the calendar venv (Google libs, no robin_stocks), the live Robinhood probe is shelled out to shared_trading_lib/robinhood_status.py under the antigravity venv (which has robin_stocks + the shared login lock) and returns one JSON line.

Privacy-inbox replies are a planned addition once that monitor script is located on disk (only the KB docs were found on 2026-07-12).

Resilience

Each section is gathered independently and wrapped: if one source fails (e.g. an expired calendar token, a missing log), that field shows ⚠️ unavailable (...) and the rest of the briefing still sends. A briefing always goes out — it is a start-the-day digest, not a silent-unless-broken alert.

Discord alert channels (4 rooms)

Verified against ~/.config/discord-webhooks/ on 2026-07-12. Four distinct Discord channels; briefing.txt is a second pointer to the stocks channel, so there are 5 webhook files but 4 rooms:

Room Webhook file(s) Channel id What posts here
Stock alerts stocks.txt, briefing.txt …240710 5:30 sentiment/bias alert, 5:45 morning briefing, and all four bots’ trade alerts
Calendar automation calendar.txt (symlink → ~/.config/backup/discord_webhook.txt) …103821 Sniffspot/Swimply buffer-automation failures (e.g. broken/expired calendar API key)
Backup failures backups.txt …542854 fires when the newest backup archive is older than ~26 h
Domain / cert monitor domain.txt …708624 bwscomputerservice.com health/cert check (5:40 daily; silent unless it fails)

The morning briefing itself is the only always-sends item; the sentiment alert also always sends; the calendar/backup/domain rooms are alert-on-failure only.

Runtime notes

  • Must run under the calendar-automation venv (it has the Google API libs): …/calendar-automation/.venv/bin/python. The calendar token is kept fresh by the every-15-min buffer automation, so the briefing rides on an always-current token.
  • Script: /home/aztechguy/.local/bin/morning-briefing.py
  • Log: /home/aztechguy/morning-briefing.log
  • Webhook: ~/.config/discord-webhooks/briefing.txt, which currently points to the same channel as stocks.txt (webhook id …240710) — i.e. the briefing posts into the stock-alerts room by design, alongside the 5:30 sentiment alert. This is the settled layout, not a placeholder; if you later want the digest in its own channel, repoint briefing.txt at a new webhook.
  • Schedule: daily at 5:45 AM, right after the 5:30 sentiment scanner and the 5:40 domain monitor — so you get the sentiment (to decide bias) plus one complete systems digest before the 6:00 market prep, with nothing else unless something breaks. Morning sequence: 5:30 sentiment → 5:40 domain check (silent unless fail) → 5:45 briefing.
  • Manual run: /home/aztechguy/Projects/calendar-automation/.venv/bin/python /home/aztechguy/.local/bin/morning-briefing.py

First live run (2026-07-12, Sunday)

Verified end to end: kill switch armed, equity $2,246.92, three options bots flat with their biases, Portfolio 2 holding TQQQ, two real Sniffspot bookings (Rachel L. 08:30, Yessenia D. 10:00) plus 4 auto-added buffers, backup archive verified, domain check pending its first scheduled run. Embed delivered to Discord.