How to harden the Briefing routine template Anthropic ships eight free starter templates on the Templates tab at claude.ai/code/routines, and a worked example shows how to harden the Briefing template against four silent failures: a dead calendar connector rendering as an empty schedule, a 7am brief produced at 11pm and still written in the present tense, three overlapping meetings compressed into "a busy morning", and runs that leave no trace. The hardened prompt adds a clock step that flags runs more than 3 hours late and skips the focus section after 18:00 local, records each source as either "read: items" or "unavailable: ", and applies eight checks including idempotency via a slot-derived run-id, an OK/PARTIAL status, and a hard ban on write actions. Anthropic ships eight starter templates on the Templates tab at claude.ai/code/routines. They are free, they are a sensible place to begin, and most people begin there. They are also unhardened: they describe what to do, and say nothing about what to do when it doesn’t work. This is a complete worked example of fixing that — one template, start to finish, with the full prompt at the end for you to paste in. The template is Briefing : summarise your calendar, email and messages into a morning brief. It is the one most people turn on first, and the one whose failures are hardest to notice. First, how it fails when nobody is watching Four specific failures, none of which produces an error in the run list. A dead connector reads as a free day If the calendar connector fails, the brief renders an empty schedule. Nothing in the output distinguishes “you have no meetings” from “I could not read your meetings”. You act on the first and discover the second on Thursday. It reports the wrong day A local Desktop task that misses its slot runs one catch-up when the machine next wakes. A 7am brief can be produced at 11pm and still be written in the present tense about “today”. Cloud routines have a milder version of the same thing: runs scheduled exactly on the hour can start several minutes late, which is why Anthropic suggests 9:07 over 9:00. It compresses away the thing you needed Three overlapping meetings become “a busy morning”. The conflict — the single most actionable fact in the whole brief — has been summarised out of existence. It leaves no trace Next week you cannot tell whether Tuesday’s brief ran and found nothing, or never ran at all. Both look identical from where you sit, which is to say: they look like nothing. The eight checks applied Each fix below maps to one of the checks in the eight-point pass https://runbook.scosovan.com/claude-code-routine-reported-success-did-nothing/ . | Check | What it changes in this prompt | |---|---| | Self-contained | Names the slot time, the sources, the caps and the output file. No conversational context assumed. | | Sources named | A SOURCES section with a status line and an item count per source. | | Verified | Step 4 re-opens the report and checks counts, times and traceability — and can set the run to PARTIAL. | | Idempotent | A run-id derived from the slot; a repeat run replaces its own log line instead of adding a second. | | Honest when blind | Two outcomes per source — read or unavailable . Never one. | | Least privilege | A hard rule banning every write action, plus trimming the connector list before the first run. | | Fails loudly | An explicit OK / PARTIAL status and one log line per run. | | Time-aware | Step 1 reads the clock and changes the output — not just a note about it. | The hardened prompt Paste this over the template’s instructions. Adjust the slot time and the source list to match yours; leave the structure alone. You are running unattended as the "Morning Brief" routine. You have no conversation context. Everything you need is named in this prompt. STEP 1 — CLOCK Read the current local date and time before anything else. Compare it with the intended slot of 07:05 local. - Within 3 hours of the slot: proceed normally. - More than 3 hours late: put "LATE RUN — produced at