---
name: leoyeai/Market Morning Brief
source: https://app.decimal.ai/s/leoyeai-market-morning-brief@1/SKILL.md
source_sha256: e07d5e93a0b1
---

# Market Brief — Daily Morning & Evening Intelligence Digest

## Overview

Market Morning Brief is a lightweight, resilient daily intelligence system designed to be the first thing you read each morning. It combines:

- **Portfolio P&L** — Your Kalshi positions and unrealized gains/losses
- **Top opportunities** — Markets with highest edge (if Kalshalyst cache available)
- **Cross-platform divergences** — Kalshi vs Polymarket pricing mismatches (if Arbiter cache available)
- **X signal summaries** — Top-performing prediction signals from Twitter/X (if Xpulse cache available)
- **Crypto prices** — Bitcoin, Ethereum, plus any configured altcoins (if Coinbase configured)
- **Polymarket insights** — Notable markets and volume activity

The brief is designed for **30-second scanning** — each section is 3-8 lines maximum. If a data source is unavailable, the section gracefully degrades to "unavailable" and the brief continues.
If Kalshi credentials are not configured yet, the brief shows a realistic preview portfolio and edge block so first-time users still see value immediately.

## When to Use This Skill

- You trade prediction markets (Kalshi, Polymarket) and want daily market context
- You need a quick morning summary: portfolio status + opportunities + signals
- You want an evening briefing: either lightweight trading summary or AI-filtered news digest
- You want integration with your other market intelligence tools (Kalshalyst, Arbiter, Xpulse)
- You want plain text output suitable for SMS, iMessage, or any messaging platform
- You want AI-powered news curation: two-stage filtering to prevent notification fatigue

**Every Evening (Default: 6:00 PM):** Day's activity summary (positions opened/closed, realized P&L), watch list for overnight risks, top X signals from the day, and unusual market activity.

## Architecture

### Design Philosophy

**Resilience through isolation.** Each section:
- Wrapped in try/except to prevent one failure from breaking the entire brief
- Reads from cache files (not live APIs) for speed and reliability
- Gracefully degrades if data unavailable ("unavailable, check Kalshalyst directly")
- Logs failures without interrupting output

**Plain text output.** No markdown, no emojis, no formatting — designed for chat delivery:
- Compatible with iMessage, SMS, email, web chat, any platform
- Scannable: max 80 chars per line, clear section headers
- Readable at a glance in <30 seconds

**Configurable integration.** The brief reads from:
- Optional Kalshalyst cache (`.kalshi_research_cache.json`)
- Optional Arbiter cache (`.crossplatform_divergences.json`)
- Optional Xpulse cache (`.x_signal_cache.json`)
- Optional Coinbase API (if configured)
- Public Polymarket API (no auth)

If a cache file doesn't exist (skill not installed), that section simply shows "unavailable".

## Configuration

Create or update your `config.yaml` when you want live account data. The first run works without it and shows preview output:

```yaml
market_morning_brief:
  enabled: true
  morning_time: "07:30"     # Schedule for morning brief
  evening_time: "18:00"     # Schedule for evening brief
  timezone: "America/New_York"

  # Kalshi API (required for portfolio section)
  kalshi:
    enabled: true
    api_key_id: "your-key-id"
    private_key_file: "/path/to/private.key"

  # Coinbase API (optional, for crypto prices)
  coinbase:
    enabled: false
    api_key: "sk-..."
    tickers: ["BTC", "ETH"]  # Customize as needed

  # Cache paths (for reading other skills' data)
  cache_paths:
    kalshalyst: "./state/.kalshi_research_cache.json"
    arbiter: "./state/.crossplatform_divergences.json"
    xpulse: "./state/.x_signal_cache.json"

  # Which sections to include
  include:
    portfolio: true
    kalshalyst_edges: true      # Requires Kalshalyst skill
    arbiter_divergences: true   # Requires Prediction Market Arbiter skill
    xpulse_signals: true        # Requires Xpulse skill
    crypto: false               # Requires Coinbase API key
    polymarket: true            # Free (public API)
```

## Section-by-Section Breakdown

### 1. Portfolio Summary

**Data source:** Kalshi API (read-only)

**Example output:**
```
PORTFOLIO (3 positions, +$24 unrealized):
POTUS-2028-DEM    YES  100@48¢  $48 cost  +$18 unrl (exp: 242 days)
UKRAINE-2026-NO    YES   50@28¢  $14 cost   +$8 unrl (exp: 118 days)
FED-MAR-CUT        NO   200@35¢  $70 cost  -$2 unrl (exp: 8 days)
```

**Fields:**
- Ticker | Side (YES/NO) | Quantity @ Price | Cost | Unrealized P&L | Days to Expiration

**Graceful degradation:** If Kalshi API unavailable:
```
PORTFOLIO: unavailable (check Kalshi API)
```

### 2. Kalshalyst Edges (Optional)

**Data source:** Kalshalyst cache (`.kalshi_research_cache.json`)

**Example output:**
```
EDGES (Kalshalyst, top 3):
1. POTUS-2028-DEM    NO @ 38%  (+14% edge, 72% conf)
2. INFLATION-2026    YES @ 68%  (+8% edge, 65% conf)
3. UKRAINE-PEACE     YES @ 55%  (+6% edge, 58% conf)
```

**Fields:**
- Ticker | Side | Market Price | Edge % | Confidence %

**Graceful degradation:** If Kalshalyst skill not installed:
```
EDGES: unavailable — unlock with: clawhub install kalshalyst
```

### 3. Cross-Platform Divergences (Optional)

**Data source:** Prediction Market Arbiter cache (`.crossplatform_divergences.json`)

**Example output:**
```
DIVERGENCES (Arbiter, Kalshi ↔ Polymarket):
UKRAINE-2026-NO    Kalshi 28% ↔ PM 31%  ($0.03 spread, 12% vol diff)
POTUS-2028-DEM     Kalshi 38% ↔ PM 40%  ($0.02 spread, 8% vol diff)
```

**Fields:**
- Ticker | Kalshi Price ↔ Polymarket Price | Spread | Volume Difference

**Graceful degradation:** If Arbiter skill not installed:
```
DIVERGENCES: unavailable — unlock with: clawhub install prediction-market-arbiter
```

### 4. X Signal Summaries (Optional)

**Data source:** Xpulse cache (`.x_signal_cache.json`)

**Example output:**
```
X SIGNALS (Xpulse, last 24h):
Fed rate cut odds +5%   (confidence: 78%, reach: 8.2K)
Ukraine ceasefire talks (+3%, 72% conf, 5.1K reach)
```

**Fields:**
- Signal | Magnitude | Confidence % | Reach/Strength

**Graceful degradation:** If Xpulse skill not installed:
```
X SIGNALS: unavailable — unlock with: clawhub install xpulse
```

### 5. Crypto Prices (Optional)

**Data source:** Coinbase API (requires key + configuration)

**Example output:**
```
CRYPTO:
BTC  $62,400  (+1.2%)   | ETH  $3,140  (-0.8%)
SOL  $142     (-2.1%)   | AVAX $38     (+0.5%)
```

**Fields:**
- Ticker | Price | 24h Change %

**Graceful degradation:** If Coinbase not configured:
```
CRYPTO: unavailable (configure Coinbase API for crypto prices)
```

### 6. Polymarket Activity

**Data source:** Public Polymarket API (free)

**Example output:**
```
POLYMARKET (top 3 by volume):
POTUS 2028: $2.4M vol, 48% DEM (vs 52% GOP)
Inflation >4% 2026: $1.1M vol, 32% prob
Bitcoin $100K by 2026: $0.8M vol, 58% prob
```

**Fields:**
- Market | Volume | Implied Probability | (Context)

**Graceful degradation:** If Polymarket API unavailable:
```
POLYMARKET: unavailable (check Polymarket directly)
```

## Evening Brief — Lightweight Market Summary + AI-Filtered News

Sent at configured evening time (default: 6:00 PM). Two variants: **lightweight market update** or **full news digest with materiality filtering**.

### Lightweight Market Variant (6-8 lines, trading-focused)

```
EVENING BRIEFING — Thursday, March 7, 2026

ACTIVITY:
Current positions: 3 | Cost: $132 | Unrealized: +$24

OVERNIGHT WATCH:
• FED-MAR-CUT expires in 8 days — monitor Fed speakers before FOMC
• UKRAINE-2026 low liquidity (9 contracts asking) — wide spreads

TOP X SIGNALS TODAY:
• Ukraine ceasefire talks +3% (78% conf)
• Fed rate cut odds stabilizing (72% conf)
```

**Key differences from morning brief:**
- Shorter (6-8 lines max)
- Focus on intraday activity (current positions, cost, unrealized P&L)
- Overnight watch items (expirations, geopolitical risks, liquidity alerts)
- Top X signals from that day (not 24h rolling)

### Full Evening News Digest (News-focused with AI filtering)

```
EVENING NEWS BRIEFING — Thursday, March 7, 2026

🏛️ Fed Signals Cautious Stance on Rate Cuts (87% conf, Reuters)
📈 Tech Stocks Rally on Earnings Beat (82% conf, Bloomberg)
🌍 Geopolitical Tensions Escalate Over Trade Deal (79% conf, AP)
💻 AI Policy Bill Advances in Congress (76% conf, TechCrunch)
📌 Crypto Markets Stabilize After Volatility (71% conf, CoinDesk)
```

**Features:**
- Category icons: 🏛️ policy, 📈 markets, 💻 technology, 🌍 geopolitics, 📌 general
- Confidence scores (0-100%) show Qwen relevance assessment
- Two-stage filtering pipeline (see below)
- 48-hour rolling history prevents repeated news
- Fail-closed design: if Qwen unavailable, no news sent (silence over noise)

## Evening Briefing: Two-Stage News Filtering Pipeline

Evening briefing combines DuckDuckGo news search with local Qwen LLM for AI-powered news curation. Designed to prevent notification fatigue while surfacing genuinely material developments.

### Architecture

**Stage 1: Relevance & Significance Filter**
1. Search for recent news across configured topics (default: prediction markets, AI policy, federal reserve)
2. Run each article through Qwen: is this significant? (0-1 confidence score, category classification)
3. Filter to articles with confidence >= min_confidence (default: 0.7)
4. Limit to top 10 most confident articles for Stage 2

**Stage 2: Materiality Gate (Prevents Notification Fatigue)**
1. Load history of previously sent articles (48h rolling, max 200 entries)
2. Compare candidate articles against recent history
3. Qwen decision: is this NEW and MATERIAL? Or just ongoing background noise?
4. Drop duplicates, commentary, routine announcements
5. Only pass through genuinely new developments or significant escalations

**Fail-Closed Design:**
- If Qwen unavailable during Stage 1 or Stage 2: **drop all articles** (silence over noise)
- If no material news: send nothing (don't interrupt with noise)
- History persistence: `~/.openclaw/state/evening_news_history.json` (max 200 entries, auto-cleanup)

### Example Configuration

```yaml
market_morning_brief:
  evening_briefing:
    enabled: true
    mode: "news"                    # "market" for activity summary, "news" for full news digest
    time: "18:00"                   # Briefing time (30-min window)
    materiality_gate: true          # Enable Stage 2 filter (prevents fatigue)
    min_confidence: 0.7             # Minimum relevance threshold (0-1)
    max_per_topic: 3                # Max articles per topic to search
    topics:
      - "prediction markets"
      - "AI policy"
      - "federal reserve"
      - "geopolitics"
```

### Command Usage

```bash
# Lightweight market variant (activity + watch list)
python scripts/evening_brief.py --mode market

# Full news digest variant
python scripts/evening_brief.py --mode news

# Force send regardless of time/already-sent-today
python scripts/evening_brief.py --force

# Dry run (print without sending)
python scripts/evening_brief.py --dry-run

# Enable verbose logging
python scripts/evening_brief.py --debug
```


### News History

Stored at `~/.openclaw/state/evening_news_history.json`. Max 200 entries, auto-cleans after 48 hours. Used by Stage 2 materiality gate to prevent duplicate notifications.

## Cache File Integration

Each optional skill writes a cache file that the Morning Brief reads automatically:

| Skill | Cache File | Section Unlocked |
|-------|-----------|-----------------|
| **Kalshalyst** | `state/.kalshi_research_cache.json` | Edge opportunities |
| **Prediction Market Arbiter** | `state/.crossplatform_divergences.json` | Cross-platform divergences |
| **Xpulse** | `state/.x_signal_cache.json` | X/Twitter signals |

If a cache file doesn't exist, that section shows "unavailable" with the install command. See `references/integration.md` for cache file schemas.

## Example Complete Morning Brief

```
MARKET MORNING BRIEF — Thursday, March 7, 2026

PORTFOLIO (3 positions, +$24 unrealized):
POTUS-2028-DEM    YES  100@48¢  $48 cost  +$18 unrl (exp: 242 days)
UKRAINE-2026-NO    YES   50@28¢  $14 cost   +$8 unrl (exp: 118 days)
FED-MAR-CUT        NO   200@35¢  $70 cost  -$2 unrl (exp: 8 days)

EDGES (Kalshalyst, top 3):
1. POTUS-2028-DEM    NO @ 38%  (+14% edge, 72% conf)
2. INFLATION-2026    YES @ 68%  (+8% edge, 65% conf)
3. UKRAINE-PEACE     YES @ 55%  (+6% edge, 58% conf)

DIVERGENCES (Arbiter):
UKRAINE-2026-NO    Kalshi 28% ↔ PM 31%  ($0.03 spread)
POTUS-2028-DEM     Kalshi 38% ↔ PM 40%  ($0.02 spread)

X SIGNALS (last 24h):
Fed rate cut odds +5%   (78% conf, 8.2K reach)
Ukraine ceasefire +3%   (72% conf, 5.1K reach)

CRYPTO:
BTC  $62,400  (+1.2%)   | ETH  $3,140  (-0.8%)

POLYMARKET (top 3 by vol):
POTUS 2028 DEM: $2.4M vol, 48% prob
Inflation >4% 2026: $1.1M vol, 32% prob
Bitcoin >$100K 2026: $0.8M vol, 58% prob
```

## Scheduling & Commands

### Morning Brief (Default: 7:30 AM)

```bash
# Manual trigger
python scripts/morning_brief.py

# With debug output
python scripts/morning_brief.py --debug

# Dry run (print without side effects)
python scripts/morning_brief.py --dry-run

# Custom config path
python scripts/morning_brief.py --config /path/to/config.yaml

# Via OpenClaw (if integrated):
openclaw skill run market-morning-brief morning
```

### Cron Scheduling

```bash
30 7 * * * python /path/to/scripts/morning_brief.py              # Morning at 7:30 AM
0 18 * * * python /path/to/scripts/evening_brief.py --mode market  # Evening at 6:00 PM
```

## Dependencies

**Required:** Python 3.10+, `pip install kalshi-python requests pyyaml`

**For evening news digest:** Ollama + Qwen model (`ollama pull qwen3:latest`), plus `pip install ddgs` (or `duckduckgo-search` as fallback).

**Optional skills** for additional brief sections: Kalshalyst, Prediction Market Arbiter, Xpulse (see Implementation Notes below).

## Performance & Cost

### Morning Brief

- **Runtime:** <5 seconds (all cached data)
- **API calls:** 1 (Polymarket public API) + 1 (Kalshi portfolio) = 2 calls
- **Cost:** $0 (Kalshi free tier, Polymarket free)

### With Optional Skills

If Kalshalyst, Arbiter, Xpulse installed:
- **Runtime:** <2 seconds (reads cache files)
- **Cost:** Only the skill installation costs (brief itself has no additional cost)

## Troubleshooting

**Portfolio not showing:** Verify Kalshi API key is configured and not rate-limited. Run `python scripts/morning_brief.py --debug`.

**Sections showing "unavailable":** Expected if the skill isn't installed. Install with the `clawhub install` command shown in the output, then run the skill once to generate its cache file.

**Evening news empty:** Check Ollama is running (`ollama list`), test Qwen (`ollama run qwen3:latest "test"`), and verify ddgs (`python -c "from ddgs import DDGS; print('OK')"`).

**Stage 2 drops everything:** The materiality gate filters out non-novel news. Clear history with `rm ~/.openclaw/state/evening_news_history.json` and retry, or disable with `--no-materiality-gate`.

**Qwen timeout:** Reduce article count with `--max-per-topic 2` or skip Stage 2 with `--no-materiality-gate`.

## Implementation Notes

This skill is designed for **standalone operation** but unlocks its full potential with the OpenClaw Prediction Market Trading Stack.

**Standalone:** Portfolio P&L + Polymarket trending + Crypto prices (if configured). No other skills required.

**With the full stack:** Each additional skill adds a new section to your daily brief automatically — no configuration needed. Install skills, run them once, and the Morning Brief picks up their cache files on the next run.

| Skill | Unlocks | Install |
|-------|---------|---------|
| **Kalshalyst** | Contrarian edge analysis with Kelly sizing | `clawhub install kalshalyst` |
| **Prediction Market Arbiter** | Cross-platform Kalshi↔Polymarket divergences | `clawhub install prediction-market-arbiter` |
| **Xpulse** | Real-time X/Twitter social signals | `clawhub install xpulse` |
| **Portfolio Drift Monitor** | Position drift alerts between briefs | `clawhub install portfolio-drift-monitor` |
| **Kalshi Command Center** | Direct trade execution from edge alerts | `clawhub install kalshi-command-center` |

**Install the complete stack:**
```bash
clawhub install kalshalyst kalshi-command-center polymarket-command-center prediction-market-arbiter xpulse portfolio-drift-monitor market-morning-brief personality-engine
```

## Further Reading

- See `references/sections.md` for detailed section documentation
- See `references/integration.md` for technical integration guide
- See `references/evening-pipeline.md` for evening briefing pipeline documentation

## Support

For issues: run with `DEBUG=1` for verbose output, review `references/sections.md` and `references/integration.md`, or check `/tmp/market-morning-brief.log`.

**Author**: KingMadeLLC


---

## Feedback & Issues

Found a bug? Have a feature request? Want to share results?

- **GitHub Issues**: [github.com/kingmadellc/openclaw-prediction-stack/issues](https://github.com/kingmadellc/openclaw-prediction-stack/issues)
- **X/Twitter**: [@KingMadeLLC](https://x.com/KingMadeLLC)

Part of the **OpenClaw Prediction Stack** — the first prediction market skill suite on ClawHub.