Skip to content

Chief of Staff

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.

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.

  1. Analyze — what is this input? Intent tags include calendar_event, task, idea, lead, question, fyi, spam, reply_needed.
  2. Rule — given the intent, what should happen? Options include archive, delete, draft reply, create task, add to calendar, escalate to James.
  3. Act or escalate — handle cleanly when confidence is high, surface to James via the approval queue when it is not.
  1. Surfaces — the channels. Each surface has a capture mechanism (poller, webhook, watcher).
  2. Event bus — one queue. Every raw input lands with a common envelope: source, timestamp, content, metadata.
  3. Classifier + rules — AI tags each event with one or more intents. Rules map intent to handler.
  4. Destinations — one handler per intent. Each handler knows how to write to its target system.

Every channel where the world reaches me. Current map:

SurfaceCapture mechanismCadence
iMessage~/Library/Messages/chat.db poller30 min
GmailGmail API via gmail-helper1 hour
Facebook Messengerfb-messenger-ghl Chrome extensionreal-time
Facebook group postsfb-group-monitor Chrome extensionreal-time
YouTube commentsYouTube Data API cron1 hour
GHL webhooks (GKP + ATH)existing FastAPI endpointreal-time
Apple NotesiCloud sync + parser30 min
Desktop file dropsfswatch daemonreal-time
Voice memosiCloud sync + Whisper10 min
Phone call notificationsnot yet capturedN/A

Where cleaned-up actions land. Current map:

  • Google Calendar — personal calendar for anything not a GHL booking
  • GHL calendar — customer bookings only
  • To-Do List1 Projects/To-Do List.docx on Google Drive
  • The One Thing~/apps/the-one-thing/data.json
  • Ideas repo — candidate destination for idea intent (not yet named)
  • Blog draft queuethemarketingshow content pipeline
  • GHL contact records — new leads enriched and added
  • Auto-journal~/apps/auto-journal/output/
  • Gmail archive / trash — for fyi and spam intents
  • Reply drafts — Gmail drafts for reply_needed
  • Approval queue — catch-all for ask-James-first items

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.

Chief of Staff serves James. It does not serve customers.

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

Every one of these was built as a standalone project. Under Chief of Staff, they become captures or handlers of a unified pipeline.

TodayRole under Chief of Staff
ai-assistantProto-concierge for the GHL surface. Scans GHL, scores contacts, alerts James. Becomes the lead intent handler.
thought-catcherApple Notes capture. Promoted to a first-class surface.
utah-connect-scanFacebook group capture, lead intent.
youtube-auto-commenterYouTube comment capture plus triage.
fb-group-monitorFacebook group capture.
fb-messenger-voice-transcriberVoice-note capture on Messenger.
desktop-organizerDesktop file capture.
inbox-to-calendarPhase 1 of iMessage + Gmail to calendar.

The first complete pipe end to end, 2026-04-17:

  1. Capture — poll ~/Library/Messages/chat.db after Full Disk Access granted
  2. Analyzeclaude -p --model haiku with a classifier prompt (pattern reused from ~/apps/cc/hooks/nudge-classifier-prompt.md)
  3. Rule — when intent is calendar_event, build a Google Calendar render URL with pre-filled event details
  4. 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).

Order of pipes to build next:

  1. iMessage to calendar — real poller running every 30 minutes, not hardcoded to one event
  2. Gmail to calendar — hourly cron, same pattern
  3. Gmail to task — inbox triage into the To-Do List
  4. Facebook Messenger to reply draft — suggested reply, James approves
  5. YouTube comments to triage — fold in existing youtube-auto-commenter
  6. GHL lead to escalate — merge ai-assistant onto 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.

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.

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