Skip to content

Weekly Reports

Garot Conklin edited this page Jun 10, 2026 · 2 revisions

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.


When it runs

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.

Installing the weekly schedule (one-time)

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.weekly

What the weekly brief contains

The 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.


How it works

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 file

Data selection

get_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.

Condensed brief format

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.


Output files

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 number

The ISO week number is calculated from the first day of the period covered. Week 20 of 2026 runs May 11–17.


Visual design

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)

Landing page and archive integration

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.


Logs

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

Troubleshooting

"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.log

Running 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–Thu

Weekly job not in launchctl list

launchctl load ~/Library/LaunchAgents/com.flexrpl.signal.weekly.plist
launchctl list | grep flexrpl

Clone this wiki locally