The workflows layer
Workflow files are the muscle memory of the command centre. Each one describes a repeatable task — what triggers it, what context to load, what steps to take, how the output should be shaped, and what to do when something goes wrong.
The four workflows below cover most operational work for a knowledge-work role. They’re built in a specific order because each builds on the previous: don’t try to write all four at once, and don’t write any of them speculatively.
The four workflows
Section titled “The four workflows”| Workflow | Trigger phrases | Output | Build order |
|---|---|---|---|
brief.md | ”morning brief”, “what’s on today” | outputs/briefs/YYYY-MM-DD-brief.md | Third |
deck.md | ”build a deck from [outline]“ | outputs/decks/YYYY-MM-DD-[name].pptx | First |
reply.md | ”draft a reply to [thread]“ | outputs/drafts/YYYY-MM-DD-[recipient].eml | Second |
triage.md | ”triage my inbox” | Brief + per-email drafts | Fourth |
Build deck.md first — it’s the lowest-stakes workflow with no Outlook dependency, so you get a working tool quickly while the integration questions resolve. Build triage.md last because it composes the others.
The shape of every workflow file
Section titled “The shape of every workflow file”Every workflow file follows the same structure. The structure matters: it’s what makes Claude’s behaviour consistent run-to-run.
Trigger
Section titled “Trigger”The phrases that should invoke this workflow. List variants — “morning brief”, “brief me”, “what’s on today” all map to the same workflow.
Pre-flight check
Section titled “Pre-flight check”What to verify before starting. Usually: the relevant context files exist and aren’t stale. For workflows that depend on scripts, verify the script is available.
Numbered, ordered, specific. Each step says what to load, what to do, and what to produce. Steps reference scripts and templates by path so Claude knows exactly where things live.
Output rules
Section titled “Output rules”Length limits, formatting constraints, what to flag and how. Output rules prevent the workflow from drifting into different shapes on different days.
Failure modes
Section titled “Failure modes”What to do when something goes wrong — empty inbox pull, missing context, conflicting signals. Without explicit failure modes, Claude either fabricates output or gives up silently. Both are worse than a structured “I tried X and got nothing — what do you want me to do?”
What this workflow does NOT do
Section titled “What this workflow does NOT do”The negative space. Sounds redundant but isn’t. Without it, the next time you ask “run the brief and reply to anything urgent”, Claude has no signal that those are two separate workflows.
Worked example: workflows/brief.md
Section titled “Worked example: workflows/brief.md”# Morning Brief Workflow
## TriggerUser says: "run the morning brief", "what's on today","morning brief", "brief me", or similar.
## Pre-flight check1. context/role.md, priorities.md, people.md, projects.md exist and have been updated within 60 days. If stale, flag at bottom of brief as a maintenance note.2. If user asked for a partial brief ("just my calendar"), skip non-applicable steps.
## Steps
### 1. Read contextLoad: role.md, priorities.md, people.md, projects.md,templates/brief_format.md.Do NOT load voice.md — not needed for a brief.
### 2. Pull calendarRun scripts/pull_outlook.py with --mode=calendar --window=today.If script fails, ask user to paste calendar manually rather thanfabricating meetings.
For each meeting, prep status:- ✓ ready: I have notes, recurring meeting, 1:1 with someone in people.md- ⚠ needs prep: external party, new client, or topic mapping to a project where I'd normally have materials but don't see them- ? unclear: can't tell from title and attendees. Don't guess — flag it.
### 3. Pull inboxRun scripts/pull_outlook.py with --mode=inbox --window=24h --unread.
Classify each into ONE bucket using priorities.md:- "Needs my judgement" — consequential decisions, ambiguous asks- "Reply today" — Tier 1- "Reply this week" — Tier 2- "FYI" — Tier 3 and auto-FYI- "Noise" — automated notifications, mass emails
Do NOT draft replies in this workflow. Brief only classifies.
### 4. Identify follow-ups owedCheck sent items from last 14 days for explicit commitments.Cross-reference against today. Anything overdue → follow-ups.
### 5. Recommend focus2-3 specific things to move forward today. Rules:- Meeting prep beats reactive email- Decisions that unblock others beat decisions that only affect me- Missed commitments beat opportunistic new work- Specific: "Decide on Acme RFP scope" beats "Work on RFP"
If the day is light, say so. Don't manufacture focus items.
### 6. Compose the briefUse templates/brief_format.md exactly. Save tooutputs/briefs/YYYY-MM-DD-brief.md AND print full brief toterminal.
## Output rules- Maximum 80 lines.- One-line context per email beats two-line.- Unknown senders flagged "[unknown sender — flagged for people.md update]".- Never invent meetings, senders, or commitments.
## Failure modes- Empty inbox pull: don't proceed silently — verify with user- Empty calendar on workday: same- Conflicting priority signals: trust content over rule, flag for priorities.md update- Same output two days running: suspicious, flag it
## What this workflow does NOT do- Does not draft replies (separate workflow)- Does not modify calendar or inbox (read-only)- Does not modify context/ files- Does not produce decksThe other three workflows
Section titled “The other three workflows”deck.md, reply.md, and triage.md follow the same structure as the brief workflow above. The specifics of each:
deck.md
Section titled “deck.md”Triggers on “build a deck from [outline]” or similar. Reads the input outline, identifies the deck type from cues (internal review, external client, executive summary), runs scripts/build_deck.py against templates/brand_template.pptx, and reports back the slide count plus any slides where the input was ambiguous and Claude made a choice.
Critical rule: for slides that need custom diagrams, Claude leaves a placeholder (“[INSERT: agentic flow diagram — build manually]”) rather than producing low-quality auto-generated visuals. Structure is what scripts handle well; visual finishing belongs in PowerPoint.
reply.md
Section titled “reply.md”Triggers on “draft a reply to [thread]”. Reads voice.md and anti-voice.md (this is one of the workflows that needs both), pulls the thread context, drafts the reply matching the recipient tier from priorities.md, and saves as a .eml file.
Critical rule: never sends. The output is always a draft you open in Outlook, edit if needed, and send manually.
triage.md
Section titled “triage.md”Composes brief.md and reply.md. Triggers on “triage my inbox”. Pulls unread mail, classifies each per priorities.md, then for each “Reply today” or “Reply this week” bucket invokes the reply workflow to produce a draft. Outputs a triage summary in the brief format showing what was drafted and what was flagged for your judgement.
Build this last because it depends on the other two being stable. Building it earlier means debugging three workflows simultaneously when something goes wrong.
Why workflow files belong here, not in CLAUDE.md
Section titled “Why workflow files belong here, not in CLAUDE.md”Workflow detail in CLAUDE.md would bloat the index file past the threshold where the model takes it seriously. Workflow detail in context/ would mix process with identity. The separate workflows/ folder is the right home: each file is loaded only when its trigger fires, and each file can grow detailed without affecting the others.
When a workflow file gets long enough to feel unwieldy (over 150 lines), the right move is usually to split a sub-task into its own workflow rather than to compress the existing one.