-
Notifications
You must be signed in to change notification settings - Fork 0
Weekly Reports
Every Monday at 6:00 AM, Signal generates a weekly intelligence summary — a higher-order analysis that looks across the entire week of daily briefs. This is the most analytically valuable output: it captures story arcs, watch list evolution, and structural patterns that no single daily run can see.
| Trigger | Time | What it does |
|---|---|---|
| Automated (launchd) | Every Monday at 6:00 AM local time | Reads past 7 days from DB, synthesizes, publishes |
| Manual (CLI) | python3 main.py --weekly |
Same pipeline, immediate execution |
| Custom window | python3 main.py --weekly --days 5 |
Past N days instead of 7 |
Important: The launchd job must be installed first. See Scheduling#one-time-setup.
cp scripts/com.flexrpl.signal.weekly.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.flexrpl.signal.weekly.plist
# Verify it loaded:
launchctl list | grep flexrpl
# → - 0 com.flexrpl.signal.weeklyThe weekly report has seven fixed sections:
| Section | What it covers |
|---|---|
| Week in Review | The dominant political dynamic of the week — not a list of events, but an assessment of the underlying movement |
| Story Arc Tracker | How the top 3–5 stories evolved day by day — escalation, resolution, buried, or framing shift |
| What Escalated | Items that grew in significance; watch list items that materialized |
| What Was Buried | Stories that appeared prominently early in the week and then vanished — natural or suspicious? |
| Blindspot of the Week | The single most significant story both sides systematically underreported this week |
| Watch List: Next Week | Concrete forward-looking items — named entities, votes, deadlines — with rationale |
| Analyst Note | One paragraph: honest assessment of where politics actually is after a full week |
The prompt is explicitly designed to force change-over-time framing, not re-summarization of individual days. A weekly brief that just lists what happened each day has no additional value.
The weekly pipeline is Pass 6 — it skips article fetching entirely and works from data already stored in signal.db.
signal.db → get_runs_for_weekly() → get_weekly_source_data()
↓
Format condensed daily summaries
Build watch list evolution timeline
↓
WEEKLY_BRIEF prompt (one LLM call)
↓
save_weekly_brief() → weekly_briefs table
↓
generate_weekly_report() → HTML fileget_runs_for_weekly() returns one run per calendar date (the latest complete run with a brief for that day) from the past 7 days. This means if you ran the pipeline multiple times in one day, only the most recent run for that date is included.
To keep the LLM context window manageable, each day's brief is condensed to:
- SITUATION OVERVIEW (up to 800 characters)
- WATCH LIST (up to 400 characters)
- Top 3 narrative patterns
- Top 2 anomalies
- ANALYST NOTE (up to 400 characters)
Full brief texts are typically 10,000–14,000 characters each. Condensing to key sections reduces input by ~85% while preserving the intelligence value.
Weekly reports are written to the same reports/ directory as daily briefs, with a distinct filename format:
reports/weekly_2026W20_20260519_2300.html
───────────────────
ISO year + week numberThe ISO week number is calculated from the first day of the period covered. Week 20 of 2026 runs May 11–17.
Weekly reports use a gold/amber color scheme (#e3b341) instead of the daily blue (#58a6ff), making them immediately distinguishable:
- The header has a three-pixel gold bottom border instead of a one-pixel border
- A "WEEKLY SUMMARY" badge appears above the title
- The Analyst Note uses a warm gold tint instead of blue
- Watch list items use the report's blue as the accent (roles reversed from daily)
After each weekly run, _update_index() in main.py regenerates both pages:
Landing page (index.html): A "Weekly Summary" card appears alongside the daily brief, monthly summary, and archive cards. It links directly to the most recent weekly report and displays the ISO week label.
Archive (archive.html): A separate "Weekly Summaries" section appears below the daily briefs list. Weekly report links are styled in gold and carry a "latest week" badge.
The weekly script writes to logs/weekly.log (separate from the daily logs/cron.log):
# Watch a weekly run live
tail -f logs/weekly.log
# Check last run result
grep -A5 "Signal WEEKLY run" logs/weekly.log | tail -20"No complete runs with briefs found in the past 7 days"
The weekly pipeline requires at least one successful daily run in the configured window. Run python3 main.py first to generate a daily brief, then retry python3 main.py --weekly.
Weekly report not appearing on GitHub Pages
Check logs/weekly.log for git errors. Confirm run_weekly_and_publish.sh staged reports/weekly_*.html:
tail -30 logs/weekly.logRunning weekly synthesis before Sunday (e.g. on a Thursday)
Use --days to match how many days of data you actually have:
python3 main.py --weekly --days 4 # if you have Mon–ThuWeekly job not in launchctl list
launchctl load ~/Library/LaunchAgents/com.flexrpl.signal.weekly.plist
launchctl list | grep flexrplSignal · Repository · fleXRPL · Daily political intelligence — powered by local AI