Morning Ops: how other people actually build it

Research synthesis, 2026-07-01. Framed as: our setup is a flawed baseline, not ahead. Where the field is simpler, cheaper, or more reliable than us, this says so.

28 agents run 51 unique sources found 20 deep-read + maturity-checked 16 shipped real, 4 demo/wip

1. The component set that keeps showing up

Building blocks recurring across the serious builds. "How ours compares" is the honest read.

  1. Multiple read-only ingestion sources (email + calendar + tasks + revenue). Near-universal. mattpaige68 pulls 8 connectors. Us: narrower, email-first, no calendar or money-flow source wired in.
  2. A triage classifier with a small fixed set of lanes (3 to 4, almost always with an explicit "needs a human reply" and an "ignore / FYI" bucket). EAIA, claude-chief-of-staff. Us: strong "needs response" lane, but no cheap ignore/FYI pre-filter.
  3. Prioritization with a hard cap (Top-3 or P0/P1/P2). Aeon drops any item without a 12-word "why now." Us: money-first Top-3 already, good.
  4. Auto-draft grounded in your Sent voice, draft-only. "Never send" stated as a hard rule (Cora, Serif). Us: Sent-grounded, matches the best.
  5. A delivery surface with a push nudge (rich artifact + a short companion ping so the phone actually buzzes). Us: phone email + terminal.
  6. Scheduling via cron/launchd or a managed Routine. doneyli runs 7 launchd jobs 24/7 with watchdogs. Us: cron/launchd.
  7. Persistent memory / state that carries across runs. doneyli: observe, nightly reflect, retrieve with decay. Us: living-docs exist but are not wired into the daily loop as a read-then-update ledger.
  8. Freshness / dedup / idempotency state (a per-message-id log so re-runs skip handled items). ArtJack (SQLite), htlin (actions.jsonl). Us: fail-loud freshness, but no per-thread idempotency.
  9. Policy / config as editable files (VIPs, rules, goals, schedules), not buried in the prompt. Blattman, mimurchison. Us: rules live in prose, not checked-in config.
  10. Graduated autonomy ladder (draft, then supervised, then auto for safe classes) with a hardcoded never-send list. doneyli. Us: draft-only, no ladder.

2. The four architecture patterns

A. Single scheduled prompt (one cron, one agent pass)

mattpaige68, MindStudio, marcos-narvaez. Simplest, cheapest, easy to make idempotent. But no coverage between runs, and depth is capped at one context window.

B. Agent swarm / orchestrator fan-out

the-ai-corner (6 subagents), aimaker, Channel. This is our shape. Deepest reading, most parallel throughput. But expensive, coordination overhead grows past ~8 subagents, and rules must be repeated per subagent or they drop.

C. Event-driven / continuous

EAIA (every 10 min), doneyli (30-min zero-LLM scan), claude-ops (2-min pre-warm), kklaw (watcher). Near-real-time urgents, instant briefs from warm cache. But more moving parts and more failure surfaces.

D. Product SaaS (managed inbox)

Cora, Serif. Zero maintenance, polished, graduated autonomy built in. But no money-first framing, no grounding in your own systems, data leaves the box, monthly cost.

The strongest shipped builds are hybrids: a cheap event-driven tick for urgents plus a scheduled heavy pass for depth (doneyli, claude-ops). We are pure B with no cheap tick.

3. Patterns worth stealing (things we do NOT do), ranked

  1. A cheap deterministic between-sweeps urgent scan. Zero-LLM or Haiku rules every 20-30 min against a VIP/keyword list catches "on fire" items in seconds at near-zero cost. doneyli reports ~80% cost cut and 3-5 urgents/day caught this way.
  2. Per-thread idempotency + dedup state (log-as-state). Append-only record keyed on thread id so a re-run never re-proposes a handled thread, and a newer reply supersedes a stale decision. htlin, EAIA, ArtJack. Directly fixes "the sweep re-surfaces the same thread every morning."
  3. A corrections to few-shot feedback loop. Every time you edit or override a proposed decision, capture it as an example that tunes the next run. EAIA. We capture nothing, so the classifier never learns from being wrong.
  4. Hourly catch-up with an exactly-once daily marker. A closed laptop at the scheduled minute still delivers exactly once when it wakes. ArtJack. We currently just miss the run.
  5. An explicit "uncertain" third verdict. Forcing a confident decision on ambiguous mail produces false confidence. htlin (actionable / not / uncertain), EAIA ("if unsure, notify").
  6. Dual-model cost split. Cheap model decides which threads deserve the expensive model. doneyli runs two tenants under $3/day; ArtJack has per-route model knobs.
  7. Enforce post-action steps with hooks, not prompts. Move "log the decision, mark must-respond, commit state" into a hook so the model cannot skip it. affaan-m, the-nuanced-perspective.
  8. A "Handled" / "Changed since yesterday" delta in the brief. Proves the work and lets you scan only what moved. doneyli, mattpaige68.
  9. Learn-once escalation to shrink the queue. On a novel thread, ask once, capture the answer as a rule, auto-handle that class after. Serif. Turns a static queue into a shrinking one.
  10. Config-as-files. VIP + never-send + CC-preservation rules, goals, schedules, all checked in and editable. doneyli, mimurchison, Blattman. Maps directly to encoding the THM/family reply-all rule in code, not prose.
  11. Idempotent queue writes. WHERE-NOT-EXISTS guards so a re-run never duplicates a queue item. anothercodingblog.
  12. Cost-gated wakeup. Cheap fetch in cron; only spin the expensive swarm if there is new material. kklaw.

4. Where our system is likely worse or over-built

Inferential (see the caveat banner), but the pattern is consistent enough to act on after a quick self-check.

5. Traps others hit that we should avoid

6. If we rebuilt the morning process from scratch

  1. Two-tier ingestion: cheap deterministic/Haiku scan every 20-30 min for urgents + the heavy scheduled deep pass for depth. Keep Sent-grounded reading in the heavy tier only.
  2. Stateful dedup layer: one SQLite or JSONL keyed on thread id (last-seen, exactly-once, newer-reply-supersedes). Highest-leverage missing piece.
  3. Batched, bounded fan-out: ~30 threads per subagent, under 8 subagents, load-bearing rules repeated in each subagent prompt.
  4. Few lanes incl. an explicit uncertain bucket + an ignore pre-filter that auto-archives noreply/receipts and reports "skipped N."
  5. Money-first Top-3 with a why-now gate, a "Changed since yesterday" delta, and a "Handled" section, componentized, empty sections dropped.
  6. Config-as-files: goals, VIP + never-send + CC-preservation, schedules, all checked in.
  7. Reliability via hooks: a Stop hook that logs the finished brief and commits state; idempotent queue writes.
  8. Freshness as a state machine: per-source stale/api-error/rate-limit flags, self-heal before briefing, fail-loud-by-omission.
  9. Missed-run recovery: scheduled time + hourly catch-up + per-day exactly-once marker.
  10. Delivery: phone push + one-line companion nudge, no-retry degrade to plain text, immutable daily archive for QA.
  11. Dual-model cost control: Haiku classifies and picks what earns the deep read; big model only for drafting/synthesis.
  12. Corrections to few-shot loop + learn-once escalation so the queue shrinks and triage improves.

Keep from today: money-first framing, Sent-folder grounding, the "a named human is blocked on you" must-respond concept (no source had an exact analog, it is our one genuine differentiator), and draft-only.

Sources (20 deep-read of 51 found)

SourceTypeMaturity
doneyli, AI Chief of Staff (7 launchd jobs, two-tier)blogshipped
langchain-ai / executive-ai-assistant (EAIA)githubshipped
claude-ops (Business OS for Claude Code)githubshipped
Cora by Every (brief twice a day)blogshipped
htlin, Claude Code mail triage (Haiku + tmux)githubshipped
Claude Blattman, AI Executive Assistantblogshipped
mattpaige68, Claude Code as Chief of Staffblogshipped
aaronjmars / aeon (self-healing morning loop)githubshipped
mimurchison / claude-chief-of-staff (config-as-files)githubshipped
anothercodingblog, Daily Brief on Routines (6 lessons)blogshipped
Channel, subagents + orchestrator patternblogshipped
marcos-narvaez / daily-briefing-agent (one prompt)githubshipped
ArtJack / email-agent (SQLite dedup, catch-up)githubshipped
aimaker, Claude cowork scheduled tasksblogshipped
the-nuanced-perspective, Chief of Staff in 45 minblogshipped
Serif (learns from Sent, graduated autonomy)productshipped
kkovacs / kklaw (inject-dir watcher)githubshipped
the-ai-corner, Claude Code Chief of Staffblogdemo/wip
affaan-m, chief-of-staff subagent (hooks over prompts)githubdemo/wip
MindStudio, EA with Claude Code + Workspaceblogdemo/wip

Generated by a 28-agent research workflow (6 parallel scouts, 20 deep-reads, synthesis + adversarial critic), 2026-07-01. Section 4 and the "how common" counts are not yet verified against our own code; treat them as leads, not facts.