Morning Briefing Workflow
Overview
Generates a daily morning briefing and delivers it three ways:
- Terminal: Summary displayed immediately
- Obsidian: Full briefing saved to daily note
- Email: Briefing text + audio podcast attachment
Location
- Gig Harbor, WA - Use for weather queries
Phase 1: Gather Data
Execute these data gathering steps:
1.1 Calendar (Today's Events)
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun calendar/list_events.js psd --today
Returns JSON with today's events including:
- Event summary, location, start/end times
- Attendees and response status
- Hangout/meet links
Account: Use psd for work calendar
1.2 OmniFocus Tasks (Due & Flagged)
osascript -l JavaScript /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_due_flagged.js
Returns tasks that are:
- Due today or overdue
- Flagged
- Available (not blocked, not deferred to future)
1.3 Recent Emails (Last 24 Hours)
YESTERDAY=$(date -v-1d +%Y/%m/%d)
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun gmail/list_messages.js psd --query "in:inbox after:$YESTERDAY" --max 15
Returns recent inbox messages with:
- From, subject, date, snippet
- Whether read or unread
- Thread ID for context
- Labels array
Filtering: Only show emails still in inbox (not already labeled/processed).
- Emails with custom labels (Label_XXXXX) have been sorted and should be excluded
- Exception: Include emails with SaneCC or SaneLater labels (worth knowing about)
- System labels (UNREAD, INBOX, CATEGORY_*, IMPORTANT) don't count as "processed"
Philosophy: Any email still in inbox from last 24 hours needs attention, read or not.
Account: Use psd for work email
1.4 Open Freshservice Tickets
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/list_tickets.js '{"workspace_id": 2, "filter": "new_and_my_open"}'
Returns open tickets assigned to or created by user in Technology workspace.
1.5 Pending Approvals
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_approvals.js requested
Returns service requests awaiting approval.
1.6 Weather
Use WebSearch:
Gig Harbor WA weather today forecast
Extract:
- Current conditions
- High/low temperature
- Precipitation chance
- Any alerts
1.7 EdTech News (with Synopses)
Use WebSearch:
K-12 education technology news past 24 hours January 2026
For each article found (3-5 articles):
- Use WebFetch to read the full article
- Extract a 2-3 sentence synopsis covering:
- What happened / what's new
- Why it matters for K-12 education
- Key takeaway or action item
Freshness check: Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
- EdTech product launches and updates
- School technology policy changes
- Cybersecurity in schools
- Digital learning trends
1.8 AI News (with Synopses)
Use WebSearch:
artificial intelligence news past 24 hours January 2026 latest
For each article found (3-5 articles):
- Use WebFetch to read the full article
- Extract a 2-3 sentence synopsis covering:
- What's the development
- Industry impact
- Relevance to education/work
Freshness check: Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
- Major AI model releases and capabilities
- AI policy and regulation
- Enterprise AI adoption
- AI research breakthroughs
1.9 K-12 Leadership News (with Synopses)
Use WebSearch:
K-12 school leadership superintendent news past 24 hours January 2026
For each article found (2-3 articles):
- Use WebFetch to read the full article
- Extract a 2-3 sentence synopsis covering:
- Policy or leadership development
- Impact on districts/schools
- Relevance to CIO/technology leadership
Freshness check: Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
- State and federal education policy
- Superintendent and board news
- School funding and budgets
- Workforce and staffing trends
1.9b School Safety & Security News (with Synopses)
Use WebSearch:
K-12 school safety security news past 24 hours January 2026
For each article found (3 articles):
- Use WebFetch to read the full article
- Extract a 2-3 sentence synopsis covering:
- What happened / what's new
- Impact on school safety practices
- Key takeaway for districts
Freshness check: Verify article dates before including. Only include articles published within the last 24 hours. Skip older articles even if they appear in results.
Topics to cover:
- School security incidents and responses
- Safety policy changes
- Emergency preparedness
- Mental health and threat assessment
- Physical security technology
1.10 Technology Team EOD Messages (Last Business Day) - DETAILED
Get end-of-day check-in messages from the Technology Staff space:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAxOtpv10 last-business-day
CRITICAL - NO HALLUCINATION:
- ONLY use names that appear in the
sender field of the script output
- If script returns no messages, say "No EOD messages found"
- If script returns messages with sender IDs instead of names, display the ID (e.g., "users/12345...")
- NEVER invent names, locations, or accomplishments
- Copy-paste approach: treat script output as source of truth
Before extracting team data:
- Examine the raw JSON output from the script
- List the exact
sender values returned
- Use ONLY those names - no paraphrasing, no "improving"
CRITICAL: Extract FULL details from each team member's EOD message. Look for messages that contain "Today:" prefix - these are the detailed EOD summaries.
For each team member who posted an EOD summary:
- Name: Who posted (use EXACTLY the name from
sender field)
- Location(s): Where they worked (WFH, DCRC, school sites)
- Key accomplishments: Specific tasks completed (not just "tickets")
- Notable items: Interesting problems solved, projects worked on
- Issues/blockers: Any problems mentioned
Example extraction from raw message:
Brad White:
- Location: TSD (Tech Services)
- Accomplished: Packaged Cinema 4D plugin for deployment, fixed OAuth blocking for Maxon App sign-in, created SwiftDialog notification for plugin installs, used Claude Code for first time to create Installomator label for Godot game engine
- Notable: Working on Unity deployment troubleshooting, burning comp time leaving early
Note: If today is Monday, "last business day" = Friday (or Thursday if Friday was a holiday).
1.10b Safety & Security Team EOD Messages (Last Business Day)
Get end-of-day check-in messages from the Safety & Security Staff space:
cd /Users/hagelk/non-ic-code/geoffrey/skills/google-workspace && bun chat/get_eod_messages.js psd spaces/AAAAFpQaAnA last-business-day
Space: PSD Safety & Security Team
CRITICAL - NO HALLUCINATION:
- ONLY use names that appear in the
sender field of the script output
- If script returns no messages, say "No EOD messages found"
- If script returns messages with sender IDs (e.g., "users/12345...") instead of names:
- Display as: Unknown (users/123456...) - [Location from message content]
- Add note: "Name not in mapping - update chat_user_mapping.json"
- NEVER invent names, locations, or accomplishments
- Copy-paste approach: treat script output as source of truth
Before extracting team data:
- Examine the raw JSON output from the script
- List the exact
sender values returned
- Use ONLY those names - no paraphrasing, no "improving"
Extract using same format as Technology Team - names, locations, accomplishments, issues.
Note: If today is Monday, "last business day" = Friday (or Thursday if Friday was a holiday).
1.11 Team Completed Tickets (Last Business Day)
Get tickets closed by the Technology team on the last business day:
LAST_BIZ_DAY=$(bun /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_last_business_day.js | jq -r '.date')
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_daily_summary.js "$LAST_BIZ_DAY"
CRITICAL - NO HALLUCINATION:
- ONLY use agent names that appear in the
byAgent section of script output
- Use EXACTLY the ticket counts returned by the script
- NEVER invent names or ticket counts
- If an agent's name shows as ID or email, display it as-is
Before reporting ticket stats:
- Examine the raw JSON output from
get_daily_summary.js
- List the exact agent names from
byAgent field
- Use ONLY those names and counts
Returns:
- Total tickets closed
- Breakdown by agent
- Breakdown by category (Password Reset, Chromebook, etc.)
- Automated vs agent-resolved
Workspace: Technology (workspace_id: 2)
1.12 Ticket Trends Analysis
Compare last business day to previous days for trends:
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_daily_summary.js "last monday"
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_daily_summary.js "last tuesday"
Analyze for:
- Volume trends (increasing/decreasing)
- Category spikes (sudden increase in specific issue types)
- Agent workload distribution
- Unusual patterns
1.13 Software Development Workspace Tickets
Get open tickets in the Software Development workspace:
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/search_tickets.js "status:2 OR status:3" 13
Returns all open (status:2) and pending (status:3) tickets in the Software Development workspace.
Workspace ID: 13 (Software Development)
Note: This is the user's internal software development bug tracker for AI Studio and other PSD applications.
1.14 Legislative Activity (Last Business Day)
Get K-12 education bills with activity since the last business day:
bun /Users/hagelk/non-ic-code/geoffrey/skills/legislative-tracker/scripts/get_recent_bill_activity.js --last-business-day
This returns:
- Date range to check (last business day β today)
- List of ~143 confirmed education bill IDs
- WebFetch instructions for each bill
Workflow:
- Get the output from
get_recent_bill_activity.js
- WebFetch each bill URL (batch 5-6 in parallel for speed)
- Extract latest action date from each bill page
- Filter to bills where latest_action_date >= lookback_start
- Apply priority framework (HIGH/MEDIUM/LOW based on district impact)
- Include summary of what each bill does
On Monday: Lookback starts on Friday (or earlier if Friday was a holiday), so includes all weekend activity (hearings, votes, committee actions).
Example URLs to WebFetch:
https://app.leg.wa.gov/billsummary?BillNumber=1020&Year=2025
https://app.leg.wa.gov/billsummary?BillNumber=5038&Year=2025
Note: Only include bills that actually had activity. If no bills moved, output "No legislative activity since [date]".
Phase 2: Generate Briefing
2.1 Analyze & Prioritize
Review gathered data and identify:
- Conflicts: Overlapping calendar events
- Urgencies: Overdue tasks, high-priority tickets
- Themes: Patterns across data sources
2.2 Format Markdown Briefing
Use this structure:
# Daily Briefing - [DATE]
## Weather
[Current conditions, high/low, precipitation]
## Today's Calendar
|------|-------|----------|
| ... | ... | ... |
**Conflicts/Notes**: [any issues]
## Priority Tasks
### Due Today
- [ ] Task 1
- [ ] Task 2
### Flagged
- [ ] Task 3
### Overdue
- [ ] Task 4 (due [date])
## Recent Emails (Last 24h)
[X emails in inbox from last 24 hours]
### Needs Response
- From: [sender] - [subject] (snippet)
- From: [sender] - [subject] (snippet)
### FYI/Notifications
- [sender] - [subject]
## Freshservice
### Technology Tickets: [count] open
[Top 3-5 tickets by priority/age]
### Software Development Tickets: [count] open
[List tickets in Software Dev workspace]
### Pending Approvals: [count]
[List with ticket #, requester, summary]
## Team Activity (Last Business Day: [DAY, DATE])
**Data Source Verification (REQUIRED):**
- Technology EOD script returned: [X] messages from [list exact sender names from JSON]
- Safety & Security EOD script returned: [X] messages from [list exact sender names from JSON]