Eslam HelmyEslam Helmy
4 min readEslam

Build Your Own Dev Agent — Lesson 7: Meeting Ingest + Failure Handling

What happens when a skill fails? A missing API key, a rate limit, a malformed response. This lesson builds the meeting ingest skill and adds failure handling so failures are logged, retried, and never silent.


Where You Are

your-project/
  CLAUDE.md
  .claude/
    preferences.md
    tasks-active.md
    tasks-completed.md
    progress.txt
    error-log.md
    learnings.md
    priority-map.md
    cron-jobs.json                   # 4 jobs
    settings.json
    hooks/
      stop-telegram.sh
      permission-gate.sh
    skills/
      daily-planner/
      pr-reviewer/
      git-reviewer/
      standup-generator/

What You're Adding

Two things in this lesson:

  1. Meeting ingest skill — extracts action items, decisions, and follow-ups from meeting transcripts
  2. Failure handling — retry, dead-letter log, graceful degradation (applied to all skills)

Failure Handling: The Four Mechanisms

Before building the skill, understand the failure infrastructure it uses:

  • Retry — try again after a short delay. Max 2 retries per run.
  • Idempotency — check if this input was already processed. Skip if yes.
  • Dead-letter log — write failures to failed-jobs.log with full context for later analysis.
  • Graceful degradation — if one step fails, still complete the others. Partial results beat no results.

Build It: Failed Jobs Log

Prompt for Claude Code:

Create .claude/failed-jobs.log — an append-only log where failed skill
runs get recorded with timestamp, job ID, error type, details, and
retry count. Start with a header comment explaining the format.

Build It: Meeting Ingest Skill

This skill runs at 6:37 PM daily. It reads meeting transcripts (from Granola or manual files), extracts structured data, and routes it to the right state files.

Prompt for Claude Code:

Create a meeting ingest skill at .claude/skills/meeting-ingest/SKILL.md.

The skill should:

INPUT:
- Read preferences.md for meeting tools and calendar info
- Read tasks-active.md to check for duplicate action items
- Read progress.txt to check if today's meetings are already processed
- Sources: Granola MCP (preferred), manual transcript files, calendar notes
  (MCPs are configured in `.mcp.json` at the project root — see [Claude Code MCP docs](https://code.claude.com/docs/en/mcp) for setup)

PROCESS:
1. Discover today's meetings from available sources
2. Idempotency check: skip meetings already in progress.txt
3. For each meeting, extract:
   - Action items (WHO will do WHAT by WHEN)
   - Decisions made (DECIDED: what, because why)
   - Key topics (3-5, one sentence each)
   - Follow-ups needed
4. Route extracted items:
   - My action items → tasks-active.md with priority
   - Others' action items → meeting notes file only
   - Decisions → meeting notes file
5. Track: append to progress.txt for each processed meeting

FAILURE HANDLING:
- If a transcript is garbled, extract what you can and flag as partial
- If extraction fails entirely, log to failed-jobs.log and continue
  to next meeting — one failure should not block the rest
- If retryable error (API timeout), wait 30s and retry once
- At the end, if any meetings failed, send Telegram notification

OUTPUT:
- Meeting notes file at .claude/reports/meetings/[date]-[slug].md
- Updated tasks-active.md with my action items
- Updated progress.txt with processing summary

Expected output: A complete meeting ingest skill with built-in failure handling.


Build It: Add Failure Handling to CLAUDE.md

Now add system-wide failure rules that apply to ALL skills, not just meeting ingest.

Prompt for Claude Code:

Append a Failure Handling section to CLAUDE.md with these rules:

1. Retry transient errors (timeout, rate limit, 5xx) once after 30s.
   Max 2 retries total.
2. Log every failure to .claude/failed-jobs.log with timestamp,
   job ID, error type, details, and retry count.
3. Degrade gracefully — if one step fails, complete what you can.
4. Notify on P0/P1 failures via Telegram.
5. Never silently fail. Every failure gets a log entry.

Expected output: CLAUDE.md updated with failure handling rules.


Build It: Schedule the Skill

Prompt for Claude Code:

Add meeting-ingest to cron-jobs.json. Schedule: 6:37 PM weekdays.
The file should now have 5 jobs total.

Expected output: cron-jobs.json with five entries.


Checkpoint

Your .claude/ directory should now contain: skills/meeting-ingest/SKILL.md, failed-jobs.log, and cron-jobs.json with 5 jobs. CLAUDE.md should include failure handling rules.


This is part of the Build Your Own Dev Agent course. ← Previous Lesson | Next Lesson →

Share this post