Chief of Staff
The role
Section titled “The role”Chief of Staff is the AI layer that sits between every inbound channel and James’s attention. Its job is the same as a human chief of staff for an executive: receive everything, figure out what it is, apply rules, act directly or escalate with one-click options. James stops being the router of his own life.
Why this exists
Section titled “Why this exists”My attention is finite. The world is not. Every channel (email, iMessage, Facebook Messenger, YouTube comments, GHL webhooks, notifications, desktop files, voice memos, Apple Notes) competes for a piece of it. When I am the router, I leak. A basketball text gets forgotten. A hot GHL lead goes cold. An idea from the shower evaporates. Chief of Staff exists so the routing is no longer my job.
The word for the total set of channels touching me is my capture surface (David Allen’s GTD term) or attack surface (cybersecurity’s cognate). Chief of Staff is the answer to a capture surface growing faster than the attention it demands.
The three functions
Section titled “The three functions”- Analyze — what is this input? Intent tags include
calendar_event,task,idea,lead,question,fyi,spam,reply_needed. - Rule — given the intent, what should happen? Options include archive, delete, draft reply, create task, add to calendar, escalate to James.
- Act or escalate — handle cleanly when confidence is high, surface to James via the approval queue when it is not.
Four-layer architecture
Section titled “Four-layer architecture”- Surfaces — the channels. Each surface has a capture mechanism (poller, webhook, watcher).
- Event bus — one queue. Every raw input lands with a common envelope:
source,timestamp,content,metadata. - Classifier + rules — AI tags each event with one or more intents. Rules map intent to handler.
- Destinations — one handler per intent. Each handler knows how to write to its target system.
Capture surface
Section titled “Capture surface”Every channel where the world reaches me. Current map:
| Surface | Capture mechanism | Cadence |
|---|---|---|
| iMessage | ~/Library/Messages/chat.db poller | 30 min |
| Gmail | Gmail API via gmail-helper | 1 hour |
| Facebook Messenger | fb-messenger-ghl Chrome extension | real-time |
| Facebook group posts | fb-group-monitor Chrome extension | real-time |
| YouTube comments | YouTube Data API cron | 1 hour |
| GHL webhooks (GKP + ATH) | existing FastAPI endpoint | real-time |
| Apple Notes | iCloud sync + parser | 30 min |
| Desktop file drops | fswatch daemon | real-time |
| Voice memos | iCloud sync + Whisper | 10 min |
| Phone call notifications | not yet captured | N/A |
Destinations
Section titled “Destinations”Where cleaned-up actions land. Current map:
- Google Calendar — personal calendar for anything not a GHL booking
- GHL calendar — customer bookings only
- To-Do List —
1 Projects/To-Do List.docxon Google Drive - The One Thing —
~/apps/the-one-thing/data.json - Ideas repo — candidate destination for
ideaintent (not yet named) - Blog draft queue —
themarketingshowcontent pipeline - GHL contact records — new leads enriched and added
- Auto-journal —
~/apps/auto-journal/output/ - Gmail archive / trash — for
fyiandspamintents - Reply drafts — Gmail drafts for
reply_needed - Approval queue — catch-all for ask-James-first items
Approval queue
Section titled “Approval queue”When the classifier is not confident enough to act directly, the event goes into an approval queue. First implementation is a morning digest email at 7 AM listing every candidate from the last 24 hours. Each row includes:
- The source message (so I can verify the classifier read it right)
- The proposed action with all details filled in
- A primary button (approve)
- A secondary button (approve with variant, e.g., “add and invite Amanda”)
- A reject link
Urgent same-day items route an iMessage instead of waiting for the morning digest.
Per-event invite flags are always a per-row choice, never a global default. Auto-inviting spouses on every event trains them to ignore calendar notifications. Invites are opt-in per event, with a secondary button when the event likely warrants it.
The customer boundary
Section titled “The customer boundary”Chief of Staff serves James. It does not serve customers.
| Direction | Repo | Example |
|---|---|---|
| Customer-facing (GKP) | claude-code-crm | ”Power Wheels party sounds fun, what date?” |
| Owner-facing (James) | Chief of Staff | ”Hey James, this lead is hot” |
Customer replies live in claude-code-crm forever. That repo has its own voice, its own booking flow, its own Stripe and waiver integrations. Chief of Staff never composes a customer reply. When the two need to talk, claude-code-crm publishes an event onto the bus and Chief of Staff consumes it.
Existing systems that fold in
Section titled “Existing systems that fold in”Every one of these was built as a standalone project. Under Chief of Staff, they become captures or handlers of a unified pipeline.
| Today | Role under Chief of Staff |
|---|---|
ai-assistant | Proto-concierge for the GHL surface. Scans GHL, scores contacts, alerts James. Becomes the lead intent handler. |
thought-catcher | Apple Notes capture. Promoted to a first-class surface. |
utah-connect-scan | Facebook group capture, lead intent. |
youtube-auto-commenter | YouTube comment capture plus triage. |
fb-group-monitor | Facebook group capture. |
fb-messenger-voice-transcriber | Voice-note capture on Messenger. |
desktop-organizer | Desktop file capture. |
inbox-to-calendar | Phase 1 of iMessage + Gmail to calendar. |
Phase 1 shipped
Section titled “Phase 1 shipped”The first complete pipe end to end, 2026-04-17:
- Capture — poll
~/Library/Messages/chat.dbafter Full Disk Access granted - Analyze —
claude -p --model haikuwith a classifier prompt (pattern reused from~/apps/cc/hooks/nudge-classifier-prompt.md) - Rule — when intent is
calendar_event, build a Google CalendarrenderURL with pre-filled event details - Escalate — email James with two buttons: “Add to my calendar” and “Add and invite Amanda”
Source script: ~/apps/inbox-to-calendar/propose_event.py. First live test: basketball game for Tuesday April 21, 2026 at 8:30 PM, detected from an iMessage group thread. Buttons open Google Calendar with the event pre-filled (no server endpoint needed, Google’s render URL does the heavy lifting).
Roadmap
Section titled “Roadmap”Order of pipes to build next:
- iMessage to calendar — real poller running every 30 minutes, not hardcoded to one event
- Gmail to calendar — hourly cron, same pattern
- Gmail to task — inbox triage into the To-Do List
- Facebook Messenger to reply draft — suggested reply, James approves
- YouTube comments to triage — fold in existing
youtube-auto-commenter - GHL lead to escalate — merge
ai-assistantonto the unified bus
Each pipe reuses the same three functions. The classifier is one prompt, versioned, regression-tested. The destinations are one handler per intent, shared across all surfaces.
Naming
Section titled “Naming”The term landed after running through: concierge, switchboard, majordomo, foyer, gatekeeper, triage. Chief of Staff won because it is the cleanest human-role analogy. Everyone understands what an executive’s chief of staff does, and that exact role is what the AI is playing.
How to update this page
Section titled “How to update this page”- New surface comes online → add a row to Capture surface.
- New destination is wired → add a bullet to Destinations.
- New standalone repo that fits the pattern → add a row to Existing systems that fold in.
- Pipe shipped → move it from Roadmap into a new section or update Phase 1 shipped with the new phase.
Related
Section titled “Related”- Phase 1 repo:
~/apps/inbox-to-calendar/ - Classifier pattern used for analyzer: Voice Nudges
- Customer-facing boundary:
~/apps/claude-code-crm/ - GTD “capture surface” concept: David Allen, Getting Things Done