Orchestration by convention, not by supervisor CORE
Lesson 8.3’s Claude Code pipeline had a live supervisor — the parent session. The parent read the blueprint, dispatched subagents, verified outputs, and stopped on failure. That supervisor existed, in process, the entire time the pipeline was running. You could interrupt it. You could watch it.
Cowork’s scheduled-task pipeline has no such process. There is no single program sitting above the pipeline reading the blueprint and dispatching. Instead, there is a set of scheduled tasks — independent jobs, each with its own schedule, each invoking its own skill, each writing to and reading from agreed-upon folders. The orchestration is not a thing that runs; it is a thing you arranged at authoring time, by choosing the schedules and the folder convention.
This sounds weaker than the Claude Code model, and in some ways it is. There is no live verification between stages; if the research task produces garbage at 6:00 a.m., the summarizer task at 6:10 a.m. will happily consume the garbage and produce garbage-shaped output. Nothing will stop it, because nothing is watching. This is the trade you make for the Cowork path.
In exchange, you get three things that matter for certain kinds of pipelines:
- The pipeline runs without you. The Claude Code parent session requires you to be there, typing the invocation. The Cowork pipeline fires whenever its schedule fires, whether or not you are at the machine. This is the whole point of a cadence-driven pipeline — you are reading its output at breakfast, not running it at breakfast.
- Each stage is legible on its own. Each scheduled task has its own run log, its own input folder, its own output folder. You can read the state of the pipeline by opening folders; you do not need a parent-session transcript to reconstruct what happened. The tradeoff is that between-stage verification has to live somewhere other than a running supervisor — typically as the first step of each downstream task’s skill.
- Failures are recoverable by folder. If the 6:00 a.m. research task produced bad output, you can fix the research skill, drop a corrected sources.md into the folder, and let the 6:10 a.m. summarizer task fire normally. The pipeline does not need to be re-orchestrated top-down; each stage is independent enough to be re-run on its own.
The choice between the two paths is not “which is better.” It is “which shape fits the goal.” An on-demand research brief wants a parent session. A daily briefing that lands in your inbox folder at 6 a.m. wants chained scheduled tasks. Lesson 8.4 is asking you to build the same blueprint on the Cowork path so that you have both in your hands when you pick in Part 4.
What replaces the supervisor: verification in each task CORE
A Cowork pipeline still needs verification between stages, or it will quietly corrupt downstream output the way Content Block 1 described. The verification has to live somewhere. Without a parent session, the natural place is the first step of each downstream task’s skill.
A scheduled task that has been authored to check its own upstream input begins its work with something like:
- Read the previous stage’s output file at the expected path.
- Check each success criterion from the handoff contract (file exists, required sections present, length band satisfied, etc.).
- If any criterion fails, write a status file to 00-status/<stage>-skipped.md explaining which criterion failed, and exit without doing the stage’s real work.
- Otherwise, proceed with the stage’s real work.
This pattern — self-verifying stages — is the Cowork equivalent of the parent session’s “check before dispatch” step. It lives in the skill, not in an orchestrator. Because it lives in the skill, you write it once per stage, not once per pipeline: if the same skill is used across five different scheduled pipelines, its self-verification travels with it.
A pipeline built this way has two failure-visibility helpers:
- The 00-status/ folder is the ground truth of what ran. Each task writes a status file: <stage>-completed.md, <stage>-skipped.md, or <stage>-failed.md. A glance at 00-status/ tells you whether the pipeline ran cleanly today without opening any of the intermediate files.
- A summary task (optional but recommended) runs last and consolidates. A final scheduled task, thirty seconds of work, reads every status file and writes 00-status/pipeline-<date>.md summarizing which stages completed, which skipped, which failed. It is the Cowork equivalent of the parent session’s pipeline-complete.md.
You will build the self-verification into your skills in Part 1 of the activity. The pattern is short, repetitive, and essential. Do not skip it — without it, the Cowork path is measurably weaker than the Claude Code path, in exactly the way Content Block 1 warned.
Step 1 — Define the shared folder convention
Before creating any scheduled task, decide on the pipeline name and the stage folders. For the daily briefing:
/pipeline/daily-briefing/<YYYY-MM-DD>/00-status/
/pipeline/daily-briefing/<YYYY-MM-DD>/01-research/
/pipeline/daily-briefing/<YYYY-MM-DD>/02-summary/
The date-folder is created by each stage if it does not already exist (each skill does mkdir -p on its own output folder as its first action). This is what lets the three tasks coordinate without a live supervisor — they all know the naming rule.
Step 2 — Create Task A (morning-research)
Using the create_scheduled_task tool (canonical flow in the Recipe Book), schedule morning-research to fire daily at 6:00 a.m. The task prompt is short and points at your Module 7 research plugin skill:
Invoke the <your-plugin>:research-sweep skill with:
- Topic: <your standing topics list>
- Output path: /pipeline/daily-briefing/<today>/01-research/sources.md
The skill's output contract is the Module 8
research → summary handoff contract in the
pipeline blueprint.
On completion, write
/pipeline/daily-briefing/<today>/00-status/research-completed.md
with the timestamp and source count.
On failure, write
/pipeline/daily-briefing/<today>/00-status/research-failed.md
with the failure reason.
Where <today> is resolved at runtime by the task’s date-substitution (the Recipe Book covers the exact syntax — typically {{today}} or an equivalent placeholder).
Step 3 — Create Task B (morning-summarize)
Scheduled for 6:08 a.m. — eight minutes after Task A, to leave comfortable room for Task A to finish. The task prompt has the self-verification block on top:
Read /pipeline/daily-briefing/<today>/01-research/sources.md.
First, verify the file exists and matches the
research → summary handoff contract:
- File exists.
- ## Summary section is 100–300 words.
- ## Key sources has ≥ 3 bullets each with a URL.
If any check fails, write
/pipeline/daily-briefing/<today>/00-status/summary-skipped.md
explaining which check failed. Stop.
Otherwise, invoke <your-plugin>:summarize skill with:
- Input path: /pipeline/daily-briefing/<today>/01-research/sources.md
- Output path: /pipeline/daily-briefing/<today>/02-summary/summary.md
On completion, write
/pipeline/daily-briefing/<today>/00-status/summary-completed.md.
On failure, write summary-failed.md with the reason.
Notice the self-verification block — this is the Content Block 2 pattern, in the task prompt rather than in a parent session. The task will run whether or not Task A succeeded; it is the self-verification that keeps a failed Task A from silently corrupting the rest of the pipeline.
Step 4 — Create Task C (morning-briefing)
Scheduled for 6:15 a.m. Same self-verification pattern as Task B, reading both prior stages, producing the final briefing. Writes the consolidated pipeline-<date>.md to 00-status/.
Step 5 — First invocation
Rather than waiting for 6:00 a.m. tomorrow, use the run now option on Task A (the list_scheduled_tasks and update_scheduled_task tools expose a manual-fire mechanism; the exact button name is in the Recipe Book). Watch the /pipeline/daily-briefing/<today>/ folder populate. Then fire Task B manually; then Task C. You are simulating the timed sequence as a single burst, which is enough for the first invocation’s trace.
Step 6 — Save the trace
Save each task’s run log (Cowork exposes these through the scheduled-tasks UI) to /capstone/pipeline-v1-draft/traces/cowork/2026-04-XX-invocation-1/. Also copy the entire /pipeline/daily-briefing/<today>/ folder into the same traces folder. The Cowork trace format is slightly different from the Claude Code one — it is three run logs plus the folder snapshot rather than one parent transcript plus a folder snapshot — but the completeness target is the same: anyone reading the trace in three months can reconstruct what happened.
Picking the frozen path CORE
At this point you have two working (or partially working) pipelines implementing the same blueprint. The Module 8 capstone requires one frozen pipeline. Pick by the goal’s shape, not by which path felt easier.
The two simple rules:
- On-demand, goal-bounded pipelines live on Claude Code. You invoke the parent session when you want the output. The pipeline produces one artifact per invocation. You run it maybe twice a week. Examples: drafting a paper, producing a research brief for a project, reviewing a pull request.
- Scheduled, cadence-driven pipelines live on Cowork. The pipeline fires on a timer. You read the output at a regular time. It runs whether or not you are at the machine. Examples: a daily briefing, a weekly status digest, a morning inbox summary, a monitoring alert.
If your goal is ambiguous — it could be run on demand or on a schedule — default to Claude Code. The live supervisor makes debugging easier, and debugging is where most of your Module 8 time will go. You can always promote a working Claude Code pipeline to a scheduled one later, once its behavior is predictable. Promoting the other direction (fixing a schedule-only pipeline you cannot watch run) is harder.
Once picked:
- Move the picked path’s files to /capstone/pipeline-v1/. This includes: subagent folders or scheduled-task definitions, any skills the pipeline relies on, the blueprint (now dropping its -draft suffix), the traces folder, and the before/after block.
- Leave the other path’s files where they are, under /capstone/pipeline-v1-draft/. Rename the folder for clarity — for example, /capstone/pipeline-v1-draft/claude-code-sibling/ or /capstone/pipeline-v1-draft/cowork-sibling/. The sibling is not part of the frozen capstone but is preserved as learning evidence.
- Update /capstone/pipeline-v1/blueprint.md with a single new line at the top of the Next review section: the date 90 days from today. The budget and kill-switch placeholders stay empty for now — Lesson 8.5 fills them.
If both paths are half-working
That is a common end-state for Lesson 8.4. The module does not require both paths to be polished; it requires one path to be picked and moved to the frozen location, and the other to be preserved as a sibling trace. If the picked path is still rough, that is fine — Lesson 8.5 is where final polish, cost estimation, and the kill switch live. If both paths are materially broken, extend your schedule and re-run the tightening loop on the path that fits the goal’s shape before moving on. A broken frozen pipeline is worse than a half-picked one.
Walkthrough: the daily briefing pipeline RECIPE
Recipe Book · versioned · chaining-scheduled-tasks-in-cowork-tab.md
| Recipe | Chaining scheduled tasks in the Cowork tab |
| Path | /recipe-book/chaining-scheduled-tasks-in-cowork-tab.md |
| Tools used | create_scheduled_task, list_scheduled_tasks, update_scheduled_task |
| Refresh cadence | Quarterly; re-verified when scheduled-tasks UI version changes |
The reference walkthrough is a three-stage sequential pipeline on a scheduled cadence — the same sequential shape as Lesson 8.3, implemented on the Cowork path:
- Task A — 6:00 a.m. daily — morning-research: invokes your Module 7 plugin’s research skill to gather the day’s research on a small set of standing topics and write sources.md to the research folder.
- Task B — 6:08 a.m. daily — morning-summarize: reads sources.md, produces summary.md in the summary folder, writes a line to 00-status/summary-completed.md (or skipped / failed).
- Task C — 6:15 a.m. daily — morning-briefing: reads both prior stages, produces a single briefing.md in your chosen reading folder, writes the overall 00-status/pipeline-<date>.md.
A student whose Module 8 goal is already cadence-shaped can adapt this walkthrough directly. A student whose goal is on-demand should still do the walkthrough, but with a lighter-weight sibling goal rather than forcing their on-demand goal into a schedule.
Adapt the walkthrough to your own pipeline RECIPE
The reference pipeline is research → summarize → briefing on a daily cadence. Adapt as follows:
- Substitute your stages. If your goal is weekly not daily, use <YYYY-WW> folders instead of <YYYY-MM-DD>. If your goal has two stages not three, you have one fewer scheduled task (and one fewer handoff contract from Lesson 8.2 to enforce). If your goal has different stages entirely — triage → reply-draft, monitor → alert, collect → categorize → archive — substitute stage names and reorder as needed. The folder convention and self-verification pattern stay the same.
- Substitute your skills. Each scheduled task invokes one Module 7 plugin skill. If you do not have a skill that does a stage’s work, the fix belongs in Module 7, not here — either author a new skill per Module 7 Lesson 7.3, or find an off-the-shelf skill per Lesson 7.2. Do not paper over a missing skill with a long ad-hoc task prompt; that is how skill pile-up starts. Tight scheduled tasks invoke tight skills.
- Substitute your stagger intervals. The reference pipeline leaves 8 minutes between Task A and Task B, and 7 minutes between Task B and Task C. For a small daily briefing, this is plenty. For a pipeline where Task A is a heavy research sweep that might take 15 minutes, bump the stagger to 20 minutes. The stagger needs to be comfortably longer than the worst-case runtime of the upstream task, not exactly as long. A stagger that is too short will sometimes cause Task B to read a half-written sources.md; a stagger that is too long is harmless. When in doubt, stagger generously.
- Substitute your topic / input. The first invocation should run against real input (a real set of topics you actually want briefings on, real triage criteria, a real calendar window). Test topics produce test-shaped traces that teach you nothing about whether the pipeline is useful.
Run the manual invocation, save the trace, then let it run on schedule for one actual cadence before Part 3 of the activity. This matters — the second invocation should be a real scheduled run, not another manual fire, so the trace shows what actually happens when you are not at the machine.
Two-round tightening on the Cowork path RECIPE
The two-round tightening loop from Lesson 8.3 applies on this path too, with three Cowork-specific notes.
Round 1 — Read the trace, find the weakest handoff. The Cowork trace is three run logs plus the folder snapshot. Read the run logs in order; when something looks off, go to the folder snapshot and read the actual file. The weakest handoff is almost always the one where the intermediate file has a shape the downstream skill was not prepared for. Tighten the handoff contract and the upstream skill’s output section to match.
Cowork-specific note 1 — Skills, not agents. On the Claude Code path, the “round 1” target was the upstream subagent’s system prompt. On the Cowork path, the target is the upstream skill (the Module 7 plugin skill the task invokes). If the fix is small (clarify the output section), update the skill directly and bump its changelog. If the fix is large (the skill needs new capability), it may be a skill-authoring issue that belongs back in Module 7 — the skill is the reusable unit, and tightening it benefits every pipeline that uses it, not just this one.
Cowork-specific note 2 — Self-verification is your main diagnostic. On the Claude Code path, failures showed up as the parent session stopping. On the Cowork path, failures show up as <stage>-skipped.md or <stage>-failed.md files in the status folder. If your status folder shows skipped stages every day and you did not expect them to skip, the upstream skill’s output is failing the handoff contract. This is usually the first place to look.
Cowork-specific note 3 — Staggers are part of tightening. If Task B is skipping because Task A is still running at 6:08 a.m., the fix might not be in any contract or skill — it might be that your 8-minute stagger is too short. Bump it to 15 minutes. Save yourself an afternoon of contract-tuning for a problem that was timing all along. This failure mode is unique to the Cowork path; the Claude Code parent session does not have timing in the same sense.
Capture invocation 2’s trace under /capstone/pipeline-v1-draft/traces/cowork/2026-04-XX-invocation-2/. Write the before/after block in the same traces folder. Same five-element completeness as Lesson 8.3.
Build, invoke, tighten, pick
Deliverables: scheduled-task definitions, two captured traces, a before/after block, and the path-picking decision.
Part 1 — Build
Following Content Blocks 3 and 4:
- Define the shared folder convention for your pipeline. Create the status folder structure.
- Create each scheduled task via create_scheduled_task. Each task prompt has two sections: the self-verification block (read the upstream output, check each success criterion from the relevant handoff contract, write skipped/failed status if any check fails) and the skill-invocation block (call the Module 7 plugin skill with the appropriate input and output paths). Write the status-completed file on success.
- Set generous stagger intervals (comfortably longer than each upstream task’s worst-case runtime).
- Verify the task definitions are correct with list_scheduled_tasks before firing anything.
Part 2 — Invoke manually, then on schedule
First, fire Tasks A, B, and C manually in order (the scheduled-tasks UI has a run now option). Watch the /pipeline/<name>/<today>/ folder populate. Save the run logs plus the folder snapshot to /capstone/pipeline-v1-draft/traces/cowork/2026-04-XX-invocation-1/.
Then — and this is the step you will be tempted to skip — wait for the next scheduled cadence and let it run on its own. For a daily pipeline, this is tomorrow morning. For a weekly pipeline, this is the next cadence day. Save the run logs plus folder snapshot from the scheduled run as invocation-2/. The second invocation showing the pipeline running without you is the evidence that the Cowork path actually works for your goal.
If you cannot wait for the cadence (e.g., the schedule is weekly and you are in a crunch), fire the pipeline manually a second time at least 24 hours after the first, so the date-folder changes. A same-day second manual fire is a degraded trace; the intent of invocation 2 is to see the pipeline run against a different date’s input.
Part 3 — Tighten
Following Content Block 5’s Cowork notes: find the weakest handoff, tighten the upstream skill or the contract, bump the stagger if timing is the problem. Write the before/after block in /capstone/pipeline-v1-draft/traces/cowork/before-after.md.
Part 4 — Pick the frozen path
Apply the Content Block 6 rule:
- Is your goal on-demand, goal-bounded, run when you want the output? → Claude Code is the frozen path.
- Is your goal scheduled, cadence-driven, run without you? → Cowork is the frozen path.
- Ambiguous? → Claude Code, by default.
Move the picked path’s files to /capstone/pipeline-v1/. Rename the other path’s folder to claude-code-sibling/ or cowork-sibling/ under pipeline-v1-draft/. Update the blueprint’s filename (drop the -draft suffix), and leave the budget / kill-switch / next-review placeholders for Lesson 8.5.
Write a short path-picking decision block at the top of /capstone/pipeline-v1/blueprint.md — three sentences, one each for the goal shape, the path picked, and what the sibling path demonstrated about this pipeline that the picked path did not. This is the evidence you considered both paths rather than defaulting to whichever was easier.
If invocation 2 on Cowork never completes
Sometimes the first real scheduled run surfaces a problem you did not see in the manual fire — permissions, path resolution, a skill that behaves differently outside a live session. Do not panic. Save what you have, including the failure evidence, and note in the before/after block that invocation 2 surfaced a different class of issue than invocation 1. If the pipeline’s goal is scheduled, you must resolve the issue before Lesson 8.5 — a cadence pipeline that does not actually run on cadence is not a frozen pipeline. If the goal is on-demand, you can pick the Claude Code path and carry the Cowork attempt as the sibling trace, with a short note explaining that the Cowork issue is why.
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
Four questions. Click each to reveal the answer and the explanation.
- (A) Nothing verifies — Cowork tasks are independent and trust their inputs.
- (B) A dedicated verifier task that runs between each dispatch.
- (C) A self-verification block at the start of each downstream task's skill, which reads the upstream output, checks the handoff contract's success criteria, and writes a skipped-status file and exits if any criterion fails.
- (D) The Cowork platform validates handoff contracts automatically.
Show explanation
Answer: C. A self-verification block at the start of each downstream task’s skill, which reads the upstream output, checks the handoff contract’s success criteria, and writes a skipped status file and exits if any criterion fails.
Why: (A) “nothing verifies” is the failure mode this lesson is warning against. (B) a dedicated verifier task adds orchestration surface without benefit; the verification belongs inside the downstream skill where the knowledge of the contract already lives. (D) the platform does not know the pipeline’s contracts. The correct pattern is self-verification at the top of each downstream skill.
- (A) Claude Code — it feels more flexible for this kind of work.
- (B) Cowork — the goal is scheduled, cadence-driven, and runs whether or not you are at the machine.
- (C) Claude Code — orchestration always belongs in a live session.
- (D) Either path is fine; the choice does not meaningfully change the result.
Show explanation
Answer: B. Cowork — the goal is scheduled, cadence-driven, and runs whether or not you are at the machine.
Why: The goal shape is unambiguously scheduled and ambient — you want the briefing waiting for you at 7 a.m., not to be there typing a prompt. Cowork is designed for exactly this. (A) picks by vibe, not goal shape. (C) over-generalizes “orchestration belongs in a live session.” (D) misses that the path does affect how debuggable, legible, and cadence-appropriate the pipeline is.
- (A) Rewrite Task B's skill so it can work with partial input from Task A.
- (B) Delete both scheduled tasks and recreate them from scratch.
- (C) Increase the stagger — move Task B's firing time to 6:15 or 6:20, generously longer than Task A's worst-case runtime.
- (D) Add a retry loop in Task B that re-runs until Task A's output is available.
Show explanation
Answer: C. Increase the stagger — move Task B’s firing time to 6:15 or 6:20, generously longer than Task A’s worst-case runtime.
Why: The symptom is a timing mismatch: Task A is not done when Task B fires, so Task B’s self-verification correctly catches the bad handoff and skips. The fix belongs in the pipeline arrangement, not in the skills or the verification. (A) rewriting Task B’s skill to handle partial input hides the bug by weakening verification. (B) deleting and restarting is a sledgehammer. (D) retry loops introduce runaway risk. “Stagger generously” is Module 8’s standard move for this shape of failure.
- (A) Freeze both pipelines as separate v1 artifacts; the choice can come later.
- (B) Freeze the path you enjoyed working on more.
- (C) Freeze the Claude Code path because the goal is on-demand; move the Cowork attempt to pipeline-v1-draft/cowork-sibling/ as a preserved learning trace.
- (D) Freeze whichever path took less effort to get working.
Show explanation
Answer: C. Freeze the Claude Code path because the goal is on-demand; move the Cowork attempt to pipeline-v1-draft/cowork-sibling/ as a preserved learning trace.
Why: The Module 8 capstone requires one frozen pipeline, picked by the goal’s shape. A one-shot research brief is on-demand, which is Claude Code’s natural home. The other path is not deleted; it is preserved as a sibling learning trace, evidence that the student considered both paths. (A) freezing both inflates scope. (B) picks by vibe. (D) picks by effort, not by fit.
Reflection prompt
Write a short paragraph (4–6 sentences) in your journal or my-first-loop.md:
What did building the same pipeline twice — once with a live supervisor, once by schedule-and-convention — teach you about orchestration that you did not see from either path alone? Which path turned out to be the easier fit for your goal’s shape, and which one surfaced a kind of problem you had not expected (timing, skill gaps, verification blind spots)? If you were helping another student pick a path for their goal, what one question would you ask them?
No length minimum past four sentences; no length maximum. The purpose is to make the goal-shape-picks-path move conscious, not intuitive.
Project checkpoint
By the end of this lesson, you should have:
- Scheduled-task definitions for every stage of your Cowork pipeline, each with a self-verification block and a skill-invocation block.
- Two captured Cowork traces under /capstone/pipeline-v1-draft/traces/cowork/, each with run logs and a shared-state folder snapshot. One of the two should be a real scheduled run (not manually fired).
- A Cowork before/after block documenting the change between invocation 1 and invocation 2.
- A picked frozen path, with files moved to /capstone/pipeline-v1/ and the other path preserved as a sibling under pipeline-v1-draft/claude-code-sibling/ or pipeline-v1-draft/cowork-sibling/.
- A path-picking decision block at the top of /capstone/pipeline-v1/blueprint.md naming the goal shape, the picked path, and what the sibling demonstrated.
Next in Module 8
Lesson 8.5 — Runaway prevention and the freeze.
The three shapes of runaway — depth, fan-out, retry — and the one rail each. Run the pre-flight cost estimate, practice the kill switch once under no pressure, complete the nine-check Runaway audit, and freeze /capstone/pipeline-v1/ as the eighth capstone artifact with budget, kill switch, and a 90-day next-review date filled in.