# Daily Tech Digest — RSS Feed Aggregator

Script: `/root/.hermes/scripts/daily-feed-summary.py`

## Purpose
Collect from 6 RSS feeds + 2 scraped sites, produce a markdown daily tech digest, optionally email it.

## Sources
- RSS: XDA Developers, MakeUseOf, Virtualization HowTo, 9to5Mac, Gizmodo, How-To Geek
- Scraped (no RSS): Top Gear (`topgear.com/car-news`) — **BROKEN** (empty since 2026-07-13), HotHardware (`hothardware.com/news`) — titles only, no summaries

## Cron Environment PATH — ROOT CAUSE & FIX

The script's shebang is `#!/usr/bin/env python3`. In interactive shells, `python3` resolves to `/opt/awscli-venv/bin/python3`. In the Hermes cron executor, the PATH may be different — `python3` may resolve to `/usr/bin/python3` (system Python) or fail entirely.

The script only needs `feedparser`, which is available in **both** environments:
- **apt package** (`python3-feedparser`): `/usr/lib/python3/dist-packages/` — available to `/usr/bin/python3`
- **pip install** (in `/opt/awscli-venv`): available to the venv Python

The error `ModuleNotFoundError: No module named 'feedparser'` occurred:
- **2026-07-13** at 11:00 AM ET — cron run failed; manual `hermes cron run b360d3ef6a6a` succeeded
- **2026-07-15** at 11:00 AM ET — same failure; `hermes cron list` showed last successful run as 07-14, next run skipped to 07-16 after failure

**Permanent fix:** Change the script's shebang to an absolute system Python path — `/usr/bin/python3` — which always has `python3-feedparser` available via apt. This eliminates the PATH ambiguity entirely.

```bash
# Verify before changing:
/usr/bin/python3 -c "import feedparser; print('OK')"
# → change shebang line 1 to:  #!/usr/bin/python3
```

**To test** (simulates stripped cron environment):
```bash
env -i PATH="/usr/local/bin:/usr/bin:/bin" HOME=/root /usr/bin/python3 /root/.hermes/scripts/daily-feed-summary.py
```

## Usage
```bash
# Print to stdout (for cron capture)
python3 /root/.hermes/scripts/daily-feed-summary.py

# Include email delivery
python3 /root/.hermes/scripts/daily-feed-summary.py --email
```

Email sends to `g@germainebrown.com` via `mail.germainebrown.com:2525` with STARTTLS. Converts markdown to inline-styled HTML.

## Current Cron Status

Hermes cron job `b360d3ef6a6a` (name: `daily-tech-digest`), runs daily at 11:00 AM Eastern. Delivers to `origin`. Agent-mode job (not `no-agent`) — the script output is passed to the agent for formatting and delivery.

```bash
hermes cron list | grep digest    # Check status
hermes cron run b360d3ef6a6a      # Force a run
```

## Known Issues

- **Top Gear scraping broken (since 2026-07-13):** `fetch_topgear()` returns 0 articles. The HTML parser (`TGLinkParser`) looks for `<a href="/car-news/...">` links with `title` attributes — site structure may have changed.
- **HotHardware titles only:** `fetch_hothardware()` returns article links but no summaries. The parser extracts link text from `<a href="/news/...">` tags on the news listing page — these are bare titles without descriptions.
- **Script shebang uses `env python3`:** Resolves inconsistently between interactive shell and cron executor. Pinned above under "Cron Environment PATH" with the `/usr/bin/python3` fix.
