showcase/integrations/mastra/qa/a2ui-recovery.md
/demos/a2ui-recovery on the dashboard hostOPENAI_API_KEY set (or aimock routing for replay)@ag-ui/mastra ≥ 1.1.0 (exports getA2UITools via the
@ag-ui/mastra/a2ui subpath) + the @copilotkit A2UI renderer (the
building/retrying/failed lifecycle rendering)a2uiRecoveryAgent OWNS generate_a2ui via
getA2UITools({ model, defaultCatalogId, recovery }), whose body runs the
forced render_a2ui sub-agent + the toolkit validate→retry loop +
a2ui_recovery_exhausted hard-fail envelope. The dedicated route
(src/app/api/copilotkit-a2ui-recovery/route.ts) sets a2ui.injectA2UITool = false so the runtime does not double-inject (mirrors the langgraph/ADK
backend-owned siblings, not the strands auto-inject path)catalogId: "declarative-gen-ui-catalog") — no new components/demos/a2ui-recovery; page renders within 3s, a single
centered CopilotChat pane (max-width ~896px, rounded-2xl, full-height)generate_a2ui; the first
inner render is structurally invalid, the loop retries, and a VALID surface
paints (a Column with 2 Metric tiles: "Quarterly Revenue", "Win Rate")declarative-metric tiles)showcase/aimock/d6/mastra/a2ui-recovery.json — HEAL uses
sequenceIndex 0 (invalid) → 1 (valid); EXHAUST is invalid on every attempt.
Pill prompts are unique per framework so the context-less inner render fixtures
don't collide across integrations.