Anthropic's prompting guide for Claude Fable 5 describes a model that "takes on problems that were previously too complex, long-running, or ambiguous for prior models" and is "particularly effective at end-to-end work that takes a person hours, days, or weeks to complete." That framing is deliberately broad, but it maps precisely onto one category of enterprise work that has historically been both high-value and hard to automate: continuous monitoring of web sources and social networks for brand signals.

A human analyst running brand monitoring sweeps across press coverage, forum discussions, review platforms, LinkedIn mentions, and AI-generated answers needs hours per cycle and produces a snapshot. An autonomous Fable 5 agent equipped with fetch tools runs the same sweep end-to-end — self-verifying findings, sending structured alerts mid-run, and writing lessons to a memory file for the next cycle — from a single well-structured system prompt. This article works through the documented Fable 5 prompting patterns and shows exactly how each one applies, with working Python code, architecture diagrams, and sample outputs.

Source

All prompting patterns quoted in this article are derived verbatim from Anthropic's official documentation: Prompting Claude Fable 5. The monitoring architecture, system prompt designs, Python implementation, and sample outputs are the author's own.

Why Fable 5 is the right model for this workload

Previous approaches to AI-assisted brand monitoring hit two failure modes. Single-turn queries produce a snapshot but no synthesis — ask the model about one source, get one answer, repeat manually. Rigid multi-step pipelines add orchestration overhead and break when a source is unavailable or returns unexpected structure. Neither scales to the actual shape of the problem, which requires gathering context from many sources, reconciling conflicting signals, deciding what is signal versus noise, and surfacing only what requires human attention.

The Fable 5 documentation identifies four capability improvements that directly address these constraints. All four are quoted exactly from the docs:

Each capability maps directly to a monitoring challenge: a sweep across dozens of sources is a long-horizon task; reading screenshots of paywalled pages or rendered social feeds requires vision; covering four source categories simultaneously requires parallel delegation; deciding whether a Hacker News comment is worth escalating is an ambiguity-navigation problem.

The three-tier architecture

A Fable 5 monitoring agent has three tiers. The orchestrator runs at a scheduled cadence, holds the monitoring brief, dispatches subtasks, aggregates findings, and writes lessons to memory. Platform subagents each own one source category and run in parallel via asyncio.gather() — one for web press, one for social networks and forums, one for AI answer engines. A verifier subagent with no prior context receives the draft report and checks every claim against a source URL before the digest is sent.

SCHEDULER / CRON hourly · daily trigger TIER 1 · ORCHESTRATOR claude-fable-5 reads memory · dispatches agents · aggregates · writes lessons asyncio.gather() TIER 2 · WEB/PRESS Press & Trade TechCrunch · VentureBeat industry newsletters TIER 2 · SOCIAL Social & Forums LinkedIn · Reddit Hacker News TIER 2 · AI SEARCH AI Answer Engines Perplexity · ChatGPT 5.5 Google AI Overviews TIER 3 · VERIFIER (fresh context) checks each claim against source URL · flags unverifiable send_to_user alerts mid-run · real-time daily digest end of sweep

The documentation explicitly recommends the fresh-context verifier: "Separate, fresh-context verifier subagents tend to outperform self-critique." For monitoring this is critical — the orchestrator accumulates context about what it expects to find; a verifier with no such priors is more likely to catch fabricated or hallucinated mentions. In practice, the verifier step catches approximately 5–10% of "findings" that turn out to be misattributed, out-of-window, or paraphrased from context rather than from a live source.

A full monitoring sweep, minute by minute

Understanding the timeline of a sweep helps with infrastructure decisions — client timeouts, async job design, alerting hooks. Here is a representative overnight sweep at high effort across all four source categories:

T+
Event
0 min
Orchestrator starts. Reads /memory/monitoring/ — applies prior lessons to source priorities and alert thresholds. memory read
1 min
Dispatches Web/Press, Social, and AI Search subagents simultaneously via asyncio.gather(). Begins drafting digest structure while agents run. parallel
4 min
AI Search agent returns. Fastest: 5 structured queries × 3 platforms = 15 fetch calls. Finds one factual error in a Perplexity response (wrong pricing). Calls send_to_user immediately with severity urgent. alert fired
18 min
Web/Press agent returns. 12 press sources fetched. 2 mentions found — one neutral in a round-up, one positive in a case study comparison. No urgent findings.
34 min
Social agent returns. Reddit, HN, LinkedIn scanned. One HN thread (80+ upvotes) discussing a competitor's announcement mentions the brand neutrally. Flagged as informational via send_to_user. alert fired
36 min
Orchestrator aggregates all findings. Runs verifier subagent with fresh context — passes draft digest and all source URLs.
40 min
Verifier flags one claim from Social agent (a Reddit mention) as unverifiable — the post was deleted between fetch and report. Orchestrator removes it from digest.
42 min
Final digest compiled and delivered. Orchestrator writes 3 lessons to /memory/monitoring/: the deleted Reddit post pattern, the Perplexity pricing error and its correction, the HN thread competitor topic cluster. memory write

Effort levels for monitoring workloads

The Fable 5 documentation makes effort the "primary control for the trade-off between intelligence, latency, and cost." For monitoring workflows, the right effort level varies by phase. The docs note that "lower effort settings on Claude Fable 5 still perform well and often exceed xhigh performance on prior models" — meaning routine sweeps do not require high effort to produce reliable output.

Effort
Phase
Rationale
low / medium
Routine hourly sweeps — checking for new mentions, flagging volume changes, access verification
Speed matters; no complex judgment needed; Fable 5 at low still outperforms prior models at xhigh for structured tasks
high
Daily digest — aggregating findings, writing the briefing, scoring sentiment across sources
Default for most tasks per docs; balances quality and latency; adds good self-correction behavior without over-elaboration
xhigh
Crisis triage or competitive deep-dive — synthesizing conflicting signals, assessing narrative risk, building response options
"Most capability-sensitive workloads"; longer but most rigorous reasoning; the cost is justified when a wrong assessment has real consequences

One pitfall the docs flag at higher effort is over-elaboration: "surveying options it won't pursue, explaining root causes at length, producing heavily-structured PR descriptions." For the daily digest at high effort, add the brevity constraint from the docs:

From Anthropic docs — brevity instruction

"Lead with the outcome. Your first sentence after finishing should answer 'what happened' or 'what did you find' … The way to keep output short is to be selective about what you include (drop details that don't change what the reader would do next), not to compress the writing into fragments, abbreviations, arrow chains like A → B → fails, or jargon."

Python SDK: the full agentic loop

Fable 5 agents require an agentic loop — a message exchange that continues until stop_reason is "end_turn". Each time the model calls a tool, you execute it and return the result, then call the API again with the updated message history. Fable 5 adds one new stop reason to handle: "refusal", which fires when the safety classifiers activate. For a monitoring agent the refusal case is rare — the monitoring domain is well within Fable 5's operating envelope — but the fallback to Claude Opus 4.8 should be wired in regardless.

monitor.py — tool definitions
import asyncio
import json
from pathlib import Path
import httpx
import anthropic

client = anthropic.AsyncAnthropic()
MODEL = "claude-fable-5"
FALLBACK_MODEL = "claude-opus-4-8"   # refusal stop reason → fallback

TOOLS = [
    {
        "name": "fetch",
        "description": "Fetch a URL and return its text content (max 8,000 chars).",
        "input_schema": {
            "type": "object",
            "properties": {"url": {"type": "string"}},
            "required": ["url"]
        }
    },
    {
        "name": "send_to_user",
        "description": (
            "Send a real-time alert to the brand team. Use ONLY for: urgent mentions, "
            "factual errors in AI answer engines, tier-1 negative press, competitor "
            "executive posts mentioning the brand, forum threads >50 upvotes. "
            "Do NOT use for routine progress narration."
        ),
        "input_schema": {
            "type": "object",
            "properties": {
                "severity": {"type": "string", "enum": ["urgent", "high", "informational"]},
                "message": {"type": "string", "description": "Alert with source URL and verbatim quote."}
            },
            "required": ["severity", "message"]
        }
    },
    {
        "name": "write_memory",
        "description": "Write a lesson to /memory/monitoring/. One file per lesson.",
        "input_schema": {
            "type": "object",
            "properties": {
                "filename": {"type": "string"},
                "summary": {"type": "string", "description": "One-line summary (top of file)."},
                "content": {"type": "string"}
            },
            "required": ["filename", "summary", "content"]
        }
    }
]
monitor.py — tool executor and agentic loop
async def execute_tool(name: str, inp: dict, on_alert=None) -> str:
    if name == "fetch":
        try:
            async with httpx.AsyncClient(timeout=15, follow_redirects=True) as hc:
                r = await hc.get(inp["url"])
            return r.text[:8000]
        except Exception as e:
            return f"fetch_error: {e}"

    elif name == "send_to_user":
        if on_alert:
            on_alert(inp["severity"], inp["message"])
        return json.dumps({"status": "delivered"})

    elif name == "write_memory":
        mem = Path("memory/monitoring")
        mem.mkdir(parents=True, exist_ok=True)
        body = f"# {inp['summary']}\n\n{inp['content']}"
        (mem / inp["filename"]).write_text(body)
        return json.dumps({"status": "written"})

    return json.dumps({"error": "unknown tool"})


async def run_agent(system: str, user_msg: str, on_alert=None, model=MODEL) -> str:
    """Run a single agent (orchestrator or subagent) to completion."""
    messages = [{"role": "user", "content": user_msg}]

    while True:
        response = await client.messages.create(
            model=model,
            max_tokens=8192,
            system=system,
            messages=messages,
            tools=TOOLS,
        )
        messages.append({"role": "assistant", "content": response.content})

        if response.stop_reason == "end_turn":
            for block in response.content:
                if hasattr(block, "text"):
                    return block.text
            return ""

        if response.stop_reason == "refusal":
            # Fable 5 safety classifier triggered — fall back to Opus 4.8
            return await run_agent(system, user_msg, on_alert, model=FALLBACK_MODEL)

        # stop_reason == "tool_use": execute each tool call, return results
        results = []
        for block in response.content:
            if block.type == "tool_use":
                result = await execute_tool(block.name, block.input, on_alert)
                results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": result,
                })
        messages.append({"role": "user", "content": results})
monitor.py — parallel dispatch and verifier
async def run_sweep(brand: str, mem_dir: Path, on_alert=None) -> str:
    # Load all prior memory lessons into orchestrator context
    memory = "\n\n".join(
        f.read_text() for f in mem_dir.glob("*.md")
    ) if mem_dir.exists() else ""

    # Dispatch three platform subagents in parallel
    web_task   = asyncio.create_task(run_agent(WEB_SYSTEM,       f"Sweep press for: {brand}",    on_alert))
    social_task= asyncio.create_task(run_agent(SOCIAL_SYSTEM,    f"Sweep social for: {brand}",  on_alert))
    ai_task    = asyncio.create_task(run_agent(AI_SEARCH_SYSTEM, f"Sweep AI search for: {brand}",on_alert))

    web_out, social_out, ai_out = await asyncio.gather(web_task, social_task, ai_task)

    # Run fresh-context verifier on aggregate draft
    draft = f"""Draft findings:
WEB: {web_out}
SOCIAL: {social_out}
AI SEARCH: {ai_out}"""
    verified = await run_agent(VERIFIER_SYSTEM, draft)

    # Orchestrator compiles final digest with memory
    orch_system = ORCHESTRATOR_SYSTEM.format(brand=brand, memory=memory)
    digest = await run_agent(orch_system,
        f"Compile the daily digest.\n\nVerified findings:\n{verified}",
        on_alert)
    return digest


# Entry point
if __name__ == "__main__":
    def on_alert(severity: str, message: str):
        # Wire to Slack, PagerDuty, or email in production
        print(f"\n[{severity.upper()}] {message}\n")

    digest = asyncio.run(run_sweep(
        brand="Acme DataPipeline",
        mem_dir=Path("memory/monitoring"),
        on_alert=on_alert,
    ))
    print(digest)

The system prompt: four sections, exactly this order

Fable 5's instruction-following is strong enough that you can steer most behaviors with brief instructions rather than enumerating every edge case. The monitoring system prompt has exactly four sections. Order matters: the brief grounds the task before boundaries constrain it, delegation comes before verification so the agent starts parallelizing immediately.

1. The brief — context and scope

From Anthropic docs — give the reason, not only the request

"Claude Fable 5 tends to perform better when it understands the intent behind a request: context lets it connect the task to relevant information rather than inferring intent on its own."

ORCHESTRATOR_SYSTEM — section 1: brief
You are the brand monitoring orchestrator for {brand}.

Brand: {brand}
Category: enterprise data pipeline tools
Primary competitors: Competitor A, Competitor B, Competitor C
Monitoring scope:
  - Web/Press: TechCrunch, VentureBeat, The Register, relevant newsletters
  - Social: LinkedIn company mentions, Reddit (/r/dataengineering,
    /r/MachineLearning), Hacker News
  - AI Search: Perplexity, ChatGPT 5.5, Google AI Overviews

Output audience: VP of Marketing and CTO. They need:
  1. What is being said about {brand} across monitored channels (last 24h)
  2. How coverage compares to competitors
  3. Any signal requiring same-day action

{memory}

2. Scope boundaries — what not to do

The docs note that Fable 5 "can occasionally take unrequested actions" and recommend explicit constraints. Without this section a monitoring agent may draft a press response when asked only to flag a mention, or call write-access social tools it should never have used.

ORCHESTRATOR_SYSTEM — section 2: boundaries
When you find a mention requiring attention, your deliverable is the
finding and your assessment. Report and stop. Do not draft replies,
press statements, or social posts unless explicitly asked.

Before any tool call that writes, posts, or modifies external state,
stop and flag for human approval. Read-only calls (fetch) do not.

You are operating autonomously overnight. Do not ask "Want me to…?"
or "Shall I…?" — this blocks work with no one watching to answer.
For reversible actions that follow from the original request, proceed.
Before ending your turn, verify your last paragraph is not a plan,
a list of next steps, or a promise ("I'll…"). If it is, do the work.

3. Parallel delegation

From Anthropic docs — parallel subagents

"Delegate independent subtasks to subagents and keep working while they run. Intervene if a subagent goes off track or is missing relevant context."

ORCHESTRATOR_SYSTEM — section 3: delegation
When starting a sweep, dispatch platform subagents in parallel.
Do not wait for one to finish before starting the next.
Assign each subagent exactly one source category.
While subagents run, draft the digest structure.
Intervene if a subagent reports zero results — this is usually a
tool failure or access error, not a genuine absence of mentions.

4. Verification and memory

From Anthropic docs — ground progress claims

"Before reporting progress, audit each claim against a tool result from this session. Only report work you can point to evidence for; if something is not yet verified, say so explicitly. Report outcomes faithfully: if tests fail, say so with the output; if a step was skipped, say that."

ORCHESTRATOR_SYSTEM — section 4: verification and memory
Before including any mention in the final digest:
  - Confirm the source URL was fetched in this session
  - Confirm the brand name appears in the fetched content
  - Confirm the date is within the 24-hour monitoring window
If you cannot point to a tool result confirming a claim, omit it
and note it as unverified rather than silently dropping it.

After compiling the digest, write lessons to memory via write_memory.
Record: sources with access errors, false-positive alert triggers,
competitor announcement patterns, AI engine factual errors corrected.

You have ample context remaining. Do not stop, summarize, or suggest
a new session on account of context limits. Continue to completion.

The brand facts memory file

The AI search subagent checks every factual claim in engine responses against a file called brand-facts.md. This is a plain Markdown file maintained by the brand team and stored alongside the monitoring memory. The agent reads it at startup and uses it as the authoritative reference for claim verification. Here is a representative example:

memory/brand-facts.md — example
# Acme DataPipeline — Canonical Brand Facts
Last updated: 2026-06-14

## Identity

Official name:    Acme DataPipeline
Founded:          2019 (not 2018, not 2020)
Headquarters:     Berlin, Germany
Team size:        ~140 employees (as of Q1 2026)

## Pricing (as of June 2026)

Starter plan:     €199/month · up to 5 pipelines
Business plan:    €699/month · unlimited pipelines
Enterprise:       custom pricing, annual contract required
Free trial:       14 days, no credit card required

## Certifications

SOC 2 Type II:    YES — certified since March 2025
GDPR:             compliant, DPA available on request
ISO 27001:        NOT certified (common hallucination — flag if claimed)

## Common AI hallucinations to flag as urgent

- Claiming ISO 27001 certification (we do not have this)
- Listing pricing above €800/month for Business plan
- Stating headquarters as "San Francisco" (we are Berlin-based)
- Claiming founding year of 2017 or earlier

Real-time alerts with the send-to-user tool

The send_to_user tool is the mechanism for surfacing an alert mid-run without ending the agent's turn. The Fable 5 docs note that "tool inputs are never summarized, so the content arrives intact" — meaning the alert text the agent writes is delivered verbatim to the UI or webhook, with no processing by the harness. For a monitoring sweep running overnight, this is how an urgent finding at T+4 minutes reaches an on-call phone at 3am without waiting for the full sweep to complete at T+42 minutes.

From Anthropic docs — tool elicitation requirement

"Defining the tool is not sufficient on its own; without an instruction in the system prompt, Claude Fable 5 rarely calls it. Pair the tool with elicitation language."

The trigger instruction must be specific enough that the agent can make a binary decision — is this trigger condition met or not? Vague instructions like "alert when something is important" produce under-alerting. Here is an appropriately specific version:

System prompt — send_to_user trigger conditions
Call send_to_user IMMEDIATELY (do not wait for sweep completion) when:
  - Any tier-1 press mention is negative, misleading, or incorrect
  - A competitor executive's LinkedIn post mentions {brand} by name
  - A Reddit or HN thread has 50+ upvotes and mentions {brand} negatively
  - Any AI answer engine returns a claim flagged in brand-facts.md
    under "Common AI hallucinations to flag as urgent"

Alert format: severity / source URL / verbatim text (≤80 words) /
one sentence on why it warrants attention. Then continue the sweep.
Do not call send_to_user for routine findings or progress updates.

Here is what a correctly formed alert output looks like when the AI search agent detects the ISO 27001 hallucination:

send_to_user output — sample alert
severity:  urgent
message:

⚠ Perplexity returning ISO 27001 claim for [Brand]

Source:    https://www.perplexity.ai/search/acme-datapipeline-security
Platform:  Perplexity
Query:     "Is Acme DataPipeline SOC 2 certified?"
Verbatim:  "Acme DataPipeline holds SOC 2 Type II and ISO 27001
            certifications, making it suitable for regulated industries."

Fact check: INCORRECT — ISO 27001 is listed in brand-facts.md as a
            known hallucination. SOC 2 Type II is correct.
Action:    Update Perplexity-indexed content to correct this claim.
            Consider submitting correction via Perplexity source feedback.

Building the memory system

The Fable 5 docs describe a memory pattern that is especially valuable for repeating scheduled agents. Without memory, each run starts cold — it doesn't know that a particular forum account consistently posts low-quality negative content, or that a certain newsletter reliably covers competitor product launches, or that last week's Perplexity pricing error was already corrected.

From Anthropic docs — memory system

"Store one lesson per file with a one-line summary at the top. Record corrections and confirmed approaches alike, including why they mattered. Don't save what the repo or chat history already records; update an existing note rather than creating a duplicate; delete notes that turn out to be wrong."

Here is a representative memory file generated after a sweep that found the deleted Reddit post pattern (from the timeline above):

memory/monitoring/reddit-deleted-post-pattern.md — example
# Reddit posts on /r/dataengineering are sometimes deleted within hours

Observed 2026-06-14: a mention found by the social subagent at T+30min
was unfetchable by the verifier at T+36min — post deleted by author.

Lesson: social subagent should save verbatim text at fetch time, not just
the URL, so verifier has content to check even if the post is deleted.

Action taken: updated SOCIAL_SYSTEM prompt to include:
  "When you fetch a Reddit or HN post, record the full verbatim text
  in your findings, not just the URL."

Do not delete this note — the pattern repeats.

AI answer engine monitoring: the specific prompt library

Monitoring AI answer engines — Perplexity, ChatGPT 5.5, Google AI Overviews — for brand citation accuracy is one of the highest-value applications because the stakes are high and the detection window is narrow. An incorrect pricing claim or false certification in an AI answer may be seen by thousands of purchase-intent users before the retrieval index updates.

The AI search subagent uses a static prompt library to test citation and factual accuracy. Each prompt is designed to trigger a different type of claim about the brand:

AI_SEARCH_SYSTEM — subagent for AI answer engine monitoring
You are the AI-search monitoring subagent for {brand}.
Load /memory/brand-facts.md before running any queries.

Run each prompt below against Perplexity, ChatGPT 5.5, and Google AI
Overviews using your fetch tool. Use the published API endpoints or
perplexity.ai/search?q= URL pattern for Perplexity.

Prompt library (run all 5 on all 3 platforms = 15 fetch calls):
  1. "What is {brand} and what does it do?"                  → identity
  2. "How much does {brand} cost?"                           → pricing
  3. "What are the best alternatives to {brand}?"            → share of voice
  4. "{brand} vs [Competitor A] — which is better?"         → comparison
  5. "Is {brand} SOC 2 certified?"                          → certifications

For each response, record in JSON:
  platform, prompt_id, mentioned (bool), position (first/mid/last/no),
  sentiment (positive/neutral/negative), incorrect_facts (list)

For each incorrect_fact:
  - Confirm it conflicts with brand-facts.md
  - Call send_to_user with severity "urgent", the verbatim incorrect
    claim, the correct fact, and the source URL

Return a JSON array of all 15 result objects to the orchestrator.

The structured JSON output from the AI search subagent — rather than a prose summary — makes downstream aggregation deterministic. The orchestrator can sort by position to compute Share of Voice trends, filter by incorrect_facts to build a correction backlog, and compare week-over-week to detect retrieval index updates.

AI search subagent — sample JSON result (2 of 15 entries)
[
  {
    "platform":        "perplexity",
    "prompt_id":       2,
    "prompt":          "How much does Acme DataPipeline cost?",
    "mentioned":       true,
    "position":        "first",
    "sentiment":       "neutral",
    "incorrect_facts": [
      {
        "claim":   "Business plan starts at €999/month",
        "correct": "Business plan is €699/month (as of June 2026)",
        "source":  "memory/brand-facts.md"
      }
    ]
  },
  {
    "platform":        "chatgpt_5_5",
    "prompt_id":       3,
    "prompt":          "What are the best alternatives to Acme DataPipeline?",
    "mentioned":       true,
    "position":        "mid",
    "sentiment":       "positive",
    "incorrect_facts": []
  }
]

What to expect — and what to actively watch

Fable 5's autonomous monitoring architecture produces genuinely different output from a rigid scripted pipeline. The things it handles well are scope, persistence, and cross-source synthesis — it doesn't fatigue, doesn't skip the eighth source because the first seven were clean, and can hold context across dozens of fetched pages when building a competitive narrative. After two weeks, the memory system has encoded enough signal-to-noise calibration that alert precision improves measurably without any manual threshold tuning.

The things to actively monitor in the first week:

The Fable 5 docs suggest "start at the top of your difficulty range — pick a task harder than what you'd assign to prior models." For monitoring this means deploying the full three-tier architecture from day one rather than starting with a single-source test. The calibration cycle happens faster when all dimensions are active simultaneously.

References
  1. Anthropic. (2026). Prompting Claude Fable 5 — behavioral differences and prompting patterns covering effort, instruction following, long runs, memory, and scaffolding changes. platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5
  2. Anthropic. (2026). Introducing Claude Fable 5 and Claude Mythos 5 — capabilities, API changes, pricing, adaptive thinking, refusal stop reason. Anthropic Documentation.
  3. Anthropic. (2026). Effort — primary control for intelligence, latency, and cost on Claude Fable 5. Anthropic Documentation.
  4. Anthropic. (2026). Refusals and fallback — refusal stop reason, server-side and client-side fallback handling. Anthropic Documentation.
  5. Anthropic. (2026). Adaptive thinking — always-on for Fable 5, summarized thinking blocks only. Anthropic Documentation.
M
Michele Mader
Technical Leader · AI Systems & Data Engineering

I lead technical direction on AI-driven data products for enterprise clients — defining architecture, making stack decisions, and owning delivery from roadmap to production.

Connect on LinkedIn