Why the morning brief is the right first automation CORE
Of the four patterns you will build in this module, the morning brief is the one most students find useful on the first day. There are three reasons to start here, and knowing them will help you not confuse this task with tasks it looks like but is not.
First, the morning brief has immediate payoff. The first time you wake up to a one-page summary of what’s in your inbox and on your calendar, with the three things that actually want your attention called out, you start the day already oriented instead of using the first stretch of it to triage. Students who build a weekly report first often abandon the module before the Sunday run happens; students who build the morning brief first read it tomorrow and come back excited.
Second, the morning brief exercises every part of the five-move loop. You have to plan the scope (which inbox label, which calendar), plan the artifact shape, wire the trigger, write the prompt, define the idempotency key (date), pick the delivery target, and design the log. If you can build a morning brief you can build the other three patterns in this module.
Third, the morning brief is the lowest-stakes place to make mistakes with scheduled agents, because the audience is literally you. The worst case for a bad morning brief is that you read it, notice it’s not useful, and re-prompt. There is no relational consequence, no outbound send, no third party. This is the right place to learn what the agent does well on a schedule and what it gets reliably wrong.
One thing to be honest about: a morning brief is not magic. An agent reading your inbox is not smart about your inbox the way you are. It will sometimes rank the wrong message at the top. It will sometimes miss the subtle line that mattered in a long thread. Your job in the first three days of running it is not to celebrate; it is to read critically and tighten the prompt. The activity below makes you run the brief three days in a row specifically so you can see what changes and what stays the same across runs.
The brief’s structure: five sections, reviewable at a glance CORE
A morning brief that follows a predictable structure is easy to scan, easy to trust, and easy to debug. A brief that is a wall of paragraphs is slower to read than the inbox it is supposed to save you from. Design the structure once; enforce it in the prompt; review the same shape every morning.
The five sections this course recommends — you may adapt them, but start here:
- Header line. One line. Run timestamp, today’s date, brief ID. The header lets you notice at a glance whether the brief you’re reading is today’s brief or yesterday’s. This is the observability minimum — every artifact in Module 6 opens with a header line.
- Three things that want your attention today. A numbered list, maximum three items. Each item is one sentence: what it is, why it matters today, what action it wants from you. “Draft due by 3 PM for Ms. Rivera’s class — thread is in agent-access/school with three open questions.” Not a paragraph. Not a section. One sentence per item, capped at three.
- Inbox summary for the bounded label. A categorized list of what’s in your agent-access label since yesterday’s run. Categories match the Module 5 shape — needs-reply, FYI, newsletter, waiting-on-me. Counts per category. No content yet — the counts and the one-line subjects only.
- Calendar preview — today and tomorrow. Today’s blocks and tomorrow’s blocks from your Agent Access calendar and any read-only calendars you have permitted the agent to see for conflict-checking. Flag any conflicts or back-to-back items under 15 minutes apart.
- Brief footer — health and honesty signals. What the brief could not do. “Three emails in the label had attachments the agent could not read.” “The agent was told not to open the thread with subject X because it contained a keyword in your sensitivity list.” “One calendar permission returned an error; conflict-check may be incomplete.” Explicit admissions of limits, so the reviewer knows where their own judgment has to fill in.
This structure has two properties the module cares about. It is bounded — the agent cannot produce a runaway wall of text even if it wants to, because the prompt caps sections two and three. And it is honest — the footer forces the agent to declare what it did not do, which is the single best defense against a brief that silently stopped working. If you stop seeing a footer, something changed.
The structure is also the scaffold for critical reading. When you read your brief at breakfast, you’re not reading it as prose; you’re auditing five specific sections. Section 2 wrong? Either your scope is wrong or the prompt’s “what wants your attention” heuristic is wrong. Section 3 wrong? Your label is likely misconfigured. Section 4 wrong? A calendar permission issue. Section 5 empty? The agent has lost the habit of admitting limits and the prompt needs a reminder.
The brief-shaping prompt: scope, sections, length, voice, honesty rails CORE
The prompt you write for a scheduled task is not a chat prompt. A chat prompt is a line you write once and iterate on in the same session. A scheduled prompt runs every day for weeks. It has to be precise enough to produce the same shape in the agent’s voice on Tuesday that it produced on Monday, even as the underlying data changes. This is a specific skill the module teaches, and the brief is the best place to learn it.
The five parts of a good scheduled prompt:
- Scope. Name the exact inputs. “Read the agent-access label for messages received since 18:00 yesterday. Read the Agent Access calendar and the primary calendar (read-only) for today and tomorrow.” Not “read my email.” The more specific the scope, the more stable the output.
- Sections. Name the output structure. “Produce a Markdown file with exactly five sections, in this order: Header, Three things that want my attention today (max 3 items), Inbox summary (categorized counts and one-line subjects), Calendar preview (today and tomorrow, flag conflicts under 15 minutes), Health footer (what you could not do).” List the sections; cap the lengths.
- Length. Put hard ceilings on the parts most likely to drift. “Three things section: exactly three items or fewer, one sentence each. Inbox summary: ten subject lines per category maximum. Calendar preview: one line per event.”
- Voice. Write one sentence about tone. “Direct. Not cheerful. Do not greet me. Do not sign off. No emojis.”
- Honesty rails. Explicit instructions about what counts as failure and how to surface it. “If any scope is unavailable, produce the brief anyway with the available sections and record the missing scope in the Health footer. If no new messages arrived, produce the brief anyway with zero-count sections. Never invent an item for section 2 to fill space. If fewer than three items warrant the top-three list, produce one or two, not three.”
Read those five parts again with the same skepticism you read the prompts in Modules 3, 4, and 5 with. Each part exists because a student shipped a scheduled task that failed that part’s test, and the prompt-rail was how they fixed it. The last one — never invent an item for section 2 to fill space — is a rail the course added after observing that agents will happily manufacture a third top-three item to match a request for three. Tell the agent not to.
The worksheet at morning-brief prompt template provides the template text. You will fill in the scope and the length numbers; the section shapes and the honesty rails are pre-written and should be used as-is in your first run.
The three-day read: what you are actually looking for CORE
The activity below asks you to run the brief three days in a row and review each one honestly. The purpose is not to confirm the brief works; it is to find the places where it silently misrepresents your day.
Specifically, read each day’s brief and ask:
- Did section 2 name the right three things? Not “were the three things accurate” — any three items in your inbox are accurate — but were those the three that would have wanted your attention if a careful human friend had summarized your day for you? If the brief put a newsletter in the top three and missed a teacher asking a direct question, your three-things prompt is wrong.
- Does the inbox summary match what you’d have said? Open your label, look at the same messages, and mentally categorize. Does your categorization match the agent’s? If not, the Module 5 label is probably the easier fix — the agent is categorizing correctly given what it sees; you just need to adjust what it sees.
- Is the calendar preview aware of commitments outside its scope? It cannot be. That is the point of the permission posture from Module 5. Note which conflicts the agent missed because they live on a calendar the agent does not read, and decide whether to extend scope (widen access) or to live with the gap (safer default).
- Did the footer actually say anything? A footer that reads “no issues” every day, every week, for a month is suspicious. Real briefs have small honest limits — attachments not read, a calendar permission briefly denied, a thread the agent refused to open. A footer that is always empty means the agent stopped reporting limits. Time to remind it.
- Did anything in the brief surprise you in a way that made you take action you would not have taken otherwise? This is the why you built it test. If after a week the brief has not once caused a single productive act you would not have otherwise done, the brief is cosmetic. Retire or re-scope.
You will tighten the prompt at least once during the three-day run. Keep a small prompt change log at the top of the register entry — one line per change, with the date and one sentence of reason. Students who change the prompt silently end up six weeks later unable to explain why their scheduled task does what it does.
Why the date is the idempotency key — and what the trap is CORE
Naming the idempotency key for a morning brief is easy: it’s the date. brief-2026-04-22.md. Re-run on the same day, overwrite. No confusion.
The trap is subtler. The date-as-key works only if the run time zone is stable. If your scheduler fires in local time and you travel to a different time zone, a run at “06:30 local” produces a file stamped with one date; a run triggered at “06:30 local” the next day in the new zone may straddle the date boundary and produce a file with an unexpected name, or with the same name as an earlier run. Students who travel across time zones during the module occasionally produce double briefs or missed briefs for this reason.
The fix is simple: pick one time zone as the canonical one — usually the student’s home time zone — and compute the brief’s date from it explicitly, regardless of where the machine is. The recipe does this for you in both paths. You do not need to do the conversion math; you do need to know why the prompt names a time zone and why you should not change it casually.
A second smaller trap: if the brief’s run skips a day (laptop asleep, scheduler not running), the next run should not try to “catch up” by producing two briefs. It should produce today’s brief and leave a note in section 5: “Yesterday’s run did not fire.” This is a form of idempotency too — the task’s intent is produce today’s brief, not ensure the last N days have been briefed. The prompt enforces this.
Primary path — Morning brief in the Cowork tab (chat-shaped) RECIPE
| Tool | Claude desktop app — Cowork tab's scheduled tasks (primary). Optional advanced: Claude Code CLI + cron / launchd / Task Scheduler. |
| Last verified | 2026-04-17 |
| Next review | 2026-07-17 |
| Supported OSes | macOS, Windows (Claude desktop app) |
- Open the Claude desktop app and switch to the Cowork tab. Start a new session called something like “Morning brief — setup.”
- Paste the prompt template. Use the morning-brief prompt template. Fill in the scope block with your agent-access label name and your Agent Access calendar name. Fill in the length numbers if you want to change the defaults. Do not edit the honesty-rails block.
- Confirm the agent understands the output shape. Ask the agent, in chat: “Summarize the output contract you will follow for this scheduled task.” It should name the five sections, the idempotency key (brief-YYYY-MM-DD.md), the audience (me only), and the honesty rails. If it does not, stop and fix the prompt.
- Choose the delivery target. Create a folder on your machine at ~/ai-architect-academy/automation/briefs/ (or C:\Users\<you>\ai-directed\automation\briefs\ on Windows). Tell the agent this is the brief’s destination and that the filename is brief-YYYY-MM-DD.md computed in your home time zone.
- Turn the session into a scheduled task. Use the Cowork tab's Save as scheduled task action. Set the schedule to daily at 06:30 local. Name the task Morning brief. Save.
- Run once on-demand. Trigger the task immediately as a dry run. Open the produced file. Read every section. Check the header line’s timestamp; check section 5 reports at least one honest limit (there will almost always be something it could not do).
- File register entry 1 (draft). Add a row to automation-register-v1-draft.md using the row template. Mark last success with today’s date if the dry run produced a correct-shape artifact. Set next review for 60 days from today.
Troubleshooting
If the dry run produces a brief with four sections instead of five, the prompt’s section list was not strict enough — re-state the list as a numbered, named checklist. If section 2 shows “no top-three items,” that is a correct output on a quiet day, not a failure; verify by reading the inbox yourself.
Optional advanced — Morning brief via the Claude Code CLI + a local OS scheduler (scriptable) RECIPE
For terminal-comfortable students who want a scriptable, version-controllable, repo-checked-in path. The Cowork-tab path above is enough to complete this lesson and the rest of Module 6; skip this whole section if scripted automation isn't a goal you have.
| Tool | Claude Code CLI + cron (macOS / Linux), launchd (macOS alt), Windows Task Scheduler |
| Last verified | 2026-04-17 |
| Next review | 2026-07-17 |
| Supported OSes | macOS, Linux, Windows |
Before you begin — vocabulary you'll hit
The scheduler step uses syntax that looks cryptic on first encounter. Three short primers so the steps below land cleanly:
Cron's five-position time syntax: minute hour day-of-month month day-of-week. Star (*) means “every.” Examples:
- 30 6 * * * = at minute 30 of hour 6, every day → every day at 6:30 AM
- 0 18 * * 0 = at 6:00 PM Sunday (Sunday is day-of-week 0)
- 0 */4 * * * = every 4 hours on the hour
Shell operators in the cron command:
- && runs the next command only if the previous one succeeded.
- >> appends output to a file (instead of overwriting).
- 2>&1 redirects error messages (stream “2”) to the same place as normal output (stream “1”). Together with >>, the effect is “append both normal output and errors to log.txt.”
crontab -e and the vi problem. crontab -e opens whatever editor your EDITOR environment variable points to — by default that's vi, which is famously hard to exit if you've never used it. Two ways through:
- Set a friendlier editor first: run export EDITOR=nano (or EDITOR=code if you want VS Code to open) before crontab -e.
- Or learn the two vi commands you actually need: press Esc to leave whatever mode you're in, then type :wq and press Enter to save and quit. To quit without saving: Esc then :q! then Enter.
.plist files (launchd). A plist (property list) is Apple's XML config format. Every launchd job is described by a plist file in ~/Library/LaunchAgents/. The recipe ships a complete template — you fill in three fields (label, program path, schedule) and run launchctl load <file> to register it. You don't write plists from scratch.
Windows Task Scheduler. A graphical app — open from Start menu, search “Task Scheduler.” Three concepts: Trigger (when the task fires), Action (what it does — usually “Start a program”), and Conditions (extras like “only when AC powered”). Use “Create Basic Task” wizard the first time.
Steps
- Create the automation folder. mkdir -p ~/ai-architect-academy/automation/morning-brief/, and inside it create prompt.md (the full prompt from the template) and run.sh (or run.ps1 on Windows) that invokes Claude Code with the prompt and the scoped tools. The recipe book ships both scripts.
- Set the output path. The script writes to ~/ai-architect-academy/automation/briefs/brief-$(date +%Y-%m-%d).md — the date is computed in the canonical time zone via a TZ= prefix on macOS/Linux or an explicit Get-Date format on Windows.
- Test the script by hand. Run ./run.sh (or ./run.ps1) manually. Confirm the file lands at the expected path with the five-section shape. Do not proceed until a hand-run succeeds. If the hand-run fails, copy the error output and paste it to the agent — fixing a hand-run with the agent's help is fast; chasing a silent overnight failure on Day 5 is not.
-
Add the scheduler entry.
- macOS / Linux cron: crontab -e and add 30 6 * * * cd ~/ai-architect-academy/automation/morning-brief && ./run.sh >> ./log.txt 2>&1. The >> ./log.txt 2>&1 tail is your log.
- macOS launchd (preferred if you expect to close the lid often): write a .plist at ~/Library/LaunchAgents/ai-directed.morning-brief.plist per the recipe; launchctl load it.
- Windows Task Scheduler: create a daily trigger at 06:30, action = powershell.exe -File ...run.ps1; set “Start in” to the automation folder.
- Verify with a first scheduled run. Wait for the next 06:30 (or force-fire the task through the scheduler UI). Confirm the artifact lands. Confirm the log file grew a line.
- File register entry 1 (draft). Same row template as the primary path, but in the Scope column record the script's location so future-you can find it.
Troubleshooting
If the cron job “runs” but produces nothing, the most common cause is the script inheriting a different PATH than your interactive shell. Fix by sourcing your shell profile inside run.sh or by using absolute paths to claude and any other binaries. Check log.txt for the actual error message.
Try it — Three-day morning-brief run RECIPE CORE
tracked in automation-register-v1-draft.md
Day 0 — setup.
- Take the primary Cowork-tab path (or the Optional Advanced CLI sidebar if you opened it). Complete the setup steps through to a successful dry run. Confirm brief-YYYY-MM-DD.md landed at the expected path with a five-section shape. Confirm section 5 is not empty.
- File register entry 1 with every column populated. Leave last success blank until Day 1.
Day 1 — first scheduled run.
- Read the brief within two hours of waking up. Do not skim. Read every section.
- Write a three-sentence review at the bottom of today’s brief file: one sentence on what the brief got right, one on what it got wrong, one on what you will change in the prompt before tomorrow.
- If the change is worth making, make it today. Log the change as a one-line entry in the register’s prompt-change-log column: 2026-04-22 — tightened section 2 to require at least one non-newsletter item.
Day 2 — second scheduled run with revised prompt.
- Read the brief. Write the three-sentence review again.
- Compare Day 1 and Day 2’s top-three lists. Did the prompt change help, hurt, or do nothing?
Day 3 — third scheduled run, decision point.
- Read the brief.
- Answer the reflection question below in the register entry under a Three-day retrospective heading: is this task worth keeping on the schedule? What would the brief need to do differently to be clearly worth keeping?
Deliverable. Three dated brief artifacts in /capstone/automation-artifacts/briefs/, each with its three-sentence review. Register entry 1 complete, with last success on Day 3, a populated prompt-change log, and the three-day retrospective filled in.
Done with the hands-on?
When the recipe steps and any activity above are complete, mark this stage to unlock the assessment, reflection, and project checkpoint.
Quick check
Five questions. Tap a question to reveal the answer and the reasoning.
Show explanation
Answer: C. A is occasionally true but not the reason. B is sometimes true and sometimes not. D is false — Lesson 6.3 builds exactly this. The three reasons in C are what make the brief the pedagogical on-ramp; a student who builds a weekly report first often abandons the module before the first Sunday run.
Show explanation
Answer: C. The footer exists to make silent failures visible. A footer that is never empty is healthier than a footer that is always empty — “no issues” forever usually means the agent stopped reporting limits. A, B, and D are precisely the kinds of content the brief should refuse to produce under Lesson 6.2’s voice rail.
Show explanation
Answer: B. The “exactly three” framing is the bait; an obedient agent fills the slot. The anti-confabulation rail explicitly overrides “exactly three” and tells the agent it is allowed — required — to produce fewer. This is the specific prompt-rail the Module 6 template ships with because of how often this failure mode occurs in student briefs.
Show explanation
Answer: B (with caveats). Cron fires in the machine’s local time, so it fires at 06:30 Pacific. The date the filename resolves to depends on whether you computed date in the canonical home zone or in local time. If you used local time, the filename will straddle date boundaries and can overwrite. The recipe’s TZ= fix pins the date to your canonical zone so travel is harmless. A, C, D describe different failure modes that would require specific misconfigurations.
Show explanation
Answer: C. An always-empty footer across three days of real inbox and calendar data is a signal, not a success. There is almost always something the agent did not do — an attachment it cannot read, a permission that’s noisy, a thread that tripped a sensitivity keyword. The right response is to reinforce the rail, not relax it.
Reflection prompt
Is the brief earning its spot on your schedule?
In 6–8 sentences, answer: After three days of running your morning brief, what did you actually learn about how the agent reads your inbox and your calendar? Name one thing it got reliably right. Name one thing it got reliably wrong. Did the brief change your behavior in the first three days — did you do something on a specific day because the brief flagged it, and did that something actually matter? If you had to keep only one of the five sections, which would you keep, and why?
Answer the last question first in your head before you write. The section you would keep reveals why you built the brief.
Project checkpoint
File register entry 1 and archive three dated briefs.
Open automation-register-v1-draft.md and add register entry 1: Morning brief. Fill in every column. Last success = the most recent day of the three-day run that produced a correct-shape artifact. Next review = 60 days from today. Retirement trigger = “I have read fewer than two of the last ten briefs” (or your own equivalent). Prompt change log = your one-line entries from the three-day run, dated.
Copy the three brief artifacts into /capstone/automation-artifacts/briefs/. Keep them — Lesson 6.5 will audit them alongside every other artifact in the module.
Do not proceed to Lesson 6.3 until entry 1 is complete and three dated brief files are saved.
Next in Module 6
Lesson 6.3 — Weekly reports and the research refresh.
Step up from daily to weekly. Build a Sunday report with an evidence-linked “Shipped this week” section, a scheduled research refresh that keeps a latest.md symlink up to date, and an ISO-week idempotency key. Register entries 2 and 3 go in.