📄 MARKET_BRIEFING_SUMMARY.md 3,114 bytes May 01, 2026 📋 Raw

Market Briefing System — Implementation Summary

Overview

Dynamic watchlist + news injection market briefing system for HoffDesk.

Files Created

Core Market Module (core/market/)

  • __init__.py — Module exports
  • sentiment.py — Finnhub API client with caching (15m quotes, 2h news, 24h sentiment/watchlist)
  • watchlist.py — Dynamic watchlist generation with rotation logic
  • news.py — News injection, scoring, and formatting

Job Scripts (jobs/)

  • premarket_briefing.py — AM pre-market briefing (8:00 AM CT)
  • daily_briefing.py — PM market close briefing (4:00 PM CT)
  • run_market_briefing.py — Runner script for cron jobs

Data Files (data/)

  • watchlist_user.json — Matt's base watchlist (8 tickers)
  • watchlist_dynamic.json — Auto-generated daily (4 rotating tickers)
  • watchlist_history.json — 2-week rotation history

Features

1. Dynamic Watchlist

  • Fetches from pool of 15 trending tickers
  • Adds 4 fresh tickers daily (never repeats previous day)
  • Tracks 2-week history to avoid repetition
  • Filters by price (>$5) to avoid penny stocks

2. News Injection

  • Fetches last 7 days of news per ticker
  • Scores news by importance (keywords + recency + source)
  • Displays top 3 most significant headlines
  • Shows relevant news inline with each ticker

3. Briefing Format

🌅 Pre-Market Brief  Friday, May 01, 2026
⚠️ Some data may be stale (if applicable)

📊 Watchlist:
 AAPL: $280.05 (+8.70 / +3.21%) 🟢
    📰 AAPL: [Headline] (Source)
 ...
 [Dynamic Ticker]: $xxx.xx (+x.xx%) [reason]

📰 Top Stories:
 [Ticker] Headline (Source)

🎯 Insider Sentiment:
 Ticker: Activity summary

📅 This Week:
 Earnings announcements

4. Cache Strategy

  • Quotes: 15 minutes
  • News: 2 hours
  • Sentiment: 24 hours
  • Dynamic watchlist: 24 hours
  • Stale data warning if >2 hours old

5. Cron Jobs (OpenClaw)

Job Schedule Target
market:am-brief 0 8 * * 1-5 (8:00 AM CT) Matt DM
market:pm-brief 0 16 * * 1-5 (4:00 PM CT) Matt DM

Both use: isolated session, light context, 300s timeout

6. Anti-Stale Checks

  • Skips briefing if no quote data available
  • Adds ⚠️ warning if data >2 hours old
  • Tracks last successful fetch per endpoint

Configuration

  • Requires FINNHUB_API_KEY environment variable
  • Requires TELEGRAM_BOT_TOKEN for Telegram delivery
  • Chat ID: 8386527252 (Matt's DM)

Success Criteria Met

✅ Briefing varies daily (different dynamic tickers)
✅ News appears in every briefing
✅ Cron runs AM and PM automatically (configured)
✅ Never sends stale data (skips if no fresh data)
✅ Under 4000 characters (typically ~2000)

Testing

# Test AM briefing
cd /home/hoffmann_admin/.openclaw/workspace && python3 jobs/premarket_briefing.py

# Test PM briefing
cd /home/hoffmann_admin/.openclaw/workspace && python3 jobs/daily_briefing.py

# Test with runner
cd /home/hoffmann_admin/.openclaw/workspace && python3 jobs/run_market_briefing.py --type am

ETA Achieved

Completed in ~1.5 hours