{
  "name": "Beyond Chat — Design Patterns for AI Beyond the Chat Interface",
  "url": "https://beyondchat.design",
  "generatedAt": "2026-10-08T22:45:17.137Z",
  "patternCount": 80,
  "dopeFramework": {
    "note": "Four axes for evaluating AI interaction quality. Always D-O-P-E order; never \"OPD\".",
    "axes": [
      "directability",
      "observability",
      "predictability",
      "explainability"
    ]
  },
  "categories": [
    {
      "id": "inline-contextual",
      "label": "Inline & Contextual",
      "description": "Controls embedded directly in the content creation flow",
      "patternIds": [
        "property-panel",
        "prompt-parsing",
        "tone-of-voice",
        "ghost-text",
        "select-transform",
        "smart-document",
        "contextual-overlay",
        "semantic-zoom",
        "progressive-disclosure",
        "prompt-enhancer",
        "sample-response",
        "saved-styles",
        "templates",
        "pointer-as-prompt",
        "output-undo",
        "chat-off-ramp"
      ]
    },
    {
      "id": "visual-generative",
      "label": "Visual & Generative",
      "description": "Spatial layouts and generated interfaces that replace text walls",
      "patternIds": [
        "generative-ui",
        "spatial-canvas",
        "visual-intent",
        "multi-modal",
        "region-lock",
        "parallel-alternatives",
        "output-skeleton",
        "real-time-generation",
        "annotated-capture",
        "seed-pinning",
        "generation-tree",
        "exclusion-controls",
        "semantic-grid",
        "read-along"
      ]
    },
    {
      "id": "agent-workflow",
      "label": "Agent Workflow",
      "description": "Plan, execute, and supervise multi-step or autonomous AI runs",
      "patternIds": [
        "intent-preview",
        "editable-plan",
        "approval-gates",
        "clarifying-questions",
        "supervisor-worker",
        "autonomy-dial",
        "action-audit",
        "agentic-dashboard",
        "mid-stream-steering",
        "follow-up-queue",
        "stage-tracker",
        "conversation-branches",
        "agent-identity",
        "cognitive-friction",
        "authority-gradient",
        "task-bid-market",
        "oversight-rhythm",
        "concurrency-dial",
        "live-plan-surface",
        "machine-state"
      ]
    },
    {
      "id": "trust-verification",
      "label": "Trust & Verification",
      "description": "Surface uncertainty, sources, and reasoning so users can verify",
      "patternIds": [
        "confidence-signals",
        "reasoning-trace",
        "citation-trail",
        "disambiguation-branch",
        "capability-boundary",
        "ai-provenance",
        "footprints",
        "disclosure",
        "verifiable-completion",
        "conversation-permalink",
        "refusal-receipt",
        "model-changelog",
        "bias-flag",
        "counterfactual-probe",
        "second-opinion",
        "personal-eval-set",
        "critic-gate"
      ]
    },
    {
      "id": "memory-context-boundary",
      "label": "Memory, Context & Boundary",
      "description": "What the AI remembers, sees, and the limits placed around it",
      "patternIds": [
        "ai-memory",
        "constraint-rules",
        "compute-budget",
        "draft-mode",
        "persona-switcher",
        "knowledge-source-toggle",
        "feedback-loop",
        "incognito-mode",
        "consent",
        "data-ownership",
        "model-selector",
        "deletion-awareness",
        "context-gauge"
      ]
    }
  ],
  "relationKinds": {
    "pairs-with": "Often paired with",
    "alternative": "Alternative to",
    "extends": "Extends",
    "extended-by": "Extended by"
  },
  "patterns": [
    {
      "id": "property-panel",
      "url": "https://beyondchat.design/patterns/property-panel/",
      "title": "Property Panel",
      "subtitle": "Deterministic Control for Probabilistic Machines",
      "metaphor": "Cockpit",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Instead of typing \"--ar 16:9 --stylize 500\" into a chat, the Property Panel brings back classic GUI elements to steer AI parameters. The text prompt describes the content, the panel controls the form.",
      "interaction": "Parametric, Sliders",
      "controlMechanism": "Sliders, Toggles, Presets",
      "useCase": "Image Generation, Fine-Tuning, Style Definition",
      "useWhen": "Users repeatedly tune the same generation parameters and need precision over speed.",
      "failureModeLabel": "Linear History",
      "dope": {
        "observability": "The full configuration — tone, length, hook style, CTA, hashtag count — reads at a glance as labeled controls, not archaeology through prompt history",
        "predictability": "Each control maps to one line of the compiled prompt, which updates live as you adjust — you see exactly what will be sent before it is sent",
        "directability": "Content stays in the prompt, form moves to controls: length is a slider, tone a select, CTA a toggle — each adjustable without rewriting a sentence",
        "explainability": "Every control carries its name, range, and current value inline, so what a setting does is read off the label, not reverse-engineered from output diffs"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Critical generation controls are hidden behind syntax and recall.",
        "pattern": "Expose stable model parameters as visible GUI controls beside the prompt.",
        "whyChatBreaks": "Chat forces users to remember parameter names, ranges, and magic words.",
        "risks": "Too many controls can recreate cockpit overload if defaults and grouping are weak.",
        "avoidWhen": "The task is still open-ended exploration and precision controls would slow discovery."
      },
      "examples": [
        {
          "product": "Midjourney Web",
          "company": "Midjourney",
          "url": "https://www.midjourney.com/imagine",
          "note": "Aesthetics drawer beside the prompt — Stylization (0–1000), Weirdness, Variety as sliders. Every value visible, every value reproducible."
        },
        {
          "product": "Adobe Firefly",
          "company": "Adobe",
          "url": "https://firefly.adobe.com",
          "note": "Right-rail panel with aspect ratio, content type, content class, style references, structure references, lighting, composition, color & tone — all GUI controls, prompt focuses on subject."
        },
        {
          "product": "Runway ML",
          "company": "Runway",
          "url": "https://app.runwayml.com",
          "note": "Gen-4 generation panel exposes Duration, Resolution, Fixed-Seed slider, Reference image controls — chat would need eight parameters on one line."
        }
      ],
      "faq": [
        {
          "q": "How is a Property Panel different from chat-based parameter setting?",
          "a": "A Property Panel exposes parameters as durable GUI controls — sliders, toggles, presets — instead of magic strings inside a prompt. The panel is the source of truth, the prompt describes content, and the user never has to remember syntax to reproduce a result."
        },
        {
          "q": "When should I avoid using a Property Panel?",
          "a": "Avoid panels when the task is open-ended exploration where premature precision controls slow discovery. If users do not yet know what knobs matter, a panel encodes assumptions that lock in too early."
        },
        {
          "q": "How does this affect AI predictability?",
          "a": "Saved presets produce repeatable outputs because every parameter is explicit and persisted. The user can return to a known-good configuration without rebuilding it from prose."
        }
      ],
      "related": [
        {
          "id": "prompt-parsing",
          "kind": "pairs-with",
          "note": "The Property Panel holds stable settings beside the prompt; Inline Prompt Controls make the values written in the prompt clickable."
        },
        {
          "id": "progressive-disclosure",
          "kind": "pairs-with",
          "note": "Progressive Disclosure folds advanced controls behind expansion, so a growing Property Panel avoids cockpit overload."
        },
        {
          "id": "tone-of-voice",
          "kind": "alternative",
          "note": "Tone of Voice sets style with one drag on a 2D pad, where a Property Panel gives each setting its own control."
        }
      ]
    },
    {
      "id": "prompt-parsing",
      "url": "https://beyondchat.design/patterns/prompt-parsing/",
      "title": "Inline Prompt Controls",
      "subtitle": "Parse the Prompt, Surface the Controls",
      "metaphor": "Rich Text Editor",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "What if your prompt parsed itself — every variable detected and turned into an inline control you click to change, right where it sits in the prose? Unlike a template you fill from a blank form, the prose stays the source of truth and the controls are extracted from it. No product ships this exact move yet (reliable parsing is the hard part); closest neighbours rewrite (Workbench) or slot-fill (Sora 2 Multi-Track).",
      "interaction": "Inline, Contextual",
      "controlMechanism": "Clickable Parameters, Popovers, Inline Editing",
      "useCase": "Video Generation, Complex Prompt Authoring, Multi-Parameter Workflows",
      "useWhen": "Prompts are long enough that editing one variable means rewriting the whole text.",
      "failureModeLabel": "Config-in-Prose",
      "dope": {
        "observability": "Every parameter is visible inline, never hidden in syntax",
        "predictability": "Structured options mean consistent, repeatable outputs",
        "directability": "Click any value to change it — the prompt is the control surface",
        "explainability": "Each detected parameter shows its type and valid range when hovered"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": false,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "Long prompts mix intent and configuration in one brittle text blob.",
        "pattern": "Parse variables out of prose and surface them as inline controls.",
        "whyChatBreaks": "Editing one setting means rereading and rewriting the entire prompt.",
        "risks": "Bad parsing can invent structure and make the system feel unreliable.",
        "avoidWhen": "The prompt is intentionally freeform and the parser cannot detect stable fields."
      },
      "examples": [
        {
          "product": "Anthropic Workbench Prompt Improver",
          "company": "Anthropic",
          "url": "https://console.anthropic.com",
          "note": "Adjacent — not exact. The Workbench takes a prompt and surfaces a rewritten version with chain-of-thought + clarification, shown as a diff. Closest current shipping example, though it rewrites rather than parses."
        },
        {
          "product": "Runway Gen-4 Prompt + References",
          "company": "OpenAI",
          "url": "https://runwayml.com",
          "note": "Adjacent — not exact. Runway pairs a free-text prompt with structured reference images and parameter controls rather than parsing typed syntax back into surfaced fields. Closer to slot-filling than to true parse-and-surface."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Inline Prompt Controls pattern?",
          "a": "Prompts are long enough that editing one variable means rewriting the whole text."
        },
        {
          "q": "When should I avoid the Inline Prompt Controls pattern?",
          "a": "The prompt is intentionally freeform and the parser cannot detect stable fields."
        },
        {
          "q": "What problem does Inline Prompt Controls solve?",
          "a": "Long prompts mix intent and configuration in one brittle text blob."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Editing one setting means rereading and rewriting the entire prompt."
        }
      ],
      "related": [
        {
          "id": "property-panel",
          "kind": "pairs-with",
          "note": "Inline Prompt Controls change values inside this prompt; the Property Panel holds stable settings across prompts."
        },
        {
          "id": "select-transform",
          "kind": "pairs-with",
          "note": "Inline Prompt Controls cover the variables the parser found; Select & Transform rewrites any other span you select as a diff."
        },
        {
          "id": "ghost-text",
          "kind": "pairs-with",
          "note": "Ghost Text Editor speeds up writing the prompt; Inline Prompt Controls turn each variable in it into a control you can click."
        }
      ]
    },
    {
      "id": "tone-of-voice",
      "url": "https://beyondchat.design/patterns/tone-of-voice/",
      "title": "Tone of Voice",
      "subtitle": "Direct Manipulation for Linguistic Style",
      "metaphor": "Mixing Console",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Instead of iterating through \"make it more professional... actually a bit more casual...\" chat loops, a 2D tone pad lets users directly manipulate writing style along two axes: conciseness and formality. One drag replaces five chat turns.",
      "interaction": "Spatial, 2D Pad",
      "controlMechanism": "2D Tone Grid, Presets, Snap Points",
      "useCase": "Text Rewriting, Brand Voice, Content Adaptation",
      "useWhen": "Users iterate on style — formality, conciseness, voice — across many short text outputs.",
      "failureModeLabel": "Weak Intervention",
      "dope": {
        "observability": "The current voice is a point on a labeled two-axis pad — position is the state, replacing memory of which adjectives were already tried",
        "predictability": "Named presets snap to fixed coordinates, so \"Executive\" lands on the same voice every session — unlike \"slightly more professional\", which drifts per turn",
        "directability": "One drag moves both axes at once and the rewrite updates live under the cursor — five turns of adjective negotiation collapse into a single gesture",
        "explainability": "Axis labels and preset names state in plain words what each position produces, so the mapping from control to voice is inspectable, not inferred"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "refinement",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Style changes via chat loops are vague, slow, and repetitive.",
        "pattern": "Map tone onto a direct manipulation surface with named presets.",
        "whyChatBreaks": "Phrases like \"slightly more professional\" are ambiguous and serial.",
        "risks": "A small set of axes can oversimplify voice and imply false precision.",
        "avoidWhen": "The output needs editorial rationale more than exploratory tuning."
      },
      "examples": [
        {
          "product": "Figma AI Tone",
          "company": "Figma",
          "url": "https://www.figma.com/ai/",
          "note": "Tone dial inside an axis with presets Executive / Technical / Basic / Educational. Direct-manipulation 2D pad — exactly the pattern."
        },
        {
          "product": "Apple Intelligence Writing Tools",
          "company": "Apple",
          "url": "https://support.apple.com/en-us/121582",
          "note": "Select text → Writing Tools → Friendly / Professional / Concise preset chips with one-tap rewrite. Not a 2D pad, but the closest preset-driven tone manipulation in a major OS."
        },
        {
          "product": "Grammarly Tone Setter",
          "company": "Grammarly",
          "url": "https://www.grammarly.com",
          "note": "Tone detector + tone setter: the system reflects detected tone back to the user via emoji indicators before suggesting a target. Caveat — detection-plus-presets, not a continuous 2D surface."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Tone of Voice pattern?",
          "a": "Users iterate on style — formality, conciseness, voice — across many short text outputs."
        },
        {
          "q": "When should I avoid the Tone of Voice pattern?",
          "a": "The output needs editorial rationale more than exploratory tuning."
        },
        {
          "q": "What problem does Tone of Voice solve?",
          "a": "Style changes via chat loops are vague, slow, and repetitive."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Phrases like \"slightly more professional\" are ambiguous and serial."
        }
      ],
      "related": [
        {
          "id": "parallel-alternatives",
          "kind": "alternative",
          "note": "Tone of Voice tunes one draft by dragging on a 2D pad; Parallel Alternatives shows three drafts to compare, pick or blend."
        },
        {
          "id": "select-transform",
          "kind": "pairs-with",
          "note": "Set the tone, then apply it to a selection as a reviewable diff."
        },
        {
          "id": "property-panel",
          "kind": "alternative",
          "note": "The Property Panel gives each setting its own control; Tone of Voice moves formality and conciseness together in one drag."
        }
      ]
    },
    {
      "id": "ghost-text",
      "url": "https://beyondchat.design/patterns/ghost-text/",
      "title": "Ghost Text Editor",
      "subtitle": "Predictive Text & Inline Suggestions",
      "metaphor": "Co-Pilot",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Ghost text predicts your next sentence right at the cursor. Inline suggestions surface improvements on text you've already written. No context switching, no copy-paste — just press Tab.",
      "interaction": "Inline, Predictive",
      "controlMechanism": "Ghost Text, Wavy Underlines, Tab-to-Accept",
      "useCase": "Writing, Coding, Content Creation",
      "useWhen": "Writing rewards flow and inline suggestions remove the cost of context switching.",
      "failureModeLabel": "Linear History",
      "dope": {
        "observability": "Ghost text is visually distinct from authored content",
        "predictability": "Tab always accepts, typing always dismisses",
        "directability": "Accept, ignore, or override — all with a single keystroke",
        "explainability": "Wavy underlines distinguish AI suggestions from authored text at a glance"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Writers lose flow when suggestions live outside the cursor context.",
        "pattern": "Place continuation and revision suggestions directly inside the writing flow.",
        "whyChatBreaks": "A separate chat window forces context switching for sentence-level work.",
        "risks": "Over-eager suggestions can flatten voice or create dependency.",
        "avoidWhen": "The writing task is high-stakes and demands deliberate, manual composition."
      },
      "examples": [
        {
          "product": "GitHub Copilot",
          "company": "GitHub",
          "url": "https://github.com/features/copilot",
          "note": "Multi-line ghost completions render directly at the cursor in VS Code; Tab accepts, Esc dismisses. The prompt is the surrounding code itself."
        },
        {
          "product": "Gmail Smart Compose",
          "company": "Google",
          "url": "https://workspace.google.com/products/gmail/",
          "note": "Grayed-out predictive completions extend mid-sentence; one Tab keystroke completes the phrase, no separate panel involved."
        },
        {
          "product": "Cursor Tab",
          "company": "Cursor",
          "url": "https://cursor.com",
          "note": "Muted ghost text + multi-line + next-edit-prediction across files — the strongest current incarnation of the pattern."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Ghost Text Editor pattern?",
          "a": "Writing rewards flow and inline suggestions remove the cost of context switching."
        },
        {
          "q": "When should I avoid the Ghost Text Editor pattern?",
          "a": "The writing task is high-stakes and demands deliberate, manual composition."
        },
        {
          "q": "What problem does Ghost Text Editor solve?",
          "a": "Writers lose flow when suggestions live outside the cursor context."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A separate chat window forces context switching for sentence-level work."
        }
      ],
      "related": [
        {
          "id": "select-transform",
          "kind": "pairs-with",
          "note": "Ghost Text Editor suggests where you type; Select & Transform rewrites any span you select, as a diff you accept or reject."
        },
        {
          "id": "contextual-overlay",
          "kind": "alternative",
          "note": "Ghost Text Editor completes at the cursor as you type; Contextual Overlay acts on a selection and labels each rewrite."
        },
        {
          "id": "smart-document",
          "kind": "pairs-with",
          "note": "Ghost Text Editor speeds up writing the source text; Smart Document recomputes its summary and translation as you edit."
        }
      ]
    },
    {
      "id": "generative-ui",
      "url": "https://beyondchat.design/patterns/generative-ui/",
      "title": "Generative UI",
      "subtitle": "Interactive Components Instead of Text Walls",
      "metaphor": "Dashboard",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Ask a model to analyze data in chat and you get prose about the data — a paragraph asserting trends you cannot check, sort, or filter, where every follow-up costs another turn. Generative UI makes the response itself the interface: stat cards with deltas, a chart with switchable encodings, a sortable and filterable table — so follow-up questions become clicks on the answer instead of new prompts about it.",
      "interaction": "Visual, Interactive",
      "controlMechanism": "Charts, Tables, Filters, Toggle Views",
      "useCase": "Data Analysis, Reporting, Research Results",
      "useWhen": "The answer is a working surface — a chart, a board, a config — rather than a paragraph.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "The data model sits on the surface — stat cards with deltas, hoverable charts, a sortable table — instead of trapped inside a paragraph of prose",
        "predictability": "Switching bar to line to pie re-encodes the same numbers; exploration changes the view, never the answer underneath it",
        "directability": "Click a category to filter every view at once, sort any column, toggle chart types — follow-up questions become direct manipulation instead of new prompts",
        "explainability": "Every claim is checkable against the marks that render it — hover a bar for the exact figure, the legend names each category — no \"trust my summary\" step"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "output",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Analytical tasks are often answered with prose instead of manipulable structure.",
        "pattern": "Render the answer itself as an interactive interface with controls and views.",
        "whyChatBreaks": "Text summaries hide the data model and block real exploration.",
        "risks": "Generated visuals can overstate certainty or choose misleading encodings.",
        "avoidWhen": "A short textual answer is clearer than an interface for the task at hand."
      },
      "examples": [
        {
          "product": "v0 by Vercel",
          "company": "Vercel",
          "url": "https://v0.app",
          "note": "Prompt produces React/Tailwind components rendered live in a sandbox runtime — the answer IS the interface, not a description of one."
        },
        {
          "product": "Claude Artifacts",
          "company": "Anthropic",
          "url": "https://claude.ai",
          "note": "Fully interactive React/Recharts components render live in a side panel. The cleanest hero — Anthropic explicitly framed this as on-demand generative UI."
        },
        {
          "product": "Gemini Deep Research",
          "company": "Google",
          "url": "https://gemini.google.com",
          "note": "Reports natively render charts, infographics, and HTML visualizations inline instead of describing data in prose. The Apr 2026 launch on Gemini 3.1 Pro made this the hero UX."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Generative UI pattern?",
          "a": "The answer is a working surface — a chart, a board, a config — rather than a paragraph."
        },
        {
          "q": "When should I avoid the Generative UI pattern?",
          "a": "A short textual answer is clearer than an interface for the task at hand."
        },
        {
          "q": "What problem does Generative UI solve?",
          "a": "Analytical tasks are often answered with prose instead of manipulable structure."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Text summaries hide the data model and block real exploration."
        }
      ],
      "related": [
        {
          "id": "spatial-canvas",
          "kind": "pairs-with",
          "note": "Spatial Canvas arranges parallel AI contexts as nodes; Generative UI turns a node's data answer into charts and tables."
        },
        {
          "id": "semantic-zoom",
          "kind": "pairs-with",
          "note": "A generated dashboard becomes navigable across abstraction levels."
        },
        {
          "id": "progressive-disclosure",
          "kind": "pairs-with",
          "note": "Progressive Disclosure keeps a Generative UI answer's extra filters and encodings folded until you need them."
        }
      ]
    },
    {
      "id": "intent-preview",
      "url": "https://beyondchat.design/patterns/intent-preview/",
      "title": "Intent Preview",
      "subtitle": "Review the Plan Before It Executes",
      "metaphor": "Flight Plan",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Before an AI agent modifies your code, it shows every planned step with risk levels, affected files, and scope estimates. You can reorder, skip, or approve before a single line changes.",
      "interaction": "Review, Approve",
      "controlMechanism": "Checkboxes, Reorder, Risk Badges, Execute Button",
      "useCase": "Code Refactoring, File Operations, Automated Workflows",
      "useWhen": "Before any agent action that costs money, sends a message, or changes shared state.",
      "failureModeLabel": "Weak Intervention",
      "dope": {
        "observability": "Every planned step is visible before execution",
        "predictability": "Risk levels and file impacts shown upfront",
        "directability": "Reorder, skip, or modify steps before running",
        "explainability": "Risk levels include plain-language rationale, not just color codes"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Users cannot safely delegate actions they cannot inspect before execution.",
        "pattern": "Show the plan, scope, and risk before the system takes action.",
        "whyChatBreaks": "Reassuring assistant language does not expose concrete steps or blast radius.",
        "risks": "Preview friction can become excessive for trivial or low-risk actions.",
        "avoidWhen": "The action is cheap to reverse and pre-review costs more than correction."
      },
      "examples": [
        {
          "product": "Claude Code Plan Mode",
          "company": "Anthropic",
          "url": "https://www.anthropic.com/claude-code",
          "note": "Plan mode (Shift+Tab, `/plan`, or `--permission-mode plan`) researches the repo and writes a plan while every edit stays blocked until you approve it; Ctrl+G opens that plan in your editor first. No risk levels — the approval dialog only asks how to proceed. The `/ultraplan` preview was removed in August 2026."
        },
        {
          "product": "Cursor Plan Mode",
          "company": "Cursor",
          "url": "https://cursor.com/docs/agent/plan-mode",
          "note": "Plan Mode (Shift+Tab or the mode picker) asks clarifying questions, researches the codebase, then writes a Markdown plan with file paths and code references that you edit inline before building. Still no risk levels, and the run default is now the Auto-review classifier rather than ask-before-each-tool-call."
        },
        {
          "product": "Replit Agent Plan Mode",
          "company": "Replit",
          "url": "https://docs.replit.com/core-concepts/agent",
          "note": "Plan mode, picked from the mode selector at the bottom left of the chat input, breaks the request into an ordered task list you review before Start building runs it. The plan is a real artifact, not a paragraph — but you refine it by chatting, not by editing rows."
        },
        {
          "product": "OpenAI Deep Research Plan",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/10500283-deep-research-in-chatgpt",
          "note": "ChatGPT proposes a research plan you can review and modify before the run begins, after clarifying questions; you scope which sites and files it may use, and can interrupt mid-run to refocus. Started from /Deepresearch, the + tools menu, or the sidebar. The plan is the contract before tokens get spent."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Intent Preview pattern?",
          "a": "Before any agent action that costs money, sends a message, or changes shared state."
        },
        {
          "q": "When should I avoid the Intent Preview pattern?",
          "a": "The action is cheap to reverse and pre-review costs more than correction."
        },
        {
          "q": "What problem does Intent Preview solve?",
          "a": "Users cannot safely delegate actions they cannot inspect before execution."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Reassuring assistant language does not expose concrete steps or blast radius."
        }
      ],
      "related": [
        {
          "id": "editable-plan",
          "kind": "pairs-with",
          "note": "Intent Preview flags each step's risk and affected files; Editable Plan lets you add, remove, and comment on steps."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Intent Preview is checked once before the run; Approval Gates pause the run itself at the steps that need sign-off."
        },
        {
          "id": "reasoning-trace",
          "kind": "pairs-with",
          "note": "Intent Preview shows what the agent will do; Reasoning Trace lays out the assumptions behind it, as claims to check."
        }
      ]
    },
    {
      "id": "confidence-signals",
      "url": "https://beyondchat.design/patterns/confidence-signals/",
      "title": "Confidence Signals",
      "subtitle": "Not All AI Confidence is Created Equal",
      "metaphor": "Trust Meter",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "AI communicates its certainty level per claim with color-coded badges, source counts, and expandable citations. Combats automation bias by making uncertainty visible.",
      "interaction": "Visual, Expandable",
      "controlMechanism": "Color-coded Badges, Expandable Sources, Dig Deeper",
      "useCase": "Research, Fact-Checking, Decision Support",
      "useWhen": "Answers mix high-evidence and low-evidence claims and the reader cannot tell them apart.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "Uncertainty is visible, not hidden behind confident-sounding text",
        "predictability": "Color coding creates consistent trust calibration",
        "directability": "Low-confidence outputs invite correction and deeper research",
        "explainability": "Sources, methodology, and study counts are visible for every claim"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Confident wording hides uneven evidence quality and uncertainty.",
        "pattern": "Attach visible confidence, sourcing, and uncertainty cues to each claim.",
        "whyChatBreaks": "Plain answers flatten strong and weak claims into the same voice.",
        "risks": "Users may over-trust the badge system itself or mistake style for rigor.",
        "avoidWhen": "Reliable confidence estimates do not exist and the signal would be decorative — or the reader has no lever to pull, where a confidence band transfers anxiety without transferring any control to act on it."
      },
      "examples": [
        {
          "product": "Elicit",
          "company": "Elicit",
          "url": "https://elicit.com",
          "note": "Confidence Flags surface when data is unclear, missing, or disputed; per-claim source quotes show *why* the system is uncertain. Strongest example in the field."
        },
        {
          "product": "Consensus Meter",
          "company": "Consensus",
          "url": "https://consensus.app",
          "note": "Yes / No / Possibly / Mixed bars across the top 20 results, color-coded by stance. Gated on ≥5 directly relevant papers — per-claim certainty in the textbook sense."
        },
        {
          "product": "scite.ai Smart Citations",
          "company": "scite.ai",
          "url": "https://scite.ai",
          "note": "Each citation classified as Supporting / Contrasting / Mentioning by a deep-learning model, with surrounding context shown. The canonical Confidence Signals UI for academic claims."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Confidence Signals pattern?",
          "a": "Answers mix high-evidence and low-evidence claims and the reader cannot tell them apart."
        },
        {
          "q": "When should I avoid the Confidence Signals pattern?",
          "a": "Reliable confidence estimates do not exist and the signal would be decorative — or the reader has no lever to pull, where a confidence band transfers anxiety without transferring any control to act on it."
        },
        {
          "q": "What problem does Confidence Signals solve?",
          "a": "Confident wording hides uneven evidence quality and uncertainty."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Plain answers flatten strong and weak claims into the same voice."
        }
      ],
      "related": [
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Confidence Signals say how sure each claim is; Citation Trail shows on hover which source span backs each sentence."
        },
        {
          "id": "reasoning-trace",
          "kind": "pairs-with",
          "note": "Surface uncertainty alongside the inference chain that produced it."
        },
        {
          "id": "disambiguation-branch",
          "kind": "pairs-with",
          "note": "Disambiguation Branch settles what you meant before the run; Confidence Signals then show how well each claim holds up."
        }
      ]
    },
    {
      "id": "autonomy-dial",
      "url": "https://beyondchat.design/patterns/autonomy-dial/",
      "title": "Autonomy Dial",
      "subtitle": "Calibrated Independence Per Task",
      "metaphor": "Permission System",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Instead of binary \"ask everything\" or \"do everything,\" users grant per-tool and per-action autonomy: which actions the agent takes freely, which need approval, which are forbidden. The 2026 reality is per-tool HITL gates more than continuous sliders, but the underlying move is the same — calibrated trust by category, durable across sessions.",
      "interaction": "Configuration, Reactive",
      "controlMechanism": "Per-Tool Permissions, Approval Gates, Allowlists, Step Caps",
      "useCase": "AI Assistants, Workflow Automation, Agent Configuration",
      "useWhen": "Delegation needs to vary by task type — research can be auto, sending mail must be approved.",
      "failureModeLabel": "Weak Intervention",
      "dope": {
        "observability": "Active permission scope visible per tool, agent, and action",
        "predictability": "Each gated action is gated the same way every run — no surprise auto-execution",
        "directability": "Toggle, allowlist, or denylist any tool at any time — the agent adapts on the next call",
        "explainability": "Each permission carries a label naming the tool, the scope, and what triggers a gate"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "entry",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Binary autonomy settings are too blunt for mixed-risk workflows where some tools should run free and others should never auto-execute.",
        "pattern": "Let users grant per-tool / per-action autonomy — auto-run, ask-before-act, or denylist — instead of one binary toggle. The 2026 reality is gates more than continuous sliders.",
        "whyChatBreaks": "Conversation alone cannot express durable, per-tool permission boundaries that survive across sessions.",
        "risks": "Too many knobs can offload system design complexity onto the user; too few collapse back to the binary toggle this pattern is meant to replace.",
        "avoidWhen": "The workflow is simple enough that one global mode is sufficient and the gate UX adds friction without insight."
      },
      "examples": [
        {
          "product": "Salesforce Agentforce",
          "company": "Salesforce",
          "url": "https://www.salesforce.com/agentforce",
          "note": "Topics + Actions + escalation thresholds + per-agent permissions provide per-domain autonomy configuration. Service Agent escalates only on confidence threshold. The clearest enterprise example."
        },
        {
          "product": "Cursor Agent Settings",
          "company": "Cursor",
          "url": "https://cursor.com/docs/agent/overview",
          "note": "Settings → Features → Agent: ask-before-act vs auto-run, allow file deletion, command denylist, max-steps before re-prompt. Per-tool autonomy as explicit knobs."
        },
        {
          "product": "Claude Code Permission Modes",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/sub-agents",
          "note": "Each subagent gets its own tool allowlist + permission mode — effectively per-task-category autonomy stored in .claude/agents/<name>.md, version-controlled."
        },
        {
          "product": "n8n HITL per-tool gating",
          "company": "n8n",
          "url": "https://n8n.io",
          "note": "Per-tool human-approval toggle gives a per-action autonomy dial — the dominant 2026 paradigm of HITL-by-tool rather than continuous sliders."
        },
        {
          "product": "Tesla Autopilot",
          "company": "Tesla",
          "url": "https://www.tesla.com/support/autopilot",
          "note": "Off-domain analog — Autopilot vs FSD (Supervised) tiers (SAE Level 2). The mode-selection UI is not per-task software autonomy, but the metaphor of calibrated trust per category travels."
        },
        {
          "product": "Levels of Autonomy for AI Agents",
          "company": "Academic source · Feng, McDonald, Zhang (University of Washington, Jun 2025)",
          "url": "https://arxiv.org/abs/2506.12469",
          "note": "Defines five discrete autonomy modes (Operator / Collaborator / Consultant / Approver / Observer) with corresponding human-side control modes. A named-modes framing that complements the continuous per-tool dial — useful as a vocabulary for what each setting actually means."
        }
      ],
      "faq": [
        {
          "q": "What is an Autonomy Dial?",
          "a": "An Autonomy Dial is a per-task setting that lets users choose how much an AI may do on its own — from copilot (suggests only) to delegate (asks before acting) to autonomous (acts and reports back). It replaces a single global toggle with task-specific defaults users actually trust."
        },
        {
          "q": "When should I avoid an Autonomy Dial?",
          "a": "Avoid the pattern when one global mode genuinely suffices for the workflow. Adding per-task knobs without a real reason offloads system design complexity onto the user and erodes trust."
        },
        {
          "q": "How does this support directability?",
          "a": "Autonomy is no longer binary — users can keep manual control where stakes are high and delegate where they are not, all from a single visible surface that survives across sessions."
        }
      ],
      "related": [
        {
          "id": "constraint-rules",
          "kind": "pairs-with",
          "note": "Autonomy Dial sets which tools run free or ask first; Constraint Rules Engine checks each action against standing rules."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Autonomy Dial decides which actions must ask first; Approval Gates are the checkpoints where a long run stops to ask."
        },
        {
          "id": "agentic-dashboard",
          "kind": "pairs-with",
          "note": "Configure delegation, then supervise it live in the control room."
        }
      ]
    },
    {
      "id": "action-audit",
      "url": "https://beyondchat.design/patterns/action-audit/",
      "title": "Action Audit & Undo",
      "subtitle": "Every Action Visible, Every Action Reversible",
      "metaphor": "Flight Recorder",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "A persistent timeline of every agent action with per-action undo buttons. Filter by type, batch undo, and see exactly what changed. The psychological safety net that enables delegation.",
      "interaction": "Timeline, Filterable",
      "controlMechanism": "Timeline Log, Per-Action Undo, Batch Undo, Filters",
      "useCase": "File Operations, Automated Workflows, Agent Supervision",
      "useWhen": "The system performs reversible side effects users cannot easily reconstruct themselves.",
      "failureModeLabel": "Linear History",
      "dope": {
        "observability": "Complete history of every agent action is always accessible",
        "predictability": "Undo always works the same way regardless of action type",
        "directability": "One-click undo on any individual action",
        "explainability": "Every logged action includes the reason and context that triggered it"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Delegation feels unsafe when system actions disappear into a black box.",
        "pattern": "Log every action in a reversible, filterable timeline.",
        "whyChatBreaks": "Chat transcripts are poor audit trails for state-changing operations.",
        "risks": "Undo promises are dangerous if side effects are only partially reversible.",
        "avoidWhen": "The system cannot provide trustworthy action history and reversal semantics."
      },
      "examples": [
        {
          "product": "Cursor Checkpoints",
          "company": "Cursor",
          "url": "https://cursor.com/docs/agent/overview#checkpoints",
          "note": "Snapshots of the whole codebase, taken before \"significant changes\", restorable from the chat timeline or the Restore Checkpoint button on a prior request. Restore reverts every modified file to that point — a per-message rollback, not per-action undo; checkpoints before each individual file edit remain an open feature request."
        },
        {
          "product": "Claude Code Esc-Esc Rewind",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/checkpointing",
          "note": "/rewind — or Esc twice on an empty prompt — opens a menu of every prompt in the session, with separate Restore code and Restore conversation actions. One checkpoint per prompt, not per action, and the docs concede the holes: bash-command changes, subagent edits and your own manual edits are not tracked."
        },
        {
          "product": "Google Docs Version History",
          "company": "Google",
          "url": "https://support.google.com/docs/answer/190843",
          "note": "Non-AI grounding for the pattern. Every change recorded with diffs and timestamps; restore-to-version is the canonical undo affordance."
        },
        {
          "product": "Zapier Run History",
          "company": "Zapier",
          "url": "https://help.zapier.com/hc/en-us/articles/8496291148685-View-and-manage-your-Zap-history",
          "note": "Caveat — replay is not undo. Zap history lists every run with a status badge and filters by status, date, owner, folder, app and Zap; runs replay singly or in bulk, with non-errored replays gated to paid plans. The only card here that ships the filterable half — and none of it reverses a side effect."
        },
        {
          "product": "Rubrik Agent Cloud (Agent Rewind)",
          "company": "Rubrik",
          "url": "https://www.rubrik.com/products/agent-rewind",
          "note": "The one product claiming both halves at once: an immutable trail of every agent action from originating prompt to tool call, plus selective rollback that reverses a single file, config or database change instead of restoring the whole system. An enterprise console for IT and security teams, not the acting user's timeline — and Rubrik documents the capability, never the screen."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Action Audit & Undo pattern?",
          "a": "The system performs reversible side effects users cannot easily reconstruct themselves."
        },
        {
          "q": "When should I avoid the Action Audit & Undo pattern?",
          "a": "The system cannot provide trustworthy action history and reversal semantics."
        },
        {
          "q": "What problem does Action Audit & Undo solve?",
          "a": "Delegation feels unsafe when system actions disappear into a black box."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat transcripts are poor audit trails for state-changing operations."
        }
      ],
      "related": [
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Action Audit & Undo captures every action; Approval Gates intercept the ones that need review first."
        },
        {
          "id": "agentic-dashboard",
          "kind": "pairs-with",
          "note": "Agentic Dashboard lets you pause agents mid-run; Action Audit & Undo reverses what they already did, step by step."
        },
        {
          "id": "intent-preview",
          "kind": "pairs-with",
          "note": "Intent Preview shows what will happen; Action Audit & Undo shows what did, with undo per step."
        }
      ]
    },
    {
      "id": "select-transform",
      "url": "https://beyondchat.design/patterns/select-transform/",
      "title": "Select & Transform",
      "subtitle": "Point at It, Don't Describe It",
      "metaphor": "Highlighter",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Select text, pick an action from the floating toolbar, see changes as inline diffs with accept/reject. No need to describe which text to change — just point at it.",
      "interaction": "Selection, Inline Diff",
      "controlMechanism": "Text Selection, Floating Toolbar, Accept/Reject Diffs",
      "useCase": "Text Editing, Content Rewriting, Translation",
      "useWhen": "Edits target a specific span and naming the location verbally would be slower than pointing.",
      "failureModeLabel": "Linear History",
      "dope": {
        "observability": "Every transform renders as an inline diff — struck-through original above the replacement — so the change is visible before it becomes the text",
        "predictability": "The blast radius is the selection: \"Simplify\" touches the highlighted sentence and nothing outside it, unlike a chat rewrite that reflows the whole paragraph",
        "directability": "Selection sets the scope, the floating toolbar names the verbs, and each diff carries its own accept/reject — edits are approved one at a time, not as a bundle",
        "explainability": "Each pending diff is tagged with the action that produced it, so \"why did this sentence change\" is answered by a label, not reconstruction"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "refinement",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Describing the exact target of an edit is slower than pointing at it.",
        "pattern": "Turn selection into AI scope and render changes as reviewable diffs.",
        "whyChatBreaks": "Users must verbally restate location, boundaries, and transformation intent.",
        "risks": "Local transforms can distract from structural problems that need broader revision.",
        "avoidWhen": "The task requires holistic rewriting rather than scoped changes."
      },
      "examples": [
        {
          "product": "Apple Intelligence Writing Tools",
          "company": "Apple",
          "url": "https://support.apple.com/en-us/121582",
          "note": "Select text → Writing Tools → Rewrite / Friendly / Professional / Concise / custom description, with original-version toggle as the diff-style review."
        },
        {
          "product": "Notion AI",
          "company": "Notion",
          "url": "https://www.notion.so",
          "note": "Select text → \"Ask AI to edit\" → in-place edit with diff confirmation. The agent edits in the doc on selection, not in a side panel."
        },
        {
          "product": "Cursor Cmd+K",
          "company": "Cursor",
          "url": "https://cursor.com",
          "note": "Inline editing — select code, press Cmd+K, describe the change, see red/green inline diff with accept/reject. Hero example for code."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Select & Transform pattern?",
          "a": "Edits target a specific span and naming the location verbally would be slower than pointing."
        },
        {
          "q": "When should I avoid the Select & Transform pattern?",
          "a": "The task requires holistic rewriting rather than scoped changes."
        },
        {
          "q": "What problem does Select & Transform solve?",
          "a": "Describing the exact target of an edit is slower than pointing at it."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Users must verbally restate location, boundaries, and transformation intent."
        }
      ],
      "related": [
        {
          "id": "ghost-text",
          "kind": "pairs-with",
          "note": "Ghost Text Editor predicts the next sentence, then you point at any text to reshape it precisely."
        },
        {
          "id": "parallel-alternatives",
          "kind": "pairs-with",
          "note": "Transform a selection into three variants you can compare or blend."
        },
        {
          "id": "tone-of-voice",
          "kind": "pairs-with",
          "note": "Select & Transform scopes the change to one span; the Tone of Voice pad sets how that span should sound."
        }
      ]
    },
    {
      "id": "smart-document",
      "url": "https://beyondchat.design/patterns/smart-document/",
      "title": "Smart Document",
      "subtitle": "AI Blocks That Watch Your Content",
      "metaphor": "Spreadsheet Formula",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "A summary generated in chat is a snapshot: edit the source afterwards and the summary silently stops being true, because nobody re-asks after every change. Smart Document treats AI outputs as derived blocks — spreadsheet formulas over prose — bound to visible source content: edit the source and the summary, translation, and action chips recompute in place, so derived text cannot quietly drift from what it describes.",
      "interaction": "Reactive, Block-based",
      "controlMechanism": "Auto-updating Blocks, Action Chips, Formality Slider",
      "useCase": "Document Editing, Summarization, Translation",
      "useWhen": "AI outputs depend on a living source document and stale answers cause real confusion.",
      "failureModeLabel": "Linear History",
      "dope": {
        "observability": "Each block displays what it derives from and visibly recomputes when the source changes — freshness is shown state, not an assumption",
        "predictability": "Blocks behave like spreadsheet formulas: any source edit deterministically triggers a re-derivation, so derived text is never silently stale",
        "directability": "Edit the source, switch the target language, slide formality — the derived blocks follow the change without being re-prompted",
        "explainability": "A block reads as source plus rule: it names the content it consumes and the transformation it applies, so stale-vs-fresh is decidable by inspection"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "output",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "A summary generated once is a snapshot — the source keeps changing and the derived text silently stops being true, because nobody re-asks after every edit.",
        "pattern": "Bind AI outputs to their source like spreadsheet formulas: edit the source and the summary, translation, and action chips recompute in place.",
        "whyChatBreaks": "Chat has no binding between answer and document — the summary lives in a transcript that never learns the source moved on.",
        "risks": "Text that rewrites itself while the user is not looking feels haunted unless every recompute is visibly cued and traceable to the source edit that caused it.",
        "avoidWhen": "The output must be a fixed snapshot — a signed-off summary, an audit artifact — where live re-derivation is a liability, not a feature."
      },
      "examples": [
        {
          "product": "Notion · AI autofill",
          "company": "Notion",
          "url": "https://www.notion.com/help/autofill",
          "note": "The auto-updating surface is AI autofill, not the inline AI block — the block needs a Generate click. Autofill offers Summary, Translate and Key info bound to the page body, with a run trigger of \"on page edits\", so the derived text re-derives in place. That triad is exactly the summary / translation / action-chips the pattern names."
        },
        {
          "product": "Coda AI Block",
          "company": "Coda",
          "url": "https://coda.io",
          "note": "AI Block creates dynamic summaries and action lists that update as source data changes. Reactivity is documented behaviour, not a bug."
        },
        {
          "product": "Google Sheets =AI()",
          "company": "Google",
          "url": "https://docs.google.com/spreadsheets",
          "note": "Kept as the instructive near-miss rather than dropped. =AI() / =Gemini() looks like the spreadsheet-formula metaphor and is not one: the output is inserted as static text and only updates when a human clicks \"Refresh and insert\". Change a referenced cell and nothing recalculates — the borrowed metaphor without the binding underneath it."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Smart Document pattern?",
          "a": "AI outputs depend on a living source document and stale answers cause real confusion."
        },
        {
          "q": "When should I avoid the Smart Document pattern?",
          "a": "The output must be a fixed snapshot — a signed-off summary, an audit artifact — where live re-derivation is a liability, not a feature."
        },
        {
          "q": "What problem does Smart Document solve?",
          "a": "A summary generated once is a snapshot — the source keeps changing and the derived text silently stops being true, because nobody re-asks after every edit."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat has no binding between answer and document — the summary lives in a transcript that never learns the source moved on."
        }
      ],
      "related": [
        {
          "id": "ghost-text",
          "kind": "pairs-with",
          "note": "Ghost Text Editor speeds up writing the source; Smart Document keeps the summary and translation built from it current."
        },
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Smart Document keeps the summary in step with its source; Citation Trail traces each summary sentence back to a source span."
        },
        {
          "id": "generative-ui",
          "kind": "pairs-with",
          "note": "Generative UI makes AI output clickable and Smart Document binds it to its source, so the result is both interactive and current."
        }
      ]
    },
    {
      "id": "spatial-canvas",
      "url": "https://beyondchat.design/patterns/spatial-canvas/",
      "title": "Spatial Canvas",
      "subtitle": "Thinking in Infinite Space",
      "metaphor": "Whiteboard",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Chat flattens parallel work into one scrolling timeline: variants, branches, and sub-tasks compete for the same column, and moving context between them means copy-paste. Spatial Canvas externalizes each AI context as a node on an infinite canvas — drag to arrange, draw an edge to pipe one node's output into another's context — so the structure of the work is the picture in front of you, not a memory of where things sat in the scroll.",
      "interaction": "Spatial, Drag & Drop",
      "controlMechanism": "Draggable Nodes, Connections, Context Flow",
      "useCase": "Ideation, Planning, Multi-Agent Workflows",
      "useWhen": "Users hold many parallel threads — variants, branches, sub-tasks — that chat history flattens.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "Every context is a node on one surface and every dependency is a drawn edge — the shape of the work is read off the canvas, not remembered from the scroll",
        "predictability": "An edge is a contract: connect Research to Review and Review consumes exactly that context; disconnect it and the contribution disappears from the output",
        "directability": "Drag nodes to restructure, draw or delete an edge to change what flows where — context routing is direct manipulation, not prompt engineering",
        "explainability": "A downstream node names the inputs it consumed (\"Review based on: research + brief\"), so its output is traceable to specific upstream contexts"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Linear chat hides parallel context, branches, and relationships.",
        "pattern": "Externalize AI work as spatial nodes on a shared canvas.",
        "whyChatBreaks": "Scrolling transcripts collapse many threads into one timeline.",
        "risks": "Spatial systems can become visually chaotic without hierarchy and pruning.",
        "avoidWhen": "The task is simple and spatial organization would just add overhead."
      },
      "examples": [
        {
          "product": "tldraw computer",
          "company": "tldraw",
          "url": "https://computer.tldraw.com",
          "note": "Text, image, and audio components flow through draggable arrows on an infinite canvas. AI work as a node graph rather than a transcript."
        },
        {
          "product": "Miro Intelligent Canvas",
          "company": "Miro",
          "url": "https://miro.com/intelligent-canvas",
          "note": "AI Sidekicks live directly on the canvas; Flows are drag-and-drop AI building blocks connected with arrows. Apr 2026 added PDF/Markdown drop-in."
        },
        {
          "product": "ComfyUI",
          "company": "Comfy.org",
          "url": "https://www.comfy.org",
          "note": "Node graph as the entire product surface — every step of an image generation pipeline is a connected node. Mar 2026 added App Mode for shipping workflows as apps."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Spatial Canvas pattern?",
          "a": "Users hold many parallel threads — variants, branches, sub-tasks — that chat history flattens."
        },
        {
          "q": "When should I avoid the Spatial Canvas pattern?",
          "a": "The task is simple and spatial organization would just add overhead."
        },
        {
          "q": "What problem does Spatial Canvas solve?",
          "a": "Linear chat hides parallel context, branches, and relationships."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Scrolling transcripts collapse many threads into one timeline."
        }
      ],
      "related": [
        {
          "id": "parallel-alternatives",
          "kind": "pairs-with",
          "note": "Give each Parallel Alternatives candidate its own node, then draw an edge to feed the one you pick into the next step."
        },
        {
          "id": "editable-plan",
          "kind": "pairs-with",
          "note": "Edit and sign off an Editable Plan, then run its steps as canvas nodes, with edges piping each step's output into the next."
        },
        {
          "id": "generative-ui",
          "kind": "pairs-with",
          "note": "Render a node's output as Generative UI, so the canvas holds sortable tables and charts, not only text."
        }
      ]
    },
    {
      "id": "contextual-overlay",
      "url": "https://beyondchat.design/patterns/contextual-overlay/",
      "title": "Contextual Overlay",
      "subtitle": "Summoned in place, dismissed when done",
      "metaphor": "Assistant",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Sidebar chat and modal assistants pull you off the page to re-describe work the model can already see. A contextual overlay summons the assist in place, anchored to your selection, and vanishes when the edit lands. Unlike a ghost-text completion at the cursor, it acts on what you selected and labels each suggestion with the action that produced it, so you accept or reject with one click.",
      "interaction": "Contextual, Ephemeral",
      "controlMechanism": "Selection-based, Autocomplete",
      "useCase": "Text Editing, Refactoring, Coding Assistance",
      "useWhen": "Unlike ghost text that just completes at the cursor, a contextual overlay acts on what you selected and shows what each suggestion did — so you stay in the document and decide with one click, not by reflex.",
      "failureModeLabel": "Hidden Structure",
      "dope": {
        "observability": "The overlay appears anchored to the selection and the proposed rewrite renders in place, visually distinct from the authored text around it",
        "predictability": "The surface is ephemeral by contract: summoned by a deliberate selection, gone when the edit lands — it never lingers as a second workspace",
        "directability": "Actions are named verbs on the selection (\"Make it shorter\", \"More formal\") — one click applies, one click dismisses, no prompt writing in between",
        "explainability": "Each proposed rewrite is labeled with the action that produced it, so what the AI did to your paragraph is stated, not guessed from the diff"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "refinement",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Sidebar and modal assistants pull users off the page to re-describe work the model can already see.",
        "pattern": "Summon an ephemeral surface anchored to the selection — not a completion at the cursor (Ghost Text), not a diff-reviewed transform (Select & Transform), but a labeled action menu that appears on demand and vanishes when the edit lands.",
        "whyChatBreaks": "A separate chat surface has no anchor to the selection, so every tiny edit becomes a copy-in, copy-out round trip the user has to splice back by hand.",
        "risks": "Overlays that trigger on idle hover instead of a deliberate gesture feel interruptive — and an overlay that grows tabs and history has become the sidebar it replaced.",
        "avoidWhen": "The edit needs cross-document context or diff-level review — then a persistent workspace or Select & Transform's reviewable scope beats a surface that disappears."
      },
      "examples": [
        {
          "product": "Notion AI overlay",
          "company": "Notion",
          "url": "https://www.notion.so",
          "note": "Press space on a new line for a prompt box; select text and choose Edit with AI for the in-place menu — built-in skills (Improve Writing, Proofread, Explain, Reformat) plus any skill your workspace adds. The rewrite lands in the document with accept, discard, or try again. Both surfaces vanish once the edit lands."
        },
        {
          "product": "GitHub Copilot Inline Chat",
          "company": "GitHub",
          "url": "https://code.visualstudio.com/docs/editing/copilot-smart-actions",
          "note": "Two surfaces in one editor. Cmd+I / Ctrl+I is a free-text prompt box at the cursor — ephemeral, but with no named verbs. The labeled half is Smart Actions: right-click a selection for Explain, Fix, Generate Docs, Generate Tests, Review, no prompt written. Both return an inline diff with Keep or Undo."
        },
        {
          "product": "Apple Intelligence Writing Tools",
          "company": "Apple",
          "url": "https://support.apple.com/en-us/121582",
          "note": "Select text, then Control-click and choose Show Writing Tools on macOS, or tap Writing Tools in the iOS selection bar. A floating panel offers Proofread, Rewrite, Friendly, Professional, Concise, Summary, Key Points, List and Table, then dismisses on Replace. Works in most third-party fields; read-only text gets the result without Replace."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Contextual Overlay pattern?",
          "a": "Unlike ghost text that just completes at the cursor, a contextual overlay acts on what you selected and shows what each suggestion did — so you stay in the document and decide with one click, not by reflex."
        },
        {
          "q": "When should I avoid the Contextual Overlay pattern?",
          "a": "The edit needs cross-document context or diff-level review — then a persistent workspace or Select & Transform's reviewable scope beats a surface that disappears."
        },
        {
          "q": "What problem does Contextual Overlay solve?",
          "a": "Sidebar and modal assistants pull users off the page to re-describe work the model can already see."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A separate chat surface has no anchor to the selection, so every tiny edit becomes a copy-in, copy-out round trip the user has to splice back by hand."
        }
      ],
      "related": [
        {
          "id": "ghost-text",
          "kind": "alternative",
          "note": "Contextual Overlay appears on a selection and vanishes once the edit lands; Ghost Text Editor completes as you type at the cursor."
        },
        {
          "id": "select-transform",
          "kind": "alternative",
          "note": "Both act on a selection; Contextual Overlay is a one-click action menu that vanishes, Select & Transform an inline diff to review."
        },
        {
          "id": "parallel-alternatives",
          "kind": "alternative",
          "note": "Contextual Overlay offers one labeled rewrite in place; Parallel Alternatives sets three candidates side by side to compare."
        }
      ]
    },
    {
      "id": "agentic-dashboard",
      "url": "https://beyondchat.design/patterns/agentic-dashboard/",
      "title": "Agentic Dashboard",
      "subtitle": "Command Center for Autonomous Agents",
      "metaphor": "Control Room",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Once agents run for minutes instead of seconds, a transcript stops working as a supervision surface: four agents interleaved into one scroll means you find out about the blocked one when you happen to scroll past it. The Agentic Dashboard gives concurrent agents a control room — per-agent status and progress, pause/resume on each lane, an approval queue that states what the agent wants to do before it does it, and a timestamped log per agent — so intervention is a button you press, not a message you hope lands in time.",
      "interaction": "Monitoring, Approval",
      "controlMechanism": "Logs, Stop-Buttons, Approval Queues",
      "useCase": "Agent Orchestration, Long-Running Processes, Governance",
      "useWhen": "Multiple agents run concurrently and users need a control room rather than a transcript.",
      "failureModeLabel": "Weak Intervention",
      "dope": {
        "observability": "Each agent gets its own lane — live status, progress bar, current step, timestamped log — so a stalled or waiting agent is visible without scrolling a merged transcript",
        "predictability": "Agents that hit a scope decision halt and queue for approval instead of guessing — the dashboard states what will happen next before it happens",
        "directability": "Pause or resume any agent mid-run, approve or reject its queued request — intervention is a per-agent button, not a chat message racing the agent",
        "explainability": "Approval cards state the concrete action and its scope (\"147 messages across 6 threads, posts to #standup\"), so the decision is made on specifics, not on trust"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Several agents running concurrently in one transcript means discovering the blocked one only when you happen to scroll past it.",
        "pattern": "Give each agent its own lane — status, progress, log — plus per-agent pause/resume and an approval queue that states the action before it runs.",
        "whyChatBreaks": "A transcript is a single timeline: it cannot show the live state of several agents at once, and a typed \"stop\" races the agent it is trying to halt.",
        "risks": "A pause button that lags the agent, or approval cards too vague to decide on, simulate control without providing it — the surface must be wired to real interruption.",
        "avoidWhen": "One short-running assistant is doing one thing — a transcript is the right surface for that, and a control room is overhead."
      },
      "examples": [
        {
          "product": "Salesforce Agentforce Observability",
          "company": "Salesforce",
          "url": "https://www.salesforce.com/agentforce/observability/",
          "note": "Renamed from Command Center — the old URL redirects here. One console over every deployed agent: error rate, latency and escalation rate on five-minute intervals, filterable by agent type and channel, plus session-level traces and topic-level quality scores. Intervention means editing the agent's configuration afterwards; nothing here halts a running agent."
        },
        {
          "product": "Fiddler.ai Agentic Observability",
          "company": "Fiddler",
          "url": "https://www.fiddler.ai/agentic-observability",
          "note": "Fiddler's docs name the surface: a Projects → Applications UI, an Agent Performance Overview across all agents, hierarchical traces from application to session to agent to trace to span, and root-cause analysis that pinpoints the failing span. Read-only supervision — guardrails fire automatically, but nobody watching can stop an agent from the dashboard."
        },
        {
          "product": "Cursor 3 Agents Window",
          "company": "Cursor",
          "url": "https://cursor.com/changelog/3-0",
          "note": "Cursor 3 (Apr 2026) made the Agents Window GA and it still ships: parallel agents in one window across local checkouts, worktrees, cloud VMs and remote SSH, with a shared diffs view and local-to-cloud handoff. Each chat queues or steers messages and can be interrupted — but the docs describe a workspace per agent, not status rows with per-lane pause."
        },
        {
          "product": "GitHub · Copilot agents page",
          "company": "GitHub",
          "url": "https://docs.github.com/en/copilot/how-tos/copilot-on-github/use-copilot-agents/manage-and-track-agents",
          "note": "An agents panel reachable from any GitHub page lists every Copilot cloud-agent session across your repos with progress, token usage and length. Open one to read its log, type a follow-up to steer it, or hit Stop session, which ends the Actions run and keeps commits already pushed. The lane-with-a-halt the other rows lack."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Agentic Dashboard pattern?",
          "a": "Multiple agents run concurrently and users need a control room rather than a transcript."
        },
        {
          "q": "When should I avoid the Agentic Dashboard pattern?",
          "a": "One short-running assistant is doing one thing — a transcript is the right surface for that, and a control room is overhead."
        },
        {
          "q": "What problem does Agentic Dashboard solve?",
          "a": "Several agents running concurrently in one transcript means discovering the blocked one only when you happen to scroll past it."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A transcript is a single timeline: it cannot show the live state of several agents at once, and a typed \"stop\" races the agent it is trying to halt."
        }
      ],
      "related": [
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Agentic Dashboard shows what each agent is doing now; Action Audit & Undo lets you reverse what one already did."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Dashboard surfaces queued gates for batched, faster approvals."
        },
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Autonomy Dial decides which actions run freely; the ones set to ask land in the dashboard's approval queue."
        }
      ]
    },
    {
      "id": "visual-intent",
      "url": "https://beyondchat.design/patterns/visual-intent/",
      "title": "Visual Intent Expression",
      "subtitle": "Show It, Don't Describe It",
      "metaphor": "Mood Board",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Instead of translating visual intent into words, express it directly: pick colors, toggle style keywords, arrange references, and watch a live preview react. Showing is faster and more precise than telling.",
      "interaction": "Visual, Direct Manipulation",
      "controlMechanism": "Color Palette, Style Tags, Reference Grid, Live Preview",
      "useCase": "Brand Design, Style Definition, Creative Direction",
      "useWhen": "Aesthetic direction matters — composition, palette, references — beyond what adjectives capture.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "The whole intent state reads off the board at a glance — checked swatches, lit keyword chips, each reference's Subtle/Strong setting — no transcript to reconstruct",
        "predictability": "Every keyword maps to a defined visual move — Geometric snaps the mark to a hexagon, Organic to a blob, Bold thickens the stroke — so a toggle's effect is known before it lands",
        "directability": "Steering happens in the output's own medium: tap a swatch, toggle a keyword, flip a reference from Subtle to Strong — no adjective ever gets typed",
        "explainability": "The preview morphs within ~250 ms of each change, so which selection drove which visual shift is demonstrated live, not reverse-engineered from a finished output"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Visual direction gets distorted when forced through adjectives alone.",
        "pattern": "Capture aesthetic intent through references, palettes, and arrangement.",
        "whyChatBreaks": "Text is weak at conveying composition, proportion, and style nuance.",
        "risks": "Reference-heavy systems can slide toward mimicry instead of synthesis.",
        "avoidWhen": "The task is primarily verbal or the visual language is already fixed."
      },
      "examples": [
        {
          "product": "Adobe Firefly Style Reference",
          "company": "Adobe",
          "url": "https://firefly.adobe.com",
          "note": "Reference image + Strength slider — user uploads aesthetic reference, drags strength to weight influence. The strongest pure expression of the pattern."
        },
        {
          "product": "Midjourney Style Reference (--sref) + Moodboards",
          "company": "Midjourney",
          "url": "https://docs.midjourney.com/hc/en-us/articles/32180011136653-Style-Reference",
          "note": "Paste --sref code to reuse aesthetic across prompts, or build a moodboard from multiple uploaded references. The 2026 hero UI for visual intent at Midjourney."
        },
        {
          "product": "Recraft · Style Reference",
          "company": "Recraft",
          "url": "https://www.recraft.ai/blog/introducing-recraft-v4-design-taste-meets-image-generation",
          "note": "Drop in reference images and Recraft turns them into a named, reusable, editable style — color grading, lighting, line quality — applied to every future generation, with style-mixing across references. Show, don't describe, made durable."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Visual Intent Expression pattern?",
          "a": "Aesthetic direction matters — composition, palette, references — beyond what adjectives capture."
        },
        {
          "q": "When should I avoid the Visual Intent Expression pattern?",
          "a": "The task is primarily verbal or the visual language is already fixed."
        },
        {
          "q": "What problem does Visual Intent Expression solve?",
          "a": "Visual direction gets distorted when forced through adjectives alone."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Text is weak at conveying composition, proportion, and style nuance."
        }
      ],
      "related": [
        {
          "id": "multi-modal",
          "kind": "pairs-with",
          "note": "Visual Intent Expression sets the palette and style; Multi-Modal Input adds a weighted sketch that sets the layout."
        },
        {
          "id": "region-lock",
          "kind": "pairs-with",
          "note": "Set the look once, lock the parts that work, regenerate the rest in style."
        },
        {
          "id": "prompt-parsing",
          "kind": "alternative",
          "note": "Visual Intent Expression sets the look with swatches and references; Inline Prompt Controls keep it in the prompt as clickable values."
        }
      ]
    },
    {
      "id": "supervisor-worker",
      "url": "https://beyondchat.design/patterns/supervisor-worker/",
      "title": "Supervisor-Worker",
      "subtitle": "Decompose, Delegate, Supervise",
      "metaphor": "Project Manager",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Instead of one AI producing a monolithic response, a Supervisor Agent decomposes the task and delegates to specialized workers. Review, approve, or revise each piece independently.",
      "interaction": "Orchestration, Approval",
      "controlMechanism": "Worker Cards, Status Badges, Approve/Revise, Progress Tracking",
      "useCase": "Complex Tasks, Multi-Step Workflows, Agent Orchestration",
      "useWhen": "Work decomposes into steps that benefit from specialized agents and a coordinating layer.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "Each agent's task, status, and output are independently visible",
        "predictability": "Defined agent roles produce specialized, consistent outputs",
        "directability": "Approve, revise, or redirect any agent without affecting others",
        "explainability": "Each worker agent's task assignment and decision rationale are independently visible"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Monolithic AI outputs hide decomposition and make review too coarse.",
        "pattern": "Split work into specialist agents under a supervising layer.",
        "whyChatBreaks": "One chat thread bundles planning, execution, and review into one opaque turn.",
        "risks": "Coordination overhead can outweigh the benefit for narrow tasks.",
        "avoidWhen": "A single agent or human can handle the work directly."
      },
      "examples": [
        {
          "product": "Claude Code Subagents",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/sub-agents",
          "note": "Specialists get their own context, tool allowlist and permission mode. A panel under the prompt lists each running worker, `/tasks` opens one worker's transcript to message or stop it, and a background worker's permission prompt names which subagent is asking. Per-worker control, in a terminal rather than a consumer UI."
        },
        {
          "product": "CrewAI Hierarchical",
          "company": "CrewAI",
          "url": "https://www.crewai.com",
          "note": "Hierarchical process with auto-created manager agent that delegates to role-defined workers. Explicit supervisor-worker process at the framework level."
        },
        {
          "product": "Microsoft Agent Framework",
          "company": "Microsoft",
          "url": "https://learn.microsoft.com/en-us/agent-framework",
          "note": "AutoGen and Semantic Kernel merged into one SDK, GA as 1.0 on 3 April 2026. Its Magentic orchestration is this pattern by name — a manager agent coordinating specialist agents — alongside handoff and group chat, on a graph workflow engine with human-in-the-loop pauses. An SDK, though: the supervision UI is yours to build."
        },
        {
          "product": "Manus Agent Mode",
          "company": "Manus",
          "url": "https://manus.im",
          "note": "Agent mode plans and then executes in a cloud sandbox, with each step visible as it runs and the whole run shareable as a replay link. Manus's own docs name only Wide Research as multi-agent, and that is hundreds of identical parallel agents — a fan-out, not a specialist tree. Decomposition you can watch; roles you cannot inspect."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Supervisor-Worker pattern?",
          "a": "Work decomposes into steps that benefit from specialized agents and a coordinating layer."
        },
        {
          "q": "When should I avoid the Supervisor-Worker pattern?",
          "a": "A single agent or human can handle the work directly."
        },
        {
          "q": "What problem does Supervisor-Worker solve?",
          "a": "Monolithic AI outputs hide decomposition and make review too coarse."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "One chat thread bundles planning, execution, and review into one opaque turn."
        }
      ],
      "related": [
        {
          "id": "agentic-dashboard",
          "kind": "pairs-with",
          "note": "Decomposed agents need a control room to monitor each independently."
        },
        {
          "id": "editable-plan",
          "kind": "pairs-with",
          "note": "The supervisor produces a plan; users edit it before workers execute."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Per-worker checkpoints catch off-track output before it propagates."
        }
      ]
    },
    {
      "id": "ai-memory",
      "url": "https://beyondchat.design/patterns/ai-memory/",
      "title": "AI Memory",
      "subtitle": "Persistent Context Users Can See and Control",
      "metaphor": "Personal Dossier",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Instead of re-explaining context every conversation, AI maintains a visible, editable memory. Users see what the AI \"knows\" about them and can correct, delete, or add memories. Memory becomes a first-class UI element, not a hidden system prompt.",
      "interaction": "Toggle, Edit, Categorize",
      "controlMechanism": "Memory Cards, Toggle Switches, Inline Edit, Category Tabs",
      "useCase": "AI Assistants, Personalization, Long-Term Collaboration",
      "useWhen": "Continuity across sessions creates real user value — and silent memory would feel intrusive.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "Every memory is a card with its provenance (\"Source: 12 conversations\"), a staleness dot, and an on/off state — plus a running \"8 of 9 active\" count, not a hidden system prompt",
        "predictability": "Each toggle maps to a specific output change — flip \"avoids buzzwords\" off and the headline goes hype, flip the format preference on and prose becomes bullets",
        "directability": "Context is curated per card — switch, inline-edit, delete, or add a memory — not wiped or kept wholesale",
        "explainability": "The response preview names which memories shaped it as chips — active ones lit, disabled ones struck through — so influence is attributed, not assumed"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Persistent context is useful but risky when it is hidden from users.",
        "pattern": "Expose memory as a visible, editable user-facing artifact.",
        "whyChatBreaks": "Hidden memory silently shapes outputs without inspection or correction.",
        "risks": "Stored memories can become creepy, stale, or over-personalized.",
        "avoidWhen": "The product does not need cross-session continuity or personalization."
      },
      "examples": [
        {
          "product": "ChatGPT Memory",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "Settings → Personalization → Manage memories. Apr 2025 added memory-source visibility (\"which memory was used\"); Oct 2025 added auto-management with prioritize/deprioritize. Flagship example."
        },
        {
          "product": "Claude Memory",
          "company": "Anthropic",
          "url": "https://claude.ai",
          "note": "Settings → Capabilities → \"View and edit memory\" (Sept 2025). Pencil icon in lower-left of memory summary lets users add custom instructions. Stored as plain Markdown for transparency. Pro/Max only."
        },
        {
          "product": "Claude Code auto-memory",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/memory",
          "note": "v2.1.59+ writes memory to CLAUDE.md files Claude shows you and lets you edit. Tier hierarchy (~/.claude, project, subdirectory) is unusually transparent — the file IS the memory."
        }
      ],
      "faq": [
        {
          "q": "When should I use the AI Memory pattern?",
          "a": "Continuity across sessions creates real user value — and silent memory would feel intrusive."
        },
        {
          "q": "When should I avoid the AI Memory pattern?",
          "a": "The product does not need cross-session continuity or personalization."
        },
        {
          "q": "What problem does AI Memory solve?",
          "a": "Persistent context is useful but risky when it is hidden from users."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Hidden memory silently shapes outputs without inspection or correction."
        }
      ],
      "related": [
        {
          "id": "constraint-rules",
          "kind": "pairs-with",
          "note": "AI Memory holds preferences that shape answers; Constraint Rules Engine holds rules every agent action is checked against."
        },
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "AI Memory names which memories shaped an answer; Confidence Signals rate how well-evidenced each claim in that answer is."
        },
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "AI Memory holds what the assistant knows about you; Autonomy Dial sets which tools it may run without asking."
        }
      ]
    },
    {
      "id": "multi-modal",
      "url": "https://beyondchat.design/patterns/multi-modal/",
      "title": "Multi-Modal Input",
      "subtitle": "Combine Sketch, References, and Text",
      "metaphor": "Director's Storyboard",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Instead of forcing users to describe visual layouts purely through text, let them combine modalities — sketch a rough layout, point to reference examples, and add text annotations. The AI interprets each signal and shows how it weighs them.",
      "interaction": "Multi-Modal, Weighted",
      "controlMechanism": "Sketch Canvas, Reference Grid, Text Input, Modality Weights",
      "useCase": "UI Layout Design, Wireframing, Visual Communication",
      "useWhen": "Users have visual or audio context that text alone forces them to translate prematurely.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "Sketch, references, and text each carry a visible weight readout, so how much each channel steers the result is displayed, not inferred from the output",
        "predictability": "Weights behave like a mixing desk: raise the sketch channel and the layout tracks the drawing more, lower it and the references take over — the preview moves with the fader",
        "directability": "Each modality is a separate input revised independently — redraw the sketch, swap a reference, set a reference's influence to subtle or strong — without disturbing the others",
        "explainability": "The preview updates against the weight mix in real time, so which input drove which aspect of the layout is demonstrated live, not asserted afterwards"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Users often know something visually before they can phrase it.",
        "pattern": "Let text, sketch, and references combine as weighted inputs.",
        "whyChatBreaks": "A single text channel forces premature translation of visual intent.",
        "risks": "Multiple input modes can complicate attribution and onboarding.",
        "avoidWhen": "The task is purely textual and extra modalities add noise."
      },
      "examples": [
        {
          "product": "tldraw Make Real",
          "company": "tldraw",
          "url": "https://makereal.tldraw.com",
          "note": "Sketch a UI, add sticky-note annotations, click Make Real — HTML/CSS comes back. Still the cleanest sketch+text→working-output example, and still hosted at makereal.tldraw.com. But tldraw archived the repo on 18 Feb 2026, so read it as a frozen research demo rather than a maintained product."
        },
        {
          "product": "Google Stitch",
          "company": "Google",
          "url": "https://stitch.withgoogle.com",
          "note": "Galileo AI's successor. The Mar 2026 canvas release takes sketches, screenshots and text on one AI-native infinite canvas, plus voice; May 2026 added the Stitch Agent, streaming edits to the canvas live. Screens generate and stitch into prototypes — but every input lands as undifferentiated context, with no per-modality weight."
        },
        {
          "product": "Leonardo.Ai Image Guidance",
          "company": "Leonardo.Ai",
          "url": "https://intercom.help/leonardo-ai/en/articles/8497988-image-guidance",
          "note": "The typed route still ships in the Image Generation UI: each reference carries a strength (Style Low–Max, Content and Character Low–High), and multiple Style References get an Influence slider that sets their ratio. But Leonardo's own doc opens by saying you no longer need it — upload six images, describe how they combine, adjust no settings."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Multi-Modal Input pattern?",
          "a": "Users have visual or audio context that text alone forces them to translate prematurely."
        },
        {
          "q": "When should I avoid the Multi-Modal Input pattern?",
          "a": "The task is purely textual and extra modalities add noise."
        },
        {
          "q": "What problem does Multi-Modal Input solve?",
          "a": "Users often know something visually before they can phrase it."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A single text channel forces premature translation of visual intent."
        }
      ],
      "related": [
        {
          "id": "visual-intent",
          "kind": "pairs-with",
          "note": "Multi-Modal Input's sketch sets where things go; Visual Intent Expression adds the palette and style a sketch can't carry."
        },
        {
          "id": "disambiguation-branch",
          "kind": "pairs-with",
          "note": "When the sketch and a reference pull different ways, Disambiguation Branch shows each reading before generating."
        },
        {
          "id": "prompt-parsing",
          "kind": "alternative",
          "note": "Multi-Modal Input adds sketch and reference channels beside the text; Inline Prompt Controls make one prompt's values clickable."
        }
      ]
    },
    {
      "id": "progressive-disclosure",
      "url": "https://beyondchat.design/patterns/progressive-disclosure/",
      "title": "Progressive Disclosure",
      "subtitle": "Complexity on Demand",
      "metaphor": "Telescope",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Instead of overwhelming all options upfront or hiding them behind chat syntax, the UI reveals advanced controls behind expansion — beginner mode, advanced mode, or layered accordions. Depth stays available without being default.",
      "interaction": "Layered, Expandable",
      "controlMechanism": "Disclosure Levels, Expand/Collapse, Complexity Indicator",
      "useCase": "Image Generation, Complex Tools, Parameter-Heavy Workflows",
      "useWhen": "Novices and experts share the same tool and full visibility would overwhelm one of them.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "Current complexity level and available controls are always visible",
        "predictability": "Each level has a defined, stable set of controls",
        "directability": "Expand or collapse complexity with one click",
        "explainability": "Each complexity level is labeled with what capabilities it unlocks"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "AI tools often overwhelm novices or frustrate experts when shown the same interface.",
        "pattern": "Reveal advanced controls behind expansion — beginner mode, advanced mode, or layered accordions — so depth is available without being default.",
        "whyChatBreaks": "Chat hides advanced capability behind exact wording and prior knowledge — there is no visible path from beginner to expert.",
        "risks": "Important capabilities may remain undiscovered if disclosure is too timid; overly tiered framings rarely match how products actually ship — and the opposite failure goes unaudited, because a tier nobody ever expands was hidden correctly, while the affordance offering it still costs attention on every visit.",
        "avoidWhen": "The tool is simple enough that full visibility is clearer than layered concealment."
      },
      "examples": [
        {
          "product": "ComfyUI",
          "company": "Comfy.org",
          "url": "https://www.comfy.org",
          "note": "Three real rungs, and the bottom one is now named: Workflow → Browse Workflow Templates, the node canvas, and App Mode (March 2026) — a one-click simplified view you can flip back out of at any time. Caveat: App Builder lets the workflow author pick which inputs App Mode shows, so the simple tier is curated, not self-service."
        },
        {
          "product": "Krea AI",
          "company": "Krea",
          "url": "https://krea.ai",
          "note": "No easy/advanced toggle in the current product: after the March 2026 redesign, image settings sit beneath the prompt box and vary by model — Krea's own framing is controls that stay hidden until you need them. The step up in depth is a separate surface, the Nodes canvas at krea.ai/nodes, not a mode switch inside the generator."
        },
        {
          "product": "Stable Diffusion WebUI (Auto1111)",
          "company": "AUTOMATIC1111",
          "url": "https://github.com/AUTOMATIC1111/stable-diffusion-webui",
          "note": "Top-level prompt + collapsible sections (Sampling, Hires.fix, ADetailer extensions). Accordion-style progressive disclosure as a power-user norm."
        },
        {
          "product": "LM Studio · User / Developer modes",
          "company": "LM Studio",
          "url": "https://lmstudio.ai/docs/app/user-interface/modes",
          "note": "A named complexity mode, set once and applied app-wide: User hides everything but chat and auto-configures; Developer exposes load and inference parameters. Also the clearest evidence against a three-rung ladder — 0.4.0 (Jan 2026) called merging Power User into Developer a simplification of the previous three-mode switch."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Progressive Disclosure pattern?",
          "a": "Novices and experts share the same tool and full visibility would overwhelm one of them."
        },
        {
          "q": "When should I avoid the Progressive Disclosure pattern?",
          "a": "The tool is simple enough that full visibility is clearer than layered concealment."
        },
        {
          "q": "What problem does Progressive Disclosure solve?",
          "a": "AI tools often overwhelm novices or frustrate experts when shown the same interface."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat hides advanced capability behind exact wording and prior knowledge — there is no visible path from beginner to expert."
        }
      ],
      "related": [
        {
          "id": "property-panel",
          "kind": "pairs-with",
          "note": "Layer a Property Panel so everyday controls stay in view and advanced ones wait one expansion away."
        },
        {
          "id": "semantic-zoom",
          "kind": "pairs-with",
          "note": "Progressive Disclosure layers the controls; Semantic Zoom re-renders the answer at three depths, from headline to full detail."
        },
        {
          "id": "prompt-parsing",
          "kind": "pairs-with",
          "note": "Inline Prompt Controls surface the settings a prompt names; Progressive Disclosure folds the ones it never mentions behind expansion."
        }
      ]
    },
    {
      "id": "reasoning-trace",
      "url": "https://beyondchat.design/patterns/reasoning-trace/",
      "title": "Reasoning Trace",
      "subtitle": "Making the Machine's Thinking Visible",
      "metaphor": "X-Ray",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "Instead of a flat confident-sounding answer, the AI exposes its reasoning as a collapsible tree. Each claim links back to the assumptions, data points, and inferences that produced it. Users see not just what the AI concluded, but why — and where uncertainty lives.",
      "interaction": "Expandable, Tree",
      "controlMechanism": "Decision Tree, Confidence Nodes, Expand/Collapse",
      "useCase": "Research, Decision Support, Complex Analysis",
      "useWhen": "Conclusions need to be challengeable — research, decisions, audits — not just produced.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "The full reasoning chain is visible, not hidden behind a confident summary",
        "predictability": "Consistent node structure makes reasoning auditable and comparable",
        "directability": "Low-confidence branches invite targeted correction or deeper research",
        "explainability": "The full decision chain is exposed with assumptions explicitly flagged"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Users cannot challenge conclusions they cannot inspect.",
        "pattern": "Expose claims, assumptions, and inferences as navigable structure.",
        "whyChatBreaks": "Flat answers collapse reasoning into one authoritative-sounding response.",
        "risks": "Displayed reasoning is typically a post-hoc rationalization, not the model's faithful process (NNGroup 2025) — treat the trace as a checkable claim structure, never as proof, and pair it with sources.",
        "avoidWhen": "The task is lightweight and explanation cost exceeds decision cost — or the reader is not answerable for the result and cannot evaluate the chain, where visible machinery reads as instability rather than rigor."
      },
      "examples": [
        {
          "product": "Claude Extended Thinking",
          "company": "Anthropic",
          "url": "https://claude.ai",
          "note": "The effort selector now spans Opus 5, Sonnet 5, Fable 5, Opus 4.8, 4.7, 4.6 and Sonnet 4.6; thinking is a toggle under model name → Effort, and cannot be switched off on Opus 5. An expandable \"Thinking\" panel with a timer shows a summary — never the raw chain, and it can cut off mid-trace when safety systems redact it."
        },
        {
          "product": "ChatGPT Reasoning Panel",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "o3 leaves the ChatGPT picker on 26 Aug 2026 (API until 11 Dec), and the picker is now a reasoning slider — Instant / Medium / High / Extra High / Pro on GPT-5.6 Sol. The expandable \"Thought for X seconds\" panel survives, and since GPT-5.4 the model states its plan upfront so you can redirect mid-run. Summary only; raw traces stay unreleased."
        },
        {
          "product": "DeepSeek V4 Thinking Mode",
          "company": "DeepSeek",
          "url": "https://chat.deepseek.com",
          "note": "R1 is off the hosted API — the deepseek-reasoner alias stopped resolving 24 Jul 2026 — and the app runs V4 through Expert / Instant mode. The move survives, and stays the least filtered of the three: DeepSeek's docs say thinking mode returns the chain of thought in full via reasoning_content, not a summary. Effort is low / high / max."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Reasoning Trace pattern?",
          "a": "Conclusions need to be challengeable — research, decisions, audits — not just produced."
        },
        {
          "q": "When should I avoid the Reasoning Trace pattern?",
          "a": "The task is lightweight and explanation cost exceeds decision cost — or the reader is not answerable for the result and cannot evaluate the chain, where visible machinery reads as instability rather than rigor."
        },
        {
          "q": "What problem does Reasoning Trace solve?",
          "a": "Users cannot challenge conclusions they cannot inspect."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Flat answers collapse reasoning into one authoritative-sounding response."
        }
      ],
      "related": [
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "Confidence Signals mark how sure each claim in the answer is; Reasoning Trace opens the assumptions behind the weak ones."
        },
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Reasoning Trace shows how each claim was reached; Citation Trail links it back to the source span it came from."
        },
        {
          "id": "intent-preview",
          "kind": "pairs-with",
          "note": "Intent Preview shows the planned steps before the agent acts; Reasoning Trace opens the logic behind its conclusions afterwards."
        }
      ]
    },
    {
      "id": "parallel-alternatives",
      "url": "https://beyondchat.design/patterns/parallel-alternatives/",
      "title": "Parallel Alternatives",
      "subtitle": "Choose Before You Iterate",
      "metaphor": "Casting Director",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Instead of iterating one output at a time through chat, the AI generates 3 distinct alternatives simultaneously. You compare, pick, or blend. One selection replaces five chat turns of \"make it more casual... actually shorter... can you try a different angle?\"",
      "interaction": "Comparison, Selection, Blend",
      "controlMechanism": "Side-by-side Cards, Blend Slider, Regenerate",
      "useCase": "Content Creation, Copywriting, Design Exploration",
      "useWhen": "Users are still searching the solution space and one answer narrows it too early.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "All alternatives visible simultaneously — no serial scrolling",
        "predictability": "Each alternative has a labeled approach, tone, and length",
        "directability": "Select, blend, or regenerate any variant independently",
        "explainability": "Each alternative's tone, approach, and length rationale are labeled"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "output",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Serial iteration wastes turns when users are still searching the space.",
        "pattern": "Generate distinct candidates simultaneously for comparison and blending.",
        "whyChatBreaks": "One-answer-at-a-time chat narrows exploration too early.",
        "risks": "Too many alternatives can create evaluation fatigue.",
        "avoidWhen": "A single high-confidence answer is preferable to divergent exploration."
      },
      "examples": [
        {
          "product": "Midjourney Grid",
          "company": "Midjourney",
          "url": "https://docs.midjourney.com/hc/en-us/articles/32692978437005-Variations",
          "note": "Every job returns four images at once. On web the grid arrives pre-separated, and hovering any image offers Vary (Subtle) or Vary (Strong), each returning a fresh grid of four. Still the canonical example — though the V1–V4 buttons are the Discord path, now filed under Legacy Features."
        },
        {
          "product": "Suno Song Versions",
          "company": "Suno",
          "url": "https://suno.com/hub/how-to-make-a-song",
          "note": "Every Create returns two complete takes of the same prompt — different arrangement, different vocal performance — and you keep, discard or extend either one. Still two per run on the current v5.5 model; the V4 / V4.5 / V4.5+ wording predates two model generations. Audio-domain proof the pattern travels."
        },
        {
          "product": "Adobe Firefly Variants",
          "company": "Adobe",
          "url": "https://firefly.adobe.com",
          "note": "Adobe's own Image 4 and Image 4 Ultra still return four variants per prompt, and the Vary control offers More like this, Keep style or Keep subject on any result. The count is per-model now, though: Image 5 and the partner models (Imagen, Flux, GPT Image) return a single image."
        },
        {
          "product": "Google Stitch",
          "company": "Google",
          "url": "https://stitch.withgoogle.com",
          "note": "Voice prompts like \"show me three menu options\" produce parallel design alternatives directly on the same infinite canvas — variants as a first-class canvas operation."
        },
        {
          "product": "Runway Gen-4 Image",
          "company": "Runway",
          "url": "https://help.runwayml.com/hc/en-us/articles/37053594806419-Creating-with-Gen-4-Image",
          "note": "Gen-4 Image ships a Quantity control — one image or a batch of four from a single prompt, with references steering all four. The video side does not do this: Gen-4.5 returns one clip per run and you compare across a scrollable Session instead, which is serial iteration wearing a feed."
        },
        {
          "product": "Cursor /best-of-n",
          "company": "Anysphere",
          "url": "https://cursor.com/docs/configuration/worktrees",
          "note": "Runs one task across several models at once, each in its own git worktree so the candidates stay isolated from each other and from your checkout. Cursor is explicit that best-of-n compares runs only — nothing merges until you pick a winner and commit from that worktree or run /apply-worktree."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Parallel Alternatives pattern?",
          "a": "Users are still searching the solution space and one answer narrows it too early."
        },
        {
          "q": "When should I avoid the Parallel Alternatives pattern?",
          "a": "A single high-confidence answer is preferable to divergent exploration."
        },
        {
          "q": "What problem does Parallel Alternatives solve?",
          "a": "Serial iteration wastes turns when users are still searching the space."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "One-answer-at-a-time chat narrows exploration too early."
        }
      ],
      "related": [
        {
          "id": "region-lock",
          "kind": "pairs-with",
          "note": "Lock the parts that work; let the alternatives diverge only in the unlocked rest."
        },
        {
          "id": "select-transform",
          "kind": "pairs-with",
          "note": "Transform a selection into three candidate edits in parallel."
        },
        {
          "id": "tone-of-voice",
          "kind": "alternative",
          "note": "Parallel Alternatives renders three candidates to compare and blend; Tone of Voice restyles one draft with a drag on a 2D pad."
        }
      ]
    },
    {
      "id": "constraint-rules",
      "url": "https://beyondchat.design/patterns/constraint-rules/",
      "title": "Constraint Rules Engine",
      "subtitle": "Persistent Rules for Persistent Agents",
      "metaphor": "Rulebook",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Instead of re-stating boundaries every session, users define persistent rules an agent must always follow — organized by category, individually toggleable. When the agent runs, every action is checked against the rulebook in real-time.",
      "interaction": "Toggle, Edit, Category",
      "controlMechanism": "Rule Cards, Category Tabs, Toggle Switches, Live Enforcement",
      "useCase": "Agent Configuration, Workflow Automation, Governance",
      "useWhen": "Agents must respect durable boundaries that prompt reminders cannot reliably enforce.",
      "failureModeLabel": "Weak Intervention",
      "dope": {
        "observability": "All active rules visible in one place, enforcement shown live",
        "predictability": "Same rulebook produces consistent agent behavior across sessions",
        "directability": "Toggle, edit, or add rules anytime — agent adapts immediately",
        "explainability": "Rule enforcement is shown live with pass/fail reasons for each action"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Agents drift when boundaries exist only inside one prompt.",
        "pattern": "Represent rules as durable, inspectable constraints enforced at runtime.",
        "whyChatBreaks": "Prompt reminders are fragile, forgettable, and hard to audit.",
        "risks": "Rigid rules can block sensible actions or become outdated.",
        "avoidWhen": "The workflow changes so fast that lightweight guidance is enough."
      },
      "examples": [
        {
          "product": "Cursor Rules",
          "company": "Cursor",
          "url": "https://cursor.com/docs/rules",
          "note": "Rules live in .cursor/rules as version-controlled .mdc files, with four application modes in the type dropdown: Always Apply, Apply Intelligently, Apply to Specific Files, Apply Manually. Every rule and its status shows in the Customize sidebar panel. Team Rules add an \"Enforce this rule\" flag members cannot switch off — enforced adoption, not enforced actions."
        },
        {
          "product": "Claude Code CLAUDE.md",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/memory",
          "note": "Four tiers — managed policy, ~/.claude, project, CLAUDE.local.md — plus .claude/rules/*.md scoped by a paths glob, all plain markdown listed by /memory. Auto memory writes to its own project directory, not back into CLAUDE.md. Anthropic names the ceiling itself: context, not enforced configuration — blocking an action takes a PreToolUse hook."
        },
        {
          "product": "GitHub Copilot Instructions",
          "company": "GitHub",
          "url": "https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/add-custom-instructions/add-repository-instructions",
          "note": ".github/copilot-instructions.md repo-wide, .github/instructions/*.instructions.md scoped by an applyTo glob, and since Aug 2025 AGENTS.md, CLAUDE.md or GEMINI.md read as-is. Personal instructions outrank repository, repository outranks organization. On github.com the path-scoped files reach only Copilot code review and the cloud agent."
        },
        {
          "product": "AGENTS.md cross-tool standard",
          "company": "Open standard",
          "url": "https://agents.md",
          "note": "Open format, ~60k repos, honored by Codex, Cursor, VS Code, Copilot's cloud agent, Jules, Devin and Zed. Claude Code is the holdout — it reads CLAUDE.md only, and tells you to import or symlink AGENTS.md into it. A convention for where rules live, not a mechanism that enforces them."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Constraint Rules Engine pattern?",
          "a": "Agents must respect durable boundaries that prompt reminders cannot reliably enforce."
        },
        {
          "q": "When should I avoid the Constraint Rules Engine pattern?",
          "a": "The workflow changes so fast that lightweight guidance is enough."
        },
        {
          "q": "What problem does Constraint Rules Engine solve?",
          "a": "Agents drift when boundaries exist only inside one prompt."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Prompt reminders are fragile, forgettable, and hard to audit."
        }
      ],
      "related": [
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Autonomy Dial sets which tools run freely, ask first, or stay off; Constraint Rules Engine checks each action that runs."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Constraint Rules Engine checks every action automatically; Approval Gates add a human sign-off at predefined checkpoints."
        },
        {
          "id": "ai-memory",
          "kind": "pairs-with",
          "note": "AI Memory keeps preferences that shape answers; Constraint Rules Engine keeps rules the agent must follow on every action."
        }
      ]
    },
    {
      "id": "approval-gates",
      "url": "https://beyondchat.design/patterns/approval-gates/",
      "title": "Approval Gates",
      "subtitle": "Human Checkpoints Inside Autonomous Workflows",
      "metaphor": "Checkpoint",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Unlike upfront plan review, Approval Gates are embedded inside long-running workflows. The agent pauses at predefined checkpoints, shows what it plans to do next, and waits for human sign-off before proceeding. The safety net for high-stakes agentic execution.",
      "interaction": "Review, Approve, Redirect",
      "controlMechanism": "Gate Diamonds, Approve/Edit/Abort, Status Timeline",
      "useCase": "Code Deployment, File Operations, Multi-Step Agent Tasks",
      "useWhen": "Long-running automation has discrete decision points that require human judgement mid-flow.",
      "failureModeLabel": "Weak Intervention",
      "dope": {
        "observability": "Upcoming actions visible at each gate before execution",
        "predictability": "Gate positions are predefined — users know exactly when they'll be asked",
        "directability": "Approve, edit the plan, or abort at each checkpoint",
        "explainability": "Each gate shows what the agent plans to do next and why before proceeding"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Long-running automation needs human checkpoints inside the flow, not just at the start.",
        "pattern": "Pause execution at predefined gates for approval, edit, or abort.",
        "whyChatBreaks": "Conversation cannot reliably interrupt hidden downstream steps at the right moment.",
        "risks": "Too many gates destroy automation gains and train users to rubber-stamp.",
        "avoidWhen": "The sequence is fully reversible and low-risk end to end."
      },
      "examples": [
        {
          "product": "LangGraph Human-in-the-Loop",
          "company": "LangChain",
          "url": "https://docs.langchain.com/oss/python/langchain/human-in-the-loop",
          "note": "interrupt() plus the human-in-the-loop middleware: a tool call matching the configured mapping pauses the graph, state is checkpointed so the run can resume later, and the human returns approve, edit, reject or respond. The gate fires on the tool itself, not on a classifier's read of it. The canonical developer-API expression of the pattern."
        },
        {
          "product": "n8n Human Review Step",
          "company": "n8n",
          "url": "https://docs.n8n.io/build/integrate-ai/ai-examples/human-in-the-loop-for-tools",
          "note": "n8n 2.6 (Jan 2026) put the gate on the Agent-to-tool connection: 'Add human review step' opens the Tools panel, you pick a channel — Slack, Teams, Gmail, Telegram, in-app chat — and the gated tool cannot run until someone hits Approve. Deny cancels the action outright. No Wait node to wire up."
        },
        {
          "product": "Cursor Agent Run Modes",
          "company": "Cursor",
          "url": "https://cursor.com/docs/agent/security/run-modes",
          "note": "Three run modes — Auto-review (the docs' recommended default since 3.6, May 2026), Allowlist, Run Everything. A classifier triages Shell, MCP and Fetch calls: known-safe ones run, riskier ones are held for approval. Gate positions are no longer predefined, and the old step cap is gone — the docs now say tool calls are unlimited."
        },
        {
          "product": "Magentic-UI: Human-in-the-Loop Agentic Systems",
          "company": "Academic source · Mozannar, Bansal, Tan et al. (Microsoft Research, Jul 2025)",
          "url": "https://arxiv.org/abs/2507.22358",
          "note": "Gates by irreversibility rather than by tool category: every proposed action carries an always / maybe / never-irreversible class, and the ambiguous middle goes to an LLM judge before the human sees it. The shipped build defaults to require_approval_untrusted — read-only calls auto-approved, untrusted ones prompted."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Approval Gates pattern?",
          "a": "Long-running automation has discrete decision points that require human judgement mid-flow."
        },
        {
          "q": "When should I avoid the Approval Gates pattern?",
          "a": "The sequence is fully reversible and low-risk end to end."
        },
        {
          "q": "What problem does Approval Gates solve?",
          "a": "Long-running automation needs human checkpoints inside the flow, not just at the start."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Conversation cannot reliably interrupt hidden downstream steps at the right moment."
        }
      ],
      "related": [
        {
          "id": "intent-preview",
          "kind": "pairs-with",
          "note": "Intent Preview shows the plan, scope, and risk before the run starts; Approval Gates then stop it at set checkpoints."
        },
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Gate the steps you cannot take back; let the rest run and undo them from the Action Audit & Undo timeline."
        },
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Autonomy Dial sets per tool which actions ask first; Approval Gates are where that asking happens, mid-run."
        }
      ]
    },
    {
      "id": "semantic-zoom",
      "url": "https://beyondchat.design/patterns/semantic-zoom/",
      "title": "Semantic Zoom",
      "subtitle": "Complexity on a Single Axis",
      "metaphor": "Map",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "The same AI output rendered at three levels of abstraction — Headline, Summary, Full Detail — controlled by a single slider. The chart is a zoom level too: the series is resampled per depth rather than pinned at full fidelity beside a one-line summary. Depth can be applied to the whole document or to one section at a time, so two sections can be skimmed while a third is read in full. No shipped product resamples the visualization alongside the prose; closest neighbours are length controls (Granola, Apple Intelligence), and Sensecape (UIST 2023) is where the three-level move is designed and measured.",
      "interaction": "Slider, Level Select, Per-Section Dial",
      "controlMechanism": "3-Level Zoom Slider, Per-Section Scope, Resampled Chart, Level Labels",
      "useCase": "Research Reports, Documentation, Data Summaries",
      "useWhen": "One answer needs to serve both skim and deep-read modes without rerunning generation.",
      "failureModeLabel": "Hidden State",
      "dope": {
        "observability": "A persistent indicator states the position exactly — \"Level 2 of 3 — Summary · ≈ 53 words · 0.4% of source\" — with the count derived from the copy on screen, so it cannot drift",
        "predictability": "Every level declares a contract for both channels — 1 sentence + 1 sparkline, 4 findings + 6 annual marks, 3 cited sections + 12 observations — so the reader knows what a zoom step returns before dragging",
        "directability": "One slider moves the whole report; per-section scope gives each section its own dial, in both directions, with no regeneration and no lost position",
        "explainability": "Zooming changes the representation, not the crop — prose from sentence to cited argument, chart from sparkline to fitted trend with its scenario band — and each level names its method"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "output",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "One output depth rarely fits both skim and deep work.",
        "pattern": "Bind one answer to multiple abstraction levels on a single control.",
        "whyChatBreaks": "Users must repeatedly ask for shorter or longer versions and lose continuity.",
        "risks": "Compression levels can hide nuance or imply false completeness.",
        "avoidWhen": "Meaning does not survive well across summary and detail layers."
      },
      "examples": [
        {
          "product": "NotebookLM Audio Overview",
          "company": "Google",
          "url": "https://notebooklm.google.com",
          "note": "Length control: Shorter / Default / Longer for audio overviews, plus formats (Brief / Deep Dive / Critique / Debate). One-control-multiple-depths, exactly the pattern."
        },
        {
          "product": "Granola",
          "company": "Granola",
          "url": "https://www.granola.ai",
          "note": "After a meeting, switch between TL;DR / Full / Action Items tabs on the same source content — semantic zoom as tab switcher."
        },
        {
          "product": "Apple Intelligence Summaries",
          "company": "Apple",
          "url": "https://support.apple.com/en-us/121582",
          "note": "Caveat — closer to format presets (Summary / Key Points / List / Table) than abstraction-depth on a single axis. Still useful as a zoom-adjacent shipping reference."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Semantic Zoom pattern?",
          "a": "One answer needs to serve both skim and deep-read modes without rerunning generation."
        },
        {
          "q": "When should I avoid the Semantic Zoom pattern?",
          "a": "Meaning does not survive well across summary and detail layers."
        },
        {
          "q": "What problem does Semantic Zoom solve?",
          "a": "One output depth rarely fits both skim and deep work."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Users must repeatedly ask for shorter or longer versions and lose continuity."
        }
      ],
      "related": [
        {
          "id": "progressive-disclosure",
          "kind": "pairs-with",
          "note": "Semantic Zoom sets how deep the answer reads; Progressive Disclosure does the same for the controls around it."
        },
        {
          "id": "reasoning-trace",
          "kind": "pairs-with",
          "note": "Semantic Zoom sets how deep you read the answer; Reasoning Trace opens the assumptions behind any claim at that depth."
        },
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Semantic Zoom's shorter levels can hide nuance; Citation Trail lets you hover any sentence to check the source behind it."
        }
      ]
    },
    {
      "id": "citation-trail",
      "url": "https://beyondchat.design/patterns/citation-trail/",
      "title": "Citation Trail",
      "subtitle": "Source Mapping for Generated Claims",
      "metaphor": "Footnote Index",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "Hover any sentence in an AI answer and the contributing sources highlight in place. Each fact carries a visible thread back to where it came from — no more anonymous synthesis behind a single footnote number.",
      "interaction": "Hover, Highlight",
      "controlMechanism": "Hover Mapping, Source Pins, Sentence-to-Source Links",
      "useCase": "Research Tools, Sourced Q&A, Knowledge Bases",
      "useWhen": "Readers must verify which source supports which specific claim, not just the document overall.",
      "failureModeLabel": "Hidden Structure",
      "dope": {
        "observability": "Every claim shows its source spans on hover",
        "predictability": "The same claim reliably maps to the same set of source spans",
        "directability": "Click a citation to inspect or remove its source from the answer",
        "explainability": "Each output sentence is bound to specific source spans, not just a footnote number"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Sourced AI hides which fact came from which source behind aggregate footnotes.",
        "pattern": "Map every claim to its contributing source spans; reveal the link on hover.",
        "whyChatBreaks": "Chat citations are flat numbers — readers cannot verify which sentence is grounded where.",
        "risks": "False precision: a visible source link can imply rigor that the underlying retrieval lacks.",
        "avoidWhen": "The output is opinion or synthesis where granular source mapping would be misleading."
      },
      "examples": [
        {
          "product": "Perplexity",
          "company": "Perplexity",
          "url": "https://www.perplexity.ai",
          "note": "Inline numbered citations linked to a side rail; hover preview of cited source. The canonical example of the pattern, even though source-to-claim mapping quality is contested."
        },
        {
          "product": "Glean",
          "company": "Glean",
          "url": "https://docs.glean.com/user-guide/assistant/glean-chat/glean-chat-citations/glean-citations",
          "note": "Deep-linked citations jump to the exact passage that supports the statement; hover preview highlights the cited text. One of the strongest enterprise examples."
        },
        {
          "product": "Notion AI Q&A",
          "company": "Notion",
          "url": "https://www.notion.so",
          "note": "Q&A returns answers with inline citations linking back to source pages and connected apps. Per-claim mapping is weaker than Perplexity but valid as a workspace-grounded example."
        },
        {
          "product": "Granola 2.0",
          "company": "Granola",
          "url": "https://www.granola.ai",
          "note": "Inline citations + jump-to-source on every claim in the meeting summary, mapping to transcript timestamps. A 2026 addition that proves the pattern travels beyond search."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Citation Trail pattern?",
          "a": "Readers must verify which source supports which specific claim, not just the document overall."
        },
        {
          "q": "When should I avoid the Citation Trail pattern?",
          "a": "The output is opinion or synthesis where granular source mapping would be misleading."
        },
        {
          "q": "What problem does Citation Trail solve?",
          "a": "Sourced AI hides which fact came from which source behind aggregate footnotes."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat citations are flat numbers — readers cannot verify which sentence is grounded where."
        }
      ],
      "related": [
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "Confidence Signals add how sure each claim is, with a color-coded badge and a source count."
        },
        {
          "id": "reasoning-trace",
          "kind": "pairs-with",
          "note": "Citation Trail shows which source backs each claim; Reasoning Trace adds the assumptions and inferences behind it."
        },
        {
          "id": "smart-document",
          "kind": "pairs-with",
          "note": "Citation Trail ties each sentence to its source span; Smart Document recomputes the derived text when that source is edited."
        }
      ]
    },
    {
      "id": "region-lock",
      "url": "https://beyondchat.design/patterns/region-lock/",
      "title": "Region Lock",
      "subtitle": "Selective Regeneration with Anchored Parts",
      "metaphor": "Pinned Frame",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Pin the parts you like, regenerate the rest. Locked regions stay frozen across iterations while the AI varies only what is free — no more starting over to keep one good thing.",
      "interaction": "Lock, Regenerate, Compare",
      "controlMechanism": "Lock Toggles, Region Selection, Partial Regen",
      "useCase": "Image Editing, Layout Variants, Content Iteration",
      "useWhen": "Iteration is composite — some parts settled, others still being explored — and full regenerations destroy progress.",
      "failureModeLabel": "Hidden Structure",
      "dope": {
        "observability": "Locked regions are visually marked across every iteration",
        "predictability": "Locks guarantee the same content survives across regenerations",
        "directability": "Toggle locks at any granularity — region, paragraph, layer",
        "explainability": "Each lock carries a label naming what is preserved and why"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "refinement",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Regenerating output destroys the parts the user already approved.",
        "pattern": "Let users lock specific regions so AI only varies the unlocked rest.",
        "whyChatBreaks": "Chat regenerations are all-or-nothing — there is no surface for partial preservation.",
        "risks": "Over-locking can trap users in local optima or hide better global alternatives.",
        "avoidWhen": "The composition is so coupled that varying one part requires varying others."
      },
      "examples": [
        {
          "product": "Midjourney Vary Region",
          "company": "Midjourney",
          "url": "https://docs.midjourney.com/hc/en-us/articles/32794723105549-Vary-Region",
          "note": "Editor with freehand/rectangular selection + prompt remix — locked regions stay frozen across iterations while the unlocked area regenerates."
        },
        {
          "product": "Photoshop Generative Fill",
          "company": "Adobe",
          "url": "https://helpx.adobe.com/photoshop/using/generative-fill.html",
          "note": "2026 release adds reference-photo-aware fills via Firefly 4, Gemini 3 Nano Banana Pro, and FLUX.2 Pro. Selection-then-fill remains the core gesture; the rest of the image stays untouched."
        },
        {
          "product": "Ideogram · Canvas Magic Fill",
          "company": "Ideogram",
          "url": "https://docs.ideogram.ai/canvas-and-editing/canvas/magic-fill",
          "note": "Mask a region on the canvas, adjust the generation window, prompt just that area — unaffected pixels stay locked while only the masked region regenerates."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Region Lock pattern?",
          "a": "Iteration is composite — some parts settled, others still being explored — and full regenerations destroy progress."
        },
        {
          "q": "When should I avoid the Region Lock pattern?",
          "a": "The composition is so coupled that varying one part requires varying others."
        },
        {
          "q": "What problem does Region Lock solve?",
          "a": "Regenerating output destroys the parts the user already approved."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat regenerations are all-or-nothing — there is no surface for partial preservation."
        }
      ],
      "related": [
        {
          "id": "parallel-alternatives",
          "kind": "pairs-with",
          "note": "Lock the keepers; let three candidates diverge only where it is unlocked."
        },
        {
          "id": "visual-intent",
          "kind": "pairs-with",
          "note": "Visual Intent Expression sets the look with swatches and references; Region Lock keeps what matches it across iterations."
        },
        {
          "id": "seed-pinning",
          "kind": "alternative",
          "note": "Seed Pinning freezes the randomness and varies one setting at a time; Region Lock freezes chosen parts, varies the rest."
        }
      ]
    },
    {
      "id": "editable-plan",
      "url": "https://beyondchat.design/patterns/editable-plan/",
      "title": "Editable Plan",
      "subtitle": "Plan-as-Document Before Execution",
      "metaphor": "Working Draft",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Before the agent runs, its plan is a document you can edit. Add steps, remove steps, change order, leave comments. Execution starts only after the plan is yours, not the model’s.",
      "interaction": "Edit, Reorder, Annotate",
      "controlMechanism": "Step Editor, Reorder Handles, Inline Comments, Approve",
      "useCase": "Agentic Workflows, Multi-step Tasks, Research Plans",
      "useWhen": "Plans for agents are long enough that arguing in chat costs more than direct editing.",
      "failureModeLabel": "Weak Intervention",
      "dope": {
        "observability": "The full plan is visible as a structured document, not buried in chat",
        "predictability": "Edits stick — the agent runs the plan you signed off on",
        "directability": "Add, remove, reorder, or annotate any step before kickoff",
        "explainability": "Each step shows its rationale, expected output, and risk class"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Plan reviews are read-only; users cannot fix the plan, only argue with it.",
        "pattern": "Render the plan as an editable document users sign off on before execution.",
        "whyChatBreaks": "Chat-based plan review forces users to negotiate edits in prose instead of editing directly.",
        "risks": "Editable plans can lull users into rubber-stamp approval if structure is weak.",
        "avoidWhen": "The plan is too small to warrant a document or too rigid to benefit from edits."
      },
      "examples": [
        {
          "product": "Devin Interactive Planning",
          "company": "Cognition",
          "url": "https://app.devin.ai",
          "note": "Devin 2.0 lets users modify the plan before letting the agent work autonomously; plan acts as inspectable starting point with dynamic re-planning during execution."
        },
        {
          "product": "Manus AI Plan",
          "company": "Manus",
          "url": "https://manus.im",
          "note": "Generates a task plan (steps + dependencies) visible and editable before execution, with live replay across phases."
        },
        {
          "product": "Replit Agent Plan",
          "company": "Replit",
          "url": "https://docs.replit.com/core-concepts/agent",
          "note": "Plan-mode surface is editable — user refines tasks before approval, then the agent runs against the agreed plan."
        },
        {
          "product": "Copilot Coding Agent Plan",
          "company": "GitHub",
          "url": "https://github.com/features/copilot",
          "note": "Spec (current vs desired) and plan (which files change, how) are editable in natural language before any code is written. The successor lineage to the sunset Copilot Workspace."
        },
        {
          "product": "Cocoa: Co-Planning and Co-Execution with AI Agents",
          "company": "Academic source · Feng, Pu, Latzke et al. (Allen AI + UW, Dec 2024)",
          "url": "https://arxiv.org/abs/2412.10999",
          "note": "Research argument for keeping the plan editable *through* execution — not just before it. Editable Plan is the pre-execution surface; the paper's contribution is co-execution, which is broken out into the separate Live Plan Surface pattern."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Editable Plan pattern?",
          "a": "Plans for agents are long enough that arguing in chat costs more than direct editing."
        },
        {
          "q": "When should I avoid the Editable Plan pattern?",
          "a": "The plan is too small to warrant a document or too rigid to benefit from edits."
        },
        {
          "q": "What problem does Editable Plan solve?",
          "a": "Plan reviews are read-only; users cannot fix the plan, only argue with it."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat-based plan review forces users to negotiate edits in prose instead of editing directly."
        }
      ],
      "related": [
        {
          "id": "intent-preview",
          "kind": "pairs-with",
          "note": "Intent Preview shows each step's risk, affected files, and scope, so you know which steps to edit before signing off."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Edit upfront, then catch deviations at gates inside the actual run."
        },
        {
          "id": "supervisor-worker",
          "kind": "pairs-with",
          "note": "Edit the supervisor's task breakdown as a plan before kickoff, then review each worker's piece on its own."
        }
      ]
    },
    {
      "id": "disambiguation-branch",
      "url": "https://beyondchat.design/patterns/disambiguation-branch/",
      "title": "Disambiguation Branch",
      "subtitle": "Surface Multiple Readings of Ambiguous Intent",
      "metaphor": "Forked Path",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "When the AI is unsure what you meant, it surfaces 2-3 concrete interpretations side by side with previews. You pick the right reading before any work runs — no wasted output, no mid-correction.",
      "interaction": "Branch Selection, Preview",
      "controlMechanism": "Variant Cards, Inline Preview, Confirm Path",
      "useCase": "Ambiguous Queries, Multi-meaning Tasks, Search",
      "useWhen": "Prompts are often ambiguous and the cost of guessing wrong is higher than asking.",
      "failureModeLabel": "Linear History",
      "dope": {
        "observability": "Ambiguity surfaces as visible branches, not silent assumption",
        "predictability": "Each branch shows a sample output before commitment",
        "directability": "Pick a branch, refine it, or write your own interpretation",
        "explainability": "Each branch is labeled with the assumption that produces it"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "input",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Ambiguous prompts produce confidently wrong answers because AI guesses instead of asking.",
        "pattern": "Surface 2-3 plausible interpretations as branches; let the user pick before work begins.",
        "whyChatBreaks": "Chat collapses ambiguity into a single answer and only reveals the misread after execution.",
        "risks": "Excessive branching for trivial ambiguity adds friction and trains users to dismiss it.",
        "avoidWhen": "Intent is unambiguous or the cost of running and correcting is lower than upfront review."
      },
      "examples": [
        {
          "product": "Perplexity Pro Search Follow-ups",
          "company": "Perplexity",
          "url": "https://www.perplexity.ai",
          "note": "Pro Search asks focused follow-up questions before running; Pro / Copilot Mode branches a complex query into sub-queries."
        },
        {
          "product": "ChatGPT Deep Research clarification",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "Always asks a multi-part clarifying question with optional \"follow these defaults\" before the research run. Strong consumer-grade example of the pre-flight branch pick."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Disambiguation Branch pattern?",
          "a": "Prompts are often ambiguous and the cost of guessing wrong is higher than asking."
        },
        {
          "q": "When should I avoid the Disambiguation Branch pattern?",
          "a": "Intent is unambiguous or the cost of running and correcting is lower than upfront review."
        },
        {
          "q": "What problem does Disambiguation Branch solve?",
          "a": "Ambiguous prompts produce confidently wrong answers because AI guesses instead of asking."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat collapses ambiguity into a single answer and only reveals the misread after execution."
        }
      ],
      "related": [
        {
          "id": "parallel-alternatives",
          "kind": "pairs-with",
          "note": "Once Disambiguation Branch has your reading, Parallel Alternatives shows distinct takes on it to compare or blend."
        },
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "Disambiguation Branch settles what you meant before the run; Confidence Signals show how well each claim holds up after."
        },
        {
          "id": "ghost-text",
          "kind": "alternative",
          "note": "Ghost Text Editor bets on one guess you can type past; Disambiguation Branch asks first when a misread costs a whole run."
        }
      ]
    },
    {
      "id": "templates",
      "url": "https://beyondchat.design/patterns/templates/",
      "title": "Templates",
      "subtitle": "Slot-filled prompts for repeatable tasks",
      "metaphor": "Madlibs",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "For repeated tasks, free-text prompting is wasteful and inconsistent. Templates expose the prompt as a form — named slots, hints, required vs optional — so the user only fills in what changes. Output stays consistent run to run, and onboarding is dramatically faster.",
      "interaction": "Slot Filling, Template Picker",
      "controlMechanism": "Named Slots, Validation Hints, Required vs Optional, Save as Template",
      "useCase": "Repeatable Tasks, Onboarding, Standardised Workflows",
      "useWhen": "A task is repeatable enough that variables can be named and most fields stay stable across runs.",
      "failureModeLabel": "Re-Improvising Stable Tasks",
      "dope": {
        "observability": "The template structure is visible; the user knows exactly what is variable",
        "predictability": "Same template + same slots = same output shape, every run",
        "directability": "Edit any slot, save the variation as a new template, share it",
        "explainability": "Each slot declares its purpose, valid values, and downstream effect"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Repeatable tasks get retyped from scratch every time, with no surface for what is variable.",
        "pattern": "Expose the prompt as a form with named slots, hints, and required-vs-optional fields.",
        "whyChatBreaks": "Free-text prompting hides which parts of a task are stable and which actually change.",
        "risks": "Over-specified templates feel rigid; under-specified ones invite the same variability the template was supposed to fix.",
        "avoidWhen": "The task is one-off and exploratory — a template would add scaffolding that is never reused."
      },
      "examples": [
        {
          "product": "Notion AI Templates",
          "company": "Notion",
          "url": "https://www.notion.so",
          "note": "Workspace admins create reusable prompt templates with slot-filling; relation-aware autofill traverses linked entries to populate the form."
        },
        {
          "product": "GitHub Issue Forms",
          "company": "GitHub",
          "url": "https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests",
          "note": "YAML-defined issue forms: text inputs, dropdowns, checkboxes, file uploads, required-vs-optional fields. The strongest non-AI precedent — the pattern predates AI products."
        },
        {
          "product": "Cursor Slash Commands",
          "company": "Cursor",
          "url": "https://cursor.com",
          "note": "Custom slash commands stored as Markdown in `.cursor/commands/` — version-controlled, team-shareable, parameterizable. Templates as code."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Templates pattern?",
          "a": "A task is repeatable enough that variables can be named and most fields stay stable across runs."
        },
        {
          "q": "When should I avoid the Templates pattern?",
          "a": "The task is one-off and exploratory — a template would add scaffolding that is never reused."
        },
        {
          "q": "What problem does Templates solve?",
          "a": "Repeatable tasks get retyped from scratch every time, with no surface for what is variable."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Free-text prompting hides which parts of a task are stable and which actually change."
        }
      ],
      "related": [
        {
          "id": "saved-styles",
          "kind": "pairs-with",
          "note": "Templates capture what changes per run, slot by slot; Saved Styles keep the tone and format every run shares."
        },
        {
          "id": "sample-response",
          "kind": "pairs-with",
          "note": "Templates shape the request; Sample Response shows a typical result before you fill in the form."
        },
        {
          "id": "prompt-parsing",
          "kind": "alternative",
          "note": "Templates start you from a blank form; Inline Prompt Controls finds the same slots in prose you already wrote."
        }
      ]
    },
    {
      "id": "saved-styles",
      "url": "https://beyondchat.design/patterns/saved-styles/",
      "title": "Saved Styles",
      "subtitle": "Your presets, not the model's",
      "metaphor": "Style Library",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Tone, format, and constraints are repeatable. Saved Styles let users define a reusable preset — \"shipping-style update\", \"executive memo\", \"casual reply\" — and apply it to any new task with a single click. Each style is an editable definition, not a magic phrase.",
      "interaction": "Save / Apply / Share",
      "controlMechanism": "Style Cards, One-Click Apply, Editable Definitions, Per-Workspace Sharing",
      "useCase": "Brand Voice, Repeated Workflows, Team Consistency",
      "useWhen": "Teams or solo authors repeat the same tone and format across many short tasks.",
      "failureModeLabel": "Repeated Re-Description",
      "dope": {
        "observability": "The active style card sits beside the task with its rules in plain sight (\"bullet points only, no marketing voice\") — the constraints in force are readable, not remembered",
        "predictability": "A style is a stored definition, not a magic phrase — applying \"Shipping update\" yields the same register on the eighth run as on the first",
        "directability": "Styles are first-class objects: edit a rule, fork a variant, share across the workspace — one click swaps the entire register of the output",
        "explainability": "Each card declares its rules as inspectable plain language, so why the output came out terse and bulleted traces to a rule you can point at"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Tone and format have to be re-described every run; team consistency depends on memory.",
        "pattern": "Let users define and save a style as a first-class object, applied to any task with one click.",
        "whyChatBreaks": "Chat treats every prompt as fresh — repeating \"shipping-tone, 3 bullets, no jargon\" eight times a day is the failure mode.",
        "risks": "Style sprawl can confuse new users; weak naming makes presets unreadable.",
        "avoidWhen": "The product has only one author or one consistent style and presets add no leverage."
      },
      "examples": [
        {
          "product": "Notion AI Instructions & Skills",
          "company": "Notion",
          "url": "https://www.notion.com/help/instructions-for-notion-agent",
          "note": "Instructions live at Settings → Notion AI as ordinary Notion pages — keep several, switch which one is active. Skills, added April 2026, are the one-click half: saved workflows invoked from the slash menu on a selection. Both share like any page, but sharing one does not change anyone else's agent."
        },
        {
          "product": "Grammarly Brand Tones",
          "company": "Grammarly",
          "url": "https://www.grammarly.com/business",
          "note": "Admin dashboard → Writing → Brand tones: a named tone profile plus a style-rule set, assigned to member groups. The lineup is now Free / Pro / Enterprise — Business is gone, and Pro caps you at one brand tone, one style guide, two groups. The multi-profile version is Enterprise."
        },
        {
          "product": "Writer.com Voice",
          "company": "Writer",
          "url": "https://writer.com",
          "note": "Upload 300+ words of sample copy, Writer derives a voice profile, and you attach a style guide and term list to it. Several voices per workspace, picked from a dropdown in Agent or applied to selected text via rewrite. Starter allows one shared voice; Enterprise is unlimited."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Saved Styles pattern?",
          "a": "Teams or solo authors repeat the same tone and format across many short tasks."
        },
        {
          "q": "When should I avoid the Saved Styles pattern?",
          "a": "The product has only one author or one consistent style and presets add no leverage."
        },
        {
          "q": "What problem does Saved Styles solve?",
          "a": "Tone and format have to be re-described every run; team consistency depends on memory."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat treats every prompt as fresh — repeating \"shipping-tone, 3 bullets, no jargon\" eight times a day is the failure mode."
        }
      ],
      "related": [
        {
          "id": "persona-switcher",
          "kind": "extended-by",
          "note": "Persona Switcher goes past tone and format: each named persona also sets a lens, its depth, and the moves it refuses."
        },
        {
          "id": "templates",
          "kind": "pairs-with",
          "note": "Templates fix what you ask, slot by slot; Saved Styles fix how the answer reads, run after run."
        },
        {
          "id": "tone-of-voice",
          "kind": "alternative",
          "note": "Tone of Voice tunes register live on a two-axis pad; Saved Styles keep tone and format rules as a reusable preset."
        }
      ]
    },
    {
      "id": "ai-provenance",
      "url": "https://beyondchat.design/patterns/ai-provenance/",
      "title": "AI Provenance",
      "subtitle": "Track changes, for AI-drafted text",
      "metaphor": "Track Changes",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "A document you co-write with AI is a blend of machine-drafted and human-written text — but the two read identically, so nothing tells you which parts still need a human eye. Provenance marks the AI-drafted spans a human has not reviewed yet, lets you accept or edit them span by span, and keeps that review state attached so the next reader can see what has been vetted and what is still raw — the same instinct behind content credentials, applied to the text you co-author.",
      "interaction": "Review Layer, Per-span Accept, Inspect on Click",
      "controlMechanism": "Draft Markers, Accept / Edit per Span, Review State, Drift Flags",
      "useCase": "Co-writing with AI, Doc & Code Review, Mixed Human-AI Drafts",
      "useWhen": "When you co-write with AI, machine-drafted and human-written text read the same — so the useful signal is which parts a human has actually reviewed.",
      "failureModeLabel": "Review Blindness",
      "dope": {
        "observability": "At a glance: which spans are AI-drafted and unreviewed vs. which a human has vetted — not a wall of identical \"AI\" markers",
        "predictability": "Consistent everywhere: vetted text reads clean, unreviewed is marked, a claim that drifts from its source is flagged",
        "directability": "Read, accept, or edit any AI-drafted span — the marker clears the moment a human has touched it",
        "explainability": "Open any marked span for what produced it — model, prompt, source-match — so you can vet it, not just trust it"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "In a document you co-write with AI, machine-drafted and human-written text read identically — so you cannot tell which parts still need a human to check them.",
        "pattern": "Treat AI like tracked changes: mark the AI-drafted spans no human has reviewed, let the user accept or edit them span by span, and keep that review state attached to the document.",
        "whyChatBreaks": "Chat hands back one finished block with no record of what was reviewed; once it leaves the chat, AI-drafted and human-vetted text look exactly the same.",
        "risks": "If everything is marked it is noise (the original mistake); if accepting is one bulk click it becomes rubber-stamping — the signal only works when unreviewed is the exception, not the default.",
        "avoidWhen": "Throwaway or low-stakes text where no one will ever need to tell an AI draft from vetted prose."
      },
      "examples": [
        {
          "product": "C2PA Content Credentials",
          "company": "C2PA",
          "url": "https://contentcredentials.org/verify",
          "note": "C2PA 2.1 ratified as ISO/IEC 22144 (2025). Shipping on Pixel 10, Galaxy S25, OpenAI image gen, DALL-E 3, Sora, Imagen, Adobe Firefly, Leica/Sony/Nikon/Canon. EU AI Act Art. 50 enforcement Aug 2026. Gold standard."
        },
        {
          "product": "Adobe Firefly Provenance",
          "company": "Adobe",
          "url": "https://firefly.adobe.com",
          "note": "Firefly auto-applies Content Credentials to any 100%-AI-generated asset, including model + version, issuer, and editing actions. Per-asset provenance with editing chain visible."
        },
        {
          "product": "Microsoft 365 AI Watermarks",
          "company": "Microsoft",
          "url": "https://www.microsoft.com/en-us/microsoft-365/copilot",
          "note": "Microsoft 365 AI watermark policy (2026): audio shipped, video rolling out March 2026, plus metadata embedding (model used, app, timestamp). Document-level provenance at scale."
        },
        {
          "product": "Google SynthID",
          "company": "Google",
          "url": "https://deepmind.google/technologies/synthid/",
          "note": "Invisible watermark embedded in Imagen and Veo outputs, verifiable with the SynthID detector. Strong consumer-scale provenance — survives common edits and re-encodings."
        },
        {
          "product": "OpenAI Image Provenance",
          "company": "OpenAI",
          "url": "https://openai.com",
          "note": "All DALL-E 3 and Sora outputs carry C2PA credentials by default — provenance that travels with the artefact. The media world ships this at file level; the prototype shows the same instinct applied span-by-span to co-authored text, which is still emerging."
        }
      ],
      "faq": [
        {
          "q": "When should I use the AI Provenance pattern?",
          "a": "When you co-write with AI, machine-drafted and human-written text read the same — so the useful signal is which parts a human has actually reviewed."
        },
        {
          "q": "When should I avoid the AI Provenance pattern?",
          "a": "Throwaway or low-stakes text where no one will ever need to tell an AI draft from vetted prose."
        },
        {
          "q": "What problem does AI Provenance solve?",
          "a": "In a document you co-write with AI, machine-drafted and human-written text read identically — so you cannot tell which parts still need a human to check them."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat hands back one finished block with no record of what was reviewed; once it leaves the chat, AI-drafted and human-vetted text look exactly the same."
        }
      ],
      "related": [
        {
          "id": "disclosure",
          "kind": "pairs-with",
          "note": "Disclosure tells recipients AI was involved; AI Provenance tells co-authors which AI-drafted spans still need review."
        },
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Citation Trail shows the source behind each claim; AI Provenance shows which AI-drafted spans a human still has to check."
        },
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Action Audit & Undo records and reverses agent actions; AI Provenance tracks which AI-drafted text a human has reviewed."
        }
      ]
    },
    {
      "id": "incognito-mode",
      "url": "https://beyondchat.design/patterns/incognito-mode/",
      "title": "Incognito Mode",
      "subtitle": "Off-the-record sessions, visibly off",
      "metaphor": "Off-the-Record",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "A counterpart to AI Memory. Incognito sessions write nothing to long-term memory, surface a persistent visual indicator, and stay clearly separate from the user's history. The mode is one move to enter, one move to leave, and unmissable while it is on.",
      "interaction": "Mode Toggle, Visible Indicator",
      "controlMechanism": "Mode Switch, Persistent Banner, No Memory Write",
      "useCase": "Sensitive Topics, Exploration, Privacy-First Sessions",
      "useWhen": "Memory-aware AI is the default and users need a clean way to explore without persistence.",
      "failureModeLabel": "Quiet Persistence",
      "dope": {
        "observability": "Persistent banner makes the mode visible at all times",
        "predictability": "Nothing in the session is written to memory or surfaces in future sessions",
        "directability": "Toggle mode any time; existing context is dropped, future writes are blocked",
        "explainability": "The mode declares exactly what is and is not retained — no ambiguity"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Memory-aware AI quietly persists everything; users have no clean way to talk to it without leaving a trail.",
        "pattern": "Provide an explicit mode where the session writes no memory, with a persistent banner that makes the mode unmissable.",
        "whyChatBreaks": "Default chat blurs the line between exploration and persisted history; users do not know what will resurface.",
        "risks": "Misleading \"incognito\" labels can imply more privacy than the system delivers (e.g., still logging to telemetry).",
        "avoidWhen": "The product has no long-term memory to begin with; the mode adds no real distinction."
      },
      "examples": [
        {
          "product": "ChatGPT Temporary Chat",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/8914046-temporary-chat-faq",
          "note": "\"Temporary\" pill button top-right; banner across the chat window confirming memory off and no training. Available on free + paid. 30-day safety retention disclosed. Flagship."
        },
        {
          "product": "Claude Incognito Mode",
          "company": "Anthropic",
          "url": "https://support.claude.com/en/articles/12260368-using-incognito-chats",
          "note": "Ghost icon in upper-right of new-chat surface; black border + \"Incognito chat\" label in upper-left while active. Free for all tiers (Sept 2025)."
        },
        {
          "product": "Gemini Temporary Chat",
          "company": "Google",
          "url": "https://blog.google/products-and-platforms/products/gemini/temporary-chats-privacy-controls/",
          "note": "Temporary Chat icon next to \"New Chat\"; banner above chat window. 72-hour retention disclosed. Web first, mobile rolling out — completes the ChatGPT/Claude/Gemini incognito-as-baseline trio."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Incognito Mode pattern?",
          "a": "Memory-aware AI is the default and users need a clean way to explore without persistence."
        },
        {
          "q": "When should I avoid the Incognito Mode pattern?",
          "a": "The product has no long-term memory to begin with; the mode adds no real distinction."
        },
        {
          "q": "What problem does Incognito Mode solve?",
          "a": "Memory-aware AI quietly persists everything; users have no clean way to talk to it without leaving a trail."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Default chat blurs the line between exploration and persisted history; users do not know what will resurface."
        }
      ],
      "related": [
        {
          "id": "ai-memory",
          "kind": "pairs-with",
          "note": "AI Memory lets you curate what is kept, card by card; Incognito Mode keeps a whole session out of it, with a banner."
        },
        {
          "id": "data-ownership",
          "kind": "pairs-with",
          "note": "Incognito Mode stops new memory writes; Data Ownership shows, exports and deletes what was already collected."
        },
        {
          "id": "consent",
          "kind": "pairs-with",
          "note": "Consent sets which apps the agent may reach; Incognito Mode sets whether a session writes anything to long-term memory."
        }
      ]
    },
    {
      "id": "conversation-branches",
      "url": "https://beyondchat.design/patterns/conversation-branches/",
      "title": "Conversation Branches",
      "subtitle": "Fork the thread, keep both sides",
      "metaphor": "Branching Path",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Linear chat forces you to abandon one direction to explore another. Conversation Branches let you fork from any turn into a parallel thread, develop both, and compare side by side. The conversation becomes a tree you can prune — not a stack you scroll through.",
      "interaction": "Fork-from-Turn, Side-by-Side Compare",
      "controlMechanism": "Branch Button per Turn, Tree View, Compare Mode",
      "useCase": "Exploring Alternatives, Decision Trees, Versioned Reasoning",
      "useWhen": "Users want to compare alternative paths from the same starting point without losing either.",
      "failureModeLabel": "Linear Stack",
      "dope": {
        "observability": "The full branch tree is visible; every fork point is annotated",
        "predictability": "Branches are isolated — work in one does not leak into another",
        "directability": "Fork from any turn, switch branches, merge or discard",
        "explainability": "Each fork shows the reason or hypothesis the user named when creating it"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "refinement",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "Linear chat forces a single thread — exploring an alternative means abandoning the current one or copy-pasting state by hand.",
        "pattern": "Let users fork from any turn into a parallel branch and compare side by side, with the full tree visible.",
        "whyChatBreaks": "Chat treats history as a stack, not a tree. There is no surface for \"what if I had asked it differently here?\".",
        "risks": "Branch sprawl can become a tree the user cannot navigate; needs pruning and clear naming.",
        "avoidWhen": "The task is single-path and forks would just clutter the surface."
      },
      "examples": [
        {
          "product": "ChatGPT branch-in-new-chat",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "Aug 2025: explicit \"Branch in new chat\" from any prior response. Caveat — no native tree view, and in-place edit is restricted to most-recent message only. Closest mainstream example."
        },
        {
          "product": "BranchGPT",
          "company": "Third-party",
          "url": "https://www.branchgpt.xyz",
          "note": "Chrome extension that visualizes ChatGPT native branching as an interactive tree. The only true tree-view today — third-party, not first-class."
        },
        {
          "product": "Claude Code /fork",
          "company": "Anthropic",
          "url": "https://code.claude.com",
          "note": "`--fork-session` and `/branch` commands create explicit fork pointers. CLI-only — no tree UI, but the branch primitive is real and version-controlled."
        },
        {
          "product": "Claude regenerate alternatives",
          "company": "Anthropic",
          "url": "https://claude.ai",
          "note": "Caveat — implicit branching via edit-prior + regenerate, no tree-view UI. Multiple GitHub issues (#16236, #32631) request a proper branch tree as a feature."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Conversation Branches pattern?",
          "a": "Users want to compare alternative paths from the same starting point without losing either."
        },
        {
          "q": "When should I avoid the Conversation Branches pattern?",
          "a": "The task is single-path and forks would just clutter the surface."
        },
        {
          "q": "What problem does Conversation Branches solve?",
          "a": "Linear chat forces a single thread — exploring an alternative means abandoning the current one or copy-pasting state by hand."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat treats history as a stack, not a tree. There is no surface for \"what if I had asked it differently here?\"."
        }
      ],
      "related": [
        {
          "id": "parallel-alternatives",
          "kind": "alternative",
          "note": "Parallel Alternatives shows three answers in one turn to pick or blend; Conversation Branches forks the whole thread."
        },
        {
          "id": "spatial-canvas",
          "kind": "extended-by",
          "note": "Spatial Canvas lays the branches out as nodes and adds edges, so one thread's output can feed another."
        },
        {
          "id": "editable-plan",
          "kind": "pairs-with",
          "note": "Fork at the turn the plan appears, edit each branch's Editable Plan, compare, and approve the one that holds up."
        }
      ]
    },
    {
      "id": "feedback-loop",
      "url": "https://beyondchat.design/patterns/feedback-loop/",
      "title": "Feedback Loop",
      "subtitle": "Steer the next answer with the last one",
      "metaphor": "Calibrated Compass",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Most AI products collect feedback as silent telemetry. A real feedback loop closes immediately — the user picks a reason ('too long', 'missed the point'), sees the system write a preference, and the next answer demonstrably uses it. Feedback becomes an active control, not a future training signal.",
      "interaction": "Structured Feedback, Visible Memory Write",
      "controlMechanism": "Reason Chips, Free-text Note, Pinned Preference, Visible Update",
      "useCase": "Long-term Assistants, Personalisation, Reducing Repeated Mistakes",
      "useWhen": "Feedback should visibly shape future answers — not just feed silently into telemetry.",
      "failureModeLabel": "Silent Feedback",
      "dope": {
        "observability": "Each feedback entry produces a visible memory write the user can edit",
        "predictability": "The next answer uses the preference; before/after is comparable on the same prompt",
        "directability": "Pin, edit, or unpin any preference at any time",
        "explainability": "Each preference is labelled with the feedback that produced it"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Feedback in AI products is mostly telemetry — users vote, then nothing visible changes.",
        "pattern": "Make feedback a structured loop: reason chips, a visible preference write, and the next answer demonstrating the change.",
        "whyChatBreaks": "Chat hides whether feedback influenced anything; users either give up or invent rituals to be heard.",
        "risks": "Over-eager preference writes can swing the assistant toward instability; users need to edit and unpin.",
        "avoidWhen": "The session is short and feedback would not survive long enough to be useful."
      },
      "examples": [
        {
          "product": "ChatGPT Memory Summary + Sources",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/8590148-memory-faq",
          "note": "The book icon under a response opens Sources: which memory shaped the answer, an explanation of why it was used, and a ••• correction. The memory summary itself is editable inline — type a change into it or highlight a line to fix it. No reason chips, and the write is retrospective rather than answer-by-answer."
        },
        {
          "product": "Claude Memory Write-Back",
          "company": "Anthropic",
          "url": "https://support.claude.com/en/articles/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context",
          "note": "Memory saves as individual Topics listed in Settings → Memory — open one to read, edit or delete it, and the fix applies to every conversation from then on. You can also tell Claude in chat to remember, change or forget something. On by default for Free, Pro and Max; the old Settings → Capabilities path is gone."
        },
        {
          "product": "Cursor Bugbot Learned Rules",
          "company": "Cursor",
          "url": "https://cursor.com/docs/bugbot",
          "note": "Downvotes on Bugbot comments, replies explaining what was wrong, and \"@cursor remember [fact]\" on a PR become written rules listed by name, content and scoped paths in the Bugbot repository-rules dashboard, editable or deletable there. Candidates only go active once signal accumulates, and auto-disable on negative signal — the write is visible, not immediate."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Feedback Loop pattern?",
          "a": "Feedback should visibly shape future answers — not just feed silently into telemetry."
        },
        {
          "q": "When should I avoid the Feedback Loop pattern?",
          "a": "The session is short and feedback would not survive long enough to be useful."
        },
        {
          "q": "What problem does Feedback Loop solve?",
          "a": "Feedback in AI products is mostly telemetry — users vote, then nothing visible changes."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat hides whether feedback influenced anything; users either give up or invent rituals to be heard."
        }
      ],
      "related": [
        {
          "id": "ai-memory",
          "kind": "extends",
          "note": "Feedback is the input, memory the artefact it writes; the loop closes when the user sees that write and can edit it."
        },
        {
          "id": "constraint-rules",
          "kind": "alternative",
          "note": "Both shape future runs: Constraint Rules Engine with hard rules you declare, Feedback Loop with preferences from feedback."
        },
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Feedback Loop steers the next answer; Autonomy Dial sets which actions the agent may take without asking."
        }
      ]
    },
    {
      "id": "capability-boundary",
      "url": "https://beyondchat.design/patterns/capability-boundary/",
      "title": "Capability Boundary",
      "subtitle": "Honest about what it cannot do — before it tries",
      "metaphor": "Spec Sheet",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "Before running, the system declares which parts of the task it can confidently handle and which it will refuse or substitute. Honest pre-flight disclosure beats confident hallucination — and offering a workaround beats a flat refusal.",
      "interaction": "Pre-flight Disclosure, Workaround Offer",
      "controlMechanism": "Can-Do List, Cannot-Do List, Workaround Path, Proceed-with-Limits",
      "useCase": "Tasks Near Model Limits, Compliance-Sensitive Work, Reducing Hallucination",
      "useWhen": "Limits are real and silent failure (confident hallucination) is costlier than honest refusal.",
      "failureModeLabel": "Helpful Hallucination",
      "dope": {
        "observability": "The system declares its scope for this task before any tokens are spent",
        "predictability": "Users know what part of the answer to trust and what to verify themselves",
        "directability": "Choose to proceed within the limits, supply the missing input, or abandon the task",
        "explainability": "Each refused capability comes with a reason and a workaround when one exists"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "AI systems prefer confident hallucination to honest refusal — users discover the limit by being misled.",
        "pattern": "Surface a pre-flight capability sheet: what the system will do, what it will refuse, and how the user can supply the missing piece.",
        "whyChatBreaks": "Chat encourages a \"yes-and\" register that hides limits behind plausible-sounding answers.",
        "risks": "Over-cautious capability lists become friction theatre and erode trust through false modesty.",
        "avoidWhen": "The model is reliably within capability for the task — disclosure adds noise without value."
      },
      "examples": [
        {
          "product": "Cursor 2.1 Plan Mode",
          "company": "Cursor",
          "url": "https://cursor.com",
          "note": "Plan Mode emits an editable plan with file paths and a to-do list before any code runs — a pre-flight surface where the agent can flag what it cannot do safely. The closest in-product capability-boundary UX in 2026."
        },
        {
          "product": "ChatGPT Model Picker Disclaimers",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "When a user selects a vision/voice/web-disabled model, the UI disables the relevant input (uploads/web) and surfaces a tooltip explaining why. Pre-flight scope disclosure for the lay user."
        },
        {
          "product": "Microsoft Copilot Studio",
          "company": "Microsoft",
          "url": "https://www.microsoft.com/en-us/copilot/microsoft-copilot-studio",
          "note": "Explicit \"disambiguate intent\" + capability declaration UX in agent setup — the clearest enterprise expression of the pattern as a configurable boundary."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Capability Boundary pattern?",
          "a": "Limits are real and silent failure (confident hallucination) is costlier than honest refusal."
        },
        {
          "q": "When should I avoid the Capability Boundary pattern?",
          "a": "The model is reliably within capability for the task — disclosure adds noise without value."
        },
        {
          "q": "What problem does Capability Boundary solve?",
          "a": "AI systems prefer confident hallucination to honest refusal — users discover the limit by being misled."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat encourages a \"yes-and\" register that hides limits behind plausible-sounding answers."
        }
      ],
      "related": [
        {
          "id": "disambiguation-branch",
          "kind": "pairs-with",
          "note": "Disambiguation Branch asks first when intent is unclear; Capability Boundary says up front what the AI cannot do at all."
        },
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "Capability Boundary says before the run what the AI cannot do; Confidence Signals rate how sure it is of each claim it makes."
        },
        {
          "id": "intent-preview",
          "kind": "pairs-with",
          "note": "Intent Preview shows the plan before it runs; Capability Boundary flags the parts the AI cannot do and offers a workaround."
        }
      ]
    },
    {
      "id": "knowledge-source-toggle",
      "url": "https://beyondchat.design/patterns/knowledge-source-toggle/",
      "title": "Knowledge Source Toggle",
      "subtitle": "Show what the AI is allowed to see",
      "metaphor": "Library Shelves",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "AI with access to multiple connectors — Drive, Slack, Notion, Email, Web — should make those sources visible and switchable. The user picks which sources are in scope before the run, sees how many hits each contributed, and can flip any source off when the answer should not see it. No silent aggregation.",
      "interaction": "Per-Source Toggle, Live Source Attribution",
      "controlMechanism": "Source List, On/Off Toggles, Hit Counts, Per-Claim Attribution",
      "useCase": "Multi-Source RAG, Agent Tool Access, Sensitive-Data Workflows",
      "useWhen": "Answers draw from multiple sources and users need to scope or audit which inputs were used.",
      "failureModeLabel": "Silent Source Aggregation",
      "dope": {
        "observability": "Every active source is visible, with hit counts after each run",
        "predictability": "Removing a source removes its contribution — the answer changes accordingly",
        "directability": "Toggle any source on or off per query, save scoped source-sets for repeat use",
        "explainability": "Every claim in the answer is attributed to a specific source"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Multi-source AI silently aggregates from every connector — users cannot tell what the answer actually saw, or stop it from seeing something it should not.",
        "pattern": "Show every connector as a visible toggle, attribute every claim to a source, and let users scope sources per query.",
        "whyChatBreaks": "Chat hides retrieval inside the system; the user gets one merged answer with no surface to scope or audit the inputs.",
        "risks": "Too many sources at once create noise; weak attribution can imply sources were used when they were merely consulted.",
        "avoidWhen": "The system has a single, well-known source and explicit toggling adds friction without insight."
      },
      "examples": [
        {
          "product": "Claude Connectors",
          "company": "Anthropic",
          "url": "https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities",
          "note": "The composer's \"+\" menu — or typing \"/\" — opens Connectors; toggle Gmail, Drive, Slack, GitHub, Linear or Microsoft 365 on for that conversation. Each directory entry states the connector's read/write capabilities before you connect. The toggles live on the conversation, not on the Project."
        },
        {
          "product": "Gemini Notebook Source Toggles",
          "company": "Google",
          "url": "https://support.google.com/gemininotebook/answer/16179559",
          "note": "Renamed from NotebookLM on 16 July 2026; the surface is unchanged. A checkbox on each source includes or excludes it from the answer, and citations quote the source directly — hover for the full quoted text, click to jump to its location in the document. Still the cleanest per-claim attribution in the set."
        },
        {
          "product": "Perplexity Projects Sources",
          "company": "Perplexity",
          "url": "https://www.perplexity.ai/help-center/en/articles/10352961-what-are-spaces",
          "note": "Spaces became Projects on 30 July 2026; existing Spaces migrated automatically. A Project's Settings tab picks which of 400+ connectors it uses, with per-connector instructions, alongside its own files and prioritised domains. Scoping is durable across every session in the Project rather than chosen per query."
        },
        {
          "product": "ChatGPT Company Knowledge",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/12628342-company-knowledge-in-chatgpt-business-enterprise-and-edu",
          "note": "Connectors were renamed Apps in Dec 2025 and folded into the Plugin directory in July 2026. Picking \"company knowledge\" from the composer's + menu opens per-app toggles for that chat, and the answer cites back to sources. Business/Enterprise/Edu on web only — and left unselected, ChatGPT may still use apps automatically."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Knowledge Source Toggle pattern?",
          "a": "Answers draw from multiple sources and users need to scope or audit which inputs were used."
        },
        {
          "q": "When should I avoid the Knowledge Source Toggle pattern?",
          "a": "The system has a single, well-known source and explicit toggling adds friction without insight."
        },
        {
          "q": "What problem does Knowledge Source Toggle solve?",
          "a": "Multi-source AI silently aggregates from every connector — users cannot tell what the answer actually saw, or stop it from seeing something it should not."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat hides retrieval inside the system; the user gets one merged answer with no surface to scope or audit the inputs."
        }
      ],
      "related": [
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Pick which sources are in scope, then hover any sentence to see the exact source spans that grounded it."
        },
        {
          "id": "constraint-rules",
          "kind": "pairs-with",
          "note": "Knowledge Source Toggle scopes sources per query; Constraint Rules Engine keeps the off-limits ones out of every run."
        },
        {
          "id": "consent",
          "kind": "extended-by",
          "note": "Consent is the durable layer above Knowledge Source Toggle: every app the agent can reach, with scope and expiry."
        }
      ]
    },
    {
      "id": "persona-switcher",
      "url": "https://beyondchat.design/patterns/persona-switcher/",
      "title": "Persona Switcher",
      "subtitle": "Choose the lens, not just the voice",
      "metaphor": "Wardrobe",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Different tasks want different agents. A Persona Switcher gives the user a deliberate set of named lenses — Researcher, Coach, Editor, Adversary — each with its own voice, depth, and constraints. The persona is visible at all times, and switching is one move, not a reset.",
      "interaction": "Persona Selection, Live Preview",
      "controlMechanism": "Persona Cards, Capability Tags, Saved Custom Personas",
      "useCase": "Specialised Expertise, Tone Consistency, Multi-Role Workflows",
      "useWhen": "One assistant serves several distinct task types — research, editing, coaching — that want different defaults.",
      "failureModeLabel": "Single Voice Default",
      "dope": {
        "observability": "Active persona is always visible alongside the response",
        "predictability": "Each persona declares its voice, depth, and what it will refuse",
        "directability": "Switch personas mid-thread without losing the context",
        "explainability": "Each persona card shows the kind of move it favours and the kind it refuses"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "A single neutral assistant cannot be the right voice for every task — research, coaching, editing, and adversarial review all want different defaults.",
        "pattern": "Offer named personas as visible, switchable lenses; each declares its voice, depth, and refusal behaviour.",
        "whyChatBreaks": "Chat hides any persona under custom instructions or system prompts; users cannot see, swap, or compare voices.",
        "risks": "Too many personas dilute the signal; weak signalling makes the active persona feel decorative.",
        "avoidWhen": "The product has one tightly-scoped task and a single voice serves it well."
      },
      "examples": [
        {
          "product": "ChatGPT GPTs",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "Explore GPTs in the sidebar; the active GPT's name sits at the top of the chat. Settings → Personalization adds a Base style and tone dropdown with six named styles (Professional, Friendly, Candid, Quirky, Efficient, Cynical). Caveat — since August 2026 personal accounts can use and edit GPTs but no longer create or publish new ones; authoring is workspace-only."
        },
        {
          "product": "Claude Projects",
          "company": "Anthropic",
          "url": "https://claude.ai",
          "note": "Each Project carries its own custom instructions (persona system prompt), files, and memory. Switching projects is one click; persona is named at the top of the conversation. Free tier gets 5 projects."
        },
        {
          "product": "Poe Multi-Bot",
          "company": "Quora",
          "url": "https://poe.com",
          "note": "Bot picker plus a configurable default bot; in a group chat several bots share one thread and you mention the one you want, with Automatic Replies set per chat. Caveat — Poe's roster is mostly models rather than declared personas, so it carries the switch-mid-thread half and not the declared-contract half."
        },
        {
          "product": "Gemini Gems",
          "company": "Google",
          "url": "https://support.google.com/gemini/answer/15235907",
          "note": "Gems sit in the left sidebar of gemini.google.com, with a \"Premade by Google\" shelf — Career guide, Writing editor, Brainstormer, Coding partner — each shipping preset instructions for its task and copyable as a starting point for your own. Caveat — picking a Gem opens a new chat; the lens does not carry the thread you are already in."
        },
        {
          "product": "Perplexity Projects",
          "company": "Perplexity",
          "url": "https://www.perplexity.ai/projects",
          "note": "Renamed from Spaces in 2026; the old /spaces URL redirects. Each Project carries up to 8,000 characters of instructions that apply to every query inside it, alongside files, connectors and a Brain memory tab. Aggregates persona, memory and source scoping into one container."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Persona Switcher pattern?",
          "a": "One assistant serves several distinct task types — research, editing, coaching — that want different defaults."
        },
        {
          "q": "When should I avoid the Persona Switcher pattern?",
          "a": "The product has one tightly-scoped task and a single voice serves it well."
        },
        {
          "q": "What problem does Persona Switcher solve?",
          "a": "A single neutral assistant cannot be the right voice for every task — research, coaching, editing, and adversarial review all want different defaults."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat hides any persona under custom instructions or system prompts; users cannot see, swap, or compare voices."
        }
      ],
      "related": [
        {
          "id": "tone-of-voice",
          "kind": "pairs-with",
          "note": "Pick the persona for its lens and refusals, then fine-tune how it sounds on the Tone of Voice pad."
        },
        {
          "id": "saved-styles",
          "kind": "extends",
          "note": "Persona Switcher takes the Saved Styles preset and adds a lens, its own depth, and the moves each persona refuses."
        },
        {
          "id": "constraint-rules",
          "kind": "pairs-with",
          "note": "Persona Switcher declares refusals per lens; the Constraint Rules Engine enforces rules that hold under every persona."
        }
      ]
    },
    {
      "id": "prompt-enhancer",
      "url": "https://beyondchat.design/patterns/prompt-enhancer/",
      "title": "Prompt Enhancer",
      "subtitle": "Rewrite the prompt — visibly — before it runs",
      "metaphor": "Editor",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Instead of running a vague prompt and producing a generic answer, the system rewrites the prompt first — adding structure, scope, and constraints — and shows the rewrite as a diff. The user accepts, edits, or rejects each augmentation before the run starts. No magic prompts behind the curtain.",
      "interaction": "Pre-flight Rewrite, Diff Review",
      "controlMechanism": "Suggested Edits, Per-Change Accept/Reject, Final Prompt Preview",
      "useCase": "Vague Prompts, Repeated Misreads, Onboarding to a New Tool",
      "useWhen": "Many users are not fluent prompters and a transparent rewrite teaches them what good prompts look like.",
      "failureModeLabel": "Hidden Rewriting",
      "dope": {
        "observability": "The rewrite is visible as a diff over the original — nothing is added invisibly",
        "predictability": "The final prompt is shown in full before any tokens are spent",
        "directability": "Accept, edit, or reject each suggested augmentation independently",
        "explainability": "Each augmentation is labeled with the kind of clarity it adds (scope, format, tone, constraint)"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "input",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Vague prompts produce generic answers — but most users do not know what shape a good prompt should have.",
        "pattern": "Rewrite the prompt as a transparent diff before running, with per-change accept/reject and a final prompt preview.",
        "whyChatBreaks": "Chat hides any prompt rewriting inside the system prompt; users cannot see what was added or chose what to keep.",
        "risks": "Aggressive rewrites can change the meaning of the original prompt; users may rubber-stamp without reading.",
        "avoidWhen": "The user is already a fluent prompter and the rewriting layer adds friction without value."
      },
      "examples": [
        {
          "product": "Microsoft Foundry · Prompt Optimizer",
          "company": "Microsoft",
          "url": "https://learn.microsoft.com/en-us/azure/foundry/observability/how-to/prompt-optimizer",
          "note": "Foundry portal, agent Instructions field, public preview and region-gated. Changed paragraphs are highlighted, a chat-bubble icon on each opens the reasoning for that specific change, and \"Show all reasoning\" expands every one at once. The apply path is still one \"Use prompt\" on the whole revision — no per-change accept or reject, and the result is gone if you close the dialog."
        },
        {
          "product": "OpenAI Playground Optimize",
          "company": "OpenAI",
          "url": "https://developers.openai.com/api/docs/guides/prompt-optimizer",
          "note": "The Optimize button at the bottom of the prompt pane rewrites into a new tab, flagging contradictions, missing format, and few-shot conflicts. Snippets show what changed and why, openable as comments or an inline reviewer — but no first-party doc says a single change can be accepted or dismissed on its own. Its dataset-backed half shuts down with Evals on 2026-11-30."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Prompt Enhancer pattern?",
          "a": "Many users are not fluent prompters and a transparent rewrite teaches them what good prompts look like."
        },
        {
          "q": "When should I avoid the Prompt Enhancer pattern?",
          "a": "The user is already a fluent prompter and the rewriting layer adds friction without value."
        },
        {
          "q": "What problem does Prompt Enhancer solve?",
          "a": "Vague prompts produce generic answers — but most users do not know what shape a good prompt should have."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat hides any prompt rewriting inside the system prompt; users cannot see what was added or chose what to keep."
        }
      ],
      "related": [
        {
          "id": "prompt-parsing",
          "kind": "alternative",
          "note": "Prompt Enhancer rewrites the prompt as a diff you review; Inline Prompt Controls keeps your wording and makes each variable clickable."
        },
        {
          "id": "disambiguation-branch",
          "kind": "pairs-with",
          "note": "Prompt Enhancer sharpens a vague prompt whose intent is clear; Disambiguation Branch takes over when the prompt has several readings."
        },
        {
          "id": "sample-response",
          "kind": "pairs-with",
          "note": "Sample Response shows what a typical answer looks like before you ask; Prompt Enhancer then sharpens the prompt you write."
        }
      ]
    },
    {
      "id": "output-skeleton",
      "url": "https://beyondchat.design/patterns/output-skeleton/",
      "title": "Output Skeleton",
      "subtitle": "Show the shape before filling it",
      "metaphor": "Wireframe",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Instead of streaming a long answer character-by-character, render the structure first — headings, section count, expected formats — then fill the slots in. Users know within a second whether they will get a 3-bullet TL;DR or a 1,200-word essay, and can start orienting before the content arrives.",
      "interaction": "Schema-First Reveal",
      "controlMechanism": "Pre-rendered Outline, Section Placeholders, Staggered Fill",
      "useCase": "Reports, Briefs, Long Structured Outputs, Code Files",
      "useWhen": "Long outputs have predictable structure and users benefit from seeing the shape before content arrives.",
      "failureModeLabel": "Shape Hidden Until End",
      "dope": {
        "observability": "The shape of the answer is visible immediately, before any content arrives",
        "predictability": "Section count, format, and length envelope are declared up front",
        "directability": "Skip ahead, expand or collapse sections, reject the structure before content fills",
        "explainability": "Each placeholder declares what kind of content will land there (paragraph, list, table)"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "output",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Long answers stream linearly — users wait without knowing if the answer will be three bullets or three pages.",
        "pattern": "Render the structure first (sections, formats, lengths) and fill content into the placeholders, often in parallel.",
        "whyChatBreaks": "Chat treats output as a flat character stream; the user must wait until the end to learn the shape they were promised.",
        "risks": "Skeletons that overpromise (more sections than the model can fill well) feel like a bait-and-switch.",
        "avoidWhen": "Outputs are short or freeform enough that a structural preview would be heavier than the content itself."
      },
      "examples": [
        {
          "product": "ChatGPT Deep Research",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/10500283-deep-research-in-chatgpt",
          "note": "Proposes a research plan card before execution; the user reviews and modifies the outline, then the agent runs. The plan-first contract made explicit."
        },
        {
          "product": "Gemini Deep Research",
          "company": "Google",
          "url": "https://gemini.google.com",
          "note": "Apr 2026 launch on Gemini 3.1 Pro made the editable research plan the hero UX — the structure of the answer is shown and shaped before any content arrives."
        },
        {
          "product": "Claude Artifacts (skeleton behavior)",
          "company": "Anthropic",
          "url": "https://claude.ai",
          "note": "Caveat — implicit, not a named feature. For long structured documents Claude often drafts headings and sections first, then fills them. Pattern visible in behavior, not branding."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Output Skeleton pattern?",
          "a": "Long outputs have predictable structure and users benefit from seeing the shape before content arrives."
        },
        {
          "q": "When should I avoid the Output Skeleton pattern?",
          "a": "Outputs are short or freeform enough that a structural preview would be heavier than the content itself."
        },
        {
          "q": "What problem does Output Skeleton solve?",
          "a": "Long answers stream linearly — users wait without knowing if the answer will be three bullets or three pages."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat treats output as a flat character stream; the user must wait until the end to learn the shape they were promised."
        }
      ],
      "related": [
        {
          "id": "progressive-disclosure",
          "kind": "pairs-with",
          "note": "Output Skeleton lets you open only the answer sections you need; Progressive Disclosure does the same for advanced controls."
        },
        {
          "id": "generative-ui",
          "kind": "pairs-with",
          "note": "A skeleton is the contract before Generative UI fills it in — structure first, components later."
        },
        {
          "id": "intent-preview",
          "kind": "pairs-with",
          "note": "Intent Preview shows the steps an agent will take; Output Skeleton shows the shape of what it will hand back."
        }
      ]
    },
    {
      "id": "stage-tracker",
      "url": "https://beyondchat.design/patterns/stage-tracker/",
      "title": "Stage Tracker",
      "subtitle": "Where the agent is, not just what it is thinking",
      "metaphor": "Conveyor Belt",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Long agent runs need structural progress, not just streaming reasoning text. Stage Tracker breaks the run into named phases — Researching → Drafting → Reviewing → Polishing — and shows which one is live, what is done, and what is still ahead. Each phase is inspectable so users can dip in without breaking flow.",
      "interaction": "Phase Timeline, Live Status",
      "controlMechanism": "Named Phases, Per-Phase Status, Time Estimates, Inspect-on-Click",
      "useCase": "Long-Running Agents, Deep Research, Multi-Step Workflows",
      "useWhen": "Agent runs have distinct phases and users need to know whether the system is stuck or progressing.",
      "failureModeLabel": "Spinner Theatre",
      "dope": {
        "observability": "A timeline of named phases shows where the agent is right now and what is queued",
        "predictability": "The phase list is declared up front; the user knows the shape before the run starts",
        "directability": "Click any completed phase to inspect its output without stopping the run",
        "explainability": "Each phase carries a one-line description of its job and the artefact it produces"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Long agent runs go silent for minutes — users do not know whether the agent is stuck, working, or almost done.",
        "pattern": "Declare named phases up front and show live status per phase, with completed phases inspectable on demand.",
        "whyChatBreaks": "A streaming \"thinking…\" indicator is not progress — it is decoration. Chat has no structural surface for multi-stage runs.",
        "risks": "Phases that do not match the agent's real structure become theatre; over-detailed phases drown the signal.",
        "avoidWhen": "The task is single-shot and short enough that any progress UI costs more than it informs — or the person came for an outcome rather than a process, where naming each phase of a slow run makes the wait feel longer and turns a delay into a spectacle they cannot leave."
      },
      "examples": [
        {
          "product": "Devin Plan View",
          "company": "Cognition",
          "url": "https://app.devin.ai",
          "note": "Devin 2.0/2.2 panel with Progress / Shell / Browser / Editor tabs; interactive timelapse with live progress bar and phase-decomposed DAG. The strongest example in the category."
        },
        {
          "product": "Manus AI Phases",
          "company": "Manus",
          "url": "https://manus.im",
          "note": "Live replay across planning → browsing → code execution → file management sub-agents, each a distinct, inspectable phase with live status badges."
        },
        {
          "product": "OpenAI Deep Research Progress",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "Real-time progress shown by phase; redesigned sidebar + fullscreen report explicitly added in 2026. Plan-first contract feeds directly into phase-tracked execution."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Stage Tracker pattern?",
          "a": "Agent runs have distinct phases and users need to know whether the system is stuck or progressing."
        },
        {
          "q": "When should I avoid the Stage Tracker pattern?",
          "a": "The task is single-shot and short enough that any progress UI costs more than it informs — or the person came for an outcome rather than a process, where naming each phase of a slow run makes the wait feel longer and turns a delay into a spectacle they cannot leave."
        },
        {
          "q": "What problem does Stage Tracker solve?",
          "a": "Long agent runs go silent for minutes — users do not know whether the agent is stuck, working, or almost done."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A streaming \"thinking…\" indicator is not progress — it is decoration. Chat has no structural surface for multi-stage runs."
        }
      ],
      "related": [
        {
          "id": "reasoning-trace",
          "kind": "pairs-with",
          "note": "Stage Tracker shows where a long run is; Reasoning Trace opens the claims and assumptions behind what it concludes."
        },
        {
          "id": "agentic-dashboard",
          "kind": "pairs-with",
          "note": "Agentic Dashboard gives several agents a lane each, with status and pause; Stage Tracker shows the phases inside one run."
        },
        {
          "id": "editable-plan",
          "kind": "pairs-with",
          "note": "Editable Plan lets you set the steps before the run starts; Stage Tracker then reports live as each phase plays out."
        }
      ]
    },
    {
      "id": "draft-mode",
      "url": "https://beyondchat.design/patterns/draft-mode/",
      "title": "Draft Mode",
      "subtitle": "Two modes, two trust zones",
      "metaphor": "Sketch Pad",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Split AI work into two explicit modes. In Draft: a cheap or no-side-effects pass, ideal for trying ten ideas in the time of one. In Live: the production model, real outputs, real cost. The 2026 industry has settled on \"Plan Mode\" terminology (Cursor, Claude Code) — the underlying move is the same: a deliberate, visible promotion from sketch to commit.",
      "interaction": "Mode Toggle, Promote-to-Live",
      "controlMechanism": "Draft / Live Switch, Cheap-Model Badge, Sandbox Banner, Promote Button",
      "useCase": "Exploration, Iteration, Pre-commit Workflows",
      "useWhen": "Iteration is exploratory and the production pipeline is too expensive to use as a sketchpad.",
      "failureModeLabel": "Uniform Cost",
      "dope": {
        "observability": "Mode is always visible; sandbox banner makes the trust zone unmissable",
        "predictability": "Draft outputs are explicitly marked as cheap-model approximations",
        "directability": "Iterate as many times as needed in Draft; promote a chosen one to Live",
        "explainability": "Each mode declares its model, cost profile, and whether side effects apply"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Iterating with a production-grade agent burns real tokens and produces real side effects, even when the user is just exploring.",
        "pattern": "Offer two explicit modes: a cheap, sandboxed Draft for exploration and a committed Live for the final pass. Make the mode visible, the cost asymmetric, and promotion a deliberate act.",
        "whyChatBreaks": "Chat treats every turn the same — same model, same cost, same persistence. There is no surface for cheap exploration that the user can leave behind.",
        "risks": "If Draft outputs look identical to Live, users may trust them as final; weak mode signalling can blur the boundary.",
        "avoidWhen": "The task is short and a single-tier model already serves both exploration and commit cheaply."
      },
      "examples": [
        {
          "product": "Midjourney · Draft Mode",
          "company": "Midjourney",
          "url": "https://docs.midjourney.com/hc/en-us/articles/35577175650957-Draft-Conversational-Modes",
          "note": "The only example that ships the cost-asymmetric half, and the product the pattern is effectively named after. A draft prompt costs 0.4 GPU minutes against 0.8 for a standard job and 1.3 for HD, returning 24 images at 512px instead of four at full size. Promotion is a deliberate act on one chosen image — Enhance, Vary or Remix re-renders it at full quality. The coding Plan Modes below ship the sandbox and the promotion; only this one makes exploring genuinely cheaper."
        },
        {
          "product": "Cursor Plan Mode",
          "company": "Cursor",
          "url": "https://cursor.com/docs/agent/plan-mode",
          "note": "Shift+Tab toggles a no-edit planning mode where Cursor proposes a plan but cannot write files; user explicitly promotes to Agent mode for execution. Strongest 2026 example."
        },
        {
          "product": "Claude Code Plan Mode",
          "company": "Anthropic",
          "url": "https://code.claude.com",
          "note": "Shift+Tab toggles a no-edit planning mode in the terminal. Claude proposes a plan; user promotes to execute. Same paradigm as Cursor — the 2026 industry settled on Plan vs Agent terminology."
        },
        {
          "product": "Replit Agent Sandbox",
          "company": "Replit",
          "url": "https://replit.com",
          "note": "Caveat — captures the side-effect-free preview half but not the cheap-model half. Sandbox-to-Deploy is the explicit promotion act; Effort-Based Pricing makes cost asymmetric."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Draft Mode pattern?",
          "a": "Iteration is exploratory and the production pipeline is too expensive to use as a sketchpad."
        },
        {
          "q": "When should I avoid the Draft Mode pattern?",
          "a": "The task is short and a single-tier model already serves both exploration and commit cheaply."
        },
        {
          "q": "What problem does Draft Mode solve?",
          "a": "Iterating with a production-grade agent burns real tokens and produces real side effects, even when the user is just exploring."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat treats every turn the same — same model, same cost, same persistence. There is no surface for cheap exploration that the user can leave behind."
        }
      ],
      "related": [
        {
          "id": "compute-budget",
          "kind": "pairs-with",
          "note": "Draft Mode keeps exploration cheap and side-effect free; Compute Budget caps what the Live run can spend."
        },
        {
          "id": "parallel-alternatives",
          "kind": "pairs-with",
          "note": "Run Parallel Alternatives in Draft, where they cost little, then promote the one you pick to Live."
        },
        {
          "id": "intent-preview",
          "kind": "alternative",
          "note": "Draft Mode runs a cheap sandboxed pass to show a rough result; Intent Preview lists the steps and risks before anything runs."
        }
      ]
    },
    {
      "id": "mid-stream-steering",
      "url": "https://beyondchat.design/patterns/mid-stream-steering/",
      "title": "Mid-Stream Steering",
      "subtitle": "Talk to the AI while it works",
      "metaphor": "Steering Wheel",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Don't stop the agent — steer it. While the AI is streaming, the user can drop quick directives (\"shorter\", \"less formal\", \"go deeper on the second point\"). The output keeps flowing, but with the new direction baked in, marked inline so the pivot is visible. No restart, no wasted tokens.",
      "interaction": "Live Redirect, Quick Nudge",
      "controlMechanism": "Steering Chips, Inline Course Marker, Soft Pivot (no restart)",
      "useCase": "Long-form Generation, Agent Reasoning, Streaming Outputs",
      "useWhen": "Generations are long enough that waiting and redoing costs more than redirecting in flight.",
      "failureModeLabel": "Atomic Generation",
      "dope": {
        "observability": "Course-correction markers appear inline so the pivot is visible in the output itself",
        "predictability": "Each steering chip describes the new direction in plain language before applying",
        "directability": "Direct manipulation of in-flight generation — change tone, depth, or angle without stopping",
        "explainability": "Every steered segment is annotated with the directive that caused it"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Once an agent starts generating, the only intervention is a hard stop — and stopping throws away whatever was already produced.",
        "pattern": "Let users redirect the in-flight stream with quick chips or natural language; the output continues with the new direction marked inline.",
        "whyChatBreaks": "Chat treats generation as atomic — you wait, read, and then ask for a redo. Mid-stream steering lets the redirection happen during the work, not after it.",
        "risks": "Too many steering options can fragment output and produce zigzag voice; markers can clutter the result.",
        "avoidWhen": "Outputs are short enough that waiting and redoing is cheaper than building a steering surface."
      },
      "examples": [
        {
          "product": "ChatGPT Voice Mode",
          "company": "OpenAI",
          "url": "https://chatgpt.com",
          "note": "Advanced Voice Mode supports mid-sentence interruption to redirect — the cleanest consumer expression of soft mid-stream steering, well-documented in 2026."
        },
        {
          "product": "OpenAI Deep Research mid-run Update",
          "company": "OpenAI",
          "url": "https://openai.com/index/introducing-deep-research/",
          "note": "Feb 2026: users add new info mid-research via sidebar \"Update\" button. No restart, progress preserved. The non-destructive pivot the pattern actually describes."
        },
        {
          "product": "Claude Code mid-turn messages",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/interactive-mode",
          "note": "Sep 2026 docs: a message typed while Claude runs tool calls reaches it as soon as those calls finish, inside the same turn — the soft pivot, no restart. The steered turn shows the message where it landed; there is no per-segment course marker."
        },
        {
          "product": "OpenAI Codex Steer",
          "company": "OpenAI",
          "url": "https://learn.chatgpt.com/docs/codex/cli",
          "note": "Captured Sep 2026: Steer pushed “Skip mercury baths, and name the inventor for each step” into a running five-search task. It lands in the timeline between two searches, the agent acknowledges it and keeps going — no restart. In a pure text stream with no step boundary the same message only lands when the turn ends. The Responses API ships the primitive for builders as response.steer."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Mid-Stream Steering pattern?",
          "a": "Generations are long enough that waiting and redoing costs more than redirecting in flight."
        },
        {
          "q": "When should I avoid the Mid-Stream Steering pattern?",
          "a": "Outputs are short enough that waiting and redoing is cheaper than building a steering surface."
        },
        {
          "q": "What problem does Mid-Stream Steering solve?",
          "a": "Once an agent starts generating, the only intervention is a hard stop — and stopping throws away whatever was already produced."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat treats generation as atomic — you wait, read, and then ask for a redo. Mid-stream steering lets the redirection happen during the work, not after it."
        }
      ],
      "related": [
        {
          "id": "editable-plan",
          "kind": "pairs-with",
          "note": "Editable Plan sets the course before kickoff; Mid-Stream Steering corrects it while the output flows."
        },
        {
          "id": "approval-gates",
          "kind": "alternative",
          "note": "Approval Gates stop the run at set checkpoints for sign-off; Mid-Stream Steering redirects it without stopping at all."
        },
        {
          "id": "follow-up-queue",
          "kind": "pairs-with",
          "note": "Mid-Stream Steering acts on the running turn; Follow-up Queue lines up asks for after it ends, and any card can steer it now."
        }
      ]
    },
    {
      "id": "compute-budget",
      "url": "https://beyondchat.design/patterns/compute-budget/",
      "title": "Compute Budget",
      "subtitle": "See the cost before you spend it",
      "metaphor": "Spending Budget",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Before an agent runs, surface its expected token, time, and dollar cost. Pick a mode (Quick / Standard / Deep) that scales the budget. Mid-flight, a meter shows what you are actually spending — and pauses the run when it crosses the cap so you can decide whether to keep going.",
      "interaction": "Pre-flight Estimate, Live Meter",
      "controlMechanism": "Mode Selector, Token & Cost Estimate, Hard Cap, Pause-at-Threshold",
      "useCase": "Agent Runs, Deep Research, Tool-Heavy Workflows",
      "useWhen": "Agent runs spend tokens, time, or money in ways users cannot see or limit at the start.",
      "failureModeLabel": "Hidden Cost",
      "dope": {
        "observability": "Live meter shows tokens, time, and dollars consumed against the budget",
        "predictability": "Mode and cap are explicit upfront — no runaway spend hidden in a long run",
        "directability": "Raise the cap, switch mode, or stop and pocket partial output any time",
        "explainability": "Estimate breakdown shows which steps and tools drive the cost"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Agent runs can spend tokens, time, and money invisibly — users only learn the cost after the bill arrives.",
        "pattern": "Show pre-flight cost estimates with mode selection and a hard cap; meter the live spend and pause at threshold.",
        "whyChatBreaks": "Chat hides compute as a black box — there is no surface to set a ceiling, see live spend, or decide mid-run whether the answer is worth more.",
        "risks": "Cost meters can become anxiety theatre if they are imprecise, distracting, or punish exploration.",
        "avoidWhen": "The task is cheap enough end-to-end that a budget interface costs more attention than it saves money."
      },
      "examples": [
        {
          "product": "Replit Effort-Based Pricing",
          "company": "Replit",
          "url": "https://replit.com/blog/effort-based-pricing",
          "note": "Effort-based pricing since July 2025: a checkpoint costs what the work cost, and hovering the usage icon in the Agent tab shows the figure for each one. Account → Billing adds threshold alerts and a hard budget cap. The $0.25 in the old note was the previous flat rate — under effort-based pricing simple changes typically land under it."
        },
        {
          "product": "Devin ACUs",
          "company": "Cognition",
          "url": "https://devin.ai/pricing/",
          "note": "Session Insights reports ACU consumption once a session closes, and Settings → Plans carries the month's usage, remaining quota and on-demand credit balance. Devin no longer defines an ACU as roughly 15 minutes — it is now \"the amount of agent effort required to complete a given task,\" scaling with inference and model, at $2.25 per ACU self-serve. Post-hoc, not pre-flight."
        },
        {
          "product": "Claude Code /usage",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/costs",
          "note": "/usage prints the session's token counts and a dollar figure, plan usage bars, and a 24h/7d breakdown attributing spend to skills, subagents, plugins and individual MCP servers — the closest thing in this set to an explainable cost breakdown. /cost survives only as an alias. The dollar figure is computed locally at list rates, so it may not match the bill."
        },
        {
          "product": "Cursor Spend Limits",
          "company": "Cursor",
          "url": "https://cursor.com/docs/account/billing/spend-limits",
          "note": "The dashboard's Spending tab shows real-time usage across both model pools, remaining allowance, and request-level cost; a monthly spend limit hard-stops AI features until the next billing cycle, and May 2026 added dollar-threshold alerts to Slack or email. All of it sits outside the editor — in there you get a notification only once the limit is already hit."
        },
        {
          "product": "ElevenLabs Studio",
          "company": "ElevenLabs",
          "url": "https://elevenlabs.io/docs/eleven-creative/products/studio",
          "note": "The one row that carries the pre-flight half: Studio tells you how many credits generating the selected text will cost before you commit, and warns what an export will cost when paragraphs still need converting. Credits rather than dollars, and there is no ceiling that stops a job once it is running."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Compute Budget pattern?",
          "a": "Agent runs spend tokens, time, or money in ways users cannot see or limit at the start."
        },
        {
          "q": "When should I avoid the Compute Budget pattern?",
          "a": "The task is cheap enough end-to-end that a budget interface costs more attention than it saves money."
        },
        {
          "q": "What problem does Compute Budget solve?",
          "a": "Agent runs can spend tokens, time, and money invisibly — users only learn the cost after the bill arrives."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat hides compute as a black box — there is no surface to set a ceiling, see live spend, or decide mid-run whether the answer is worth more."
        }
      ],
      "related": [
        {
          "id": "draft-mode",
          "kind": "pairs-with",
          "note": "Draft Mode keeps exploration cheap and side-effect free; Compute Budget caps what the Live run can spend."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Compute Budget pauses when spend crosses the cap; Approval Gates add pauses at set steps for sign-off."
        },
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Set how much autonomy the agent has, then bound how much it can spend exercising it."
        }
      ]
    },
    {
      "id": "footprints",
      "url": "https://beyondchat.design/patterns/footprints/",
      "title": "Footprints",
      "subtitle": "The Org-Wide Record of Every AI Action",
      "metaphor": "Black Box Recorder",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "Action Audit gives one user a reversible undo of their own agent — but it can't answer who touched what, for whom, and when across everyone. Footprints is the operator's view: one searchable, exportable record of every AI action across all users, tools, and resources, so an admin scopes an incident review by query instead of stitching transcripts by hand.",
      "interaction": "Filterable Log, Cross-User Query",
      "controlMechanism": "Search, Filter, Date Range, Actor & Resource Filters, Export",
      "useCase": "Incident review, Cross-user debugging, Compliance audit",
      "useWhen": "When something goes wrong across a team's AI, one queryable record answers \"who did what, to what, when\" in seconds — a per-user undo timeline never can.",
      "failureModeLabel": "No Org-Level Audit",
      "dope": {
        "observability": "Every AI action across the org is queryable, not just user-scoped sessions",
        "predictability": "Action records use a stable schema so cross-time and cross-user comparisons stay meaningful",
        "directability": "Investigators filter by actor, tool, resource, and outcome to scope a review",
        "explainability": "Each entry links back to the prompt, plan, and tool calls that produced the action"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Action Audit gives each user a personal undo of their own agent, but no one can answer the org-level question of which AI touched what, for whom, and when, across every user at once.",
        "pattern": "Add an operator-facing record of every AI action — actor, tool, resource, outcome, time — that any admin can search, filter, and export across all users, separate from the per-user undo timeline.",
        "whyChatBreaks": "Chat transcripts are user-scoped and stack-shaped, so reconstructing what happened across many operators means manually pulling and stitching sessions instead of querying one record.",
        "risks": "Volume can drown the signal, and over-collecting every user's actions can breach the very privacy boundaries the record was meant to protect — scope retention and access deliberately.",
        "avoidWhen": "A single user operates the agent and a personal undo timeline already answers every question — the org-wide record is overhead no one queries."
      },
      "examples": [
        {
          "product": "LangSmith",
          "company": "LangChain",
          "url": "https://www.langchain.com/langsmith",
          "note": "Production observability for LLM apps. Every run shows the prompt tree, tool calls, latency, token cost — filterable across users, projects, and time. The org-wide query surface compliance teams reach for first."
        },
        {
          "product": "Datadog LLM Observability",
          "company": "Datadog",
          "url": "https://www.datadoghq.com/product/llm-observability/",
          "note": "Hooks into the same APM dashboards that ops already trusts. Per-trace prompt/response, cost, latency, user id, and PII detection. Treats LLM calls as a first-class span type, not a wrapper around a normal HTTP call."
        },
        {
          "product": "AWS Bedrock model invocation logs",
          "company": "Amazon",
          "url": "https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html",
          "note": "Native CloudWatch + S3 logging for every Bedrock invocation: caller identity, request, response, guardrail decisions. Pairs with CloudTrail for the audit layer compliance teams already operate on."
        },
        {
          "product": "OpenAI Audit Logs API",
          "company": "OpenAI",
          "url": "https://platform.openai.com/docs/api-reference/audit-logs",
          "note": "Org-admin endpoint for actor / action / object queries across the workspace — user invites, API key rotations, project membership, login methods. Less granular than LangSmith on the prompt level but the canonical \"who did what\" trail."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Footprints pattern?",
          "a": "When something goes wrong across a team's AI, one queryable record answers \"who did what, to what, when\" in seconds — a per-user undo timeline never can."
        },
        {
          "q": "When should I avoid the Footprints pattern?",
          "a": "A single user operates the agent and a personal undo timeline already answers every question — the org-wide record is overhead no one queries."
        },
        {
          "q": "What problem does Footprints solve?",
          "a": "Action Audit gives each user a personal undo of their own agent, but no one can answer the org-level question of which AI touched what, for whom, and when, across every user at once."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat transcripts are user-scoped and stack-shaped, so reconstructing what happened across many operators means manually pulling and stitching sessions instead of querying one record."
        }
      ],
      "related": [
        {
          "id": "action-audit",
          "kind": "extends",
          "note": "Action Audit & Undo gives the user reversible undo; Footprints is the org-level record across every user, every action."
        },
        {
          "id": "agentic-dashboard",
          "kind": "pairs-with",
          "note": "Agentic Dashboard supervises agents live; Footprints lets an admin query everything they did afterwards, across the whole org."
        },
        {
          "id": "constraint-rules",
          "kind": "pairs-with",
          "note": "Constraint Rules Engine checks each action live; Footprints keeps the org-wide record to show afterwards that the rules held."
        }
      ]
    },
    {
      "id": "consent",
      "url": "https://beyondchat.design/patterns/consent/",
      "title": "Consent",
      "subtitle": "See and Control What Your Agent Can Touch",
      "metaphor": "Permissions Pane",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Per-prompt \"allow this?\" dialogs train the reflex click and leave no record of what the agent can reach. Where a knowledge-source toggle scopes a single query, this is the durable layer above it: one surface listing every app the agent can touch right now — with scope, grantor, and expiry — where any grant can be inspected, narrowed, extended, or revoked inline.",
      "interaction": "Grant, Revoke, Inspect",
      "controlMechanism": "Permission Cards, Scope Sliders, Expiry Dates, Periodic Review Prompts",
      "useCase": "Multi-tool agents, Connector management, Granting & revoking access",
      "useWhen": "A standing, revocable map of what the agent can reach beats a stream of one-off \"allow this?\" prompts that vanish the moment they are clicked.",
      "failureModeLabel": "Modal-as-Consent",
      "dope": {
        "observability": "Every active permission is visible on a single surface with scope, grantor, expiry",
        "predictability": "Scope and expiry are explicit — there is no implicit grant the user has not seen",
        "directability": "Revoke, narrow, extend, or re-bind any grant at any time",
        "explainability": "Each permission lists exactly what data and actions it covers, in plain language"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "entry",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "An agent reaching across many apps on the user's behalf accumulates access no one can see, because per-prompt dialogs leave no durable record of what it can touch.",
        "pattern": "Render every grant on one inspectable surface — which app, what scope, granted by whom, expiring when — sitting above the per-query toggle, and let the user narrow, extend, or revoke any of it inline.",
        "whyChatBreaks": "Permissions approved in chat die with the session and cannot be seen, audited, or revoked later, so the agent's reach only ever grows.",
        "risks": "Without a review cadence the surface still drifts — grants accumulate, scopes broaden, and a permission list no one revisits becomes its own blind spot.",
        "avoidWhen": "The agent reaches a single trusted system within one fixed scope, where a standing permission surface adds chrome with nothing to control."
      },
      "examples": [
        {
          "product": "Auth0 · Fine-Grained Authorization",
          "company": "Okta",
          "url": "https://fga.dev/",
          "note": "Relationship-based access control aimed at AI agents: durable grants with explicit scope, expiry, and inspectable history. Permissions as inspectable artifacts, not modal choices."
        },
        {
          "product": "Google Workspace · third-party app access",
          "company": "Google",
          "url": "https://workspace.google.com/security/",
          "note": "Per-app, per-scope, per-user permission panels in the Admin console. Revocation propagates immediately; expiry policies and review prompts at the workspace level."
        },
        {
          "product": "OpenAI ChatGPT · Connectors",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/11487775-connectors-in-chatgpt",
          "note": "Settings → Connectors lists every linked service with the scopes granted and a per-connector revoke. The cleanest consumer-facing implementation of \"every grant is visible on one surface.\""
        },
        {
          "product": "Anthropic Claude · MCP server consent",
          "company": "Anthropic",
          "url": "https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp",
          "note": "Each MCP server connection is a durable grant with a visible scope description; tool calls show the granting server inline. Mid-maturity — UI varies across surfaces (desktop, Claude Code) and the org-wide audit view is not yet unified."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Consent pattern?",
          "a": "A standing, revocable map of what the agent can reach beats a stream of one-off \"allow this?\" prompts that vanish the moment they are clicked."
        },
        {
          "q": "When should I avoid the Consent pattern?",
          "a": "The agent reaches a single trusted system within one fixed scope, where a standing permission surface adds chrome with nothing to control."
        },
        {
          "q": "What problem does Consent solve?",
          "a": "An agent reaching across many apps on the user's behalf accumulates access no one can see, because per-prompt dialogs leave no durable record of what it can touch."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Permissions approved in chat die with the session and cannot be seen, audited, or revoked later, so the agent's reach only ever grows."
        }
      ],
      "related": [
        {
          "id": "knowledge-source-toggle",
          "kind": "extends",
          "note": "Knowledge Source Toggle scopes one query; Consent is the durable permission layer above it, across sessions and revocable."
        },
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Autonomy Dial sets which tools run freely, ask first, or stay off; Consent sets which apps the agent can reach and for how long."
        },
        {
          "id": "data-ownership",
          "kind": "pairs-with",
          "note": "Consent controls what the agent can still reach; Data Ownership lists what it has collected, ready to export or delete."
        }
      ]
    },
    {
      "id": "data-ownership",
      "url": "https://beyondchat.design/patterns/data-ownership/",
      "title": "Data Ownership",
      "subtitle": "What the AI Has on You — and How to Take It Back",
      "metaphor": "Inventory Cabinet",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Memory exposes what the AI remembers about you. Data Ownership broadens that to all the data the AI has touched on your behalf — uploaded files, scraped sources, retrieved emails, persisted preferences. Categorized by source, dated, exportable, deletable. The user-facing inventory of what the system holds.",
      "interaction": "Inspect, Export, Delete",
      "controlMechanism": "Data Cards, Source Tags, Bulk Actions, Export Buttons",
      "useCase": "Memory-aware AI, Personalized Assistants, Privacy Compliance",
      "useWhen": "The AI accumulates user data over time and users need a single surface to inspect, export, and reclaim it.",
      "failureModeLabel": "Scattered Ownership",
      "dope": {
        "observability": "Every fragment of user data the system touches is rendered, categorised, and dated",
        "predictability": "Deletion is real and surfaces a confirmation; the inventory always reflects current truth",
        "directability": "Export, delete, or scope any item — bulk or individual — without filing a support ticket",
        "explainability": "Each entry shows where the data came from and what features rely on it"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "AI products accumulate user data invisibly — uploads, scraped sources, retrieved messages, persisted preferences — with no surface for users to see or control it.",
        "pattern": "Render every fragment of user data the system has touched as a first-class user-facing inventory: categorized, dated, exportable, deletable.",
        "whyChatBreaks": "Chat as a UX has no surface for \"what do you have on me\" beyond memory; data scattered across tools stays invisible to the human it belongs to.",
        "risks": "Faithful inventory can reveal more than expected and break trust if the system has been silently over-collecting.",
        "avoidWhen": "The system stores only ephemeral session data with no cross-session persistence — a data inventory adds noise without information."
      },
      "examples": [
        {
          "product": "Apple · App Privacy Report",
          "company": "Apple",
          "url": "https://support.apple.com/en-us/HT212958",
          "note": "Settings → Privacy → App Privacy Report renders every domain each app contacted, categorised, dated, exportable. Not AI-specific, but the canonical example of \"user-facing inventory of what the system holds on you.\""
        },
        {
          "product": "GDPR · Data Subject Access Request flows",
          "company": "EU regulatory pattern",
          "url": "https://gdpr.eu/article-15-right-of-access/",
          "note": "Every major product now ships a \"Download my data\" workflow. Coverage varies (memories yes, retrieved sources sometimes, persisted preferences often missed). The legal baseline the pattern operationalises."
        },
        {
          "product": "ChatGPT · Memory export + bulk delete",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/8590148-memory-faq",
          "note": "Settings → Personalization → Memory shows every saved memory with date and one-tap delete. Custom Instructions export as JSON. Closest consumer-facing implementation of the inventory-with-actions surface."
        },
        {
          "product": "Claude · Memory inspector",
          "company": "Anthropic",
          "url": "https://www.anthropic.com/news/memory",
          "note": "Per-project memory page rendering what Claude has learned, with edit and delete per entry. Stops short of unifying uploaded files and retrieved sources into the same surface — the upgrade path the pattern points to."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Data Ownership pattern?",
          "a": "The AI accumulates user data over time and users need a single surface to inspect, export, and reclaim it."
        },
        {
          "q": "When should I avoid the Data Ownership pattern?",
          "a": "The system stores only ephemeral session data with no cross-session persistence — a data inventory adds noise without information."
        },
        {
          "q": "What problem does Data Ownership solve?",
          "a": "AI products accumulate user data invisibly — uploads, scraped sources, retrieved messages, persisted preferences — with no surface for users to see or control it."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat as a UX has no surface for \"what do you have on me\" beyond memory; data scattered across tools stays invisible to the human it belongs to."
        }
      ],
      "related": [
        {
          "id": "ai-memory",
          "kind": "extends",
          "note": "AI Memory exposes what the AI remembers; Data Ownership broadens that to everything it has touched on your behalf."
        },
        {
          "id": "incognito-mode",
          "kind": "pairs-with",
          "note": "Incognito Mode keeps a session out of long-term memory; Data Ownership shows and deletes what was already stored."
        },
        {
          "id": "consent",
          "kind": "pairs-with",
          "note": "Data Ownership shows what the AI already holds; Consent controls which apps it can still reach, with scope and expiry."
        }
      ]
    },
    {
      "id": "disclosure",
      "url": "https://beyondchat.design/patterns/disclosure/",
      "title": "Disclosure",
      "subtitle": "Make AI Presence Visible at a Glance",
      "metaphor": "Hazard Sign",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "AI Provenance marks per-fragment authorship inside a document. Disclosure is the at-a-glance signal that this surface, session, or output involves AI — for the user, the recipient, the regulator. Banner-level, not span-level. Survives copy-paste, screenshot, and downstream sharing.",
      "interaction": "Persistent Label, Optional Expansion",
      "controlMechanism": "Banners, Badges, Watermarks, Footer Notes, Provenance Stamps",
      "useCase": "Mixed-AI Documents, AI-Drafted Content, Public-Facing Outputs",
      "useWhen": "AI-touched outputs leave the system into untrusted contexts where recipients need to know AI was involved.",
      "failureModeLabel": "No At-A-Glance Signal",
      "dope": {
        "observability": "AI presence is visible without expansion or hover — recipients see it at a glance",
        "predictability": "The disclosure surface is consistent across the product so users learn to recognise it",
        "directability": "Users can expand any disclosure to see what AI contributed to the artifact",
        "explainability": "Each disclosure links to the model, prompt context, and time that produced the contribution"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "AI-generated content circulates outside the system as if it were human-authored — recipients cannot calibrate trust or detect synthetic provenance.",
        "pattern": "Mark every AI-touched surface or output with a visible, persistent disclosure that survives copy-paste, screenshot, and downstream sharing.",
        "whyChatBreaks": "Chat transcripts have no surface for marking the assistant contribution once it leaves the chat — the labelling has to come at the artifact level.",
        "risks": "Heavy-handed disclosure becomes legal-disclaimer noise users learn to tune out; weak disclosure satisfies regulators without informing recipients.",
        "avoidWhen": "The output is internal-only and disclosure adds friction without recipient value."
      },
      "examples": [
        {
          "product": "Microsoft 365 Copilot · \"Created with Copilot\" labels",
          "company": "Microsoft",
          "url": "https://learn.microsoft.com/en-us/copilot/",
          "note": "Documents drafted with Copilot get a header label and an in-doc footer note. Survives copy-paste into another doc; visible to anyone the file is shared with. Loosely couples to C2PA where the file format supports it."
        },
        {
          "product": "Google SynthID",
          "company": "Google DeepMind",
          "url": "https://deepmind.google/technologies/synthid/",
          "note": "Invisible cryptographic watermark embedded in Gemini-generated images, audio, and video. Robust to cropping and re-encoding — detection happens at the model side. Banner-level signal without visible chrome."
        },
        {
          "product": "C2PA Content Credentials",
          "company": "C2PA · Adobe / OpenAI",
          "url": "https://contentcredentials.org/",
          "note": "Open standard: cryptographic provenance metadata attached to images and video at generation. Sora, Adobe Firefly, Leica cameras all sign with C2PA. Disclosure as portable signal, verified outside the originating product."
        },
        {
          "product": "Apple Intelligence · Image Playground provenance metadata",
          "company": "Apple",
          "url": "https://www.apple.com/apple-intelligence/",
          "note": "Images generated with Image Playground carry AI-provenance metadata written into the file itself, so the disclosure travels with the artifact when it is saved or shared. Apple's real disclosure mechanism — at the file level, not the editing surface."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Disclosure pattern?",
          "a": "AI-touched outputs leave the system into untrusted contexts where recipients need to know AI was involved."
        },
        {
          "q": "When should I avoid the Disclosure pattern?",
          "a": "The output is internal-only and disclosure adds friction without recipient value."
        },
        {
          "q": "What problem does Disclosure solve?",
          "a": "AI-generated content circulates outside the system as if it were human-authored — recipients cannot calibrate trust or detect synthetic provenance."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat transcripts have no surface for marking the assistant contribution once it leaves the chat — the labelling has to come at the artifact level."
        }
      ],
      "related": [
        {
          "id": "ai-provenance",
          "kind": "pairs-with",
          "note": "Disclosure labels the whole output as AI-touched; AI Provenance marks the AI-drafted spans in it no human has reviewed."
        },
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "Disclosure says the output is AI; Confidence Signals add how sure it is of each claim, so recipients can calibrate trust."
        },
        {
          "id": "footprints",
          "kind": "pairs-with",
          "note": "Disclosure tells the reader an output involved AI; Footprints gives an admin a searchable record of the action behind it."
        }
      ]
    },
    {
      "id": "sample-response",
      "url": "https://beyondchat.design/patterns/sample-response/",
      "title": "Sample Response",
      "subtitle": "Show the Shape Before You Ask",
      "metaphor": "Specimen",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Output Skeleton previews the structure of your answer once you have prompted. Sample Response inverts that: before you fill the form or submit the prompt, see a typical example of what you will receive — calibrating expectations, format, length, tone — without paying for a real run.",
      "interaction": "Pre-flight Preview, Calibration",
      "controlMechanism": "Example Cards, Format Previews, Sample Output Tab",
      "useCase": "First-Time Users, Form-Driven Tasks, Calibrated Expectations",
      "useWhen": "First-time or infrequent users need to calibrate expectations about format, length, and tone before committing to a prompt.",
      "failureModeLabel": "Run-To-Calibrate",
      "dope": {
        "observability": "A representative example is visible before the user invests in their own query",
        "predictability": "Sample shape demonstrates what \"normal\" looks like so deviations stand out",
        "directability": "Users browse a small set of samples to find the closest match before committing",
        "explainability": "Each sample is labeled with the inputs that produced it so the user can adapt"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "Users prompt blind, then judge the output as good or bad without ever seeing what \"normal\" looks like for the system they are talking to.",
        "pattern": "Render a representative sample of what a typical answer looks like before the user invests in their own query — calibrating expectations, format, length, tone.",
        "whyChatBreaks": "Chat is empty until you prompt; there is no native surface for \"what would this normally produce\" before the cost of a real query is paid.",
        "risks": "A canned sample can over-anchor users on one specific shape; freshness rots if the model changes faster than the sample.",
        "avoidWhen": "Outputs are highly variable or the user is already a fluent operator who knows what to expect — the sample becomes scaffolding without leverage."
      },
      "examples": [
        {
          "product": "Stripe API Reference · response examples",
          "company": "Stripe",
          "url": "https://docs.stripe.com/api/charges/object",
          "note": "Every endpoint reference renders a realistic JSON response in the right column — the canonical \"sample response\" pattern in developer docs. Calibrates field shape, types, and length before the user spends a real request."
        },
        {
          "product": "Notion AI · template previews",
          "company": "Notion",
          "url": "https://www.notion.so/product/ai",
          "note": "Pick \"Meeting notes\" or \"Project brief\" templates and a one-shot rendered sample appears before you commit. Length envelope, section structure, and tone visible up front."
        },
        {
          "product": "OpenAI Playground · presets",
          "company": "OpenAI",
          "url": "https://platform.openai.com/playground",
          "note": "Saved completions browsable as samples — see how an instruction-following or code-generation preset behaves before crafting your own prompt against it. Closest neighbour for \"calibrate before you commit\" in the API tooling space."
        },
        {
          "product": "Vercel v0 · template gallery",
          "company": "Vercel",
          "url": "https://v0.dev",
          "note": "Components and pages rendered as starting samples — fork the closest match, then ask v0 to riff on it. Sample-as-springboard, not sample-as-preview."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Sample Response pattern?",
          "a": "First-time or infrequent users need to calibrate expectations about format, length, and tone before committing to a prompt."
        },
        {
          "q": "When should I avoid the Sample Response pattern?",
          "a": "Outputs are highly variable or the user is already a fluent operator who knows what to expect — the sample becomes scaffolding without leverage."
        },
        {
          "q": "What problem does Sample Response solve?",
          "a": "Users prompt blind, then judge the output as good or bad without ever seeing what \"normal\" looks like for the system they are talking to."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat is empty until you prompt; there is no native surface for \"what would this normally produce\" before the cost of a real query is paid."
        }
      ],
      "related": [
        {
          "id": "output-skeleton",
          "kind": "pairs-with",
          "note": "Sample Response shows what normal looks like before you ask; Output Skeleton renders the structure of the actual run."
        },
        {
          "id": "templates",
          "kind": "pairs-with",
          "note": "Templates turn the prompt into a form; Sample Response shows a typical result before you fill it in."
        },
        {
          "id": "prompt-enhancer",
          "kind": "pairs-with",
          "note": "Sample Response calibrates what to expect from the answer; Prompt Enhancer then sharpens the prompt as a diff you review."
        }
      ]
    },
    {
      "id": "real-time-generation",
      "url": "https://beyondchat.design/patterns/real-time-generation/",
      "title": "Real-time Generation",
      "subtitle": "Continuous Visual Synthesis as You Steer",
      "metaphor": "Synthesizer",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Streaming text generation produces tokens left-to-right. Real-time generation produces a complete artifact that updates as the user manipulates inputs — drag a slider, the image updates within milliseconds. Krea Realtime Canvas, Leonardo Realtime, Stable Diffusion Live.",
      "interaction": "Live, Continuous, Bidirectional",
      "controlMechanism": "Canvas, Sliders, Reference Drops, Brushstrokes, Live Preview",
      "useCase": "Image Generation, Video Sketching, Live Visual Iteration",
      "useWhen": "Visual iteration benefits from continuous synthesis as inputs change, not turn-based regeneration.",
      "failureModeLabel": "Submit-and-Wait",
      "dope": {
        "observability": "The full output is visible at all times — no waiting for a turn to complete",
        "predictability": "Each input change produces a coherent, deterministic delta to the artifact",
        "directability": "Manipulate any input — drag, sketch, drop reference — and watch the artifact respond live",
        "explainability": "The mapping from input to output is visible in motion, so users learn the controls by using them"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "processing",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Streaming generation produces tokens left-to-right; visual iteration wants the whole artifact updating with every input twiddle, not waiting for a turn to finish.",
        "pattern": "Render a complete output that re-synthesizes continuously as the user manipulates inputs — millisecond-grained, not turn-grained.",
        "whyChatBreaks": "Chat is turn-based; there is no native surface for \"render this as I move\" — every parameter change requires a new generation cycle.",
        "risks": "Cost and energy of continuous regeneration; visual flicker can feel chaotic without smoothing or commit-to-result handoff.",
        "avoidWhen": "The output is text or the user benefits more from a deliberate one-shot than from continuous re-synthesis."
      },
      "examples": [
        {
          "product": "Krea AI · Realtime Canvas",
          "company": "Krea",
          "url": "https://www.krea.ai/realtime",
          "note": "Drag a slider or sketch on the canvas; the generated image re-synthesizes ~30fps with no submit button. The clearest production example of generation-as-direct-manipulation — built on SDXL Turbo behind the scenes."
        },
        {
          "product": "Leonardo · Realtime Canvas",
          "company": "Leonardo.Ai",
          "url": "https://intercom.help/leonardo-ai/en/articles/8658301-realtime-canvas",
          "note": "Paint shapes with a brush, the image regenerates to match your strokes live. Style prompt stays fixed while the structure follows the canvas — a different cut of the same pattern."
        },
        {
          "product": "Figma · Make (real-time interface generation)",
          "company": "Figma",
          "url": "https://www.figma.com/make/",
          "note": "Interface components regenerate as you steer through the design surface. Not yet pixel-fluid like Krea, but the same input-as-render-trigger contract applied to UI building blocks."
        },
        {
          "product": "fal · Realtime SDXL Turbo",
          "company": "fal.ai",
          "url": "https://fal.ai/realtime",
          "note": "The infrastructure layer — sub-second generation served at scale. Krea, Leonardo, and many internal tools sit on top. Pattern relies on this latency envelope; without it, real-time collapses back into turn-based."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Real-time Generation pattern?",
          "a": "Visual iteration benefits from continuous synthesis as inputs change, not turn-based regeneration."
        },
        {
          "q": "When should I avoid the Real-time Generation pattern?",
          "a": "The output is text or the user benefits more from a deliberate one-shot than from continuous re-synthesis."
        },
        {
          "q": "What problem does Real-time Generation solve?",
          "a": "Streaming generation produces tokens left-to-right; visual iteration wants the whole artifact updating with every input twiddle, not waiting for a turn to finish."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat is turn-based; there is no native surface for \"render this as I move\" — every parameter change requires a new generation cycle."
        }
      ],
      "related": [
        {
          "id": "region-lock",
          "kind": "pairs-with",
          "note": "With Region Lock, continuous synthesis runs only where you want it; the locked parts stay still."
        },
        {
          "id": "multi-modal",
          "kind": "pairs-with",
          "note": "Feed Multi-Modal Input's sketch, references and text into the live canvas, and it re-renders with every weight change."
        },
        {
          "id": "parallel-alternatives",
          "kind": "alternative",
          "note": "Real-time Generation reshapes one artifact as you steer; Parallel Alternatives shows three candidates side by side."
        }
      ]
    },
    {
      "id": "annotated-capture",
      "url": "https://beyondchat.design/patterns/annotated-capture/",
      "title": "Annotated Capture",
      "subtitle": "Point at it — visually — instead of describing it",
      "metaphor": "Sticky Note on Screenshot",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Describing a visual element with words is slow and ambiguous — \"the third button from the left, next to the search bar\". Annotated Capture lets the user draw on a screenshot directly: circle the element, arrow it, label it with the change you want. The annotations themselves become the prompt. Distinct from Multi-Modal Input (which composes a new artefact from sketch + text + reference) and Region Lock (which freezes parts of generated output): this pattern is markup of a captured surface as a steering signal. Made practical by vision-language models that can resolve per-pixel pointing — a 2024-era capability shift that turned hand-drawn arrows into a precise input channel. By 2026 the pattern ships natively, not as a workaround: Cursor's Design Mode puts click, multi-select, and draw-to-select annotation directly in the canvas, and Figma Make reads on-canvas annotations as build instructions.",
      "interaction": "Capture, Mark Up, Submit",
      "controlMechanism": "Markup Tools (Arrow, Circle, Label), Screenshot Canvas, Pointing-as-Prompt",
      "useCase": "UI Feedback, Bug Reports, Design Critique, Computer-Use Agents",
      "useWhen": "Visual pointing translated into prose costs tokens, time, and precision — now that vision-language models can resolve markup directly, the translation layer is unnecessary.",
      "failureModeLabel": "Pointing-by-Prose",
      "dope": {
        "observability": "Every annotation is visible on the canvas — the user sees exactly what the AI is being told to look at",
        "predictability": "Markup is unambiguous: a circle around an element means that element, not \"something similar\"",
        "directability": "Add, move, edit, or delete annotations directly on the canvas before submitting",
        "explainability": "Each annotation carries its tool kind and an optional label that names the change requested"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Describing a visual element with words is slow and ambiguous — \"the third button next to the search bar\" leaves the AI guessing, and every clarification round multiplies tokens without adding precision.",
        "pattern": "Let the user mark up a captured screen directly with arrows, circles, and labels. The annotations become the prompt: deictic markup (\"this one, this big\") instead of descriptive prose (\"the one between X and Y\").",
        "whyChatBreaks": "Chat is a single text channel; visual pointing has to be translated into prose at the user side and back into spatial reasoning at the model side, which loses precision at both steps. Vision-language models can now resolve markup directly, and first-class annotation canvases — Cursor's Design Mode, Figma Make — ship it natively rather than as a pasted-screenshot workaround.",
        "risks": "Over-annotated captures get noisy and the AI can fixate on the markup instead of the underlying element. If the system silently reads only some markup types (e.g. circles but not arrows), the user has no signal which were used. Annotation tooling that drifts from native conventions (Apple Pencil, browser screenshot apps) creates a second thing to learn.",
        "avoidWhen": "The visual is simple enough to describe in one sentence, the underlying element is text where Select & Transform is already a fit, or the user has no easy capture path (mobile-only flows without screenshot APIs)."
      },
      "examples": [
        {
          "product": "Google AI Studio · Stream Realtime",
          "company": "Google",
          "url": "https://aistudio.google.com",
          "note": "Live screen-sharing session with Gemini where the cursor itself becomes a deictic gesture — the model resolves \"this thing here\" without prose. Closest production-grade approximation of pointing-as-prompt today."
        },
        {
          "product": "Apple Intelligence · Image Wand",
          "company": "Apple",
          "url": "https://www.apple.com/apple-intelligence/",
          "note": "Draw a rough shape around something on screen and the wand resolves the bounded region as an input. Ships in iOS/macOS as part of Apple Intelligence — closest mass-market expression of the pattern."
        },
        {
          "product": "Figma Make · Canvas Annotations",
          "company": "Figma",
          "url": "https://www.figma.com/make/",
          "note": "In-canvas comments and arrows that the AI-driven build flow reads alongside the design — annotations on a frame become instructions, not just feedback."
        },
        {
          "product": "Cursor · Design Mode",
          "company": "Cursor",
          "url": "https://cursor.com/blog/design-mode",
          "note": "First-class annotation canvas (Cursor 3.0, April 2026; extended in 3.7): click, multi-select, or draw-to-select UI elements directly and add a note or voice narration — the agent edits from the pointing itself, replacing the old pasted-PNG workaround."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Annotated Capture pattern?",
          "a": "Visual pointing translated into prose costs tokens, time, and precision — now that vision-language models can resolve markup directly, the translation layer is unnecessary."
        },
        {
          "q": "When should I avoid the Annotated Capture pattern?",
          "a": "The visual is simple enough to describe in one sentence, the underlying element is text where Select & Transform is already a fit, or the user has no easy capture path (mobile-only flows without screenshot APIs)."
        },
        {
          "q": "What problem does Annotated Capture solve?",
          "a": "Describing a visual element with words is slow and ambiguous — \"the third button next to the search bar\" leaves the AI guessing, and every clarification round multiplies tokens without adding precision."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat is a single text channel; visual pointing has to be translated into prose at the user side and back into spatial reasoning at the model side, which loses precision at both steps. Vision-language models can now resolve markup directly, and first-class annotation canvases — Cursor's Design Mode, Figma Make — ship it natively rather than as a pasted-screenshot workaround."
        }
      ],
      "related": [
        {
          "id": "multi-modal",
          "kind": "alternative",
          "note": "Multi-Modal Input composes something new from sketch, text and references; Annotated Capture marks up a captured screen."
        },
        {
          "id": "region-lock",
          "kind": "pairs-with",
          "note": "Annotated Capture marks what to change on a screenshot; Region Lock pins what must survive the next regeneration."
        },
        {
          "id": "select-transform",
          "kind": "alternative",
          "note": "Select & Transform points at text by selecting it; Annotated Capture points at pixels by drawing on them."
        }
      ]
    },
    {
      "id": "output-undo",
      "url": "https://beyondchat.design/patterns/output-undo/",
      "title": "Output-Level Undo",
      "subtitle": "Cmd+Z for generated output",
      "metaphor": "Time-Reverse Key",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "AI products shipped without Cmd+Z: you can regenerate, branch, or edit-to-fork, but none reverses the last output with one keystroke the way every text editor has since 1987 — so people screenshot before they regenerate. Output-Level Undo treats the output as the unit of work and gives it the real thing: one keystroke walks back through a linear history of states, with a small persistent cue that says you can come back. Branching is the heavyweight retrofit; undo is the lightweight primitive it skipped.",
      "interaction": "One Keystroke, Stack Navigation, Ambient Affordance",
      "controlMechanism": "Cmd+Z / Cmd+Shift+Z, Linear State Stack, Visible \"↩\" Affordance, Inline Restore-Preview",
      "useCase": "Generative Writing, Output Iteration, Recovery After Regenerate",
      "useWhen": "AI inherited branching but skipped undo; one keystroke that walks back through output states replaces the screenshot-before-regenerate reflex.",
      "failureModeLabel": "Branching as Undo Retrofit",
      "dope": {
        "observability": "A small persistent affordance (↩) shows the user a prior state is recoverable — Norman's feedback principle applied to generative output",
        "predictability": "Same keystroke, same semantics, every surface. Cmd+Z behaves like Cmd+Z behaves anywhere else",
        "directability": "One keystroke restores the previous output state, no menu, no hover, no navigation — direct manipulation at the syntactic level of the answer",
        "explainability": "Each entry in the stack names what is being reversed (e.g. \"before regenerate · 14:22\") so the user picks a target consciously"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "refinement",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "AI products shipped without Cmd+Z. Generated output can be regenerated, branched, or edited-to-fork — but none of those reverse the last action with one keystroke the way every text editor since 1987 has. Users have invented their own undo through Cmd+A → Cmd+C and screenshot-before-regenerate reflexes.",
        "pattern": "Treat output as the unit of work and apply the canonical four-property undo to it: output-level reversibility (restore the previous paragraph as recoverable state), one-keystroke ambient access (Cmd+Z and Cmd+Shift+Z, no menu), stack semantics (a linear history of states, not a branch tree), and visible affordance (a small persistent \"you can come back from this\" cue).",
        "whyChatBreaks": "Chat inherited the messaging-app skeleton, in which the unit of state is the message thread. Generative output is the unit of work, but the surface treats it as a turn — and turns do not have undo, they have branching. The industry shipped branching as a retrofit; users read it as a betrayal.",
        "risks": "Without clear scope (output-level vs paragraph-level vs token-level), undo can over- or under-shoot. Stack semantics on a generative system also have to handle non-deterministic state — restoring \"the output before regenerate\" is well-defined; restoring \"the cursor position inside that output\" is not. Persistent affordances can also clutter outputs that don't need them.",
        "avoidWhen": "The output is ephemeral or read-only by design (a one-shot Q&A surface) and a stack would add cognitive load without earning it."
      },
      "examples": [
        {
          "product": "Cursor · Checkpoints",
          "company": "Cursor",
          "url": "https://cursor.com",
          "note": "Closest neighbour to the pattern. Every agent step snapshots the workspace; \"Restore\" rolls back to any checkpoint with one click. Not Cmd+Z and not ambient, but the only shipping example that treats prior states as a recoverable stack rather than a branch tree."
        },
        {
          "product": "Claude Code · Esc-Esc Rewind",
          "company": "Anthropic",
          "url": "https://docs.claude.com/en/docs/claude-code",
          "note": "Double-Esc opens a history picker of prior agent states; user navigates and resumes from any earlier point. One-keystroke-adjacent, output-level, with a visible affordance — three of the four undo properties. Still pickerless ambient invocation is the missing piece."
        },
        {
          "product": "Adobe Photoshop · History panel",
          "company": "Adobe",
          "url": "https://helpx.adobe.com/photoshop/using/undo-history.html",
          "note": "Linear stack of prior document states in an always-visible panel — click any entry to walk back, with the undo keystroke stepping through the same stack. The non-AI reference for stack semantics on rich output; the keystroke, the stack, and the ambient affordance all in one surface."
        },
        {
          "product": "Cmd+Z in any text editor (1987 baseline)",
          "company": "Apple HIG · Tesler · Norman · Nielsen",
          "url": "https://www.nngroup.com/articles/ten-usability-heuristics/",
          "note": "The reference implementation. Cmd+Z works the same way in a 1987 Mac word processor and a 2026 Figma frame — without tutorials, settings, or menus. Adi Leviim's argument: AI products inherited 50 years of text editing without inheriting its most successful primitive."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Output-Level Undo pattern?",
          "a": "AI inherited branching but skipped undo; one keystroke that walks back through output states replaces the screenshot-before-regenerate reflex."
        },
        {
          "q": "When should I avoid the Output-Level Undo pattern?",
          "a": "The output is ephemeral or read-only by design (a one-shot Q&A surface) and a stack would add cognitive load without earning it."
        },
        {
          "q": "What problem does Output-Level Undo solve?",
          "a": "AI products shipped without Cmd+Z. Generated output can be regenerated, branched, or edited-to-fork — but none of those reverse the last action with one keystroke the way every text editor since 1987 has. Users have invented their own undo through Cmd+A → Cmd+C and screenshot-before-regenerate reflexes."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat inherited the messaging-app skeleton, in which the unit of state is the message thread. Generative output is the unit of work, but the surface treats it as a turn — and turns do not have undo, they have branching. The industry shipped branching as a retrofit; users read it as a betrayal."
        }
      ],
      "related": [
        {
          "id": "conversation-branches",
          "kind": "alternative",
          "note": "Output-Level Undo steps back through outputs with Cmd+Z; Conversation Branches lets you fork a turn and keep both paths."
        },
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Action Audit & Undo reverses each action an agent took; Output-Level Undo reverses the generated output itself."
        },
        {
          "id": "region-lock",
          "kind": "pairs-with",
          "note": "Region Lock keeps the good parts through a regenerate; Output-Level Undo brings back the previous version if it got worse."
        }
      ]
    },
    {
      "id": "task-bid-market",
      "url": "https://beyondchat.design/patterns/task-bid-market/",
      "title": "Task Bid Market",
      "subtitle": "Let the Person Pick the Bid, Not the System",
      "metaphor": "Open Tender",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "When many specialist agents could handle a task, most systems silently route to one chosen at build time — before anyone knew this job would be high-stakes. The move: broadcast the task, collect competing bids, and lay them out side by side — cost, time, privacy, reputation — with trade-off controls, so the person picks on the actual trade-off. For an open agent web, this is where routing is heading, not where it ships today.",
      "interaction": "Broadcast RFQ, Receive Bids, Pick by Trade-Off",
      "controlMechanism": "Task RFQ Broadcast, Bid Objects (cost/duration/privacy), Reputation Filter, Smart Contract Settlement",
      "useCase": "Routing to specialist agents, Per-task provider choice, Cost-vs-privacy trade-offs",
      "useWhen": "Surfacing the candidate bids and letting the person decide on the trade-off beats a silent build-time default, because no one choosing months ahead could know which axis — cost, speed, privacy, or quality — this particular task would turn on.",
      "failureModeLabel": "Design-Time Dispatch",
      "dope": {
        "observability": "Every bid is visible side-by-side — cost, duration, privacy guarantee, reputation portfolio, and the agent's prior task history",
        "predictability": "Bid contracts specify scope, schedule, and penalty for default before commitment; reputation bonds make defection costly",
        "directability": "Delegators set the trade-off priorities (latency vs cost vs privacy) and the market filters; pick is one click on the chosen bid",
        "explainability": "The selected bid carries its own justification — which axes it dominated, which competitors it Pareto-replaced"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "entry",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "When many agents could do a task, the system usually picks one silently at build time, collapsing the real trade-off between cost, speed, privacy, and quality into a default nobody chose for this specific job.",
        "pattern": "Treat the assignment as an open set, not a fixed roster: broadcast the task, collect competing bids, lay them out side by side — cost, duration, privacy, reputation — and let the person pick the bid that fits this task and see what each pick costs them.",
        "whyChatBreaks": "Chat commits to a single agent up front, in the system prompt and tool wiring, and has no surface for comparing an open set of candidates and choosing per task at the moment of need.",
        "risks": "The hard part sits under the comparison UI: without stake-on-bid and Sybil resistance an attacker floods the board with fake agents, without scoped requests sensitive task details leak to losing bidders, and without portable reputation the market quietly favours incumbents.",
        "avoidWhen": "The right agent is known and stable, or the task is routine and cheap — then a fixed route beats running an auction for every job."
      },
      "examples": [
        {
          "product": "A2A protocol",
          "company": "Linux Foundation (orig. Google)",
          "url": "https://a2a-protocol.org/latest/specification/",
          "note": "Peer-to-peer agent transport layer with Agent Cards (capability and skill manifests) and task objects (lifecycle states). The infrastructure foundation for marketplace-style delegation between agents on the open web."
        },
        {
          "product": "AP2 · Mandates",
          "company": "Google · Google Pay",
          "url": "https://github.com/google-agentic-commerce/AP2",
          "note": "Cryptographically signed intents authorising an agent to spend funds or incur costs on behalf of a principal. Provides the financial liability layer the bid market needs — a delegator can issue a mandate ceiling, bidders post stake against it."
        },
        {
          "product": "EigenLayer · AVS operator marketplace",
          "company": "Eigen Labs",
          "url": "https://www.eigenlayer.xyz/",
          "note": "Game-theoretic open market from the web3 stack: operators stake to take on verification work and get slashed for faulty execution; delegators choose operators on stake, performance, and track record. The closest live staking-and-selection market after TrueBit's protocol was exploited and pivoted away (Jan 2026)."
        },
        {
          "product": "Upwork · open bidding (human analogue)",
          "company": "Upwork",
          "url": "https://www.upwork.com/",
          "note": "The mature human analogue. Clients post tasks with budget ranges; freelancers submit proposals with rate, timeline, portfolio link, reputation score. Hiring decision is a Pareto trade-off across cost/quality/speed — the same shape as the agentic-web pattern, applied to humans for two decades."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Task Bid Market pattern?",
          "a": "Surfacing the candidate bids and letting the person decide on the trade-off beats a silent build-time default, because no one choosing months ahead could know which axis — cost, speed, privacy, or quality — this particular task would turn on."
        },
        {
          "q": "When should I avoid the Task Bid Market pattern?",
          "a": "The right agent is known and stable, or the task is routine and cheap — then a fixed route beats running an auction for every job."
        },
        {
          "q": "What problem does Task Bid Market solve?",
          "a": "When many agents could do a task, the system usually picks one silently at build time, collapsing the real trade-off between cost, speed, privacy, and quality into a default nobody chose for this specific job."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat commits to a single agent up front, in the system prompt and tool wiring, and has no surface for comparing an open set of candidates and choosing per task at the moment of need."
        }
      ],
      "related": [
        {
          "id": "supervisor-worker",
          "kind": "alternative",
          "note": "In Supervisor-Worker the supervisor assigns each piece to a specialist; in Task Bid Market you pick among competing bids."
        },
        {
          "id": "persona-switcher",
          "kind": "alternative",
          "note": "Both let you pick who takes the task: Persona Switcher from a set of named lenses, Task Bid Market from competing bids."
        },
        {
          "id": "verifiable-completion",
          "kind": "pairs-with",
          "note": "A winning bid promises an outcome; Verifiable Task Completion proves it was delivered before you accept the work."
        }
      ]
    },
    {
      "id": "verifiable-completion",
      "url": "https://beyondchat.design/patterns/verifiable-completion/",
      "title": "Verifiable Task Completion",
      "subtitle": "Proof of Done You Can Open",
      "metaphor": "Notarised Certificate",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "Most products mark a task \"done\" with a checkbox, so whoever receives the result has only the producer's word for it. Verifiable Task Completion declares up front what \"done\" must prove, then attaches an inspectable bundle to the result — tests passed, sources checked, sign-offs collected. You open the proof instead of trusting the label, and the evidence rides along when the result gets forwarded.",
      "interaction": "Pre-flight Evidence Standard, Post-flight Proof",
      "controlMechanism": "Verification Policy Contract, Cryptographic Proof Bundle, Attestation Chain, Escrow Trigger",
      "useCase": "Delegated agent work, Code-review gates, Forwarded results",
      "useWhen": "When a result carries its own evidence, the receiver verifies it in seconds instead of trusting a checkbox that proves nothing once it is forwarded.",
      "failureModeLabel": "Done as a Label",
      "dope": {
        "observability": "The proof bundle is inspectable — every attestation, signer, and verification artefact is visible alongside the result",
        "predictability": "The verification policy is declared up front; done means exactly the criteria the policy specified, no more, no less",
        "directability": "Delegators choose verification strictness (none / unit-test / zk-proof / panel) per task and renegotiate if a delegatee cannot meet the standard",
        "explainability": "Each proof carries its method (test suite, ZKP circuit hash, TEE enclave id) and the verifier identity that signed it"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "A task marked \"done\" is a label, not evidence — the receiver has to trust the producer's word, and that word carries nothing inspectable once the result is forwarded to someone who never saw the work.",
        "pattern": "Declare what \"done\" must prove up front, then attach an inspectable proof bundle to the result at completion — passed tests, checked sources, sign-offs — so the receiver opens the evidence before accepting it and the proof travels with the result.",
        "whyChatBreaks": "A chat reply that says \"done\" is just text — there is no attached evidence to open, no way to ask \"done against which criteria, checked by whom?\", and nothing survives when the answer is copied onward.",
        "risks": "Proof is only as good as its checks: gameable test suites or captured reviewers fake it, and a bundle only the producer can read defeats the point; the heavy-duty end — zk-SNARK traces, TEE attestations, cryptographic signatures — buys auditability at real cost and latency, so reserve it for high-stakes or private work, and treat it as where delegation is heading, not a default that ships today.",
        "avoidWhen": "The task is low-stakes and the receiver can just look at the result themselves — attaching proof costs more than reading the output."
      },
      "examples": [
        {
          "product": "C2PA · Content Credentials",
          "company": "C2PA · Adobe / OpenAI / Leica",
          "url": "https://contentcredentials.org/",
          "note": "Cryptographically signed provenance metadata embedded in images, audio, and video at generation time. The proof travels with the artefact and any consumer can verify it without trusting the originating product. The clearest deployed example of \"done = signed proof bundle\" outside crypto."
        },
        {
          "product": "Optimism · Fault proofs",
          "company": "OP Labs",
          "url": "https://docs.optimism.io/stack/fault-proofs/explainer",
          "note": "Optimistic verification: results are accepted provisionally, but every claim carries an open challenge window in which anyone can run a fault proof that re-executes the disputed step and provably rejects a wrong result. Game-theoretic completion verification — wrong solutions cost the poster their bond."
        },
        {
          "product": "GitHub · Required status checks",
          "company": "GitHub",
          "url": "https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches",
          "note": "Merge is gated by a verification policy: test suite must pass, CodeQL must succeed, signed-commits required. \"Done\" = green checks from named verifiers. Closest day-to-day production example."
        },
        {
          "product": "A2A Protocol · Signed Agent Cards",
          "company": "Google / Linux Foundation",
          "url": "https://a2a-protocol.org/latest/specification/",
          "note": "A2A v1.0 ships cryptographically signed Agent Cards — verified agent identity today. Signed task-completion attestations (self-reported / counter-signed / third-party) exist as an active extension proposal (AIP, arXiv 2603.24775) layered on A2A — the closest agent-protocol trajectory toward this pattern."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Verifiable Task Completion pattern?",
          "a": "When a result carries its own evidence, the receiver verifies it in seconds instead of trusting a checkbox that proves nothing once it is forwarded."
        },
        {
          "q": "When should I avoid the Verifiable Task Completion pattern?",
          "a": "The task is low-stakes and the receiver can just look at the result themselves — attaching proof costs more than reading the output."
        },
        {
          "q": "What problem does Verifiable Task Completion solve?",
          "a": "A task marked \"done\" is a label, not evidence — the receiver has to trust the producer's word, and that word carries nothing inspectable once the result is forwarded to someone who never saw the work."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A chat reply that says \"done\" is just text — there is no attached evidence to open, no way to ask \"done against which criteria, checked by whom?\", and nothing survives when the answer is copied onward."
        }
      ],
      "related": [
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Action Audit & Undo shows each step the agent took; Verifiable Task Completion attaches proof the result met its bar."
        },
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Citation Trail backs each claim with a source; Verifiable Task Completion backs the result with proof you can open."
        },
        {
          "id": "ai-provenance",
          "kind": "pairs-with",
          "note": "AI Provenance shows which AI-drafted spans a human reviewed; Verifiable Task Completion attaches proof the whole result met its bar."
        }
      ]
    },
    {
      "id": "authority-gradient",
      "url": "https://beyondchat.design/patterns/authority-gradient/",
      "title": "Authority Gradient",
      "subtitle": "A No-Cost Way For The AI To Disagree",
      "metaphor": "Two-Challenge Rule",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "An AI built to comply will carry out a clear-but-wrong instruction it could see was wrong. The move: wire a structured push-back the AI can raise at zero cost — it flags a reason category and a detail, you pick revise, override, or cancel, and the exchange is logged. Unlike a clarifying question, this fires after the instruction is clear but its content conflicts with something the AI can see. (The no-cost two-challenge rule comes from aviation Crew Resource Management.)",
      "interaction": "Mid-Task Push-Back, Structured Disagreement",
      "controlMechanism": "No-Cost Challenge Button, Reason Categories, Detail Field, Resolution Choices, Logged Outcome",
      "useCase": "Agentic side-effects, Irreversible operations, Wrong-but-clear instructions",
      "useWhen": "A logged push-back action turns a concern the AI can already see into a decision you get to make, instead of an error you find afterward.",
      "failureModeLabel": "Disagreement-as-Awkward-Prose",
      "dope": {
        "observability": "Every push-back instance is visible — reason category, detail, resolution. The system makes disagreement legible, not awkward",
        "predictability": "Push-back always costs the lower-authority party zero — by contract, not by social signal",
        "directability": "The delegatee can interrupt to challenge; the delegator picks revise / override / cancel from a structured menu, not from prose",
        "explainability": "Each challenge is logged with reason category and outcome, creating calibration data for both parties over time"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "An AI built to follow instructions will execute a clear-but-wrong one even when it can see the conflict — it has no first-class way to say so without sounding like it is refusing.",
        "pattern": "Give the AI a structured push-back it can raise at no cost: it flags a reason category and detail, you pick revise / override / cancel from a menu, and the exchange is logged as calibration data.",
        "whyChatBreaks": "Chat turns disagreement into awkward prose — the AI complies silently or wraps a concern in hedging you click through; there is no first-class action that makes raising it free and resolving it structured.",
        "risks": "Push-back on routine work becomes argumentative AI, so gate it by stakes; and without a genuine no-cost guarantee plus a logged audit trail, the affordance is theatre — the same Crew Resource Management lesson aviation learned the hard way.",
        "avoidWhen": "The work is open-ended or creative and the user wants a yes-and partner — or this is a clarifying question that should fire before the AI guesses (that is Disambiguation Branch), not a push-back after a clear instruction."
      },
      "examples": [
        {
          "product": "Aviation · Crew Resource Management (CRM)",
          "company": "ICAO / FAA",
          "url": "https://www.faa.gov/regulations_policies/handbooks_manuals/aviation/aviation_instructors_handbook",
          "note": "The reference implementation. After a string of crashes attributed to too-steep authority gradients between captain and first officer, the aviation industry codified Crew Resource Management — explicit two-challenge rule, mandated checklists, no-penalty push-back culture. Trained, audited, mandatory."
        },
        {
          "product": "WHO · Surgical Safety Checklist",
          "company": "World Health Organization",
          "url": "https://www.who.int/teams/integrated-health-services/patient-safety/research/safe-surgery/tool-and-resources",
          "note": "Three-stage pre-/intra-/post-op checklist that mandates the most-junior team member voice concerns. Cut surgical mortality by ~47% in pilot studies. Authority gradient flattened by protocol, not by personality."
        },
        {
          "product": "Anthropic · Constitutional Classifiers",
          "company": "Anthropic",
          "url": "https://www.anthropic.com/research/constitutional-classifiers",
          "note": "A separate classifier system runs alongside the generator in production and can block or flag its outputs against a constitution (cut universal-jailbreak success from 86% to 4.4%). A live second system that outranks the first on safety grounds — the closest shipped authority gradient in the AI stack."
        },
        {
          "product": "GitHub · CODEOWNERS + required reviewers",
          "company": "GitHub",
          "url": "https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners",
          "note": "For sensitive code paths, a required reviewer with explicit domain authority must sign off. The PR author and reviewer occupy known positions on the authority gradient, and the system enforces the gap. Closest software-engineering analogue."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Authority Gradient pattern?",
          "a": "A logged push-back action turns a concern the AI can already see into a decision you get to make, instead of an error you find afterward."
        },
        {
          "q": "When should I avoid the Authority Gradient pattern?",
          "a": "The work is open-ended or creative and the user wants a yes-and partner — or this is a clarifying question that should fire before the AI guesses (that is Disambiguation Branch), not a push-back after a clear instruction."
        },
        {
          "q": "What problem does Authority Gradient solve?",
          "a": "An AI built to follow instructions will execute a clear-but-wrong one even when it can see the conflict — it has no first-class way to say so without sounding like it is refusing."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat turns disagreement into awkward prose — the AI complies silently or wraps a concern in hedging you click through; there is no first-class action that makes raising it free and resolving it structured."
        }
      ],
      "related": [
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Autonomy Dial sets what the agent may do; Authority Gradient lets it push back. Set both, or it obeys even when it sees the error."
        },
        {
          "id": "cognitive-friction",
          "kind": "pairs-with",
          "note": "Cognitive Friction slows you down as stakes rise; Authority Gradient lets the AI challenge you, best gated by the same stakes."
        },
        {
          "id": "feedback-loop",
          "kind": "pairs-with",
          "note": "Feedback Loop can turn how you resolve each push-back into a visible preference, so the AI learns when to object."
        }
      ]
    },
    {
      "id": "cognitive-friction",
      "url": "https://beyondchat.design/patterns/cognitive-friction/",
      "title": "Cognitive Friction",
      "subtitle": "Adaptive speed bumps — seamless for low stakes, mandatory pause for high uncertainty",
      "metaphor": "Adaptive Speed Bump",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Approval gates are binary: pause or do not. Cognitive Friction is a continuous axis baked into the flow itself. The system reads task stakes — criticality × uncertainty × reversibility — and inserts proportional friction: a one-second confirm for low stakes, a written rationale for high uncertainty, a 5-second cool-down + secondary signer for irreversible high-criticality steps. Builds on the aviation principle that pilots need different attention budgets for different actions, and the medicine principle that surgeons get mandatory checklists before incisions but not before pre-op chart review. From Google DeepMind's \"Intelligent AI Delegation\" (Tomašev, Franklin & Osindero, Feb 2026): \"friction must be context-aware: the system should allow seamless execution for tasks with low criticality or low uncertainty, but dynamically increase cognitive load.\"",
      "interaction": "Variable Mandatory Step, Context-Aware Intensity",
      "controlMechanism": "Stakes Detector, Friction Intensity Dial, Mandatory Justification Field, Cool-down Timer",
      "useCase": "High-Stakes Decisions, Long Delegation Chains, Avoiding Rubber-Stamp Approval",
      "useWhen": "Binary approval gates either over- or under-prompt the user for every action. Context-aware friction scales the pause to the actual stakes — flow when it is safe, structured deliberation when it is not.",
      "failureModeLabel": "Binary Friction",
      "dope": {
        "observability": "The applied friction level is named back to the user along with the stakes inputs that triggered it (\"high criticality + low reversibility → mandatory justification\")",
        "predictability": "Stakes inputs map deterministically to friction intensity — users learn what a \"5-second cool-down\" means and trust it",
        "directability": "Users can override friction with explicit acknowledgement; system records the override for later audit",
        "explainability": "The friction policy itself is inspectable as a rule set — what stakes produce what friction, configurable per workspace"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Approval gates are binary — either pause or do not. Real risk is continuous: a one-cent transaction and a $50,000 transfer cannot need the same number of clicks, but most systems give them either both no friction or both the same friction.",
        "pattern": "Read task stakes (criticality × uncertainty × reversibility) and insert proportional friction: no friction for low stakes, a one-line confirm for medium, a written justification for high uncertainty, a cool-down + secondary signer for irreversible high-criticality. The friction policy is inspectable, configurable per workspace.",
        "whyChatBreaks": "Chat treats every turn as the same kind of action — there is no signal-carrying surface for \"this one is more dangerous than the last one.\" Users rely on prose disclaimers and self-discipline, which fail predictably under deadline pressure.",
        "risks": "Without context-awareness, friction degenerates into alarm fatigue — too many high-friction prompts train users to click through them. Conversely, too little friction on critical actions enables rubber-stamping.",
        "avoidWhen": "All actions in the surface have approximately equal stakes (a sandbox, a draft-only tool) — a fixed friction level is simpler and just as safe."
      },
      "examples": [
        {
          "product": "Apple · Authentication Required (tiered)",
          "company": "Apple",
          "url": "https://support.apple.com/guide/security/",
          "note": "iOS/macOS prompts scale by sensitivity: silent for app-launch, Touch ID for low-stakes purchases, Face ID + 6-digit passcode for App Store, full passcode after restart. The same OS-level pattern, applied to four different stakes tiers."
        },
        {
          "product": "GitHub · Branch Protection Rules",
          "company": "GitHub",
          "url": "https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches",
          "note": "Different branches get different friction: main requires reviews + status checks + linear history; feature branches require nothing. Friction proportional to blast radius, configured as policy."
        },
        {
          "product": "Stripe · Strong Customer Authentication",
          "company": "Stripe",
          "url": "https://stripe.com/docs/strong-customer-authentication",
          "note": "Low-value contactless transactions waved through; high-value or unusual transactions trigger 3D Secure step-up. PSD2 codified the principle: friction calibrated to risk score, not flat per transaction."
        },
        {
          "product": "Anthropic · Claude Code permission prompts",
          "company": "Anthropic",
          "url": "https://www.anthropic.com/engineering/claude-code-auto-mode",
          "note": "Claude Code gates destructive actions (rm -rf, force-push, git reset --hard) behind confirmation prompts while reversible edits flow freely — stakes-aware friction shipped in a mainstream agent, with the override itself an explicit, logged choice."
        },
        {
          "product": "Cognitive Agency Surrender: Defending Epistemic Sovereignty via Scaffolded AI Friction",
          "company": "Academic source · Xu, Shen, Yan, Ren (Cyberspace Security University of China, Mar 2026)",
          "url": "https://arxiv.org/abs/2603.21735",
          "note": "Independent argument for *scaffolded* friction — designed to preserve user epistemic agency, not just gate dangerous actions. Same pattern, different load-bearing rationale (cognitive sovereignty over operational safety). Useful counter-frame."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Cognitive Friction pattern?",
          "a": "Binary approval gates either over- or under-prompt the user for every action. Context-aware friction scales the pause to the actual stakes — flow when it is safe, structured deliberation when it is not."
        },
        {
          "q": "When should I avoid the Cognitive Friction pattern?",
          "a": "All actions in the surface have approximately equal stakes (a sandbox, a draft-only tool) — a fixed friction level is simpler and just as safe."
        },
        {
          "q": "What problem does Cognitive Friction solve?",
          "a": "Approval gates are binary — either pause or do not. Real risk is continuous: a one-cent transaction and a $50,000 transfer cannot need the same number of clicks, but most systems give them either both no friction or both the same friction."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat treats every turn as the same kind of action — there is no signal-carrying surface for \"this one is more dangerous than the last one.\" Users rely on prose disclaimers and self-discipline, which fail predictably under deadline pressure."
        }
      ],
      "related": [
        {
          "id": "approval-gates",
          "kind": "alternative",
          "note": "Approval Gates give every checkpoint the same hard pause; Cognitive Friction scales the friction to each action's stakes."
        },
        {
          "id": "autonomy-dial",
          "kind": "pairs-with",
          "note": "Autonomy Dial decides per tool what runs unasked; Cognitive Friction decides how hard to slow each action, by its stakes."
        },
        {
          "id": "capability-boundary",
          "kind": "pairs-with",
          "note": "Capability Boundary says up front what the system can't do reliably; Cognitive Friction slows the risky steps it can do."
        }
      ]
    },
    {
      "id": "pointer-as-prompt",
      "url": "https://beyondchat.design/patterns/pointer-as-prompt/",
      "title": "Pointer as Prompt",
      "subtitle": "The cursor becomes the deictic anchor, voice becomes the verb",
      "metaphor": "Magic Wand",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "The cursor stops being a passive pointer and becomes the deictic anchor of a prompt — \"this thing, here, right now\". Voice carries the verb. The AI captures the visual and semantic context the cursor is resting on, names what it resolved, and acts in place. Distinct from Annotated Capture (which requires drawn markup that persists) and Contextual Overlay (which surfaces a UI at the cursor): here the cursor itself is the input channel. Demonstrated production-grade by Google DeepMind's AI Pointer for Chrome and \"Magic Pointer\" on Googlebook (May 2026).",
      "interaction": "Hover + Voice, Live Context Capture",
      "controlMechanism": "Cursor Tracking, Voice Command, Resolved-Element Surface, Cross-App Reach",
      "useCase": "In-Place Edits, Cross-App Workflows, Computer-Use Agents",
      "useWhen": "AI lives in its own window today — the user has to translate context into prose to get the AI to see it. Pointer-as-Prompt inverts the geometry: AI meets the cursor where it already is.",
      "failureModeLabel": "AI Lives in a Window",
      "dope": {
        "observability": "Visible highlight around the resolved region — the user sees what context the AI captured before acting",
        "predictability": "The same gesture (cursor on X + \"do Y\") produces the same in-place action across apps",
        "directability": "Pointing and speaking fold the entire input loop into one gesture — no app switch, no copy-paste, no descriptive prose",
        "explainability": "The captured context is named back to the user (\"captured: link, status 404, in paragraph 3\") before the action runs"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "AI tools live in their own windows — the user has to drag context into the AI rather than the AI meeting context where it already is, and describing what is \"this\" in prose multiplies tokens without adding precision.",
        "pattern": "Make the cursor itself the deictic anchor of the prompt and voice the verb. The AI captures the visual + semantic context under the pointer, names what it resolved, and acts in place. Cross-app by default — the surface is the OS pointer, not the AI window.",
        "whyChatBreaks": "Chat is a destination users have to travel to with hand-written descriptions of what they're looking at. Pointer-as-Prompt inverts the geometry: AI travels to the user's cursor, with no app-switch and no prose translation in between.",
        "risks": "Voice + cursor is a high-bandwidth input and a high-stakes one — misresolution of \"this\" can act on the wrong target. Without a visible captured-element confirmation, the pattern degrades into \"blind action at cursor\". Persistent always-listening surfaces also raise privacy expectations the user must consent to.",
        "avoidWhen": "The action is sensitive enough that explicit selection + confirm is safer than gestural pointing, or the user's flow is keyboard-driven where reaching for cursor + voice is friction."
      },
      "examples": [
        {
          "product": "Google · Gemini in Chrome (Select from screen to prompt)",
          "company": "Google DeepMind",
          "url": "https://deepmind.google/blog/ai-pointer/",
          "note": "Cursor + Gemini in Chrome: hover, speak \"fix this\" or \"show me directions\" — the model resolves what is under the pointer (text, image, button) and acts in place. The canonical example of cursor-as-deictic-anchor + voice-as-verb at OS-adjacent scale."
        },
        {
          "product": "Google · Magic Pointer (Googlebook)",
          "company": "Google",
          "url": "https://deepmind.google/blog/ai-pointer/",
          "note": "Same pattern on the Pixel laptop class — system-level pointer that captures context across native apps, not just the browser. Closest production approximation of \"the OS cursor is the AI input channel\" (announced May 2026, hardware ships fall 2026)."
        },
        {
          "product": "Apple Intelligence · Image Wand",
          "company": "Apple",
          "url": "https://www.apple.com/apple-intelligence/",
          "note": "Closest neighbour at the OS level — draw a rough shape around something on screen, the wand resolves the bounded region. Less continuous than a hover-tracking cursor, but the same \"point and let the system resolve\" geometry."
        },
        {
          "product": "Anthropic · Computer Use",
          "company": "Anthropic",
          "url": "https://www.anthropic.com/news/3-5-models-and-computer-use",
          "note": "The agent-side analogue: the model resolves coordinates and clicks at them. Pointer-as-Prompt is the user-side counterpart — both treat the cursor as the resolution surface between intent and pixels."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Pointer as Prompt pattern?",
          "a": "AI lives in its own window today — the user has to translate context into prose to get the AI to see it. Pointer-as-Prompt inverts the geometry: AI meets the cursor where it already is."
        },
        {
          "q": "When should I avoid the Pointer as Prompt pattern?",
          "a": "The action is sensitive enough that explicit selection + confirm is safer than gestural pointing, or the user's flow is keyboard-driven where reaching for cursor + voice is friction."
        },
        {
          "q": "What problem does Pointer as Prompt solve?",
          "a": "AI tools live in their own windows — the user has to drag context into the AI rather than the AI meeting context where it already is, and describing what is \"this\" in prose multiplies tokens without adding precision."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat is a destination users have to travel to with hand-written descriptions of what they're looking at. Pointer-as-Prompt inverts the geometry: AI travels to the user's cursor, with no app-switch and no prose translation in between."
        }
      ],
      "related": [
        {
          "id": "annotated-capture",
          "kind": "alternative",
          "note": "Annotated Capture leaves drawn markup on a screenshot; Pointer as Prompt points with the cursor and speaks the verb."
        },
        {
          "id": "contextual-overlay",
          "kind": "alternative",
          "note": "Contextual Overlay offers a labeled action menu on your selection; Pointer as Prompt takes a spoken verb at the cursor."
        },
        {
          "id": "select-transform",
          "kind": "extends",
          "note": "Select & Transform is text-only and menu-driven; Pointer as Prompt extends the move to any content with voice as the verb."
        }
      ]
    },
    {
      "id": "agent-identity",
      "url": "https://beyondchat.design/patterns/agent-identity/",
      "title": "Agent Identity",
      "subtitle": "Distinct Faces for Distinct Agents",
      "metaphor": "Crew Roster",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "When supervisor-worker setups dispatch many specialist agents, every agent action, output, and reasoning step needs a distinct visual identity so the user can tell them apart at a glance. Avatar, color, and role label — used consistently across logs, dashboards, and outputs.",
      "interaction": "Visual + Named Distinction",
      "controlMechanism": "Avatars, Color Codes, Role Labels, Action Attribution",
      "useCase": "Multi-Agent Supervision, Specialist Pipelines, Audit Trails",
      "useWhen": "Multiple agents act on the user behalf and the user needs to attribute actions and outputs to specific agents at a glance.",
      "failureModeLabel": "Voice Collapse",
      "dope": {
        "observability": "Every action and output carries a stable visual identifier of the agent that produced it",
        "predictability": "The same agent always renders with the same identity across surfaces",
        "directability": "Users can address, redirect, or pause individual agents by name",
        "explainability": "Each agent identity carries a role description and capability boundary"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Multi-agent UIs collapse all agents into \"the AI\", making it impossible for the user to attribute actions, outputs, or reasoning to a specific agent.",
        "pattern": "Give each agent a stable visual and named identity — avatar, color, role label — rendered consistently across every surface where its work appears.",
        "whyChatBreaks": "Chat shows one assistant voice; multi-agent reality has many — and the user needs to tell them apart at a glance, not by reading metadata.",
        "risks": "Identity bloat (too many similar avatars) defeats the purpose; superficial naming can imply more specialization than actually exists.",
        "avoidWhen": "The system runs a single agent and identity adds visual chrome without information."
      },
      "examples": [
        {
          "product": "Superhuman Go · agent roster",
          "company": "Superhuman",
          "url": "https://superhuman.com/go",
          "note": "The consumer case the other four entries lack — they are all developer tools. Go is a designed character with motion built into its UI as a deliberate signal that it is thinking, coordinating a roster of named specialists the user curates: Grammarly, Email Assistant, Knowledge Checker, Daily Brief, plus custom agents from a store. The identity work is real but asymmetric — the coordinator has a face, while the specialists carry names and remits without a per-agent colour following their output across surfaces."
        },
        {
          "product": "CrewAI · Agent Cards",
          "company": "CrewAI",
          "url": "https://www.crewai.com/",
          "note": "Every agent gets a Name, Role, Goal, and Backstory rendered as a card in the playground. Outputs are tagged with the agent that produced them. The clearest production framing of distinct-agents-as-distinct-faces."
        },
        {
          "product": "Claude Code · subagents",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/sub-agents",
          "note": "Specialist agents (code-reviewer, debugger, frontend-developer, etc.) defined by name + role + tool allowlist, plus a `color` frontmatter field that renders each subagent in its own display color in the task list and transcript. Every dispatched call surfaces the subagent name, so attribution survives across long sessions — the clearest shipping proof of color-coded agent identity."
        },
        {
          "product": "Manus AI · internal agent roles",
          "company": "Monica · Manus",
          "url": "https://manus.im/",
          "note": "Internal Planner / Executor / Verifier architecture — distinct roles exist in the orchestration layer, but they are not consistently exposed as labelled agents in the user-facing live log. The gap between internal role separation and visible identity is exactly what this pattern names."
        },
        {
          "product": "AutoGen Studio · agent gallery",
          "company": "Microsoft Research",
          "url": "https://microsoft.github.io/autogen/",
          "note": "Multi-agent orchestration with a gallery view: each agent rendered as a card with system prompt, tools, and history. Conversations between agents are visualised as labelled message flows."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Agent Identity pattern?",
          "a": "Multiple agents act on the user behalf and the user needs to attribute actions and outputs to specific agents at a glance."
        },
        {
          "q": "When should I avoid the Agent Identity pattern?",
          "a": "The system runs a single agent and identity adds visual chrome without information."
        },
        {
          "q": "What problem does Agent Identity solve?",
          "a": "Multi-agent UIs collapse all agents into \"the AI\", making it impossible for the user to attribute actions, outputs, or reasoning to a specific agent."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat shows one assistant voice; multi-agent reality has many — and the user needs to tell them apart at a glance, not by reading metadata."
        }
      ],
      "related": [
        {
          "id": "supervisor-worker",
          "kind": "pairs-with",
          "note": "Supervisor-Worker splits a task across specialist agents; Agent Identity shows at a glance which agent did which part."
        },
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Action Audit & Undo logs every agent action; Agent Identity shows which agent took each one, not a generic AI label."
        },
        {
          "id": "agentic-dashboard",
          "kind": "pairs-with",
          "note": "Agentic Dashboard gives each agent its own lane; Agent Identity keeps that agent recognizable in logs and outputs too."
        }
      ]
    },
    {
      "id": "oversight-rhythm",
      "url": "https://beyondchat.design/patterns/oversight-rhythm/",
      "title": "Oversight Rhythm",
      "subtitle": "Review On Your Schedule, Not The Agent's",
      "metaphor": "Patrol Schedule",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "A long-running agent that asks before every action shreds your attention; turn the gates off and you lose oversight entirely. Oversight Rhythm splits when you review from when the agent acts. You set the cadence — every N minutes, N actions, or at milestones — and the agent batches its work into a digest delivered at those checkpoints, with escalation triggers for the few things that can't wait.",
      "interaction": "Cadence Configuration, Batched Review Surface, Escalation Triggers",
      "controlMechanism": "Cadence Picker (every N min / N actions / on milestone), Digest Queue, Quiet-Hours Window, Escalation Overrides",
      "useCase": "Long-running agents, Background automation, Multi-step runs",
      "useWhen": "Batching review onto a cadence you control protects your attention and your oversight at once, where interrupt-driven approvals force you to sacrifice one for the other.",
      "failureModeLabel": null,
      "dope": {
        "observability": "The cadence and the next-checkpoint countdown are visible at all times — the user sees when the next review is due and what is queued",
        "predictability": "The agent runs in declared bursts; the review surface always shows the same digest shape, with no surprise interrupts between checkpoints",
        "directability": "Users set the cadence (time / count / milestone) and the escalation triggers; can pull a review forward or postpone within bounds",
        "explainability": "Each digest names what happened, what was deferred to the next checkpoint, and which actions were escalated past the rhythm"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "An agent that interrupts on every action either constantly breaks the user's focus or gets its gates switched off wholesale, dropping oversight to zero.",
        "pattern": "Let the user set a review cadence — time, action count, or milestone — so the agent batches its work into a digest delivered at each checkpoint instead of pausing inline on every action, with declared triggers that escalate the few that can't wait.",
        "whyChatBreaks": "A chat transcript has no concept of cadence — every agent message arrives as an interrupt, with no way to pre-schedule a batched review or defer the non-urgent items.",
        "risks": "A cadence set too coarse can let the agent drift unrecoverably between checkpoints, and without explicit escalation triggers an irreversible action slips past before anyone reviews it.",
        "avoidWhen": "The task is short, single-shot, or already inside the user's active flow — cadence machinery overshoots a problem that doesn't exist yet."
      },
      "examples": [
        {
          "product": "Linear · Triage queue",
          "company": "Linear",
          "url": "https://linear.app/docs/triage",
          "note": "Incoming issues land in a shared inbox and wait for batch review — accept, snooze, mark duplicate — before they enter the workflow, with optional rotation of triage responsibility. The strongest analogue in the set: review happens on the reviewer's rhythm, not per event."
        },
        {
          "product": "GitHub · Scheduled reminders",
          "company": "GitHub",
          "url": "https://docs.github.com/en/organizations/organizing-members-into-teams/managing-scheduled-reminders-for-your-team",
          "note": "Posts a digest of pull requests awaiting review to Slack at times the team chooses — cadence-based batching instead of a ping per PR. Note the destination: it digests into Slack; GitHub ships no native daily PR digest."
        },
        {
          "product": "Stripe · Radar for Fraud Teams review queue",
          "company": "Stripe",
          "url": "https://docs.stripe.com/radar/reviews",
          "note": "Flagged payments queue into a list that analysts work through in batches, with assignment and filtering. A paid add-on, and reviews happen after the charge — a batched review surface, not a blocking gate."
        },
        {
          "product": "CrewAI · Flow human-in-the-loop checkpoints",
          "company": "CrewAI",
          "url": "https://docs.crewai.com/en/enterprise/guides/flow-hitl-management",
          "note": "The @human_feedback decorator pauses a Flow at a declared step, notifies the assignee, and waits — with a timeout auto-response if nobody answers. A single pause-and-wait gate, not a time- or count-based cadence that batches work into digests."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Oversight Rhythm pattern?",
          "a": "Batching review onto a cadence you control protects your attention and your oversight at once, where interrupt-driven approvals force you to sacrifice one for the other."
        },
        {
          "q": "When should I avoid the Oversight Rhythm pattern?",
          "a": "The task is short, single-shot, or already inside the user's active flow — cadence machinery overshoots a problem that doesn't exist yet."
        },
        {
          "q": "What problem does Oversight Rhythm solve?",
          "a": "An agent that interrupts on every action either constantly breaks the user's focus or gets its gates switched off wholesale, dropping oversight to zero."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A chat transcript has no concept of cadence — every agent message arrives as an interrupt, with no way to pre-schedule a batched review or defer the non-urgent items."
        }
      ],
      "related": [
        {
          "id": "approval-gates",
          "kind": "alternative",
          "note": "Approval Gates stop the agent at each checkpoint; Oversight Rhythm batches its work into reviews on a schedule you set."
        },
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Action Audit & Undo keeps each action logged and reversible, so at each digest you can still undo what ran in between."
        },
        {
          "id": "concurrency-dial",
          "kind": "pairs-with",
          "note": "Oversight Rhythm sets when you review; Concurrency Dial sets how many agents can claim your attention at once."
        }
      ]
    },
    {
      "id": "concurrency-dial",
      "url": "https://beyondchat.design/patterns/concurrency-dial/",
      "title": "Concurrency Dial",
      "subtitle": "Cap the agents you can actually watch",
      "metaphor": "Air Traffic Lanes",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "A multi-agent dashboard shows every running agent at once, but a person can only meaningfully watch a few — so saturation stays silent until things start slipping. The Concurrency Dial makes attention a setting: a slider for how many agents you oversee right now. Agents over the cap wait in a queue (still running), and the next is promoted into a free lane when you finish one.",
      "interaction": "Concurrency Slider, Attention Budget Meter, Lane Promotion",
      "controlMechanism": "Active-Lane Cap (1-N), Pending Queue, Cognitive Load Indicator, Manual Pin / Defer",
      "useCase": "Multi-agent dashboards, Agent ops consoles, Attention-limited oversight",
      "useWhen": "A dashboard that shows every agent at once makes oversight cost grow with agent count until the user breaks; a concurrency cap holds active attention fixed no matter how many agents are running.",
      "failureModeLabel": null,
      "dope": {
        "observability": "The dial reads back current cognitive load — active lanes, pending queue depth, saturation indicator — so the user sees attention budget in real time",
        "predictability": "The user sets the cap; the system never demands attention from more than N agents simultaneously",
        "directability": "Slider chooses the concurrency limit; users can pin specific agents to a lane or defer others into the queue manually",
        "explainability": "Promotions out of the queue are named — \"agent X promoted because Y completed\" — so the user knows why an agent is now front-and-center"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "A multi-agent dashboard surfaces every running agent at once, but a person can only watch a few, so attention saturates silently until they start missing things.",
        "pattern": "Let the user cap how many agents they actively watch at once, and route the rest into a queue that promotes the next agent into a lane the moment one frees up.",
        "whyChatBreaks": "Chat shows one stream, then five, then twenty, all competing for the same attention, with no surface to say \"I can only watch three of you right now\".",
        "risks": "Set the cap too low and work stalls behind the queue; set it too high and you rebuild the saturation the dial was meant to prevent.",
        "avoidWhen": "Only one or two agents ever run at once, so there is nothing to ration and the dial is pure overhead."
      },
      "examples": [
        {
          "product": "PagerDuty · On-call schedules",
          "company": "PagerDuty",
          "url": "https://support.pagerduty.com/main/docs/schedule-basics",
          "note": "Only one user per schedule is on call at a time; the rotation promotes the next person when a shift ends. The one-at-a-time attention cap the dial generalises — enforced by the system, not by discipline."
        },
        {
          "product": "Slack · Huddle participant cap",
          "company": "Slack",
          "url": "https://slack.com/help/articles/4402059015315-Use-huddles-in-Slack",
          "note": "A hard ceiling on simultaneous presence: 50 participants on paid plans, but only 25 with video on at once (the free plan caps at 2). A capacity limit on shared attention — though there is no queue; over the cap, latecomers are simply refused."
        },
        {
          "product": "GitHub · Draft pull requests",
          "company": "GitHub",
          "url": "https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests",
          "note": "A draft PR suppresses review requests and notifications until the author flips it to \"Ready for review\", and cannot merge before then. Work keeps moving without demanding attention — the defer-then-promote half of the dial."
        },
        {
          "product": "Businessmap · Per-user WIP limits",
          "company": "Businessmap (Kanbanize)",
          "url": "https://businessmap.io/kanban-resources/getting-started/what-is-wip",
          "note": "Kanban boards enforce a numeric cap on how many cards one person can have in progress; new work queues until a slot frees. The closest shipping version of attention as an enforced budget — in project management, not yet in agent consoles."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Concurrency Dial pattern?",
          "a": "A dashboard that shows every agent at once makes oversight cost grow with agent count until the user breaks; a concurrency cap holds active attention fixed no matter how many agents are running."
        },
        {
          "q": "When should I avoid the Concurrency Dial pattern?",
          "a": "Only one or two agents ever run at once, so there is nothing to ration and the dial is pure overhead."
        },
        {
          "q": "What problem does Concurrency Dial solve?",
          "a": "A multi-agent dashboard surfaces every running agent at once, but a person can only watch a few, so attention saturates silently until they start missing things."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat shows one stream, then five, then twenty, all competing for the same attention, with no surface to say \"I can only watch three of you right now\"."
        }
      ],
      "related": [
        {
          "id": "agentic-dashboard",
          "kind": "extends",
          "note": "Agentic Dashboard gives every agent a lane; Concurrency Dial caps how many you watch and queues the rest, still running."
        },
        {
          "id": "supervisor-worker",
          "kind": "pairs-with",
          "note": "Supervisor-Worker splits the job across workers; Concurrency Dial caps how many of them you have to watch at once."
        },
        {
          "id": "oversight-rhythm",
          "kind": "pairs-with",
          "note": "Concurrency Dial limits how many agents need you at once; Oversight Rhythm limits how often they get your attention."
        }
      ]
    },
    {
      "id": "live-plan-surface",
      "url": "https://beyondchat.design/patterns/live-plan-surface/",
      "title": "Live Plan Surface",
      "subtitle": "The plan stays editable during execution — both human and AI can grab any step",
      "metaphor": "Shared Whiteboard with Live Cursors",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "Most plan UIs (Editable Plan, Intent Preview) are pre-execution: the user reviews the plan, edits it, and then hands off to the agent. Co-planning is different — the plan stays a live, editable surface *during* execution. Either side, human or agent, can take ownership of the next step, insert a new step, reorder, or hand back. The plan is the workspace, not just a contract. When the user grabs a step, the agent pauses on that branch. When the agent grabs the next step, it leaves a receipt the user can inspect. Adapted from Feng, Pu, Latzke, August, Siangliulue, Bragg, Weld, Zhang & Chang (\"Cocoa: Co-Planning and Co-Execution with AI Agents\", Allen AI + University of Washington, Dec 2024 / refined Feb 2026, CHI 2026), who showed that co-planning beats both full automation and full manual on outcome quality and user trust.",
      "interaction": "Step-Level Hand-Off, Mid-Run Plan Edit, Co-Execution",
      "controlMechanism": "Step Ownership Toggle (AI / me), Inline Step Insert, Live Reorder, Step Receipt Trail",
      "useCase": "Interleaved Human-AI Workflows, Research Agents, Multi-Step Document Production",
      "useWhen": "Multi-step agent runs where the user wants to step in mid-flow without aborting — research, multi-document production, code reviews where intervention has to be cheap and surgical.",
      "failureModeLabel": null,
      "dope": {
        "observability": "Each step shows its current owner (AI / human / unassigned) and the receipt for completed steps — what was done, by whom, with what evidence",
        "predictability": "Ownership is explicit per step; the agent never silently takes a step the user marked human-only, and vice versa",
        "directability": "Drag a step to a different owner, insert a new step inline, skip or reorder mid-run — the agent re-plans around the change",
        "explainability": "Each ownership change is logged with reason; each completed step links to the receipt the executor produced"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Plans go stale the moment execution starts — the user cannot intervene mid-run without aborting and re-prompting from scratch.",
        "pattern": "Keep the plan editable during execution; let either side take ownership of any step at any time, with explicit ownership semantics and per-step receipts.",
        "whyChatBreaks": "Chat moves the plan into the transcript history once execution starts — edits would have to be re-prompted from scratch, breaking the agent's state.",
        "risks": "Without clear ownership semantics, human and agent can clash on the same step; without receipts, completed steps cannot be re-inspected after the fact.",
        "avoidWhen": "The plan is short or low-stakes enough that pre-execution review (Editable Plan) is sufficient and live ownership transfer adds complexity for no gain."
      },
      "examples": [
        {
          "product": "Claude Code · Live task list",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/agent-sdk/todo-tracking",
          "note": "The agent maintains a visible task list (the Tasks API, formerly TodoWrite) that updates as it executes — steps are added, reordered, and checked off mid-run, and the user can redirect between them. The plan and the execution share one surface."
        },
        {
          "product": "Cursor · Plan Mode",
          "company": "Cursor",
          "url": "https://cursor.com/docs/agent/plan-mode",
          "note": "Plan Mode ships an interactive editor for modifying plans inline, and Composer keeps the plan open to refinement while the agent executes — edit a step mid-run and the agent re-plans around it."
        },
        {
          "product": "GitHub · Copilot app Canvas",
          "company": "GitHub",
          "url": "https://github.blog/changelog/2026-06-17-github-copilot-app-generally-available",
          "note": "The canvas is explicitly bidirectional: the agent updates it as it works, and the user can edit, reorder, approve, or redirect work on that same surface (GA June 2026). The best-verified production match for a co-owned plan."
        },
        {
          "product": "Manus · Task list",
          "company": "Manus AI",
          "url": "https://manus.im",
          "note": "The plan updates on the fly as the agent works; the user can jump in mid-run or take control of a step, and replay what each step did. Take-over is real, though per-step ownership is not as explicit as the pattern asks."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Live Plan Surface pattern?",
          "a": "Multi-step agent runs where the user wants to step in mid-flow without aborting — research, multi-document production, code reviews where intervention has to be cheap and surgical."
        },
        {
          "q": "When should I avoid the Live Plan Surface pattern?",
          "a": "The plan is short or low-stakes enough that pre-execution review (Editable Plan) is sufficient and live ownership transfer adds complexity for no gain."
        },
        {
          "q": "What problem does Live Plan Surface solve?",
          "a": "Plans go stale the moment execution starts — the user cannot intervene mid-run without aborting and re-prompting from scratch."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat moves the plan into the transcript history once execution starts — edits would have to be re-prompted from scratch, breaking the agent's state."
        }
      ],
      "related": [
        {
          "id": "editable-plan",
          "kind": "extends",
          "note": "Editable Plan lets you edit the plan before kickoff; Live Plan Surface keeps it editable mid-run, so a fix never means aborting."
        },
        {
          "id": "intent-preview",
          "kind": "pairs-with",
          "note": "Intent Preview shows each step's risk and scope before kickoff; Live Plan Surface keeps the steps editable once the run starts."
        },
        {
          "id": "mid-stream-steering",
          "kind": "pairs-with",
          "note": "Mid-Stream Steering redirects the output as it streams; Live Plan Surface lets you reorder or take over steps without a restart."
        }
      ]
    },
    {
      "id": "conversation-permalink",
      "url": "https://beyondchat.design/patterns/conversation-permalink/",
      "title": "Conversation Permalink",
      "subtitle": "A stable link to one answer, not the whole thread",
      "metaphor": "Anchor",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "A chat thread is one ephemeral stream — there is no address for a single answer, so sharing means forwarding the whole conversation, and the turn you meant drifts or disappears as the thread keeps going. A Conversation Permalink gives every turn a stable address that captures that answer and the context it came from, so it can be shared, cited, and reopened exactly as it was — even after the live thread has moved on.",
      "interaction": "Per-Turn Link, Snapshot Capture, Reopen Read-only",
      "controlMechanism": "Link Affordance per Turn, Context Snapshot, Permalink Chip, Frozen View",
      "useCase": "Sharing AI Answers, Citing Output, Bookmarking, Support Handoffs",
      "useWhen": "Answers worth sharing or citing need a stable address — without one you forward the whole thread and the point you meant gets lost or overwritten.",
      "failureModeLabel": "Ephemeral Thread",
      "dope": {
        "observability": "Every turn carries a visible link affordance, and the permalink names what it captured — which turn, which model, how much context",
        "predictability": "The link always reopens the same answer and the same context snapshot, even as the live thread keeps growing",
        "directability": "Copy, share, or bookmark any turn; open a permalink read-only, or fork a fresh thread from it",
        "explainability": "The permalink shows the captured context — the messages it was given, the model, and when it was frozen"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "trust",
        "agentReady": false,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "You cannot point anyone to a single AI answer — sharing forwards the whole thread, and the turn you meant drifts or disappears as the conversation continues.",
        "pattern": "Give every turn a stable permalink that captures that answer plus the context it came from, so it can be shared, cited, and reopened exactly as it was.",
        "whyChatBreaks": "Chat treats the conversation as one ephemeral stream — there is no address for a single turn, and continuing or editing the thread silently changes what a shared link points at.",
        "risks": "A permalink that re-renders against the live thread instead of a frozen snapshot breaks the moment the conversation moves on; capturing context also widens what a shared link can expose.",
        "avoidWhen": "Throwaway chats no one will ever reference again — addressable turns add machinery with nothing to cite."
      },
      "examples": [
        {
          "product": "ChatGPT · Shared links",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/7925741-chatgpt-shared-links-faq",
          "note": "A share link freezes the conversation at creation — later messages in the live thread are not reflected unless a new link is generated. The frozen-snapshot mechanic, but at thread granularity, not per turn."
        },
        {
          "product": "Perplexity · Shareable threads",
          "company": "Perplexity",
          "url": "https://www.perplexity.ai/help-center",
          "note": "Threads share via a stable link, frozen at share time. Per-thread only — there is no per-answer address, which is exactly the granularity this pattern is about."
        },
        {
          "product": "Claude · Share",
          "company": "Anthropic",
          "url": "https://support.claude.com/en/articles/9519189-share-and-unshare-chats",
          "note": "Sharing creates a per-conversation snapshot frozen at share time; messages sent afterwards stay private. Same mechanic, same caveat: the address points at the thread, not the turn."
        },
        {
          "product": "Slack · Message permalinks",
          "company": "Slack",
          "url": "https://slack.com/help/articles/203274767-Forward-messages-in-Slack",
          "note": "Copy link on any message yields a stable per-message address that survives as the channel moves on — the mature, non-AI precedent. The only per-turn example in the set; no AI chat product ships it yet."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Conversation Permalink pattern?",
          "a": "Answers worth sharing or citing need a stable address — without one you forward the whole thread and the point you meant gets lost or overwritten."
        },
        {
          "q": "When should I avoid the Conversation Permalink pattern?",
          "a": "Throwaway chats no one will ever reference again — addressable turns add machinery with nothing to cite."
        },
        {
          "q": "What problem does Conversation Permalink solve?",
          "a": "You cannot point anyone to a single AI answer — sharing forwards the whole thread, and the turn you meant drifts or disappears as the conversation continues."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat treats the conversation as one ephemeral stream — there is no address for a single turn, and continuing or editing the thread silently changes what a shared link points at."
        }
      ],
      "related": [
        {
          "id": "conversation-branches",
          "kind": "pairs-with",
          "note": "Fork from a permalink's frozen turn; Conversation Branches keeps each fork alive and comparable side by side."
        },
        {
          "id": "generation-tree",
          "kind": "alternative",
          "note": "Generation Tree restores any past variant in one click; Conversation Permalink freezes one answer behind a link."
        },
        {
          "id": "model-changelog",
          "kind": "pairs-with",
          "note": "Conversation Permalink records which model answered; Model Changelog explains why the same ask now answers differently."
        }
      ]
    },
    {
      "id": "model-selector",
      "url": "https://beyondchat.design/patterns/model-selector/",
      "title": "Model Selector",
      "subtitle": "Pick the model for the task, see the trade-off",
      "metaphor": "Gearbox",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "A single default model is wrong for half your tasks — overkill for a quick reword, underpowered for a hard debug — yet the choice is hidden in settings, if it exists at all. Model Selector surfaces the engine as a per-task control: a small set of named models with their speed, cost, and strengths, switchable in one move, with a sensible default so picking is optional, not required. Consumer chat is moving the other way — ChatGPT's June 2026 redesign swapped named models for an effort slider — so the pattern's home is now power-user and developer surfaces, where the trade-off must stay visible because someone is paying for it. That drift strengthens the case, not weakens it: when the picker disappears, cost and capability visibility disappear with it.",
      "interaction": "Per-Task Model Pick, Fit Indicator, Cost/Speed Estimate",
      "controlMechanism": "Model Cards, Default + Override, Speed/Cost/Capability Meters, Task-Fit Hint",
      "useCase": "Mixed-Difficulty Workloads, Cost Control, Latency-Sensitive Tasks",
      "useWhen": "Tasks vary from trivial to hard, so a single default model is wrong for most of them — and the cost/speed/capability trade-off should be the user's to make.",
      "failureModeLabel": "One-Size Model",
      "dope": {
        "observability": "The active model and its trade-offs — speed, cost, context, strengths — are visible before you run",
        "predictability": "The same model gives the same class of result; switching is explicit, never a silent swap",
        "directability": "Pick the model per task or set a default — fast and cheap, or slow and capable",
        "explainability": "Each model card states what it is good at and what it trades away, so the pick is informed"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "A single default model is wrong for half your tasks — overkill for the quick ones, underpowered for the hard ones — but the choice is hidden in settings, if it exists at all, and consumer products are now removing it entirely.",
        "pattern": "Surface the model as a per-task control — a small set of named models with their speed, cost, and strengths, switchable in one move — a control whose home is now power-user and developer surfaces, where the trade-off has to stay visible.",
        "whyChatBreaks": "Chat picks one model behind the scenes — and consumer chat is doubling down, ChatGPT's June 2026 redesign swapped named models for an effort slider — so when the picker goes, cost and capability visibility go with it.",
        "risks": "Too many models is choice overload, and exposing raw model names without their trade-offs just moves the guesswork onto the user.",
        "avoidWhen": "One model genuinely serves every task, or the audience is mainstream consumers better served by an effort dial than an engine list — the direction ChatGPT took in June 2026."
      },
      "examples": [
        {
          "product": "ChatGPT · Model picker (now a reasoning slider)",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/20001354-gpt-56-in-chatgpt",
          "note": "The picker survives but its rungs are reasoning levels, not models: Instant, Medium, High, Extra High, Pro. Model names live in the help docs — Terra and Luna are not selectable at all. No cost is shown, and ChatGPT escalates reasoning on its own unless you turn off Settings › General › Higher intelligence."
        },
        {
          "product": "Claude · Model + effort selector",
          "company": "Anthropic",
          "url": "https://support.claude.com/en/articles/8664678-change-the-model-effort-and-thinking-settings",
          "note": "Named models — Haiku, Sonnet, Opus, Fable — sit next to the send button, now paired with an effort selector running Low to Max with High marked Default. It states the trade-off plainly: more thorough answers, but slower and more tokens. Price is still nowhere in the interface."
        },
        {
          "product": "Cursor · Model picker",
          "company": "Cursor",
          "url": "https://cursor.com/docs/models-and-pricing",
          "note": "Named models plus Auto, switchable per task — and on Teams and Enterprise, Auto now opens an Optimize For control inside the picker: Cost, Balance, Intelligence. Per-model prices still sit on the docs page and the usage dashboard, never in the picker, and Auto hides which model actually ran by default."
        },
        {
          "product": "OpenRouter · Model catalog",
          "company": "OpenRouter",
          "url": "https://openrouter.ai/models",
          "note": "Price, context length, and benchmark rank across the catalog; latency, throughput, and uptime per provider on each model page, plus a compare view and request-time routing modes — Balanced, Nitro, Exacto. The fullest trade-off surface anywhere, but it lives on browsing pages rather than inside a single pick."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Model Selector pattern?",
          "a": "Tasks vary from trivial to hard, so a single default model is wrong for most of them — and the cost/speed/capability trade-off should be the user's to make."
        },
        {
          "q": "When should I avoid the Model Selector pattern?",
          "a": "One model genuinely serves every task, or the audience is mainstream consumers better served by an effort dial than an engine list — the direction ChatGPT took in June 2026."
        },
        {
          "q": "What problem does Model Selector solve?",
          "a": "A single default model is wrong for half your tasks — overkill for the quick ones, underpowered for the hard ones — but the choice is hidden in settings, if it exists at all, and consumer products are now removing it entirely."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat picks one model behind the scenes — and consumer chat is doubling down, ChatGPT's June 2026 redesign swapped named models for an effort slider — so when the picker goes, cost and capability visibility go with it."
        }
      ],
      "related": [
        {
          "id": "draft-mode",
          "kind": "alternative",
          "note": "Draft Mode offers two fixed modes, cheap draft and costly live; Model Selector offers a few named models, each with its trade-off."
        },
        {
          "id": "compute-budget",
          "kind": "pairs-with",
          "note": "Model Selector sets which engine runs and at what cost; Compute Budget caps the run's total spend and pauses it at the limit."
        },
        {
          "id": "model-changelog",
          "kind": "pairs-with",
          "note": "Model Changelog tells you when the model you picked changes under you, with a before/after diff on your own prompts."
        }
      ]
    },
    {
      "id": "deletion-awareness",
      "url": "https://beyondchat.design/patterns/deletion-awareness/",
      "title": "Deletion Awareness",
      "subtitle": "Show what disappears before it is gone",
      "metaphor": "Shredder Preview",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Deleting what an AI holds — a memory, an uploaded source, a learned preference — is usually a blind action: you cannot see what actually goes, or what silently breaks when it does. Deletion Awareness shows the blast radius before the delete commits: exactly what will be removed and what currently depends on it, with an option to keep the dependencies and a short window to undo.",
      "interaction": "Pre-delete Impact Preview, Keep-Dependencies, Undo Window",
      "controlMechanism": "Impact List, Dependency Map, Delete / Keep-deps / Cancel, Undo Toast",
      "useCase": "Deleting AI Memory, Removing Sources, Privacy Cleanup, Account Offboarding",
      "useWhen": "Deleting AI-held data is irreversible and opaque; users need to see what goes and what breaks before they confirm, not discover it afterward.",
      "failureModeLabel": "Blind Delete",
      "dope": {
        "observability": "Before you confirm, the delete shows exactly what will be removed and what currently depends on it",
        "predictability": "The same delete always previews the same blast radius — nothing extra disappears silently",
        "directability": "Delete everything, keep the dependencies, or cancel — and undo within a short window",
        "explainability": "Each item names what it is, when it was added, and which features rely on it"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "trust",
        "agentReady": false,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "Deleting what an AI holds — a memory, an uploaded source, a learned preference — is a blind action: you cannot see what actually goes, or what silently breaks when it does.",
        "pattern": "Before the delete commits, show exactly what will be removed and what currently depends on it, with a keep-the-dependencies option and a short undo window.",
        "whyChatBreaks": "Chat deletes on a word (\"forget that\") with no preview and no trace — you learn what it removed only when something later behaves differently.",
        "risks": "An impact list that overstates dependencies scares users out of cleaning up; one that understates them is the silent breakage it was meant to prevent.",
        "avoidWhen": "The item is trivially re-creatable and nothing depends on it — a preview adds friction with no risk to surface."
      },
      "examples": [
        {
          "product": "Homebrew / apt · dependency-removal prompts",
          "company": "Homebrew · Debian",
          "url": "https://manpages.debian.org/stable/apt/apt-get.8.en.html",
          "note": "The blast radius shown before the delete commits: apt lists \"The following packages will be REMOVED\" — including dependents you never named — and waits for an explicit confirm; Homebrew warns when an uninstall would break formulae that depend on it. The dependency map half of the pattern, shipping in every package manager."
        },
        {
          "product": "Google Drive & macOS Trash · 30-day restore",
          "company": "Google · Apple",
          "url": "https://support.google.com/drive/answer/2375102",
          "note": "The undo window half of the pattern: deleted items move to a trash surface where they stay restorable for 30 days before permanent removal, and a single Restore / Put Back action reverses the delete in place. Deletion as a staged commit, not an instant erase."
        },
        {
          "product": "Gmail · Undo Send",
          "company": "Google",
          "url": "https://support.google.com/mail/answer/2819488",
          "note": "The undo-window precedent for irreversible actions: after hitting Send, a toast holds the action open for a user-configurable window (up to 30 seconds) with a one-tap Undo before it commits. The same short-window mechanic the pattern asks for on AI-data deletes."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Deletion Awareness pattern?",
          "a": "Deleting AI-held data is irreversible and opaque; users need to see what goes and what breaks before they confirm, not discover it afterward."
        },
        {
          "q": "When should I avoid the Deletion Awareness pattern?",
          "a": "The item is trivially re-creatable and nothing depends on it — a preview adds friction with no risk to surface."
        },
        {
          "q": "What problem does Deletion Awareness solve?",
          "a": "Deleting what an AI holds — a memory, an uploaded source, a learned preference — is a blind action: you cannot see what actually goes, or what silently breaks when it does."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat deletes on a word (\"forget that\") with no preview and no trace — you learn what it removed only when something later behaves differently."
        }
      ],
      "related": [
        {
          "id": "ai-memory",
          "kind": "extends",
          "note": "AI Memory lets you delete a memory; Deletion Awareness first shows which features depend on it and offers to keep them."
        },
        {
          "id": "data-ownership",
          "kind": "pairs-with",
          "note": "Data Ownership lists everything the AI holds on you; Deletion Awareness previews what deleting one item takes with it."
        },
        {
          "id": "action-audit",
          "kind": "pairs-with",
          "note": "Deletion Awareness shows the blast radius first; Action Audit & Undo keeps a timeline to reverse actions after they land."
        }
      ]
    },
    {
      "id": "refusal-receipt",
      "url": "https://beyondchat.design/patterns/refusal-receipt/",
      "title": "Refusal Receipt",
      "subtitle": "When the AI says no, it shows its work",
      "metaphor": "Receipt",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "The AI says \"I can't help with that\" and nothing else — so users retry blindly, learn superstitions about phrasing, and abandon legitimate requests. Refusal Receipt attaches structure to every no: which policy fired, which span of the request triggered it, how severe the call was, what a permitted variant looks like, and where to appeal. The refusal stops being a wall and becomes a signpost.",
      "interaction": "Refusal Card, Policy Chip, Appeal Path",
      "controlMechanism": "Triggered-Policy Label, Severity Indicator, Highlighted Span, Allowed-Alternative Suggestion, Review Request",
      "useCase": "Content Policies, Enterprise Guardrails, API Moderation",
      "useWhen": "Users hit guardrails on legitimate work and need to understand what triggered the refusal and how to proceed.",
      "failureModeLabel": "The Blanket No",
      "dope": {
        "directability": "The receipt names the triggering span, so the user edits that instead of guessing at rephrasings",
        "observability": "Which policy fired, at what severity, is printed on the refusal instead of hidden in the model",
        "predictability": "Named policies behave like rules — the same category triggers the same way across requests",
        "explainability": "The refusal explains itself: policy, span, severity, and a permitted alternative instead of a blanket no"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "output",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "The AI says \"I can't help with that\" and nothing else — the user retries blindly, learns superstitions about phrasing, and abandons legitimate requests.",
        "pattern": "Attach a receipt to every refusal: the policy that fired, the span that triggered it, the severity of the call, a permitted alternative, and an appeal path.",
        "whyChatBreaks": "Chat delivers a refusal as just another message bubble — no structure, no trigger, no way forward — so the reason stays exactly as invisible as the model leaves it.",
        "risks": "A receipt that is too specific becomes a jailbreak manual — name the policy and category, not the exact decision boundary.",
        "avoidWhen": "Trivial or obviously out-of-scope refusals — a ceremonial receipt on every \"no\" erodes the signal for the refusals that matter."
      },
      "examples": [
        {
          "product": "Azure OpenAI · Content filter annotations",
          "company": "Microsoft",
          "url": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/content-filter",
          "note": "Filtered responses return the triggered category (hate, sexual, violence, self-harm) and severity level per request — a machine-readable refusal receipt at the API layer, waiting for product UIs to surface it."
        },
        {
          "product": "Gemini API · Safety ratings",
          "company": "Google",
          "url": "https://ai.google.dev/gemini-api/docs/safety-settings",
          "note": "Every response carries per-category safety ratings and a block reason when filtered; thresholds are user-adjustable per category — policy visibility plus a steering surface."
        },
        {
          "product": "GitHub Copilot · Public code filter notice",
          "company": "GitHub",
          "url": "https://docs.github.com/en/copilot/how-tos/manage-your-account/manage-policies",
          "note": "When the duplication filter suppresses a completion, Copilot says the match filter fired rather than silently returning nothing — a minimal but real named-policy refusal."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Refusal Receipt pattern?",
          "a": "Users hit guardrails on legitimate work and need to understand what triggered the refusal and how to proceed."
        },
        {
          "q": "When should I avoid the Refusal Receipt pattern?",
          "a": "Trivial or obviously out-of-scope refusals — a ceremonial receipt on every \"no\" erodes the signal for the refusals that matter."
        },
        {
          "q": "What problem does Refusal Receipt solve?",
          "a": "The AI says \"I can't help with that\" and nothing else — the user retries blindly, learns superstitions about phrasing, and abandons legitimate requests."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat delivers a refusal as just another message bubble — no structure, no trigger, no way forward — so the reason stays exactly as invisible as the model leaves it."
        }
      ],
      "related": [
        {
          "id": "capability-boundary",
          "kind": "pairs-with",
          "note": "Capability Boundary declares what the system cannot do up front; Refusal Receipt explains the no at the moment it happens."
        },
        {
          "id": "reasoning-trace",
          "kind": "pairs-with",
          "note": "Reasoning Trace lays out the claims and assumptions behind an answer; Refusal Receipt names the policy and span behind a no."
        },
        {
          "id": "constraint-rules",
          "kind": "pairs-with",
          "note": "Refusal Receipt explains a no under platform policy; Constraint Rules Engine checks each agent action against rules you wrote."
        }
      ]
    },
    {
      "id": "context-gauge",
      "url": "https://beyondchat.design/patterns/context-gauge/",
      "title": "Context Gauge",
      "subtitle": "See what the model still holds — before it forgets",
      "metaphor": "Fuel Gauge",
      "category": {
        "id": "memory-context-boundary",
        "label": "Memory, Context & Boundary"
      },
      "description": "Chat shows an infinite scrollback while the model sees a sliding window — old turns silently fall out mid-session, and the user only notices when the assistant contradicts something it knew an hour ago. Context Gauge renders the window as an instrument: how full it is, which sources occupy it (files, conversation, memory, system), what has already been evicted, a warning before compaction — and pins for what must survive.",
      "interaction": "Live Meter, Segment Breakdown, Pin & Evict",
      "controlMechanism": "Fill-Level Bar, Per-Source Segments, Pinned Items, Eviction Markers, Compaction Warning",
      "useCase": "Long Sessions, Document-Heavy Work, Agent Runs",
      "useWhen": "Sessions run long enough that context loss changes answers, and users need to see — and steer — what the model still holds.",
      "failureModeLabel": "Silent Forgetting",
      "dope": {
        "directability": "Pin what must survive, evict what should not be there — the user curates the window instead of hoping",
        "observability": "A live gauge shows how full the window is and which sources — files, turns, memory — occupy it",
        "predictability": "Compaction announces itself before it happens instead of silently dropping the oldest turns",
        "explainability": "When the model forgets, the eviction marker says what left the window and when"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "The model silently forgets — old turns fall out of the window mid-session, and the user only notices when the assistant contradicts something it knew an hour ago.",
        "pattern": "Render the context window as a live gauge: fill level, per-source segments, eviction markers, a compaction warning, and pins for what must stay.",
        "whyChatBreaks": "Chat presents an infinite scrollback while the model sees a sliding window — the interface actively misrepresents what the AI is working from.",
        "risks": "A raw token-accounting dashboard becomes noise — the gauge earns its place by showing consequences (what left, what stays), not numbers.",
        "avoidWhen": "Short, single-shot interactions that never approach the window limit."
      },
      "examples": [
        {
          "product": "Claude Code · Context meter + auto-compact warning",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/costs",
          "note": "A live indicator shows remaining context and warns before auto-compaction summarizes older turns — fill level, consequence, and advance notice in one strip."
        },
        {
          "product": "Cursor · Context window indicator",
          "company": "Cursor",
          "url": "https://cursor.com/en-US/learn/context",
          "note": "Shows how much of the model window the current conversation and attached files consume, and which files are in context — per-source visibility of the window."
        },
        {
          "product": "Google AI Studio · Token count",
          "company": "Google",
          "url": "https://aistudio.google.com/",
          "note": "A persistent token counter against the model maximum as you compose — the raw fill-level reading, without eviction markers or pins."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Context Gauge pattern?",
          "a": "Sessions run long enough that context loss changes answers, and users need to see — and steer — what the model still holds."
        },
        {
          "q": "When should I avoid the Context Gauge pattern?",
          "a": "Short, single-shot interactions that never approach the window limit."
        },
        {
          "q": "What problem does Context Gauge solve?",
          "a": "The model silently forgets — old turns fall out of the window mid-session, and the user only notices when the assistant contradicts something it knew an hour ago."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat presents an infinite scrollback while the model sees a sliding window — the interface actively misrepresents what the AI is working from."
        }
      ],
      "related": [
        {
          "id": "ai-memory",
          "kind": "pairs-with",
          "note": "AI Memory carries context across sessions; Context Gauge shows how much of the current window that memory fills."
        },
        {
          "id": "compute-budget",
          "kind": "pairs-with",
          "note": "Compute Budget meters what a run spends; Context Gauge meters what the model can still hold before it forgets."
        },
        {
          "id": "knowledge-source-toggle",
          "kind": "pairs-with",
          "note": "Knowledge Source Toggle picks which sources may enter; Context Gauge shows how much of the window they fill."
        }
      ]
    },
    {
      "id": "seed-pinning",
      "url": "https://beyondchat.design/patterns/seed-pinning/",
      "title": "Seed Pinning",
      "subtitle": "Hold the randomness still, change one thing at a time",
      "metaphor": "Anchor",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Regenerating reshuffles everything at once: the user liked the composition but wanted warmer light, and now both are gone. Seed Pinning freezes the randomness — pin the seed, and the same settings reproduce the same image; then vary exactly one dimension per iteration. Refinement becomes a controlled experiment instead of a slot machine.",
      "interaction": "Seed Lock Toggle, Single-Variable Slider, Variation Grid",
      "controlMechanism": "Pinned Seed, Lock Indicator, One-Axis Variation, Seed History",
      "useCase": "Image Iteration, Style Exploration, A/B Comparison",
      "useWhen": "The user has a generation they mostly like and needs to iterate on one dimension without losing the rest.",
      "failureModeLabel": "Slot-Machine Regenerate",
      "dope": {
        "directability": "One slider changes one dimension while everything else holds still",
        "observability": "The lock state and seed value sit visibly on the artifact, so the user knows why outputs match or differ",
        "predictability": "With the seed pinned, the same settings reproduce the same image — regeneration stops being a lottery",
        "explainability": "Differences between variants are attributable: the only thing that changed is the dimension the user moved"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "refinement",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Regenerating reshuffles everything at once — users lose the composition they liked while chasing the lighting they wanted.",
        "pattern": "Pin the seed to freeze the randomness, then vary a single dimension per iteration — a controlled experiment instead of a lottery ticket.",
        "whyChatBreaks": "Re-sending a prompt in chat re-rolls the dice; a text box has no handle for \"keep everything, change this one thing.\"",
        "risks": "Pinned seeds create false confidence across model versions — the same seed on a new model is a different image; show the model version next to the seed.",
        "avoidWhen": "Divergent exploration — when the user wants maximally different options, pinning the seed is the opposite of the job."
      },
      "examples": [
        {
          "product": "Midjourney · --seed parameter",
          "company": "Midjourney",
          "url": "https://docs.midjourney.com/hc/en-us/articles/32604356340877-Seeds",
          "note": "Same prompt + same seed reproduces the image; change one prompt term with the seed held and the diff is attributable to that term. The mechanic is real — the UI is still a typed flag, which is the gap the pattern names."
        },
        {
          "product": "Leonardo AI · Fixed seed",
          "company": "Leonardo.Ai",
          "url": "https://intercom.help/leonardo-ai/en/articles/8658301-realtime-canvas",
          "note": "A UI toggle pins the generation seed so subsequent runs vary only what the user changes — the lock affordance as an actual control, not a syntax trick."
        },
        {
          "product": "Stable Diffusion WebUI · Reuse seed",
          "company": "AUTOMATIC1111",
          "url": "https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features",
          "note": "One-click recycle-seed button plus visible seed field; the community workflow that made pin-then-vary the default way to iterate locally."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Seed Pinning pattern?",
          "a": "The user has a generation they mostly like and needs to iterate on one dimension without losing the rest."
        },
        {
          "q": "When should I avoid the Seed Pinning pattern?",
          "a": "Divergent exploration — when the user wants maximally different options, pinning the seed is the opposite of the job."
        },
        {
          "q": "What problem does Seed Pinning solve?",
          "a": "Regenerating reshuffles everything at once — users lose the composition they liked while chasing the lighting they wanted."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Re-sending a prompt in chat re-rolls the dice; a text box has no handle for \"keep everything, change this one thing.\""
        }
      ],
      "related": [
        {
          "id": "region-lock",
          "kind": "alternative",
          "note": "Region Lock freezes the parts you like and regenerates the rest; Seed Pinning freezes the randomness instead."
        },
        {
          "id": "parallel-alternatives",
          "kind": "pairs-with",
          "note": "Explore wide with candidates, then pin the winner's seed and iterate narrow."
        },
        {
          "id": "real-time-generation",
          "kind": "pairs-with",
          "note": "A pinned seed makes the live slider meaningful — the preview varies only on the axis you move."
        }
      ]
    },
    {
      "id": "model-changelog",
      "url": "https://beyondchat.design/patterns/model-changelog/",
      "title": "Model Changelog",
      "subtitle": "The model changed — hear it from the product, not from your broken outputs",
      "metaphor": "Release Notes",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "Model updates land silently: the same saved prompt starts answering differently overnight, and users discover the swap through degraded outputs, not through the product. Model Changelog announces the change where the work happens — what improved, what behaves differently, scoped to what you actually do — with a before/after diff on your own pinned prompts instead of version arithmetic. HAX guidelines 14 and 18 (update cautiously, notify about changes) have named this obligation since 2019; almost nothing ships it.",
      "interaction": "Update Card, Behavioral Diff, Notification Rhythm",
      "controlMechanism": "In-Product Change Notice, Behavior-Scoped Notes, Before/After Diff on Your Prompts, Acknowledge Control",
      "useCase": "Model Updates, Workflow Stability, Regression Triage",
      "useWhen": "Users build workflows on model behavior that changes underneath them, and silent updates cost them trust or output quality.",
      "failureModeLabel": "Silent Model Swap",
      "dope": {
        "observability": "The update is announced in-product with behavior-scoped notes, not buried in a blog post the user never sees",
        "predictability": "A before/after diff on the user's own pinned prompts shows how the change lands on their work, before it surprises them",
        "directability": "Acknowledge, snooze, or re-run your checks — the user controls when the new behavior enters their workflow where the platform allows it",
        "explainability": "Each notice names what category of behavior moved and why, instead of a bare version number"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Model updates land silently — the same saved prompt answers differently overnight, and users discover the swap through degraded outputs, not through the product.",
        "pattern": "Announce the change in-product, scoped to behavior: what improved, what moved, with a before/after diff on the user's own pinned prompts and a control over when it takes effect.",
        "whyChatBreaks": "Chat has no surface for \"the system under this box changed last night\" — same input, different distribution, zero notice.",
        "risks": "Changelog fatigue — if every minor bump interrupts, users dismiss all notices; scope announcements to behavioral change, not version arithmetic.",
        "avoidWhen": "The user pins model versions themselves (versioned API snapshots) — the notice belongs where change is imposed, not chosen."
      },
      "examples": [
        {
          "product": "ChatGPT · Release notes",
          "company": "OpenAI",
          "url": "https://help.openai.com/en/articles/6825453-chatgpt-release-notes",
          "note": "A running in-help changelog of model and feature changes — the notice half of the pattern. Behavior-scoped diffs on your own prompts remain unshipped anywhere."
        },
        {
          "product": "Anthropic · Model release notes + system cards",
          "company": "Anthropic",
          "url": "https://docs.claude.com/en/release-notes/overview",
          "note": "Versioned release notes plus system cards documenting behavioral characteristics per model — the most behavior-scoped public change documentation in the industry, but it lives in docs, not in-product."
        },
        {
          "product": "Cursor · Changelog",
          "company": "Cursor",
          "url": "https://cursor.com/changelog",
          "note": "Names model swaps and behavior changes per release, surfaced to developers who treat the tool as infrastructure. In-product update notes appear on version bumps."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Model Changelog pattern?",
          "a": "Users build workflows on model behavior that changes underneath them, and silent updates cost them trust or output quality."
        },
        {
          "q": "When should I avoid the Model Changelog pattern?",
          "a": "The user pins model versions themselves (versioned API snapshots) — the notice belongs where change is imposed, not chosen."
        },
        {
          "q": "What problem does Model Changelog solve?",
          "a": "Model updates land silently — the same saved prompt answers differently overnight, and users discover the swap through degraded outputs, not through the product."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat has no surface for \"the system under this box changed last night\" — same input, different distribution, zero notice."
        }
      ],
      "related": [
        {
          "id": "capability-boundary",
          "kind": "pairs-with",
          "note": "Capability Boundary declares what the system can do; Model Changelog announces when that declaration moves."
        },
        {
          "id": "model-selector",
          "kind": "pairs-with",
          "note": "Model Selector lets you pick the model per task; Model Changelog tells you when the model behind that pick changes."
        },
        {
          "id": "seed-pinning",
          "kind": "pairs-with",
          "note": "Seed Pinning reproduces an output only on the same model; Model Changelog tells you when that model changed."
        }
      ]
    },
    {
      "id": "bias-flag",
      "url": "https://beyondchat.design/patterns/bias-flag/",
      "title": "Bias Flag",
      "subtitle": "The output carries its own skew warnings",
      "metaphor": "Spirit Level",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "AI output inherits skew — gendered coding in a job ad, stereotyped defaults in an image, exclusionary phrasing in customer copy — and the fluency of the prose makes it read as neutral. Bias Flag annotates the output itself: the specific span or depiction, a named skew category, a short evidence note, and a neutral alternative one click away. Review the skew like you review a spelling error — at the moment it can still be fixed.",
      "interaction": "Span Flag, Skew Category Chip, Neutral Alternative",
      "controlMechanism": "Flagged Spans, Category Labels, Evidence Note, Replace Suggestion, Per-Flag Accept/Dismiss",
      "useCase": "Job Ads & HR Copy, Public-Facing Text, Image Generation Defaults",
      "useWhen": "Generated text or imagery ships to audiences where unnoticed skew has real cost — hiring, customer copy, public communication.",
      "failureModeLabel": "Fluent Skew",
      "dope": {
        "observability": "Skew is visible as flagged spans in the output, not an abstract disclaimer above it",
        "predictability": "Flag categories are a stable, named set — the same kind of coding triggers the same kind of flag",
        "directability": "Each flag carries a neutral alternative; accept or dismiss per flag, with dismissals logged, not silent",
        "explainability": "Every flag names its category and shows the evidence — which words, which pattern, why it reads as skew"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "output",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "AI output inherits skew — gendered coding, stereotyped defaults, exclusionary phrasing — and its fluency makes it read as neutral, so users ship it downstream unchecked.",
        "pattern": "Flag the specific span or depiction in the output, name the skew category, show the evidence, and offer a neutral alternative one click away.",
        "whyChatBreaks": "A prose answer has no channel for \"this part may be skewed\" — the confident paragraph asserts its own neutrality.",
        "risks": "Over-flagging becomes moral noise that gets dismissed wholesale — flags must be specific, evidenced, and rare enough to mean something.",
        "avoidWhen": "Creative work where the requested voice or style is the point — a flag on deliberate register is a false positive."
      },
      "examples": [
        {
          "product": "Textio",
          "company": "Textio",
          "url": "https://textio.com",
          "note": "Flags gendered and exclusionary coding in job posts and performance feedback, span by span, with rewrite suggestions and evidence — the canonical skew-flagging product, applied to human text."
        },
        {
          "product": "Grammarly · Inclusive language suggestions",
          "company": "Grammarly",
          "url": "https://support.grammarly.com/hc/en-us/articles/4402966281869",
          "note": "Underlines potentially exclusionary phrasing inline and offers neutral alternatives with a short why — accept or dismiss per flag. Flags human writing; flagging the AI's own output is the emerging edge."
        },
        {
          "product": "Microsoft Editor · Inclusiveness checks",
          "company": "Microsoft",
          "url": "https://support.microsoft.com/en-us/office/microsoft-editor-checks-grammar-and-more-in-documents-mail-and-the-web-91ecbe1b-d021-4e9e-a82e-abc4cd7163d7",
          "note": "Optional inclusiveness category in Word's refinement checks — age, cultural, gender bias — as reviewable spans with alternatives, off by default."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Bias Flag pattern?",
          "a": "Generated text or imagery ships to audiences where unnoticed skew has real cost — hiring, customer copy, public communication."
        },
        {
          "q": "When should I avoid the Bias Flag pattern?",
          "a": "Creative work where the requested voice or style is the point — a flag on deliberate register is a false positive."
        },
        {
          "q": "What problem does Bias Flag solve?",
          "a": "AI output inherits skew — gendered coding, stereotyped defaults, exclusionary phrasing — and its fluency makes it read as neutral, so users ship it downstream unchecked."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A prose answer has no channel for \"this part may be skewed\" — the confident paragraph asserts its own neutrality."
        }
      ],
      "related": [
        {
          "id": "ai-provenance",
          "kind": "pairs-with",
          "note": "AI Provenance marks AI-drafted spans no human has reviewed; Bias Flag marks spans that may be skewed and offers a neutral fix."
        },
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "Confidence Signals mark how sure the AI is of each claim; Bias Flag marks skew in framing, a different failure on the same output."
        },
        {
          "id": "refusal-receipt",
          "kind": "pairs-with",
          "note": "Refusal Receipt explains the no; Bias Flag annotates the output that does ship."
        }
      ]
    },
    {
      "id": "chat-off-ramp",
      "url": "https://beyondchat.design/patterns/chat-off-ramp/",
      "title": "Chat Off-Ramp",
      "subtitle": "When the best AI interface is no conversation at all",
      "metaphor": "Off-Ramp",
      "category": {
        "id": "inline-contextual",
        "label": "Inline & Contextual"
      },
      "description": "Chat gets bolted onto tasks that have a known shape — and suddenly cropping an image takes three turns of typing. When the task's parameters are enumerable, the strongest move is the one this library keeps circling: skip the conversation entirely. Ship the task-native control — a toolbar, a slider, a button — with the model behind it, and keep a free-form escape hatch for the long tail. NNGroup's most radical finding, distilled: sometimes the fix is not a better surface next to chat, but no chat at all.",
      "interaction": "Task-Native Controls, One-Gesture Actions, Escape Hatch to Free-Form",
      "controlMechanism": "Direct Controls With AI Behind Them, Enumerated Parameters, Optional Free-Form Fallback",
      "useCase": "Photo Editing, Repetitive Structured Tasks, Known-Shape Workflows",
      "useWhen": "The task's parameters are enumerable and repeated — a conversation adds turns where a control would do.",
      "failureModeLabel": "Chat as Overhead",
      "dope": {
        "observability": "The available actions are the interface — every capability is a visible control, none hides behind phrasing",
        "predictability": "A labeled control does one named thing — no turn-taking, no interpretation variance between runs",
        "directability": "One gesture does what three chat turns approximated, and the free-form hatch stays open for the unenumerated case",
        "explainability": "The control's label is the explanation — what it does is what it says, before it runs"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "entry",
        "agentReady": false,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "Chat gets bolted onto tasks with a known shape, adding turn-taking, typing, and interpretation variance to something a control could do in one gesture.",
        "pattern": "When the task's parameters are enumerable, skip the conversation: ship the task-native control with the model behind it, and keep a free-form escape hatch for the long tail.",
        "whyChatBreaks": "This is the meta-case — the conversation itself is the overhead; there is nothing for the dialogue to disambiguate.",
        "risks": "Fixed controls cap the ceiling — without an escape hatch to free-form input, the unenumerated 20% of intents has nowhere to go.",
        "avoidWhen": "Open-ended, exploratory, or genuinely conversational tasks — when intent cannot be enumerated, chat earns its place."
      },
      "examples": [
        {
          "product": "Adobe Photoshop · Generative Fill toolbar",
          "company": "Adobe",
          "url": "https://helpx.adobe.com/photoshop/desktop/create-open-import-images/create-images/edit-images-with-generative-fill.html",
          "note": "Generative AI behind a selection tool and a button — the model does the work, the interface stays a toolbar. The optional prompt field is the escape hatch, not the primary surface."
        },
        {
          "product": "Google Photos · Magic Editor",
          "company": "Google",
          "url": "https://support.google.com/photos/answer/13570871",
          "note": "Tap, drag, erase — generative editing with zero conversation. Suggested edits appear as buttons; parameters the task actually has (position, size, presence) map to gestures."
        },
        {
          "product": "Canva · Magic Studio tools",
          "company": "Canva",
          "url": "https://www.canva.com/magic/",
          "note": "A suite of single-purpose AI tools (Magic Eraser, Magic Expand, Magic Grab) shipped as named buttons in the editor — each does one enumerable thing, no dialogue required."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Chat Off-Ramp pattern?",
          "a": "The task's parameters are enumerable and repeated — a conversation adds turns where a control would do."
        },
        {
          "q": "When should I avoid the Chat Off-Ramp pattern?",
          "a": "Open-ended, exploratory, or genuinely conversational tasks — when intent cannot be enumerated, chat earns its place."
        },
        {
          "q": "What problem does Chat Off-Ramp solve?",
          "a": "Chat gets bolted onto tasks with a known shape, adding turn-taking, typing, and interpretation variance to something a control could do in one gesture."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "This is the meta-case — the conversation itself is the overhead; there is nothing for the dialogue to disambiguate."
        }
      ],
      "related": [
        {
          "id": "property-panel",
          "kind": "extends",
          "note": "Property Panel puts controls beside the prompt; Chat Off-Ramp drops the conversation once every parameter is a control."
        },
        {
          "id": "select-transform",
          "kind": "extended-by",
          "note": "Select & Transform is the off-ramp for text edits: select the span and pick a verb from the toolbar instead of describing it."
        },
        {
          "id": "disambiguation-branch",
          "kind": "alternative",
          "note": "Disambiguation Branch lets you pick a reading of an ambiguous prompt; Chat Off-Ramp's labeled controls leave nothing to misread."
        }
      ]
    },
    {
      "id": "counterfactual-probe",
      "url": "https://beyondchat.design/patterns/counterfactual-probe/",
      "title": "Counterfactual Probe",
      "subtitle": "What would have to change for a different answer?",
      "metaphor": "Lever",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "An answer arrives with no sense of its stability: users can't tell whether a recommendation is robust or one assumption away from flipping. Counterfactual Probe exposes the levers — which inputs, moved how far, would change the verdict — and lets the user pull them: drag the budget 15% higher and watch the recommendation flip, with the boundary marked. Asking \"why\" gets a rationalization; probing \"what would change your mind\" shows the actual decision surface.",
      "interaction": "Input Levers, Distance-to-Flip Indicator, Live Re-Decision",
      "controlMechanism": "Probeable Input Sliders, Decision-Boundary Marker, Flip Preview, Sensitivity Ranking",
      "useCase": "Recommendations, Risk Assessments, Approval Decisions",
      "useWhen": "Decisions rest on the answer and users need to know how fragile it is before acting on it.",
      "failureModeLabel": "Sealed Verdict",
      "dope": {
        "directability": "The user probes the decision directly — drag a lever, watch the verdict respond — instead of prompting for hypotheticals",
        "observability": "Each input shows its distance-to-flip, so the fragile assumptions are visible before anyone acts on the answer",
        "predictability": "The boundary is marked on the control: the user knows where the flip happens before crossing it",
        "explainability": "Sensitivity is ranked — which factor actually drives this verdict — replacing prose rationalization with testable structure"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "output",
        "agentReady": true,
        "researchStatus": "aspirational"
      },
      "framing": {
        "problem": "An answer arrives with no sense of its stability — users cannot tell whether a recommendation is robust or one assumption away from flipping.",
        "pattern": "Expose the levers: which inputs, moved how far, would change the verdict — and let the user pull them, with the decision boundary marked on the control.",
        "whyChatBreaks": "Asking \"why\" in chat gets a rationalization and \"what if\" gets a fresh essay — neither shows the actual decision surface or where it flips.",
        "risks": "Counterfactuals on fabricated reasoning are theater — the levers must be causally tied to the actual computation, or honestly labeled as approximations.",
        "avoidWhen": "Creative or generative tasks with no decision boundary to probe."
      },
      "examples": [
        {
          "product": "Google · What-If Tool (PAIR)",
          "company": "Google",
          "url": "https://pair-code.github.io/what-if-tool/",
          "note": "Probe an ML model's decisions by editing datapoints and finding counterfactual twins — the closest shipped implementation of pull-the-lever-and-watch-the-verdict, aimed at practitioners rather than end users."
        },
        {
          "product": "Fiddler AI · Counterfactual explanations",
          "company": "Fiddler",
          "url": "https://www.fiddler.ai/explainable-ai",
          "note": "Model-monitoring platform surfacing which feature changes would flip a prediction — decision-boundary visibility as an enterprise observability product."
        },
        {
          "product": "Adverse-action reason codes",
          "company": "US consumer credit (regulated)",
          "url": "https://www.consumerfinance.gov/ask-cfpb/what-is-a-notice-of-adverse-action-en-1253/",
          "note": "Credit denials must state the principal reasons — a legally mandated, decades-old counterfactual receipt (\"what would have to be different\"), proving the pattern predates AI."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Counterfactual Probe pattern?",
          "a": "Decisions rest on the answer and users need to know how fragile it is before acting on it."
        },
        {
          "q": "When should I avoid the Counterfactual Probe pattern?",
          "a": "Creative or generative tasks with no decision boundary to probe."
        },
        {
          "q": "What problem does Counterfactual Probe solve?",
          "a": "An answer arrives with no sense of its stability — users cannot tell whether a recommendation is robust or one assumption away from flipping."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Asking \"why\" in chat gets a rationalization and \"what if\" gets a fresh essay — neither shows the actual decision surface or where it flips."
        }
      ],
      "related": [
        {
          "id": "reasoning-trace",
          "kind": "pairs-with",
          "note": "Reasoning Trace shows the reasoning the AI claims; Counterfactual Probe shows which inputs actually flip the verdict."
        },
        {
          "id": "confidence-signals",
          "kind": "pairs-with",
          "note": "Confidence Signals say how sure the AI is of a claim; Counterfactual Probe shows how far an input can move before the verdict flips."
        },
        {
          "id": "second-opinion",
          "kind": "pairs-with",
          "note": "Counterfactual Probe varies the inputs and Second Opinion varies the model, two different checks on the same answer."
        }
      ]
    },
    {
      "id": "generation-tree",
      "url": "https://beyondchat.design/patterns/generation-tree/",
      "title": "Generation Tree",
      "subtitle": "Every variant remembers where it came from",
      "metaphor": "Family Tree",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "After twenty variations, the good one from ten minutes ago is unfindable — iteration history is a flat scroll, or nothing at all. Generation Tree renders the work's real topology: every variant hangs off its parent, branches stay comparable, and any node restores its full state — prompt, seed, settings — in one click. The chat fork, applied to the medium where branching is the actual shape of the work.",
      "interaction": "Branching Nodes, Click-to-Restore, Side-by-Side Compare",
      "controlMechanism": "Lineage Graph, Node Thumbnails, Branch Labels, Restore-Full-State, Two-Node Compare",
      "useCase": "Image Iteration, Design Exploration, Variant Management",
      "useWhen": "Iteration produces many variants across diverging directions and the good ones must stay findable and restorable.",
      "failureModeLabel": "Lost Lineage",
      "dope": {
        "directability": "Any node is a restart point — click to restore its full state and branch from there, no retyping the past",
        "observability": "The lineage is the interface: which variant came from which, and where each branch was abandoned, is visible at a glance",
        "predictability": "Restoring a node reproduces its exact state — parent, prompt, seed, settings — not an approximation from memory",
        "explainability": "Each edge names what changed between parent and child, so the path to the good variant reads as a decision log"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "refinement",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "After twenty variations the good one from ten minutes ago is unfindable — iteration history is a flat scroll, or nothing at all.",
        "pattern": "Render generations as a tree: every variant hangs off its parent, branches stay comparable, and any node restores its full state in one click.",
        "whyChatBreaks": "Chat scrollback is a single line while visual iteration branches — the topology of the work does not fit the container.",
        "risks": "Unbounded trees become their own navigation problem — prune, collapse, and name branches, or the map ends up as unfindable as the scroll it replaced.",
        "avoidWhen": "Single-shot generation with no iteration to track."
      },
      "examples": [
        {
          "product": "ComfyUI · Node graph",
          "company": "Comfy Org",
          "url": "https://github.com/comfyanonymous/ComfyUI",
          "note": "The generation pipeline as an explicit graph — lineage is the interface. Power-tool register: it shows the topology the pattern wants, at the cost of approachability."
        },
        {
          "product": "Midjourney · Vary & remix lineage",
          "company": "Midjourney",
          "url": "https://docs.midjourney.com/hc/en-us/articles/32692978437005-Variations",
          "note": "Every vary/remix job links back to its parent job — the lineage exists in the data and job history, but no tree view renders it navigable."
        },
        {
          "product": "Figma · Branching",
          "company": "Figma",
          "url": "https://help.figma.com/hc/en-us/articles/360063144053-Create-branches-and-merge-changes",
          "note": "Named branches off a main file with review-and-merge — design iteration as a tree, though per-file rather than per-generation."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Generation Tree pattern?",
          "a": "Iteration produces many variants across diverging directions and the good ones must stay findable and restorable."
        },
        {
          "q": "When should I avoid the Generation Tree pattern?",
          "a": "Single-shot generation with no iteration to track."
        },
        {
          "q": "What problem does Generation Tree solve?",
          "a": "After twenty variations the good one from ten minutes ago is unfindable — iteration history is a flat scroll, or nothing at all."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat scrollback is a single line while visual iteration branches — the topology of the work does not fit the container."
        }
      ],
      "related": [
        {
          "id": "conversation-branches",
          "kind": "extends",
          "note": "The chat fork, applied to visual artifacts — where branching is the actual shape of the work."
        },
        {
          "id": "seed-pinning",
          "kind": "pairs-with",
          "note": "Pin the seed inside one branch; the tree keeps every branch findable."
        },
        {
          "id": "output-undo",
          "kind": "alternative",
          "note": "Output-Level Undo walks back one linear history with Cmd+Z; Generation Tree keeps every branch and restores any node."
        }
      ]
    },
    {
      "id": "exclusion-controls",
      "url": "https://beyondchat.design/patterns/exclusion-controls/",
      "title": "Exclusion Controls",
      "subtitle": "Say never without learning the syntax",
      "metaphor": "Blocklist",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "The model keeps adding what you don't want, and the only defense is arcana: \"--no hands\", negative-prompt incantations pasted from forums — retyped every generation. Exclusion Controls make the negative space structural: click the unwanted element in the output to ban it, keep a visible never-list that persists across generations, and remove any exclusion with one click. Negation is the model's weakest instruction in prose; a blocklist doesn't re-roll each turn.",
      "interaction": "Click-to-Ban, Persistent Never-List, One-Click Unban",
      "controlMechanism": "Element-Level Exclusion, Visible Blocklist Chips, Cross-Generation Persistence, Cost Indicator",
      "useCase": "Image Generation, Brand Safety, Style Guardrails",
      "useWhen": "The same unwanted elements keep reappearing across generations and prose negation keeps failing.",
      "failureModeLabel": "Negation Roulette",
      "dope": {
        "directability": "Banning happens on the artifact — click the element, not describe its absence — and unbanning is one chip click",
        "observability": "The never-list is always visible next to the output, so what is being suppressed is never a mystery",
        "predictability": "Exclusions persist structurally across generations instead of depending on how well prose negation lands this turn",
        "explainability": "Each exclusion chip names what it blocks, and the cost indicator shows how much the blocklist narrows the option space"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "The model keeps adding what you do not want, and the only defense is syntax arcana — negative-prompt incantations retyped every generation.",
        "pattern": "Make the negative space structural: click the unwanted element to ban it, keep a visible never-list that persists across generations, unban with one click.",
        "whyChatBreaks": "Negation is the model's weakest prose instruction — \"no text in the image\" famously produces text — and it re-rolls with every turn.",
        "risks": "Over-exclusion quietly collapses the possibility space — show what the blocklist costs and keep removal effortless.",
        "avoidWhen": "One-off generations where retyping a negation is cheaper than managing a list."
      },
      "examples": [
        {
          "product": "Leonardo AI · Negative prompt field",
          "company": "Leonardo.Ai",
          "url": "https://intercom.help/leonardo-ai/en/articles/8067671-prompting-tips-tricks",
          "note": "A dedicated, labeled field for what must not appear — the exclusion as first-class input rather than inline syntax, though still typed prose rather than click-to-ban."
        },
        {
          "product": "Stable Diffusion WebUI · Negative prompts",
          "company": "AUTOMATIC1111",
          "url": "https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Negative-prompt",
          "note": "The community convention that proved structural negation works where prose negation fails — persistent per-generation, reusable, and the reason \"negative prompt\" is a household term in image generation."
        },
        {
          "product": "Midjourney · --no parameter",
          "company": "Midjourney",
          "url": "https://docs.midjourney.com/hc/en-us/articles/32173351982093-No",
          "note": "Exclusion ships as typed flag syntax — exactly the arcana the pattern replaces with visible, persistent chips. The mechanic is proven; the interface is the gap."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Exclusion Controls pattern?",
          "a": "The same unwanted elements keep reappearing across generations and prose negation keeps failing."
        },
        {
          "q": "When should I avoid the Exclusion Controls pattern?",
          "a": "One-off generations where retyping a negation is cheaper than managing a list."
        },
        {
          "q": "What problem does Exclusion Controls solve?",
          "a": "The model keeps adding what you do not want, and the only defense is syntax arcana — negative-prompt incantations retyped every generation."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Negation is the model's weakest prose instruction — \"no text in the image\" famously produces text — and it re-rolls with every turn."
        }
      ],
      "related": [
        {
          "id": "region-lock",
          "kind": "pairs-with",
          "note": "Region Lock keeps what must stay; Exclusion Controls ban what must never appear, across every regeneration."
        },
        {
          "id": "property-panel",
          "kind": "pairs-with",
          "note": "Property Panel turns flags like --ar into sliders and toggles; Exclusion Controls turn --no into a visible never-list."
        },
        {
          "id": "prompt-parsing",
          "kind": "alternative",
          "note": "Inline Prompt Controls make parameters clickable in the prose; Exclusion Controls list bans beside the output instead."
        }
      ]
    },
    {
      "id": "second-opinion",
      "url": "https://beyondchat.design/patterns/second-opinion/",
      "title": "Second Opinion",
      "subtitle": "Route the same question to a different model before you trust the first",
      "metaphor": "Consult",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "A single model's confident answer has no external check — users either trust it blindly or do the verification legwork themselves across browser tabs. Second Opinion makes the check one action: the same question routes to a second, independent model, and the answers render claim-by-claim — corroborated claims aligned, divergences flagged. Consensus becomes a signal, disagreement a warning, and the trust decision gets evidence instead of vibes.",
      "interaction": "One-Tap Second Model, Claim-Level Agreement View, Divergence Flags",
      "controlMechanism": "Independent Model Routing, Aligned Claim Comparison, Consensus/Divergence Markers, Correlation Disclosure",
      "useCase": "Factual Research, High-Stakes Answers, Analysis Review",
      "useWhen": "The answer matters enough that one model's word should not be the only evidence.",
      "failureModeLabel": "Single Source",
      "dope": {
        "directability": "One tap requests the consult — no copy-pasting between tabs, no re-typing the context",
        "observability": "Agreement and divergence are visible per claim, not per answer — the exact sentence the models dispute is flagged",
        "predictability": "The comparison always renders the same way — matched claims aligned, disputes marked — so reading it becomes a habit, not an effort",
        "explainability": "The verdict states its basis (\"4 of 5 claims corroborated\") and discloses model correlation, so agreement is weighted honestly"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "A single model's confident answer has no external check — users either trust it blindly or do the verification legwork themselves across tabs.",
        "pattern": "One action routes the same question to a second, independent model and renders agreement claim-by-claim — consensus as signal, divergence as warning.",
        "whyChatBreaks": "Chat binds you to one interlocutor; a second opinion means copy-pasting context into another tab and eyeballing the diff yourself.",
        "risks": "Two models sharing training data or a provider fail the independence the pattern implies — disclose the correlation, or agreement gets overweighted.",
        "avoidWhen": "Low-stakes or subjective asks where a second answer just doubles the reading."
      },
      "examples": [
        {
          "product": "LMArena · Side-by-side",
          "company": "LMArena",
          "url": "https://lmarena.ai",
          "note": "Two models answer the same prompt side by side — the comparison surface exists, framed as model evaluation rather than answer verification."
        },
        {
          "product": "Poe · Multi-bot compare",
          "company": "Quora",
          "url": "https://poe.com",
          "note": "One question fanned out to multiple models in one interface — removes the copy-paste tax, but leaves the claim-level agreement analysis to the reader."
        },
        {
          "product": "OpenRouter · Multi-model chat",
          "company": "OpenRouter",
          "url": "https://openrouter.ai/chat",
          "note": "Parallel answers from selectable models in one chat room — the routing half of the pattern, without corroboration markers."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Second Opinion pattern?",
          "a": "The answer matters enough that one model's word should not be the only evidence."
        },
        {
          "q": "When should I avoid the Second Opinion pattern?",
          "a": "Low-stakes or subjective asks where a second answer just doubles the reading."
        },
        {
          "q": "What problem does Second Opinion solve?",
          "a": "A single model's confident answer has no external check — users either trust it blindly or do the verification legwork themselves across tabs."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat binds you to one interlocutor; a second opinion means copy-pasting context into another tab and eyeballing the diff yourself."
        }
      ],
      "related": [
        {
          "id": "citation-trail",
          "kind": "pairs-with",
          "note": "Citation Trail shows which sources back each claim; Second Opinion checks the same claims against a second model."
        },
        {
          "id": "critic-gate",
          "kind": "alternative",
          "note": "Second Opinion compares two full answers; Critic Gate has the second model return located defects that block the accept."
        },
        {
          "id": "counterfactual-probe",
          "kind": "pairs-with",
          "note": "Second Opinion varies the model; Counterfactual Probe varies the inputs and marks where the verdict flips."
        }
      ]
    },
    {
      "id": "personal-eval-set",
      "url": "https://beyondchat.design/patterns/personal-eval-set/",
      "title": "Personal Eval Set",
      "subtitle": "Your own test cases, run against every change",
      "metaphor": "Test Bench",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "Every model or prompt change is a gamble against invisible regressions — users notice breakage days later, one degraded output at a time, with no record of what \"good\" looked like. Personal Eval Set turns your own representative cases into a pinned test bench: run the suite in one click — or automatically when the model changes — and see per-case verdicts with diffs where behavior moved. The regression suite, brought to everyone who depends on a model's behavior.",
      "interaction": "Pin-as-Case, One-Click Suite Run, Per-Case Verdicts",
      "controlMechanism": "Pinned Cases With Expected Qualities, Suite Runner, Regression Diff, Case Pruning",
      "useCase": "Prompt Changes, Model Updates, Workflow Stability",
      "useWhen": "Work depends on stable model behavior and changes (model, prompt, config) need a regression check before they ship.",
      "failureModeLabel": "Invisible Regression",
      "dope": {
        "directability": "The user defines what good means — pin a case from any output, name its expected qualities, prune it when the job changes",
        "observability": "A suite run renders per-case verdicts in one view — what held, what regressed, what improved — instead of anecdotes",
        "predictability": "Changes are measured against the same fixed cases every time, so \"did it get worse?\" has a stable answer",
        "explainability": "Each failed case shows the diff against its expected qualities — the regression is demonstrated, not suspected"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "trust",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Every model or prompt change is a gamble against invisible regressions — users notice breakage days later, one degraded output at a time.",
        "pattern": "Pin your own representative cases as a test bench with expected qualities, and run the suite — one click or automatically — whenever the model, prompt, or config changes.",
        "whyChatBreaks": "Chat keeps no record of what good looked like — each conversation re-litigates quality from scratch, from memory.",
        "risks": "A stale eval set calcifies yesterday's requirements — cases need pruning and refreshing as the job evolves, or green checks mean nothing.",
        "avoidWhen": "Exploratory work with no stable definition of correct."
      },
      "examples": [
        {
          "product": "promptfoo",
          "company": "promptfoo",
          "url": "https://www.promptfoo.dev",
          "note": "Open-source eval harness: declare test cases with assertions, run them against prompt or model changes, see a pass/fail matrix — the pattern as a developer CLI/CI tool."
        },
        {
          "product": "LangSmith · Datasets & evals",
          "company": "LangChain",
          "url": "https://docs.langchain.com/langsmith/evaluation",
          "note": "Pin real production cases into datasets and score new versions against them — regression testing for LLM behavior at platform scale, developer-facing."
        },
        {
          "product": "Braintrust",
          "company": "Braintrust",
          "url": "https://www.braintrust.dev",
          "note": "Eval-first LLM engineering: side-by-side diffs of eval runs across model/prompt versions. The end-user version of this — pin-from-output, one-click suite — remains unshipped."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Personal Eval Set pattern?",
          "a": "Work depends on stable model behavior and changes (model, prompt, config) need a regression check before they ship."
        },
        {
          "q": "When should I avoid the Personal Eval Set pattern?",
          "a": "Exploratory work with no stable definition of correct."
        },
        {
          "q": "What problem does Personal Eval Set solve?",
          "a": "Every model or prompt change is a gamble against invisible regressions — users notice breakage days later, one degraded output at a time."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat keeps no record of what good looked like — each conversation re-litigates quality from scratch, from memory."
        }
      ],
      "related": [
        {
          "id": "model-changelog",
          "kind": "pairs-with",
          "note": "Model Changelog announces the model update in-product; Personal Eval Set re-runs your pinned cases and shows which held."
        },
        {
          "id": "templates",
          "kind": "pairs-with",
          "note": "Templates freeze the request; Personal Eval Set freezes the assessment."
        },
        {
          "id": "verifiable-completion",
          "kind": "pairs-with",
          "note": "Verifiable Task Completion proves one task met its declared criteria; Personal Eval Set checks the system still meets yours."
        }
      ]
    },
    {
      "id": "semantic-grid",
      "url": "https://beyondchat.design/patterns/semantic-grid/",
      "title": "Semantic Grid",
      "subtitle": "One Prompt, N Independent Runs",
      "metaphor": "Work Queue",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Ask a chat to compare six vendors on three attributes and you get eighteen facts flattened into prose — one silently missing, none traceable, and rechecking a single one costs a full regeneration. Semantic Grid makes the prompt a column definition: authored once, fanned out across rows as independent runs, each cell carrying its own source and re-runnable on its own. Where Parallel Alternatives is N variants of one task, this is one task over N subjects.",
      "interaction": "Column Definition, Cell Inspect, Per-Cell Re-run",
      "controlMechanism": "Editable Column Prompts, Per-Cell Provenance, Single-Cell Retry, Run Counter",
      "useCase": "Vendor Comparison, Literature Review, Lead Enrichment, Competitive Research",
      "useWhen": null,
      "failureModeLabel": null,
      "dope": {
        "directability": "Edit a column prompt and only that column re-runs; add a row and only its cells fill — the unit of work is the cell, not the table",
        "observability": "Every cell carries its own source chip and confidence dot, and the counter states the run exactly — 18 cells · 3 low-confidence · 1 re-run · 4,210 tokens",
        "predictability": "The schema is declared before anything runs: N rows × M column prompts is N×M cells, each answering the same stated question",
        "explainability": "Open any cell for the snippet that produced it, with its own tokens and latency — provenance is per answer, not per document"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "output",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Comparing many things across many attributes collapses into prose where no fact can be traced, counted, or rechecked on its own.",
        "pattern": "Make the prompt a column definition, fan it out across the rows as independent runs, and give every cell its own source and its own retry.",
        "whyChatBreaks": "A transcript holds one answer per turn, so eighteen facts arrive as a single blob and rechecking any one of them costs a full regeneration of the other seventeen.",
        "risks": "A grid of confident-looking cells invites reading it as a dataset — without per-cell provenance and a visible low-confidence count it industrialises unverified claims.",
        "avoidWhen": "The question has one subject: a single deep answer beats a one-row table wearing a schema."
      },
      "examples": [
        {
          "product": "Elicit"
        },
        {
          "product": "Clay"
        },
        {
          "product": "Airtable AI Fields"
        }
      ],
      "faq": [
        {
          "q": "When should I avoid the Semantic Grid pattern?",
          "a": "The question has one subject: a single deep answer beats a one-row table wearing a schema."
        },
        {
          "q": "What problem does Semantic Grid solve?",
          "a": "Comparing many things across many attributes collapses into prose where no fact can be traced, counted, or rechecked on its own."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A transcript holds one answer per turn, so eighteen facts arrive as a single blob and rechecking any one of them costs a full regeneration of the other seventeen."
        }
      ],
      "related": [
        {
          "id": "parallel-alternatives",
          "kind": "extends",
          "note": "Semantic Grid takes the parallel runs of Parallel Alternatives and aims them at N subjects, not N variants of one task."
        },
        {
          "id": "templates",
          "kind": "extends",
          "note": "A column prompt works like a template: written once, run for every row, with only the row's subject changing."
        },
        {
          "id": "compute-budget",
          "kind": "pairs-with",
          "note": "A grid is rows × columns runs; Compute Budget prices it before it fans out and meters every cell you re-run."
        }
      ]
    },
    {
      "id": "read-along",
      "url": "https://beyondchat.design/patterns/read-along/",
      "title": "Read-Along",
      "subtitle": "A Playhead for Generated Speech",
      "metaphor": "Playhead",
      "category": {
        "id": "visual-generative",
        "label": "Visual & Generative"
      },
      "description": "Spoken output is bound word by word to the visible text, which makes the answer addressable in time: click a word to seek to it, drag a phrase to quote it, and stop the assistant anchored to a span rather than to a moment. Every other span pattern here — Citation Trail, AI Provenance, Bias Flag — annotates a static artifact the reader scans at their own pace; this is the only one with a clock. The binding itself is mature (Speechify, ElevenLabs Reader, Apple Books); the half that matters, interrupting at a phrase rather than at a timestamp, ships nowhere yet.",
      "interaction": "Click-to-Seek, Phrase Select, Anchored Interrupt",
      "controlMechanism": "Word-Level Binding, Scrub Bar, Quote-This-Span, Interrupt-Here",
      "useCase": "Voice Assistants, Audio Overviews, Read-Aloud Documents, Meeting Recaps",
      "useWhen": null,
      "failureModeLabel": null,
      "dope": {
        "directability": "Click any word to move the playhead there, or select a phrase and stop the assistant on that span — correction lands where the error is, not where the clock happened to be",
        "observability": "The spoken word is the highlighted word, with its exact timestamp on screen, so what the system is saying and where it is are never inferred from audio alone",
        "predictability": "Every word carries a start and end time before playback, so seeking is exact and the same span is addressable twice",
        "explainability": "An interrupt reports the span it caught — the sentence, not the millisecond — so the assistant can say what it thinks you objected to"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "output",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Spoken output is a stream you can only stop wholesale, so objecting to one sentence means killing the whole answer and starting the ask again.",
        "pattern": "Bind the speech to the visible text word by word, so the answer becomes addressable in time — seek to a word, quote a phrase, and interrupt anchored to a span.",
        "whyChatBreaks": "A transcript has no clock: it can show what was said but not where the system is in saying it, so there is nothing to point at while it speaks.",
        "risks": "Stopping at karaoke is the trap — word highlighting alone is a decade-old reading feature, and without seek, quote and span-anchored interrupt the binding buys nothing.",
        "avoidWhen": "The answer is short enough to hear out; a playhead over two sentences is ceremony."
      },
      "examples": [
        {
          "product": "ElevenLabs Reader"
        },
        {
          "product": "Speechify"
        },
        {
          "product": "NotebookLM Audio Overview"
        }
      ],
      "faq": [
        {
          "q": "When should I avoid the Read-Along pattern?",
          "a": "The answer is short enough to hear out; a playhead over two sentences is ceremony."
        },
        {
          "q": "What problem does Read-Along solve?",
          "a": "Spoken output is a stream you can only stop wholesale, so objecting to one sentence means killing the whole answer and starting the ask again."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A transcript has no clock: it can show what was said but not where the system is in saying it, so there is nothing to point at while it speaks."
        }
      ],
      "related": [
        {
          "id": "machine-state",
          "kind": "pairs-with",
          "note": "Machine State, Rendered shows whether it is safe to speak; Read-Along shows which word the voice is on."
        },
        {
          "id": "mid-stream-steering",
          "kind": "extends",
          "note": "Read-Along takes Mid-Stream Steering to spoken answers, anchoring the correction to the disputed phrase rather than a timestamp."
        },
        {
          "id": "select-transform",
          "kind": "alternative",
          "note": "Select & Transform points at static text to rewrite it; Read-Along points at a spoken word to seek, quote or interrupt there."
        }
      ]
    },
    {
      "id": "machine-state",
      "url": "https://beyondchat.design/patterns/machine-state/",
      "title": "Machine State, Rendered",
      "subtitle": "The Channel That Is Left When There Is No Transcript",
      "metaphor": "Light Ring",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "When the interface has no transcript to read, the system’s state has to live in a non-textual, pre-attentive channel — a glyph, a ring, a colour, a motion. Stage Tracker answers how far along a task is; this answers whether it is safe to speak now, on a sub-second clock instead of a minutes-long one. The states that earn it are the ones a transcript cannot express: heard-you-but-still-listening, barge-in accepted, muted, both-at-once. Mature in the field since Alexa’s light ring in 2014 — novel only to this archive.",
      "interaction": "Hold-to-Talk, Barge-In, Mute",
      "controlMechanism": "State Glyph, Named Channel States, Timed Event Log",
      "useCase": "Voice Assistants, Ambient Devices, Hands-Free Interfaces, Live Agents",
      "useWhen": null,
      "failureModeLabel": null,
      "dope": {
        "observability": "A closed set of named states renders continuously in a channel that needs no reading, so turn ownership is visible at a glance rather than inferred from silence",
        "predictability": "The states are declared and finite, and each one names the machine event that produces it — endpoint detected, first token, buffer playing",
        "explainability": "An event log timestamps every transition beside the glyph, so a state that looks wrong can be traced to the signal that caused it",
        "directability": "Barge-in is a first-class state rather than an error: speaking over the assistant produces an acknowledged transition, not a collision"
      },
      "tags": {
        "primaryDope": "observability",
        "lifecycleStage": "processing",
        "agentReady": false,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Without a transcript there is no way to tell whether the system is listening, thinking or about to speak, so people talk over it and lose their input.",
        "pattern": "Render a small closed set of channel states in a non-textual, pre-attentive surface, and timestamp every transition beside it.",
        "whyChatBreaks": "Chat resolves turn-taking with a visible message boundary; strip the transcript and that boundary disappears, leaving silence to carry the whole signal.",
        "risks": "A glyph that only changes colour is a mood ring — if every state maps onto a phase label a text tracker could print, this is a progress display wearing a face.",
        "avoidWhen": "The interface already shows a transcript and turn boundaries are legible from the messages themselves."
      },
      "examples": [
        {
          "product": "Amazon Alexa light ring"
        },
        {
          "product": "ChatGPT Advanced Voice Mode"
        },
        {
          "product": "Gemini Live"
        }
      ],
      "faq": [
        {
          "q": "When should I avoid the Machine State, Rendered pattern?",
          "a": "The interface already shows a transcript and turn boundaries are legible from the messages themselves."
        },
        {
          "q": "What problem does Machine State, Rendered solve?",
          "a": "Without a transcript there is no way to tell whether the system is listening, thinking or about to speak, so people talk over it and lose their input."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat resolves turn-taking with a visible message boundary; strip the transcript and that boundary disappears, leaving silence to carry the whole signal."
        }
      ],
      "related": [
        {
          "id": "stage-tracker",
          "kind": "alternative",
          "note": "Stage Tracker tracks a long task's phases over minutes; Machine State, Rendered shows whether it is safe to speak right now."
        },
        {
          "id": "read-along",
          "kind": "pairs-with",
          "note": "Machine State, Rendered says whose turn it is; Read-Along adds which word of the spoken answer is playing."
        },
        {
          "id": "mid-stream-steering",
          "kind": "pairs-with",
          "note": "Mid-Stream Steering redirects an answer while it runs; Machine State, Rendered shows the barge-in was accepted, not lost."
        }
      ]
    },
    {
      "id": "critic-gate",
      "url": "https://beyondchat.design/patterns/critic-gate/",
      "title": "Critic Gate",
      "subtitle": "Located Findings Before the Accept",
      "metaphor": "Code Review",
      "category": {
        "id": "trust-verification",
        "label": "Trust & Verification"
      },
      "description": "A second model reviews the first model’s work and returns findings anchored to specific spans of the output — each with a severity and a written rationale — sitting in front of the accept action a human still has to take. Unlike Second Opinion it produces no rival answer at all; consensus is not the signal, located defects are. Unlike AI Provenance, which marks spans by authorship, it marks them by defect. The dismissal rate is shown on purpose: a critic nobody trusts gets rubber-stamped, and that has to be measurable.",
      "interaction": "Finding Review, Per-Item Dismiss, Blocked Accept",
      "controlMechanism": "Span-Anchored Findings, Severity, Written Rationale, Dismissal Rate",
      "useCase": "AI-Written Code, Generated Policy, Drafted Contracts, Agent Output Review",
      "useWhen": null,
      "failureModeLabel": null,
      "dope": {
        "explainability": "Each finding names where it lands, how severe it is, and why — a written rationale on a span, not a score on a document",
        "observability": "The gate states what is unresolved before the accept is available, and counts dismissals so a noisy critic shows up as a number rather than a feeling",
        "directability": "Findings are accepted or dismissed one at a time, so a reviewer can take the two that matter without swallowing or discarding the set",
        "predictability": "Accept stays blocked until every finding is resolved or explicitly dismissed — the gate’s condition is stated, not implied"
      },
      "tags": {
        "primaryDope": "explainability",
        "lifecycleStage": "refinement",
        "agentReady": true,
        "researchStatus": "emerging"
      },
      "framing": {
        "problem": "Generated work arrives labelled done, so the only options are to accept all of it or read all of it, and under time pressure everyone accepts.",
        "pattern": "Put a second model between generation and acceptance, and have it return findings anchored to spans — severity, rationale, suggested fix — that block the accept until each is resolved or dismissed.",
        "whyChatBreaks": "A naive pipeline treats generation as completion; nothing sits between the output and the merge button, and no record exists of what was checked.",
        "risks": "A critic that flags everything gets rubber-stamped — which is why the dismissal rate has to be visible: an unread gate is worse than no gate, because it looks like review.",
        "avoidWhen": "The output is low-stakes or trivially reversible; a blocking gate on a throwaway draft is friction with no payoff."
      },
      "examples": [
        {
          "product": "CodeRabbit"
        },
        {
          "product": "Cursor Bugbot"
        },
        {
          "product": "GitHub Copilot code review"
        }
      ],
      "faq": [
        {
          "q": "When should I avoid the Critic Gate pattern?",
          "a": "The output is low-stakes or trivially reversible; a blocking gate on a throwaway draft is friction with no payoff."
        },
        {
          "q": "What problem does Critic Gate solve?",
          "a": "Generated work arrives labelled done, so the only options are to accept all of it or read all of it, and under time pressure everyone accepts."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "A naive pipeline treats generation as completion; nothing sits between the output and the merge button, and no record exists of what was checked."
        }
      ],
      "related": [
        {
          "id": "second-opinion",
          "kind": "alternative",
          "note": "Second Opinion asks the second model for a rival answer and weighs agreement; Critic Gate asks it for located defects."
        },
        {
          "id": "approval-gates",
          "kind": "extends",
          "note": "Approval Gates pause for human sign-off; Critic Gate adds span-anchored findings from a second model that must be cleared first."
        },
        {
          "id": "ai-provenance",
          "kind": "pairs-with",
          "note": "AI Provenance marks spans by who drafted them and whether a human has reviewed them; Critic Gate marks spans by defect."
        }
      ]
    },
    {
      "id": "clarifying-questions",
      "url": "https://beyondchat.design/patterns/clarifying-questions/",
      "title": "Clarifying Questions",
      "subtitle": "Ask in options, not in paragraphs",
      "metaphor": "Questionnaire",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "An agent that needs a decision either guesses or asks in prose — four numbered questions the user answers in one paragraph that quietly leaves one out. Clarifying Questions gives every open decision its own card: two to four options, each with its consequence in one line, one marked as the recommendation, a free-text escape, and a skip that hands the call back to the agent on a stated default. Unlike Disambiguation Branch, which offers competing readings of the whole request, these are independent decisions the request left open; unlike Approval Gates, which asks yes or no on an action already chosen, they ask which action — mid-run, once the agent has read enough to know what is open.",
      "interaction": "Option Pick, Stepwise Answer, Skip to Default",
      "controlMechanism": "Option Cards, Recommended Default, Free-Text Escape, Question Stepper",
      "useCase": "Agent Kick-off, Mid-Run Decisions, Spec Gathering",
      "useWhen": "An agent reaches decisions it cannot infer, and a wrong guess costs a rerun or a revert.",
      "failureModeLabel": "Questions as Prose",
      "dope": {
        "directability": "Each decision is answered on its own card — pick an option, write your own, or skip — instead of inside one reply paragraph",
        "observability": "A stepper shows how many decisions are open and which are answered: 2 of 4, not a wall of numbered prose",
        "predictability": "Every question names its recommended default, so a skip is a known outcome rather than a silent guess",
        "explainability": "Each option carries its trade-off in one line, so the choice is made against its consequence, not its label"
      },
      "tags": {
        "primaryDope": "directability",
        "lifecycleStage": "input",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "An agent that needs a decision either guesses silently or asks in prose, and the user answers four numbered questions in one paragraph that leaves one out — which the agent then fills with a guess.",
        "pattern": "Give every open decision its own card with two to four consequence-labelled options, a recommended default, a free-text escape and a skip.",
        "whyChatBreaks": "Chat asks in paragraphs and receives paragraphs, so the answer has to be parsed back into decisions — and a question the user forgot looks exactly like one they chose not to answer.",
        "risks": "Asking what the agent could have inferred turns clarification into a form to fill in, and a recommendation that is always accepted becomes a rubber stamp.",
        "avoidWhen": "Running and redoing is cheaper than answering, or the open decision is one the user has no opinion on."
      },
      "examples": [
        {
          "product": "Claude Code AskUserQuestion",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/tools-reference",
          "note": "The agent asks through a tool, not in prose: multiple-choice questions when it needs a decision, answered by picking an option or typing into an Other row. The documented detail closest to a Skip is an opt-in auto-continue timeout: an unanswered question closes, submits whatever was already selected, and tells Claude you may be away, so it proceeds on its own judgment and can re-ask later. The fallback is Claude’s judgment, not a default named in advance."
        },
        {
          "product": "OpenAI Codex",
          "company": "OpenAI",
          "url": "https://learn.chatgpt.com/docs/codex/cli",
          "note": "Captured Sep 2026: asked for decisions it could not infer, Codex docks a Question tray above the composer — “1 of 3” with arrows, numbered options that each carry their consequence, a free-text “Or write your own response”, Skip and Next. The same card shape as Claude Code; the questions also stay in the transcript as plain lines."
        },
        {
          "product": "Cursor 2.1 Clarifying Questions",
          "company": "Cursor",
          "url": "https://cursor.com",
          "note": "Nov 2025: Plan Mode asks multi-question clarification with pickable answers before it writes the editable Markdown plan. Moved here from Disambiguation Branch — it asks independent questions, it does not offer competing readings."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Clarifying Questions pattern?",
          "a": "An agent reaches decisions it cannot infer, and a wrong guess costs a rerun or a revert."
        },
        {
          "q": "When should I avoid the Clarifying Questions pattern?",
          "a": "Running and redoing is cheaper than answering, or the open decision is one the user has no opinion on."
        },
        {
          "q": "What problem does Clarifying Questions solve?",
          "a": "An agent that needs a decision either guesses silently or asks in prose, and the user answers four numbered questions in one paragraph that leaves one out — which the agent then fills with a guess."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat asks in paragraphs and receives paragraphs, so the answer has to be parsed back into decisions — and a question the user forgot looks exactly like one they chose not to answer."
        }
      ],
      "related": [
        {
          "id": "disambiguation-branch",
          "kind": "alternative",
          "note": "Disambiguation Branch lets you pick one reading of the whole request; Clarifying Questions gives each open decision its own card."
        },
        {
          "id": "chat-off-ramp",
          "kind": "extends",
          "note": "Clarifying Questions takes Chat Off-Ramp's enumerated controls to the agent's own questions and adds a recommended default."
        },
        {
          "id": "approval-gates",
          "kind": "pairs-with",
          "note": "Clarifying Questions asks which action to take; Approval Gates then pauses for your yes or no before that action runs."
        }
      ]
    },
    {
      "id": "follow-up-queue",
      "url": "https://beyondchat.design/patterns/follow-up-queue/",
      "title": "Follow-up Queue",
      "subtitle": "Line up the next ask without stopping this one",
      "metaphor": "Outbox",
      "category": {
        "id": "agent-workflow",
        "label": "Agent Workflow"
      },
      "description": "While an agent works, chat gives the next thought two bad options: a locked composer, or a send that lands inside the run it was meant to follow. Follow-up Queue stacks messages above the composer as editable cards that fire in order when the run ends — each with two verbs, after (stay queued) and now (steer the running turn). Mid-Stream Steering is the now half; this is the after. The queue also has to be honest about time: a message written against a state the run has since changed gets flagged stale instead of firing blind, and the queue holds while the agent is waiting on a question.",
      "interaction": "Queue While Running, Reorder, Promote to Steer",
      "controlMechanism": "Queued Message Cards, Send-Now (Steer), Edit / Delete / Reorder, Stale Flag, Hold on Question",
      "useCase": "Long Agent Runs, Coding Agents, Batched Follow-ups",
      "useWhen": "Agent runs last minutes and users think of the next task before the current one has finished.",
      "failureModeLabel": "Send Means Now",
      "dope": {
        "directability": "Edit, reorder or delete any queued message, or promote it to steer the running turn with one click",
        "observability": "The queue sits above the composer with its order and count visible, so what runs next is never a guess",
        "predictability": "Queued messages fire only when the current run ends, in the order shown — typing never interrupts the work in flight",
        "explainability": "A queued message the run has overtaken is flagged with the reason — “cart snapshot updated at step 4” — instead of firing blind"
      },
      "tags": {
        "primaryDope": "predictability",
        "lifecycleStage": "processing",
        "agentReady": true,
        "researchStatus": "mature"
      },
      "framing": {
        "problem": "While an agent works the next thought has nowhere to go — the composer is locked or sending interrupts the run, so the user waits and holds it in their head.",
        "pattern": "Stack follow-ups as editable cards above the composer that fire in order when the run ends, each one promotable to steer the running turn now.",
        "whyChatBreaks": "Chat has one verb, send, and one timeline, so a message typed during a run either waits outside the product or lands inside the work it was meant to follow.",
        "risks": "A queue written against a state the run then changes fires stale instructions — fix the test, after the test is fixed — unless each item is re-checked before it sends.",
        "avoidWhen": "Runs finish in seconds, or every follow-up depends on reading the result first."
      },
      "examples": [
        {
          "product": "OpenAI Codex queued messages",
          "company": "OpenAI",
          "url": "https://learn.chatgpt.com/docs/codex/cli",
          "note": "Captured Sep 2026: a message typed while the agent works parks as a card above the composer with ↳ Steer, delete and a menu — queue by default, steer on demand. Nothing interrupts the run until you press Steer."
        },
        {
          "product": "Cursor queued messages",
          "company": "Cursor",
          "url": "https://cursor.com/changelog/1-2",
          "note": "Cursor 1.2 (July 2025): follow-ups typed while the agent works wait until the current task is done; once queued they can be reordered, or started without waiting."
        },
        {
          "product": "Claude Code message queue",
          "company": "Anthropic",
          "url": "https://code.claude.com/docs/en/interactive-mode",
          "note": "Queued entries are listed above the input box. The documented split is the interesting part: a queued message reaches Claude as soon as the running tool calls finish, inside the same turn, while commands wait for the turn to end. Ctrl+Enter sends the queue now; Up takes it back."
        }
      ],
      "faq": [
        {
          "q": "When should I use the Follow-up Queue pattern?",
          "a": "Agent runs last minutes and users think of the next task before the current one has finished."
        },
        {
          "q": "When should I avoid the Follow-up Queue pattern?",
          "a": "Runs finish in seconds, or every follow-up depends on reading the result first."
        },
        {
          "q": "What problem does Follow-up Queue solve?",
          "a": "While an agent works the next thought has nowhere to go — the composer is locked or sending interrupts the run, so the user waits and holds it in their head."
        },
        {
          "q": "Why is chat the wrong fit for this?",
          "a": "Chat has one verb, send, and one timeline, so a message typed during a run either waits outside the product or lands inside the work it was meant to follow."
        }
      ],
      "related": [
        {
          "id": "mid-stream-steering",
          "kind": "pairs-with",
          "note": "Mid-Stream Steering is the now, Follow-up Queue the after; one click promotes a queued card to steer the running turn."
        },
        {
          "id": "live-plan-surface",
          "kind": "alternative",
          "note": "Live Plan Surface inserts the new ask as a step in the running plan; Follow-up Queue holds it as a message until the run ends."
        },
        {
          "id": "clarifying-questions",
          "kind": "pairs-with",
          "note": "Follow-up Queue holds while the agent waits on a Clarifying Questions card; your answer goes first, the queued asks after."
        }
      ]
    }
  ]
}