Skip to content

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.

WorkflowTrigger phrasesOutputBuild order
brief.md”morning brief”, “what’s on today”outputs/briefs/YYYY-MM-DD-brief.mdThird
deck.md”build a deck from [outline]“outputs/decks/YYYY-MM-DD-[name].pptxFirst
reply.md”draft a reply to [thread]“outputs/drafts/YYYY-MM-DD-[recipient].emlSecond
triage.md”triage my inbox”Brief + per-email draftsFourth

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.

Every workflow file follows the same structure. The structure matters: it’s what makes Claude’s behaviour consistent run-to-run.

The phrases that should invoke this workflow. List variants — “morning brief”, “brief me”, “what’s on today” all map to the same workflow.

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.

Length limits, formatting constraints, what to flag and how. Output rules prevent the workflow from drifting into different shapes on different days.

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?”

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.

# Morning Brief Workflow
## Trigger
User says: "run the morning brief", "what's on today",
"morning brief", "brief me", or similar.
## Pre-flight check
1. 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 context
Load: role.md, priorities.md, people.md, projects.md,
templates/brief_format.md.
Do NOT load voice.md — not needed for a brief.
### 2. Pull calendar
Run scripts/pull_outlook.py with --mode=calendar --window=today.
If script fails, ask user to paste calendar manually rather than
fabricating 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 inbox
Run 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 owed
Check sent items from last 14 days for explicit commitments.
Cross-reference against today. Anything overdue → follow-ups.
### 5. Recommend focus
2-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 brief
Use templates/brief_format.md exactly. Save to
outputs/briefs/YYYY-MM-DD-brief.md AND print full brief to
terminal.
## 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 decks

deck.md, reply.md, and triage.md follow the same structure as the brief workflow above. The specifics of each:

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.

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.

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.