A nightly cron that scans the nathanbrace.com repo for content changes and open TODOs, then emails Ethan (and optionally Nate) a one-page 'campaign pulse' — what shipped, what's stale, which pages haven't been touched in 14+ days, and any broken links detected via a lightweight curl sweep. Turns a passive side-project site into something with gentle forward momentum without requiring Ethan to context-switch into it.
Create ~/bin/campaign-pulse-digest as a bash+python script. Steps: (1) cd /home/ethan/nathanbrace.com && git log --since='1 day ago' --oneline to gather recent commits; (2) grep -rn 'TODO\|FIXME\|XXX' src/ for open markers; (3) find src/content -mtime +14 to flag stale pages; (4) curl -sI each internal route from sitemap and flag non-200s; (5) pipe structured summary through ~/services/innovation-engine (reuse its AI analysis) for a 3-bullet 'what matters' synthesis; (6) send via gws gmail_send from bys account with subject 'Campaign Pulse — {date}'. Add to crontab at 7am daily via safe-append. Log to ~/.local/share/campaign-pulse/YYYY-MM-DD.json for trend tracking.
**What was requested:** A nightly cron for nathanbrace.com that emails a one-page campaign health summary (commits, TODOs, stale pages, broken links).
**How it went:** Smooth. TDD-first — failing test written, then 73-line script passed it on first run. All 4 routes on nathanbrace.com returned 200.
**Files created:**
- `/home/ethan/bin/campaign-pulse-digest` (73 lines, executable) — bash+python script with `--dry-run` flag
- `/home/ethan/bin/test-campaign-pulse-digest.sh` — smoke test asserting exit 0, all 4 section headers, and route presence
**Tests added:** `test-campaign-pulse-digest.sh` — asserts the 4 section headers ("Recent commits", "Open TODOs", "Stale pages", "Link check") and at least one known route appear in stdout; currently **PASS**.
**Cron installed:** `0 7 * * * /home/ethan/bin/campaign-pulse-digest >> /tmp/campaign-pulse.log 2>&1` (safe-appended — existing entries preserved).
**Hangups:**
- Plan called for `src/content` and a sitemap — neither exist. Adapted to `src/pages/*.vue` and the 4 hardcoded routes from `src/router.js`.
- Innovation-engine integration skipped for v1 — it's a complex autonomous system without a simple CLI entry point. TODO comment left in the script.
**Verification:** `/home/ethan/.claude/safe-exec.sh /home/ethan/bin/test-campaign-pulse-digest.sh` → `PASS`. Dry-run produces clean output with all routes returning 200.