Proactive Morning Brief — Build spec
Sam ask 2026-05-11: "My Monday today came without me having a proactive briefing. By next Monday, I want that in place — without question."
Doctrine: manual → repeatable → VA-safe runbook → automated. First fire Tue 5/12 ~7:45 AM EDT.
Acceptance test
- [ ] Email lands in Sam's inbox at 7:45 AM ET Mon-Fri (skip Sat)
- [ ] Mobile-readable in Outlook iOS + Gmail iOS without dark mode
- [ ] Contains: calendar today · obligations next 7 days · open P0 loops · MIS regime snapshot · flagged urgent emails
- [ ] Reply-to-update: Sam replies, picture re-shapes within 30 min
- [ ] Survives 5 consecutive weekdays without form changes → locked
- [ ] Acceptance: Sam doesn't have to open Calendar / Sheets / Email separately first thing in the morning
Data sources
| Source | Pull method | What |
|---|---|---|
| Google Calendar | CalendarApp.getEventsForDay(today) |
Today's events with times + locations |
v1 Monthly Obligations sheet (1L_rxCSOnc...) |
direct read via SpreadsheetApp.openById |
Items due in next 7 days |
MIS V11 sheet (1HEmRev...) Snapshot tab |
direct read | Regime · VIX · top 3 ADD signals · holdings P&L line |
BOS Action_Master (Command Center sheet 17XDHL...) |
direct read | P0/P1 open loops by status flag |
| Gmail | GmailApp.search('subject:⚡ OR subject:P0 OR is:starred newer_than:1d') |
Urgent inbox items |
docs/CURRENT_STATE.md top section |
fetch via GitHub API on schedule | Latest session state |
docs/SCOPE_BACKLOG.md |
fetch via GitHub API on schedule | Backburner items aging |
Trigger
- Apps Script time-based trigger: weekdays 7:45 AM ET
- Skip if
MIS_CFG.timezoneformatted-date returns weekend (already handled inmisIsWeekend_) - Skip if Sam manually set
SKIP_BRIEF_DATEin Control tab to today's date (manual override)
Email structure
Subject line
☀️ [Day] [Mon DD] · [N] today · [M] urgent · $[$$] week
Example: ☀️ Tue May 12 · 3 events · 1 urgent · $4,221 week
Header — light/dark adaptive table+bgcolor (same pattern as MIS BLUF)
[Dark band #0a0e1a]
☀️ Good morning, Sam
Tue May 12 · 7:45 AM EDT
[White bg row]
Cadence: weekday 7:45 AM · reply to re-shape today's picture
Section 1 — 🚨 NOW (top 3 items, reordered if urgent)
Pulled from: Calendar (time-sensitive events first), then Gmail urgent (⚡ subject), then BOS Action_Master P0 rows. Each line:
- Direction arrow ↑↓· what · who owns · literal next step
Section 2 — 📅 TODAY
Calendar events laid out as a timeline. Each event: time · title · location (if any) · attendees if more than just Sam.
Section 3 — 💰 MONEY (next 7 days)
Bake the obligations table INTO the email body (NOT a live fetch — Apps Script reads sheet directly at send time). Each row: days · amount · vendor · pay_from · status. Total at top.
Section 4 — 📊 MARKETS
One line: regime · VIX · SPY today (if market open) · top 3 ADD names · current portfolio P&L delta vs prior close.
Section 5 — ❓ CLARIFYING QUESTIONS (max 3)
Hard-coded today via prompting logic OR pulled from a QUESTIONS_QUEUE tab Sam can pre-load. Each question has: Q · Why · Default if no reply.
Section 6 — 🎯 IF YOU DON'T REPLY
What I'll proceed with as defaults. Lets silence still produce a sane day.
Section 7 — 🌱 BACKBURNER (1 item rotated)
Surface 1 aging item from SCOPE_BACKLOG.md (>14 days stale, has unblock_trigger). Per yesterday's backburner-ritual proposal.
Footer
Source trail · last commit hash · memory snapshot age · "Reply to this email — I'll re-shape my picture"
Build sequence
Phase 1 — manual MVP (Tue 5/12 morning)
- Claude (this session) composes ONE manual brief by hand reading sheets directly
- Sends as draft to sam@hookstreetcapital.com at ~7:30 AM Tue
- Sam taps Send → it lands in inbox at 7:45 AM
- Sam critiques form
- Iterate Wed → Thu → Fri until form locked
Phase 2 — Apps Script function (Fri 5/16 or weekend)
- Write
sendProactiveMorningBrief_()in PWA Apps Script project - Reads from all sources listed above
- Builds HTML email
- Sends via
MailApp.sendEmail - Time-trigger daily 7:45 AM weekdays
Phase 3 — Reply-to-update handler (after form lock)
- Gmail watch / Apps Script trigger on new emails replying to brief
- Parses Sam's reply (Q1: X, Q2: Y, etc.)
- Sends "tweaked beginning of the day" follow-up email within 30 min
Phase 4 — Cross-channel (later)
- WhatsApp summary version (via Twilio if Malca Yenta number is live)
- iPad widget version
- Voice-readable version for car-Claude playback
Stop rules
- NOT a multi-recipient email (Sam only — Mildred has her own start-of-week)
- NOT a notification system — one email per morning, one reply per response
- NOT a chat — Sam opens Claude Code for conversation
- NOT a build target — form lives in this doc, the EMAIL is the artifact
- NO Phase 2 automation until 5 consecutive Mon-Fri manual MVPs pass form-lock
Source
- Sam voice memo 2026-05-11 ~3:30 PM EDT (cloud session 31 handoff TASK 4 + Sam's "by next Monday I want that in place")
- Yesterday's session 30 briefing template
docs/daily-cadence-system/MORNING_BRIEF_TEMPLATE.md(this spec supersedes that) - Memories:
feedback_classifier_first_doctrine.md·feedback_done_means_survives_tuesday.md·project_home_base_vision.md - Doctrine: ChatGPT "Z's World" v9 · manual → repeatable → VA-safe → automated