The Executive Assistant and Notification Field
The executive assistant stack has two parts that are easy to conflate but solve different problems. The EA agent handles proactive cadence: open the day, surface what matters, queue drafts, close the day. The notification field handles reactive detection: scan the inbox for threads that went quiet and surface the ones that need attention.
The EA agent
Section titled “The EA agent”agents/executive_assistant started as a fork of the chief-of-staff agent (CHANGELOG 2026-05-24). The persona lives at agents/executive_assistant/persona.md.
Daily ritual
Section titled “Daily ritual”The daily ritual runs on a cron at 7 AM (open) and 9 PM (close) MT, every day. It was intentionally themed by day of week:
- Monday: School focus
- Tuesday: Siemens focus
- Wednesday: AI Foundry + consulting
- Thursday: Startups
- Friday: Growth
- Saturday/Sunday: Family
The --open pass surfaces tomorrow’s one thing (a file artifact at tomorrows-one-thing.md), the day’s calendar, any flagged inbox items, and open loops. The --close pass does a lightweight EOD capture.
Both runs were smoke-tested live to Telegram before the cron was installed. The output is a short text message — JD is reading on his phone, not in a terminal.
The draft-first cadence
Section titled “The draft-first cadence”The EA’s primary constraint is that any communication sent as JD requires his approval. The agent runs hourly (8 AM – 9 PM MT) and follows a strict gate:
- Reversible, no-send actions: do autonomously (file operations, calendar reads, search, draft queuing)
- Anything external that sends as JD: always draft, never send
That second gate is non-negotiable. It is not a soft preference — the EA’s cron is written to only surface drafts to Telegram, never to fire the actual send. JD taps approve or edits before the message goes.
The EA was paused briefly in June 2026 when it was observed queuing drafts for emails that didn’t need a reply — it was generating noise rather than reducing it. The root-cause fix was to add a relevance filter before queuing: only threads that match a defined pattern (left-on-red by JD, requires a response, meets minimum signal) get a draft. The notification field (below) handles a related piece of that problem.
The notification field
Section titled “The notification field”The notification field started from a specific observation: JD sometimes sends an email, gets no reply, and forgets to follow up. The Left-on-Red detector (agents/notification_field) solves this.
How it works
Section titled “How it works”LeftOnRedDetector scans Gmail for threads where:
- JD sent the last message
- No reply came back
- The thread has been idle for a meaningful period
Results go into the notification_field Supabase table and a daily digest is sent to Telegram. The first smoke test (CHANGELOG 2026-05-21) found 78 left-on-red threads; the top three had been idle for 63 days.
The cron was not installed immediately after that smoke test. Instead, the results were reviewed first — about 50 of the 78 hits were scholarship-organization spam threads where JD was a recipient and no reply was ever expected. The detector needed a domain blocklist and a noise score before it would produce signal-to-noise ratios worth acting on.
That caution is worth noting. A detector that surfaces 78 threads when 50 are false positives trains the user to ignore it. The right call is to refine the signal before installing the cron.
The episodic memory tier
Section titled “The episodic memory tier”The EA’s M2.2 (CHANGELOG 2026-06-07 09:04) added a SQLite/FTS5 episodic store at ~/clawd/memory/episodic.sqlite:
- 238-record 30-day backfill: agent events, changelogs, Plaud transcripts, task logs
- Zero LLM cost for the backfill (FTS5 indexing, no embeddings)
mcp__memory__episodic_recalltool/rememberTelegram command with#tagprefix for manual capturedaily_journal_v2 --harvest-decisionsflag extracts[DECIDED]and[SHIPPED]markers automatically
The episodic layer is how the EA knows what happened yesterday without reading the full CHANGELOG. It also powers cross-source calendar merge: the journal reconciles FastMail, Outlook, and Google Calendar events by date, so the morning briefing doesn’t miss a meeting because it only checked one calendar source.
What broke, and why
Section titled “What broke, and why”The EA is the stack most likely to produce output that felt right at build time but felt wrong in use. Two real failure modes:
Queuing drafts for threads that didn’t need replies. The EA was generating noise. The fix was a relevance filter — don’t draft unless there’s a real signal the thread needs attention. This is obvious in retrospect and non-obvious at build time.
The domain consolidation mess. At one point there were separate exec-assistant and executive-assistant directories under agents/. The CHANGELOG 2026-06-06 entry describes consolidating them into a single ea domain with a config.yaml and a CLAUDE.md. The broken heartbeat cron was also fixed here: the cron was calling agents.ea.heartbeat which didn’t exist as a module (ModuleNotFoundError, hourly). A domain-integrity-check script was added to catch half-domains before they waste cron cycles.
The lesson is structural: when you build an agent that touches real inboxes and real calendars, the cleanup cost of getting the domain boundaries wrong is higher than it would be for a data pipeline.
How to wire a draft-first EA loop
Section titled “How to wire a draft-first EA loop”-
Define the reversible/irreversible boundary. Write it down in the persona file. “Reads calendar, reads inbox, queues drafts” is reversible. “Sends email as JD” is not.
-
Smoke-test the first run in dry-run mode. The EA’s
--reply-dry-runflag runs the agent and logs what it would do without doing it. Read the log before installing the cron. -
Install a noise threshold. Any automation that surfaces alerts needs a minimum signal score. If your first smoke test shows 78 hits and 50 are noise, fix the filter before installing.
-
Add a daily digest with suppression. The notification field sends once per day per thread, not once per cron cycle. A thread that is still left-on-red tomorrow should not generate a second alert until the suppression window expires.
-
Log decisions explicitly. Tag any message where a real decision was made with
[DECIDED]. The episodic memory tier harvests those automatically, and the EA can surface them in weekly review without re-reading the full CHANGELOG.
Next: From executive communications to money. The Tax Strategist and Finance Agents apply the same KB-backed specialist pattern to tax strategy and financial analysis.