[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openai-dashboard-expert":3,"mdc-t088xd-key":33,"related-org-openai-dashboard-expert":2945,"related-repo-openai-dashboard-expert":3152},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"dashboard-expert","build and manage Mixpanel dashboards","Full CRUD and analysis for Mixpanel dashboards. Use when the user asks to build, create, analyze, read, understand, explain, modify, update, enhance, or manage dashboards, or asks about dashboard layout, text cards, or report arrangement. Covers dashboard analysis (read + understand existing), creation (new builds), modification (update existing), and explanation (data-driven annotation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"openai","OpenAI","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenai.png",[12,16,19],{"name":13,"slug":14,"type":15},"Dashboards","dashboards","tag",{"name":17,"slug":18,"type":15},"Data Visualization","data-visualization",{"name":20,"slug":21,"type":15},"Analytics","analytics",3992,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins","2026-06-30T19:00:57.102",null,465,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"OpenAI Plugins","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fmixpanel-headless\u002Fskills\u002Fdashboard-expert","---\nname: dashboard-expert\ndescription: >-\n  Full CRUD and analysis for Mixpanel dashboards. Use when the user asks to\n  build, create, analyze, read, understand, explain, modify, update, enhance,\n  or manage dashboards, or asks about dashboard layout, text cards, or report\n  arrangement. Covers dashboard analysis (read + understand existing), creation\n  (new builds), modification (update existing), and explanation (data-driven\n  annotation).\nallowed-tools: Bash Read Write\n---\n\n# Dashboard Expert\n\nAnalyze, build, modify, and explain Mixpanel dashboards. Four modes — pick the one matching the user's intent.\n\n## Mode Selection\n\n| User intent | Mode | Key actions |\n|---|---|---|\n| \"analyze\u002Funderstand\u002Fread\u002Fexplore dashboard\" | **Analyze** | Read structure, execute reports, summarize |\n| \"build\u002Fcreate\u002Fmake a new dashboard\" | **Build** | Investigate data → plan → create with layout |\n| \"modify\u002Fupdate\u002Fadd to\u002Ffix\u002Fimprove dashboard\" | **Modify** | Read current state → plan changes → execute |\n| \"explain\u002Fannotate\u002Fadd insights to dashboard\" | **Explain** | Analyze → generate data-driven text cards |\n\n## Quick Start: Analyze an Existing Dashboard\n\n```python\nimport json, re\nimport mixpanel_headless as mp\n\nws = mp.Workspace()\ndash = ws.get_dashboard(DASHBOARD_ID)\nlayout, contents = dash.layout, dash.contents\n\n# Extract structure: rows → cells → content items\nfor row_id in layout[\"order\"]:\n    row = layout[\"rows\"][row_id]\n    for cell in row[\"cells\"]:\n        cid, ctype = str(cell[\"content_id\"]), cell[\"content_type\"]\n        if ctype in (\"report\", \"report-link\"):\n            info = contents[\"report\"][cid]\n            print(f\"  [{cell['width']}w] {info['name']} ({info['type']}) {'[linked]' if ctype == 'report-link' else ''}\")\n        elif ctype == \"text\":\n            md = contents[\"text\"][cid].get(\"markdown\", \"\")\n            is_header = bool(re.search(r'\u003Ch2[\\s>]', md, re.I))\n            print(f\"  [{cell['width']}w] TEXT {'[SECTION]' if is_header else ''}: {md[:60]}...\")\n\n# Execute each report → DataFrame\nfor cid, info in contents.get(\"report\", {}).items():\n    btype, bid = info[\"type\"], info[\"id\"]\n    if btype == \"flows\":\n        result = ws.query_saved_flows(bid)\n    else:\n        result = ws.query_saved_report(bid, bookmark_type=btype)\n    df = result.df\n    print(f\"{info['name']}: {len(df)} rows, columns={list(df.columns)}\")\n```\n\n## Quick Start: Build a New Dashboard\n\n```python\nfrom mixpanel_headless.types import CreateDashboardParams, DashboardRow, DashboardRowContent\nimport json\n\nws = mp.Workspace()\ndau = ws.query(\"Login\", math=\"dau\", last=90)\n\ndef text(html):\n    return DashboardRowContent(content_type=\"text\", content_params={\"markdown\": html})\n\ndef report(name, btype, result):\n    return DashboardRowContent(content_type=\"report\", content_params={\n        \"bookmark\": {\"name\": name, \"type\": btype, \"params\": json.dumps(result.params)}})\n\ndashboard = ws.create_dashboard(CreateDashboardParams(\n    title=\"Product Health\", description=\"Core metrics.\",\n    rows=[\n        DashboardRow(contents=[text(\"\u003Ch2>Product Health\u003C\u002Fh2>\u003Cp>Core metrics.\u003C\u002Fp>\")]),\n        DashboardRow(contents=[report(\"DAU (90d)\", \"insights\", dau)]),\n    ],\n))\nws.pin_dashboard(dashboard.id)  # Make visible to team\n```\n\n---\n\n## Mode: Analyze\n\nRead existing dashboards, execute their reports, and synthesize understanding.\n\n### Phase A1: Read Dashboard Structure\n\n```python\ndash = ws.get_dashboard(dashboard_id)\nlayout, contents = dash.layout, dash.contents\n```\n\nParse the response into a structured representation:\n\n- **`layout[\"order\"]`** — ordered list of row IDs\n- **`layout[\"rows\"][row_id][\"cells\"]`** — cells with `content_id`, `content_type`, `width`\n- **`contents[\"report\"][str(content_id)]`** — report metadata: `id` (bookmark_id), `name`, `type`, `params`, `description`\n- **`contents[\"text\"][str(content_id)]`** — text card: `markdown`\n\n**Classify each cell:**\n- `content_type == \"report\"` → owned, editable\n- `content_type == \"report-link\"` → linked from another dashboard, read-only\n- `content_type == \"text\"` → text card; detect section headers via `re.search(r'\u003Ch2[\\s>]', md, re.I)`\n\n**Build a mental model:** Group reports by section (text cards with `\u003Ch2>` tags delimit sections). Note each report's chart type, width, and position.\n\n### Phase A2: Extract Report Details\n\nFor deeper understanding, fetch full bookmark params:\n\n```python\nbookmark = ws.get_bookmark(bookmark_id)\nparams = bookmark.params  # Full query definition dict\n```\n\nKey fields in params (Insights format):\n- `params[\"sections\"][\"show\"]` — metrics with event names and math type\n- `params[\"sections\"][\"group\"]` — breakdown properties\n- `params[\"sections\"][\"filter\"]` — active filters\n- `params[\"sections\"][\"time\"]` — date range\n- `params[\"displayOptions\"][\"chartType\"]` — visualization type\n\nNote: `params` in `contents[\"report\"][id]` may be a JSON string — parse with `json.loads()` if needed.\n\n### Phase A3: Execute and Summarize\n\nExecute each report to get live data:\n\n```python\nfor cid, info in contents.get(\"report\", {}).items():\n    bid, btype = info[\"id\"], info[\"type\"]\n    if btype == \"flows\":\n        result = ws.query_saved_flows(bid)\n    else:\n        result = ws.query_saved_report(bid, bookmark_type=btype)\n    df = result.df\n```\n\n**Summarize by report type:**\n\n| Type | Key metrics to extract |\n|---|---|\n| insights | Total, average, latest value, min, max, trend direction |\n| funnels | Step names, counts, per-step and overall conversion rate |\n| retention | Day 1, Day 7, Day 30 rates; stabilization point |\n| flows | Top paths, conversion rate, drop-off points |\n\n**Cross-correlate across reports:** Look for relationships — DAU trends vs. retention, funnel drop-off vs. feature adoption.\n\n### Phase A4: Present Analysis\n\nStructure findings as:\n1. **Dashboard overview** — title, purpose, section count, report count\n2. **Section-by-section breakdown** — what each section measures, key findings\n3. **Cross-metric insights** — correlations, anomalies, patterns\n4. **Suggestions** — missing metrics, better chart types, layout improvements\n\n### Multi-Dashboard Analysis\n\nWhen analyzing multiple dashboards, build a unified picture:\n\n```python\ndashboard_ids = [1001, 1002, 1003]\nall_data = {}\nfor did in dashboard_ids:\n    dash = ws.get_dashboard(did)\n    for cid, info in dash.contents.get(\"report\", {}).items():\n        result = ws.query_saved_report(info[\"id\"], bookmark_type=info[\"type\"])\n        all_data[f\"{dash.title}\u002F{info['name']}\"] = result.df\n# Cross-dashboard: join DataFrames on date index, compute correlations\n```\n\n---\n\n## Mode: Build\n\nCreate new dashboards from scratch. Five phases.\n\n### Phase B1: Investigate\n\nBefore building, discover the data. Never build reports for events with zero volume.\n\n```python\nws = mp.Workspace()\ntop = ws.top_events(limit=15)\nfor t in top:\n    print(f\"{t.event}: {t.count:,} ({t.percent_change:+.1%})\")\n\n# Validate candidate events\nfor event in candidate_events:\n    result = ws.query(event, from_date=\"2025-01-01\", to_date=\"2025-03-31\")\n    print(f\"{event}: {result.df['count'].sum():,.0f} total\")\n\n# Explore properties for breakdowns\nprops = ws.properties(event=\"key_event\")\nvalues = ws.property_values(event=\"key_event\", property=\"platform\", limit=20)\n```\n\n### Phase B2: Plan Structure\n\nPresent a proposed structure before building. Choose a template from `references\u002Fdashboard-templates.md`.\n\n**A plan includes:** title + description, sections with text card headers, reports per section with chart type, grid layout.\n\n**Text cards use HTML** (not markdown). Every dashboard must have an intro text card and section headers.\n\n**Allowed HTML tags:** `\u003Ch1>`, `\u003Ch2>`, `\u003Ch3>`, `\u003Cp>`, `\u003Cstrong>`, `\u003Cem>`, `\u003Cu>`, `\u003Cs>`, `\u003Cmark>`, `\u003Ccode>`, `\u003Cblockquote>`, `\u003Chr>`, `\u003Cbr>`, `\u003Cul>`, `\u003Col>`, `\u003Cli>`, `\u003Ca href=\"...\">`\n\n**Forbidden (stripped):** `\u003Cdiv>`, `\u003Cspan>`, `\u003Cb>` (use `\u003Cstrong>`), `\u003Ci>` (use `\u003Cem>`), `\u003Cimg>`, `\u003Ctable>`\n\n**Critical:** Strip `\\n` and collapse whitespace from HTML before sending. Each element renders as its own line.\n\n**Text card patterns:**\n```\nIntro:     \u003Ch2>Dashboard Title\u003C\u002Fh2>\u003Cp>What and why. Time period: last 90 days.\u003C\u002Fp>\nSection:   \u003Ch2>Acquisition\u003C\u002Fh2>\u003Cp>How users discover and sign up.\u003C\u002Fp>\nExplainer: \u003Cp>^ Signup conversion is \u003Cstrong>23.4%\u003C\u002Fstrong>, up 2.1pp.\u003C\u002Fp>\n```\n\n### Phase B3: Query and Build\n\nQuery each metric, verify data, then create with layout in one call.\n\n```python\ndef text(html):\n    return DashboardRowContent(content_type=\"text\", content_params={\"markdown\": html})\n\ndef report(name, btype, result, description=None):\n    params = {\"bookmark\": {\"name\": name, \"type\": btype, \"params\": json.dumps(result.params)}}\n    if description:\n        params[\"bookmark\"][\"description\"] = description\n    return DashboardRowContent(content_type=\"report\", content_params=params)\n\ndashboard = ws.create_dashboard(CreateDashboardParams(\n    title=\"Product Health Dashboard\",\n    description=\"Key metrics for product health monitoring.\",\n    rows=[\n        DashboardRow(contents=[text(\"\u003Ch2>Product Health\u003C\u002Fh2>\u003Cp>Updated daily.\u003C\u002Fp>\")]),\n        DashboardRow(contents=[\n            report(\"DAU (90d)\", \"insights\", dau),\n            report(\"Signups (90d)\", \"insights\", signups),\n            report(\"Revenue (90d)\", \"insights\", revenue),\n        ]),\n        DashboardRow(contents=[text(\"\u003Ch2>Conversion\u003C\u002Fh2>\u003Cp>Key funnels.\u003C\u002Fp>\")]),\n        DashboardRow(contents=[report(\"Signup Funnel\", \"funnels\", funnel)]),\n    ],\n))\n```\n\n**On report failure**, substitute a fallback text card:\n```python\ntry:\n    result = ws.query(event, math=\"total\", last=90)\n    row_items.append(report(f\"{event} Trend\", \"insights\", result))\nexcept Exception as e:\n    row_items.append(text(f\"\u003Cp>\u003Cstrong>Failed:\u003C\u002Fstrong> {event} — {e}\u003C\u002Fp>\"))\n```\n\n### Phase B4: Enhance\n\n- **Pin for team visibility:** `ws.pin_dashboard(dashboard.id)` — dashboards are invisible by default\n- **Favorite for personal use:** `ws.favorite_dashboard(dashboard.id)`\n- **Add explainer cards:** see Mode: Explain\n- **Adjust heights:** see `references\u002Fdashboard-reference.md` Section 3.4\n\n### Phase B5: Verify\n\nOpen the dashboard and confirm all reports render with data, text cards display correctly, and layout matches the plan.\n\n---\n\n## Mode: Modify\n\nUpdate existing dashboards. Read first, then apply changes in the correct order.\n\n### Phase M1: Read Current State\n\nUse Analyze Phase A1-A2 to understand the dashboard's structure. Present to user before making changes.\n\n### Phase M2: Plan Changes\n\nClassify each change and plan execution order. Operations **must** follow this sequence:\n\n1. **Metadata** (title\u002Fdescription) — standalone PATCH\n2. **Cell creates** — add new content first\n3. **Row reorder** (`rows_order`) — after creates so temp IDs resolve\n4. **Cell updates** — modify existing content\n5. **Cell deletes** — remove content\n6. **Row deletes** — remove entire rows last\n\n### Phase M3: Execute Changes\n\n**Adding content to a specific existing row** — send `content` AND `layout` together:\n\n```python\nimport copy\ndash = ws.get_dashboard(dashboard_id)\nlayout = copy.deepcopy(dash.layout)\ntarget_row = layout[\"rows\"][target_row_id]\n\n# Redistribute widths\nnew_count = len(target_row[\"cells\"]) + 1\ncell_width = 12 \u002F\u002F new_count\nfor cell in target_row[\"cells\"]:\n    cell[\"width\"] = cell_width\ntarget_row[\"cells\"].append({\"temp_id\": \"-1\", \"width\": cell_width})\n\nws.update_dashboard(dashboard_id, UpdateDashboardParams(\n    content={\"action\": \"create\", \"content_type\": \"report\",\n             \"content_params\": {\"bookmark\": {\"name\": \"New Report\", \"type\": \"insights\",\n                                              \"params\": json.dumps(result.params)}}},\n    layout={\"rows_order\": layout[\"order\"], \"rows\": layout[\"rows\"]},\n))\n```\n\n**Adding content as a new row** — content action alone (appends to bottom):\n\n```python\nws.update_dashboard(dashboard_id, UpdateDashboardParams(\n    content={\"action\": \"create\", \"content_type\": \"text\",\n             \"content_params\": {\"markdown\": \"\u003Cp>^ Explainer card.\u003C\u002Fp>\"}},\n))\n```\n\n**Deleting content:**\n\n```python\nws.update_dashboard(dashboard_id, UpdateDashboardParams(\n    content={\"action\": \"delete\", \"content_type\": \"report\", \"content_id\": content_id},\n))\n```\n\n**Cross-type updates** (e.g., text → report): API rejects changing `content_type` on update. Delete the old cell, then create the new one.\n\nSee `references\u002Fdashboard-reference.md` Section 8 for temp ID resolution, operation ordering details, and report-link semantics.\n\n---\n\n## Mode: Explain\n\nCombine analysis with targeted text card insertion.\n\n1. **Analyze** — run Mode: Analyze to extract structure and execute reports\n2. **Generate insights** — for each report, compute key metrics from the DataFrame:\n   ```python\n   latest = df.iloc[-1][\"count\"]\n   prev = df.iloc[-8][\"count\"]\n   trend = ((latest - prev) \u002F prev) * 100\n   html = (f\"\u003Cp>^ DAU is \u003Cstrong>{latest:,.0f}\u003C\u002Fstrong>, \"\n           f\"{'up' if trend > 0 else 'down'} \u003Cstrong>{abs(trend):.1f}%\u003C\u002Fstrong> \"\n           f\"vs. last week.\u003C\u002Fp>\").replace(\"\\n\", \"\")\n   ```\n3. **Insert cards** — add as new rows below each report section:\n   ```python\n   ws.update_dashboard(dashboard_id, UpdateDashboardParams(\n       content={\"action\": \"create\", \"content_type\": \"text\",\n                \"content_params\": {\"markdown\": html}},\n   ))\n   ```\n\n---\n\n## Critical Gotchas\n\n1. **Combined content+layout PATCH** — send both `content` and `layout` in the same `UpdateDashboardParams` to add cells to specific existing rows. Without `layout`, new content appends as a full-width row at the bottom.\n\n2. **Width auto-redistribution** — when adding to an existing row with N cells, set all cells (including new) to `12 \u002F\u002F (N+1)` width.\n\n3. **Update operation ordering** — metadata → cell creates → rows_order → cell updates → cell deletes → row deletes. Wrong order causes failures.\n\n4. **`per_user` requires `math_property`** — using per-user aggregation without a numeric property raises `BookmarkValidationError`.\n\n5. **`CreateBookmarkParams(dashboard_id=X)` does NOT add to layout** — use `add_report_to_dashboard()` or inline content action.\n\n6. **`add_report_to_dashboard()` CLONES** — creates \"Duplicate of...\" copy. Use `rows` in `CreateDashboardParams` or inline content action instead.\n\n7. **GET `order` vs PATCH `rows_order`** — layout from GET uses `order`; PATCH expects `rows_order`.\n\n8. **Never include `version` in layout PATCH** — the API rejects it.\n\n9. **Strip `\\n` and collapse whitespace** — call `.replace(\"\\n\", \"\").strip()` on text card HTML. Newlines cause TipTap to mangle content.\n\n10. **Limits** — title 255 chars, description 400 chars, text cards 2,000 chars, max 4 items\u002Frow, max 30 rows.\n\n11. **Cross-type cell updates require delete+create** — API rejects changing `content_type` on an update action.\n\n12. **Report-link cells are read-only** — `content_type: \"report-link\"` references a report owned by another dashboard. You can view but not edit its params.\n\n13. **Auto-pin after creation** — dashboards are invisible to the team by default. Call `ws.pin_dashboard(dashboard.id)`.\n\n14. **The `markdown` field accepts only HTML** — despite the name. Markdown syntax renders as literal text.\n\n## See Also\n\n- `references\u002Fdashboard-reference.md` — Complete API reference, layout system, content actions, text card formatting, update operations, analysis patterns\n- `references\u002Fdashboard-templates.md` — 9 purpose-built dashboard templates with section layouts and report specs\n- `references\u002Fbookmark-pipeline.md` — End-to-end pipeline from typed query to dashboard report for all 4 engines\n- `references\u002Fchart-types.md` — Chart type selection guide with slugs, use cases, and width recommendations\n",{"data":34,"body":36},{"name":4,"description":6,"allowed-tools":35},"Bash Read Write",{"type":37,"children":38},"root",[39,47,53,60,178,184,458,464,634,638,644,649,656,678,683,806,814,856,874,880,885,908,913,971,999,1005,1010,1067,1075,1149,1159,1165,1170,1214,1220,1225,1296,1299,1305,1310,1316,1321,1429,1435,1448,1458,1468,1595,1659,1677,1685,1695,1701,1706,1889,1899,1946,1952,2015,2021,2026,2029,2035,2040,2046,2051,2057,2069,2140,2146,2172,2319,2329,2366,2374,2403,2420,2432,2435,2441,2446,2569,2572,2578,2888,2894,2939],{"type":40,"tag":41,"props":42,"children":43},"element","h1",{"id":4},[44],{"type":45,"value":46},"text","Dashboard Expert",{"type":40,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"Analyze, build, modify, and explain Mixpanel dashboards. Four modes — pick the one matching the user's intent.",{"type":40,"tag":54,"props":55,"children":57},"h2",{"id":56},"mode-selection",[58],{"type":45,"value":59},"Mode Selection",{"type":40,"tag":61,"props":62,"children":63},"table",{},[64,88],{"type":40,"tag":65,"props":66,"children":67},"thead",{},[68],{"type":40,"tag":69,"props":70,"children":71},"tr",{},[72,78,83],{"type":40,"tag":73,"props":74,"children":75},"th",{},[76],{"type":45,"value":77},"User intent",{"type":40,"tag":73,"props":79,"children":80},{},[81],{"type":45,"value":82},"Mode",{"type":40,"tag":73,"props":84,"children":85},{},[86],{"type":45,"value":87},"Key actions",{"type":40,"tag":89,"props":90,"children":91},"tbody",{},[92,115,136,157],{"type":40,"tag":69,"props":93,"children":94},{},[95,101,110],{"type":40,"tag":96,"props":97,"children":98},"td",{},[99],{"type":45,"value":100},"\"analyze\u002Funderstand\u002Fread\u002Fexplore dashboard\"",{"type":40,"tag":96,"props":102,"children":103},{},[104],{"type":40,"tag":105,"props":106,"children":107},"strong",{},[108],{"type":45,"value":109},"Analyze",{"type":40,"tag":96,"props":111,"children":112},{},[113],{"type":45,"value":114},"Read structure, execute reports, summarize",{"type":40,"tag":69,"props":116,"children":117},{},[118,123,131],{"type":40,"tag":96,"props":119,"children":120},{},[121],{"type":45,"value":122},"\"build\u002Fcreate\u002Fmake a new dashboard\"",{"type":40,"tag":96,"props":124,"children":125},{},[126],{"type":40,"tag":105,"props":127,"children":128},{},[129],{"type":45,"value":130},"Build",{"type":40,"tag":96,"props":132,"children":133},{},[134],{"type":45,"value":135},"Investigate data → plan → create with layout",{"type":40,"tag":69,"props":137,"children":138},{},[139,144,152],{"type":40,"tag":96,"props":140,"children":141},{},[142],{"type":45,"value":143},"\"modify\u002Fupdate\u002Fadd to\u002Ffix\u002Fimprove dashboard\"",{"type":40,"tag":96,"props":145,"children":146},{},[147],{"type":40,"tag":105,"props":148,"children":149},{},[150],{"type":45,"value":151},"Modify",{"type":40,"tag":96,"props":153,"children":154},{},[155],{"type":45,"value":156},"Read current state → plan changes → execute",{"type":40,"tag":69,"props":158,"children":159},{},[160,165,173],{"type":40,"tag":96,"props":161,"children":162},{},[163],{"type":45,"value":164},"\"explain\u002Fannotate\u002Fadd insights to dashboard\"",{"type":40,"tag":96,"props":166,"children":167},{},[168],{"type":40,"tag":105,"props":169,"children":170},{},[171],{"type":45,"value":172},"Explain",{"type":40,"tag":96,"props":174,"children":175},{},[176],{"type":45,"value":177},"Analyze → generate data-driven text cards",{"type":40,"tag":54,"props":179,"children":181},{"id":180},"quick-start-analyze-an-existing-dashboard",[182],{"type":45,"value":183},"Quick Start: Analyze an Existing Dashboard",{"type":40,"tag":185,"props":186,"children":191},"pre",{"className":187,"code":188,"language":189,"meta":190,"style":190},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import json, re\nimport mixpanel_headless as mp\n\nws = mp.Workspace()\ndash = ws.get_dashboard(DASHBOARD_ID)\nlayout, contents = dash.layout, dash.contents\n\n# Extract structure: rows → cells → content items\nfor row_id in layout[\"order\"]:\n    row = layout[\"rows\"][row_id]\n    for cell in row[\"cells\"]:\n        cid, ctype = str(cell[\"content_id\"]), cell[\"content_type\"]\n        if ctype in (\"report\", \"report-link\"):\n            info = contents[\"report\"][cid]\n            print(f\"  [{cell['width']}w] {info['name']} ({info['type']}) {'[linked]' if ctype == 'report-link' else ''}\")\n        elif ctype == \"text\":\n            md = contents[\"text\"][cid].get(\"markdown\", \"\")\n            is_header = bool(re.search(r'\u003Ch2[\\s>]', md, re.I))\n            print(f\"  [{cell['width']}w] TEXT {'[SECTION]' if is_header else ''}: {md[:60]}...\")\n\n# Execute each report → DataFrame\nfor cid, info in contents.get(\"report\", {}).items():\n    btype, bid = info[\"type\"], info[\"id\"]\n    if btype == \"flows\":\n        result = ws.query_saved_flows(bid)\n    else:\n        result = ws.query_saved_report(bid, bookmark_type=btype)\n    df = result.df\n    print(f\"{info['name']}: {len(df)} rows, columns={list(df.columns)}\")\n","python","",[192],{"type":40,"tag":193,"props":194,"children":195},"code",{"__ignoreMap":190},[196,207,216,226,235,244,253,261,270,279,288,297,306,315,324,333,342,351,360,369,377,386,395,404,413,422,431,440,449],{"type":40,"tag":197,"props":198,"children":201},"span",{"class":199,"line":200},"line",1,[202],{"type":40,"tag":197,"props":203,"children":204},{},[205],{"type":45,"value":206},"import json, re\n",{"type":40,"tag":197,"props":208,"children":210},{"class":199,"line":209},2,[211],{"type":40,"tag":197,"props":212,"children":213},{},[214],{"type":45,"value":215},"import mixpanel_headless as mp\n",{"type":40,"tag":197,"props":217,"children":219},{"class":199,"line":218},3,[220],{"type":40,"tag":197,"props":221,"children":223},{"emptyLinePlaceholder":222},true,[224],{"type":45,"value":225},"\n",{"type":40,"tag":197,"props":227,"children":229},{"class":199,"line":228},4,[230],{"type":40,"tag":197,"props":231,"children":232},{},[233],{"type":45,"value":234},"ws = mp.Workspace()\n",{"type":40,"tag":197,"props":236,"children":238},{"class":199,"line":237},5,[239],{"type":40,"tag":197,"props":240,"children":241},{},[242],{"type":45,"value":243},"dash = ws.get_dashboard(DASHBOARD_ID)\n",{"type":40,"tag":197,"props":245,"children":247},{"class":199,"line":246},6,[248],{"type":40,"tag":197,"props":249,"children":250},{},[251],{"type":45,"value":252},"layout, contents = dash.layout, dash.contents\n",{"type":40,"tag":197,"props":254,"children":256},{"class":199,"line":255},7,[257],{"type":40,"tag":197,"props":258,"children":259},{"emptyLinePlaceholder":222},[260],{"type":45,"value":225},{"type":40,"tag":197,"props":262,"children":264},{"class":199,"line":263},8,[265],{"type":40,"tag":197,"props":266,"children":267},{},[268],{"type":45,"value":269},"# Extract structure: rows → cells → content items\n",{"type":40,"tag":197,"props":271,"children":273},{"class":199,"line":272},9,[274],{"type":40,"tag":197,"props":275,"children":276},{},[277],{"type":45,"value":278},"for row_id in layout[\"order\"]:\n",{"type":40,"tag":197,"props":280,"children":282},{"class":199,"line":281},10,[283],{"type":40,"tag":197,"props":284,"children":285},{},[286],{"type":45,"value":287},"    row = layout[\"rows\"][row_id]\n",{"type":40,"tag":197,"props":289,"children":291},{"class":199,"line":290},11,[292],{"type":40,"tag":197,"props":293,"children":294},{},[295],{"type":45,"value":296},"    for cell in row[\"cells\"]:\n",{"type":40,"tag":197,"props":298,"children":300},{"class":199,"line":299},12,[301],{"type":40,"tag":197,"props":302,"children":303},{},[304],{"type":45,"value":305},"        cid, ctype = str(cell[\"content_id\"]), cell[\"content_type\"]\n",{"type":40,"tag":197,"props":307,"children":309},{"class":199,"line":308},13,[310],{"type":40,"tag":197,"props":311,"children":312},{},[313],{"type":45,"value":314},"        if ctype in (\"report\", \"report-link\"):\n",{"type":40,"tag":197,"props":316,"children":318},{"class":199,"line":317},14,[319],{"type":40,"tag":197,"props":320,"children":321},{},[322],{"type":45,"value":323},"            info = contents[\"report\"][cid]\n",{"type":40,"tag":197,"props":325,"children":327},{"class":199,"line":326},15,[328],{"type":40,"tag":197,"props":329,"children":330},{},[331],{"type":45,"value":332},"            print(f\"  [{cell['width']}w] {info['name']} ({info['type']}) {'[linked]' if ctype == 'report-link' else ''}\")\n",{"type":40,"tag":197,"props":334,"children":336},{"class":199,"line":335},16,[337],{"type":40,"tag":197,"props":338,"children":339},{},[340],{"type":45,"value":341},"        elif ctype == \"text\":\n",{"type":40,"tag":197,"props":343,"children":345},{"class":199,"line":344},17,[346],{"type":40,"tag":197,"props":347,"children":348},{},[349],{"type":45,"value":350},"            md = contents[\"text\"][cid].get(\"markdown\", \"\")\n",{"type":40,"tag":197,"props":352,"children":354},{"class":199,"line":353},18,[355],{"type":40,"tag":197,"props":356,"children":357},{},[358],{"type":45,"value":359},"            is_header = bool(re.search(r'\u003Ch2[\\s>]', md, re.I))\n",{"type":40,"tag":197,"props":361,"children":363},{"class":199,"line":362},19,[364],{"type":40,"tag":197,"props":365,"children":366},{},[367],{"type":45,"value":368},"            print(f\"  [{cell['width']}w] TEXT {'[SECTION]' if is_header else ''}: {md[:60]}...\")\n",{"type":40,"tag":197,"props":370,"children":372},{"class":199,"line":371},20,[373],{"type":40,"tag":197,"props":374,"children":375},{"emptyLinePlaceholder":222},[376],{"type":45,"value":225},{"type":40,"tag":197,"props":378,"children":380},{"class":199,"line":379},21,[381],{"type":40,"tag":197,"props":382,"children":383},{},[384],{"type":45,"value":385},"# Execute each report → DataFrame\n",{"type":40,"tag":197,"props":387,"children":389},{"class":199,"line":388},22,[390],{"type":40,"tag":197,"props":391,"children":392},{},[393],{"type":45,"value":394},"for cid, info in contents.get(\"report\", {}).items():\n",{"type":40,"tag":197,"props":396,"children":398},{"class":199,"line":397},23,[399],{"type":40,"tag":197,"props":400,"children":401},{},[402],{"type":45,"value":403},"    btype, bid = info[\"type\"], info[\"id\"]\n",{"type":40,"tag":197,"props":405,"children":407},{"class":199,"line":406},24,[408],{"type":40,"tag":197,"props":409,"children":410},{},[411],{"type":45,"value":412},"    if btype == \"flows\":\n",{"type":40,"tag":197,"props":414,"children":416},{"class":199,"line":415},25,[417],{"type":40,"tag":197,"props":418,"children":419},{},[420],{"type":45,"value":421},"        result = ws.query_saved_flows(bid)\n",{"type":40,"tag":197,"props":423,"children":425},{"class":199,"line":424},26,[426],{"type":40,"tag":197,"props":427,"children":428},{},[429],{"type":45,"value":430},"    else:\n",{"type":40,"tag":197,"props":432,"children":434},{"class":199,"line":433},27,[435],{"type":40,"tag":197,"props":436,"children":437},{},[438],{"type":45,"value":439},"        result = ws.query_saved_report(bid, bookmark_type=btype)\n",{"type":40,"tag":197,"props":441,"children":443},{"class":199,"line":442},28,[444],{"type":40,"tag":197,"props":445,"children":446},{},[447],{"type":45,"value":448},"    df = result.df\n",{"type":40,"tag":197,"props":450,"children":452},{"class":199,"line":451},29,[453],{"type":40,"tag":197,"props":454,"children":455},{},[456],{"type":45,"value":457},"    print(f\"{info['name']}: {len(df)} rows, columns={list(df.columns)}\")\n",{"type":40,"tag":54,"props":459,"children":461},{"id":460},"quick-start-build-a-new-dashboard",[462],{"type":45,"value":463},"Quick Start: Build a New Dashboard",{"type":40,"tag":185,"props":465,"children":467},{"className":187,"code":466,"language":189,"meta":190,"style":190},"from mixpanel_headless.types import CreateDashboardParams, DashboardRow, DashboardRowContent\nimport json\n\nws = mp.Workspace()\ndau = ws.query(\"Login\", math=\"dau\", last=90)\n\ndef text(html):\n    return DashboardRowContent(content_type=\"text\", content_params={\"markdown\": html})\n\ndef report(name, btype, result):\n    return DashboardRowContent(content_type=\"report\", content_params={\n        \"bookmark\": {\"name\": name, \"type\": btype, \"params\": json.dumps(result.params)}})\n\ndashboard = ws.create_dashboard(CreateDashboardParams(\n    title=\"Product Health\", description=\"Core metrics.\",\n    rows=[\n        DashboardRow(contents=[text(\"\u003Ch2>Product Health\u003C\u002Fh2>\u003Cp>Core metrics.\u003C\u002Fp>\")]),\n        DashboardRow(contents=[report(\"DAU (90d)\", \"insights\", dau)]),\n    ],\n))\nws.pin_dashboard(dashboard.id)  # Make visible to team\n",[468],{"type":40,"tag":193,"props":469,"children":470},{"__ignoreMap":190},[471,479,487,494,501,509,516,524,532,539,547,555,563,570,578,586,594,602,610,618,626],{"type":40,"tag":197,"props":472,"children":473},{"class":199,"line":200},[474],{"type":40,"tag":197,"props":475,"children":476},{},[477],{"type":45,"value":478},"from mixpanel_headless.types import CreateDashboardParams, DashboardRow, DashboardRowContent\n",{"type":40,"tag":197,"props":480,"children":481},{"class":199,"line":209},[482],{"type":40,"tag":197,"props":483,"children":484},{},[485],{"type":45,"value":486},"import json\n",{"type":40,"tag":197,"props":488,"children":489},{"class":199,"line":218},[490],{"type":40,"tag":197,"props":491,"children":492},{"emptyLinePlaceholder":222},[493],{"type":45,"value":225},{"type":40,"tag":197,"props":495,"children":496},{"class":199,"line":228},[497],{"type":40,"tag":197,"props":498,"children":499},{},[500],{"type":45,"value":234},{"type":40,"tag":197,"props":502,"children":503},{"class":199,"line":237},[504],{"type":40,"tag":197,"props":505,"children":506},{},[507],{"type":45,"value":508},"dau = ws.query(\"Login\", math=\"dau\", last=90)\n",{"type":40,"tag":197,"props":510,"children":511},{"class":199,"line":246},[512],{"type":40,"tag":197,"props":513,"children":514},{"emptyLinePlaceholder":222},[515],{"type":45,"value":225},{"type":40,"tag":197,"props":517,"children":518},{"class":199,"line":255},[519],{"type":40,"tag":197,"props":520,"children":521},{},[522],{"type":45,"value":523},"def text(html):\n",{"type":40,"tag":197,"props":525,"children":526},{"class":199,"line":263},[527],{"type":40,"tag":197,"props":528,"children":529},{},[530],{"type":45,"value":531},"    return DashboardRowContent(content_type=\"text\", content_params={\"markdown\": html})\n",{"type":40,"tag":197,"props":533,"children":534},{"class":199,"line":272},[535],{"type":40,"tag":197,"props":536,"children":537},{"emptyLinePlaceholder":222},[538],{"type":45,"value":225},{"type":40,"tag":197,"props":540,"children":541},{"class":199,"line":281},[542],{"type":40,"tag":197,"props":543,"children":544},{},[545],{"type":45,"value":546},"def report(name, btype, result):\n",{"type":40,"tag":197,"props":548,"children":549},{"class":199,"line":290},[550],{"type":40,"tag":197,"props":551,"children":552},{},[553],{"type":45,"value":554},"    return DashboardRowContent(content_type=\"report\", content_params={\n",{"type":40,"tag":197,"props":556,"children":557},{"class":199,"line":299},[558],{"type":40,"tag":197,"props":559,"children":560},{},[561],{"type":45,"value":562},"        \"bookmark\": {\"name\": name, \"type\": btype, \"params\": json.dumps(result.params)}})\n",{"type":40,"tag":197,"props":564,"children":565},{"class":199,"line":308},[566],{"type":40,"tag":197,"props":567,"children":568},{"emptyLinePlaceholder":222},[569],{"type":45,"value":225},{"type":40,"tag":197,"props":571,"children":572},{"class":199,"line":317},[573],{"type":40,"tag":197,"props":574,"children":575},{},[576],{"type":45,"value":577},"dashboard = ws.create_dashboard(CreateDashboardParams(\n",{"type":40,"tag":197,"props":579,"children":580},{"class":199,"line":326},[581],{"type":40,"tag":197,"props":582,"children":583},{},[584],{"type":45,"value":585},"    title=\"Product Health\", description=\"Core metrics.\",\n",{"type":40,"tag":197,"props":587,"children":588},{"class":199,"line":335},[589],{"type":40,"tag":197,"props":590,"children":591},{},[592],{"type":45,"value":593},"    rows=[\n",{"type":40,"tag":197,"props":595,"children":596},{"class":199,"line":344},[597],{"type":40,"tag":197,"props":598,"children":599},{},[600],{"type":45,"value":601},"        DashboardRow(contents=[text(\"\u003Ch2>Product Health\u003C\u002Fh2>\u003Cp>Core metrics.\u003C\u002Fp>\")]),\n",{"type":40,"tag":197,"props":603,"children":604},{"class":199,"line":353},[605],{"type":40,"tag":197,"props":606,"children":607},{},[608],{"type":45,"value":609},"        DashboardRow(contents=[report(\"DAU (90d)\", \"insights\", dau)]),\n",{"type":40,"tag":197,"props":611,"children":612},{"class":199,"line":362},[613],{"type":40,"tag":197,"props":614,"children":615},{},[616],{"type":45,"value":617},"    ],\n",{"type":40,"tag":197,"props":619,"children":620},{"class":199,"line":371},[621],{"type":40,"tag":197,"props":622,"children":623},{},[624],{"type":45,"value":625},"))\n",{"type":40,"tag":197,"props":627,"children":628},{"class":199,"line":379},[629],{"type":40,"tag":197,"props":630,"children":631},{},[632],{"type":45,"value":633},"ws.pin_dashboard(dashboard.id)  # Make visible to team\n",{"type":40,"tag":635,"props":636,"children":637},"hr",{},[],{"type":40,"tag":54,"props":639,"children":641},{"id":640},"mode-analyze",[642],{"type":45,"value":643},"Mode: Analyze",{"type":40,"tag":48,"props":645,"children":646},{},[647],{"type":45,"value":648},"Read existing dashboards, execute their reports, and synthesize understanding.",{"type":40,"tag":650,"props":651,"children":653},"h3",{"id":652},"phase-a1-read-dashboard-structure",[654],{"type":45,"value":655},"Phase A1: Read Dashboard Structure",{"type":40,"tag":185,"props":657,"children":659},{"className":187,"code":658,"language":189,"meta":190,"style":190},"dash = ws.get_dashboard(dashboard_id)\nlayout, contents = dash.layout, dash.contents\n",[660],{"type":40,"tag":193,"props":661,"children":662},{"__ignoreMap":190},[663,671],{"type":40,"tag":197,"props":664,"children":665},{"class":199,"line":200},[666],{"type":40,"tag":197,"props":667,"children":668},{},[669],{"type":45,"value":670},"dash = ws.get_dashboard(dashboard_id)\n",{"type":40,"tag":197,"props":672,"children":673},{"class":199,"line":209},[674],{"type":40,"tag":197,"props":675,"children":676},{},[677],{"type":45,"value":252},{"type":40,"tag":48,"props":679,"children":680},{},[681],{"type":45,"value":682},"Parse the response into a structured representation:",{"type":40,"tag":684,"props":685,"children":686},"ul",{},[687,702,737,786],{"type":40,"tag":688,"props":689,"children":690},"li",{},[691,700],{"type":40,"tag":105,"props":692,"children":693},{},[694],{"type":40,"tag":193,"props":695,"children":697},{"className":696},[],[698],{"type":45,"value":699},"layout[\"order\"]",{"type":45,"value":701}," — ordered list of row IDs",{"type":40,"tag":688,"props":703,"children":704},{},[705,714,716,722,724,730,731],{"type":40,"tag":105,"props":706,"children":707},{},[708],{"type":40,"tag":193,"props":709,"children":711},{"className":710},[],[712],{"type":45,"value":713},"layout[\"rows\"][row_id][\"cells\"]",{"type":45,"value":715}," — cells with ",{"type":40,"tag":193,"props":717,"children":719},{"className":718},[],[720],{"type":45,"value":721},"content_id",{"type":45,"value":723},", ",{"type":40,"tag":193,"props":725,"children":727},{"className":726},[],[728],{"type":45,"value":729},"content_type",{"type":45,"value":723},{"type":40,"tag":193,"props":732,"children":734},{"className":733},[],[735],{"type":45,"value":736},"width",{"type":40,"tag":688,"props":738,"children":739},{},[740,749,751,757,759,765,766,772,773,779,780],{"type":40,"tag":105,"props":741,"children":742},{},[743],{"type":40,"tag":193,"props":744,"children":746},{"className":745},[],[747],{"type":45,"value":748},"contents[\"report\"][str(content_id)]",{"type":45,"value":750}," — report metadata: ",{"type":40,"tag":193,"props":752,"children":754},{"className":753},[],[755],{"type":45,"value":756},"id",{"type":45,"value":758}," (bookmark_id), ",{"type":40,"tag":193,"props":760,"children":762},{"className":761},[],[763],{"type":45,"value":764},"name",{"type":45,"value":723},{"type":40,"tag":193,"props":767,"children":769},{"className":768},[],[770],{"type":45,"value":771},"type",{"type":45,"value":723},{"type":40,"tag":193,"props":774,"children":776},{"className":775},[],[777],{"type":45,"value":778},"params",{"type":45,"value":723},{"type":40,"tag":193,"props":781,"children":783},{"className":782},[],[784],{"type":45,"value":785},"description",{"type":40,"tag":688,"props":787,"children":788},{},[789,798,800],{"type":40,"tag":105,"props":790,"children":791},{},[792],{"type":40,"tag":193,"props":793,"children":795},{"className":794},[],[796],{"type":45,"value":797},"contents[\"text\"][str(content_id)]",{"type":45,"value":799}," — text card: ",{"type":40,"tag":193,"props":801,"children":803},{"className":802},[],[804],{"type":45,"value":805},"markdown",{"type":40,"tag":48,"props":807,"children":808},{},[809],{"type":40,"tag":105,"props":810,"children":811},{},[812],{"type":45,"value":813},"Classify each cell:",{"type":40,"tag":684,"props":815,"children":816},{},[817,828,839],{"type":40,"tag":688,"props":818,"children":819},{},[820,826],{"type":40,"tag":193,"props":821,"children":823},{"className":822},[],[824],{"type":45,"value":825},"content_type == \"report\"",{"type":45,"value":827}," → owned, editable",{"type":40,"tag":688,"props":829,"children":830},{},[831,837],{"type":40,"tag":193,"props":832,"children":834},{"className":833},[],[835],{"type":45,"value":836},"content_type == \"report-link\"",{"type":45,"value":838}," → linked from another dashboard, read-only",{"type":40,"tag":688,"props":840,"children":841},{},[842,848,850],{"type":40,"tag":193,"props":843,"children":845},{"className":844},[],[846],{"type":45,"value":847},"content_type == \"text\"",{"type":45,"value":849}," → text card; detect section headers via ",{"type":40,"tag":193,"props":851,"children":853},{"className":852},[],[854],{"type":45,"value":855},"re.search(r'\u003Ch2[\\s>]', md, re.I)",{"type":40,"tag":48,"props":857,"children":858},{},[859,864,866,872],{"type":40,"tag":105,"props":860,"children":861},{},[862],{"type":45,"value":863},"Build a mental model:",{"type":45,"value":865}," Group reports by section (text cards with ",{"type":40,"tag":193,"props":867,"children":869},{"className":868},[],[870],{"type":45,"value":871},"\u003Ch2>",{"type":45,"value":873}," tags delimit sections). Note each report's chart type, width, and position.",{"type":40,"tag":650,"props":875,"children":877},{"id":876},"phase-a2-extract-report-details",[878],{"type":45,"value":879},"Phase A2: Extract Report Details",{"type":40,"tag":48,"props":881,"children":882},{},[883],{"type":45,"value":884},"For deeper understanding, fetch full bookmark params:",{"type":40,"tag":185,"props":886,"children":888},{"className":187,"code":887,"language":189,"meta":190,"style":190},"bookmark = ws.get_bookmark(bookmark_id)\nparams = bookmark.params  # Full query definition dict\n",[889],{"type":40,"tag":193,"props":890,"children":891},{"__ignoreMap":190},[892,900],{"type":40,"tag":197,"props":893,"children":894},{"class":199,"line":200},[895],{"type":40,"tag":197,"props":896,"children":897},{},[898],{"type":45,"value":899},"bookmark = ws.get_bookmark(bookmark_id)\n",{"type":40,"tag":197,"props":901,"children":902},{"class":199,"line":209},[903],{"type":40,"tag":197,"props":904,"children":905},{},[906],{"type":45,"value":907},"params = bookmark.params  # Full query definition dict\n",{"type":40,"tag":48,"props":909,"children":910},{},[911],{"type":45,"value":912},"Key fields in params (Insights format):",{"type":40,"tag":684,"props":914,"children":915},{},[916,927,938,949,960],{"type":40,"tag":688,"props":917,"children":918},{},[919,925],{"type":40,"tag":193,"props":920,"children":922},{"className":921},[],[923],{"type":45,"value":924},"params[\"sections\"][\"show\"]",{"type":45,"value":926}," — metrics with event names and math type",{"type":40,"tag":688,"props":928,"children":929},{},[930,936],{"type":40,"tag":193,"props":931,"children":933},{"className":932},[],[934],{"type":45,"value":935},"params[\"sections\"][\"group\"]",{"type":45,"value":937}," — breakdown properties",{"type":40,"tag":688,"props":939,"children":940},{},[941,947],{"type":40,"tag":193,"props":942,"children":944},{"className":943},[],[945],{"type":45,"value":946},"params[\"sections\"][\"filter\"]",{"type":45,"value":948}," — active filters",{"type":40,"tag":688,"props":950,"children":951},{},[952,958],{"type":40,"tag":193,"props":953,"children":955},{"className":954},[],[956],{"type":45,"value":957},"params[\"sections\"][\"time\"]",{"type":45,"value":959}," — date range",{"type":40,"tag":688,"props":961,"children":962},{},[963,969],{"type":40,"tag":193,"props":964,"children":966},{"className":965},[],[967],{"type":45,"value":968},"params[\"displayOptions\"][\"chartType\"]",{"type":45,"value":970}," — visualization type",{"type":40,"tag":48,"props":972,"children":973},{},[974,976,981,983,989,991,997],{"type":45,"value":975},"Note: ",{"type":40,"tag":193,"props":977,"children":979},{"className":978},[],[980],{"type":45,"value":778},{"type":45,"value":982}," in ",{"type":40,"tag":193,"props":984,"children":986},{"className":985},[],[987],{"type":45,"value":988},"contents[\"report\"][id]",{"type":45,"value":990}," may be a JSON string — parse with ",{"type":40,"tag":193,"props":992,"children":994},{"className":993},[],[995],{"type":45,"value":996},"json.loads()",{"type":45,"value":998}," if needed.",{"type":40,"tag":650,"props":1000,"children":1002},{"id":1001},"phase-a3-execute-and-summarize",[1003],{"type":45,"value":1004},"Phase A3: Execute and Summarize",{"type":40,"tag":48,"props":1006,"children":1007},{},[1008],{"type":45,"value":1009},"Execute each report to get live data:",{"type":40,"tag":185,"props":1011,"children":1013},{"className":187,"code":1012,"language":189,"meta":190,"style":190},"for cid, info in contents.get(\"report\", {}).items():\n    bid, btype = info[\"id\"], info[\"type\"]\n    if btype == \"flows\":\n        result = ws.query_saved_flows(bid)\n    else:\n        result = ws.query_saved_report(bid, bookmark_type=btype)\n    df = result.df\n",[1014],{"type":40,"tag":193,"props":1015,"children":1016},{"__ignoreMap":190},[1017,1024,1032,1039,1046,1053,1060],{"type":40,"tag":197,"props":1018,"children":1019},{"class":199,"line":200},[1020],{"type":40,"tag":197,"props":1021,"children":1022},{},[1023],{"type":45,"value":394},{"type":40,"tag":197,"props":1025,"children":1026},{"class":199,"line":209},[1027],{"type":40,"tag":197,"props":1028,"children":1029},{},[1030],{"type":45,"value":1031},"    bid, btype = info[\"id\"], info[\"type\"]\n",{"type":40,"tag":197,"props":1033,"children":1034},{"class":199,"line":218},[1035],{"type":40,"tag":197,"props":1036,"children":1037},{},[1038],{"type":45,"value":412},{"type":40,"tag":197,"props":1040,"children":1041},{"class":199,"line":228},[1042],{"type":40,"tag":197,"props":1043,"children":1044},{},[1045],{"type":45,"value":421},{"type":40,"tag":197,"props":1047,"children":1048},{"class":199,"line":237},[1049],{"type":40,"tag":197,"props":1050,"children":1051},{},[1052],{"type":45,"value":430},{"type":40,"tag":197,"props":1054,"children":1055},{"class":199,"line":246},[1056],{"type":40,"tag":197,"props":1057,"children":1058},{},[1059],{"type":45,"value":439},{"type":40,"tag":197,"props":1061,"children":1062},{"class":199,"line":255},[1063],{"type":40,"tag":197,"props":1064,"children":1065},{},[1066],{"type":45,"value":448},{"type":40,"tag":48,"props":1068,"children":1069},{},[1070],{"type":40,"tag":105,"props":1071,"children":1072},{},[1073],{"type":45,"value":1074},"Summarize by report type:",{"type":40,"tag":61,"props":1076,"children":1077},{},[1078,1094],{"type":40,"tag":65,"props":1079,"children":1080},{},[1081],{"type":40,"tag":69,"props":1082,"children":1083},{},[1084,1089],{"type":40,"tag":73,"props":1085,"children":1086},{},[1087],{"type":45,"value":1088},"Type",{"type":40,"tag":73,"props":1090,"children":1091},{},[1092],{"type":45,"value":1093},"Key metrics to extract",{"type":40,"tag":89,"props":1095,"children":1096},{},[1097,1110,1123,1136],{"type":40,"tag":69,"props":1098,"children":1099},{},[1100,1105],{"type":40,"tag":96,"props":1101,"children":1102},{},[1103],{"type":45,"value":1104},"insights",{"type":40,"tag":96,"props":1106,"children":1107},{},[1108],{"type":45,"value":1109},"Total, average, latest value, min, max, trend direction",{"type":40,"tag":69,"props":1111,"children":1112},{},[1113,1118],{"type":40,"tag":96,"props":1114,"children":1115},{},[1116],{"type":45,"value":1117},"funnels",{"type":40,"tag":96,"props":1119,"children":1120},{},[1121],{"type":45,"value":1122},"Step names, counts, per-step and overall conversion rate",{"type":40,"tag":69,"props":1124,"children":1125},{},[1126,1131],{"type":40,"tag":96,"props":1127,"children":1128},{},[1129],{"type":45,"value":1130},"retention",{"type":40,"tag":96,"props":1132,"children":1133},{},[1134],{"type":45,"value":1135},"Day 1, Day 7, Day 30 rates; stabilization point",{"type":40,"tag":69,"props":1137,"children":1138},{},[1139,1144],{"type":40,"tag":96,"props":1140,"children":1141},{},[1142],{"type":45,"value":1143},"flows",{"type":40,"tag":96,"props":1145,"children":1146},{},[1147],{"type":45,"value":1148},"Top paths, conversion rate, drop-off points",{"type":40,"tag":48,"props":1150,"children":1151},{},[1152,1157],{"type":40,"tag":105,"props":1153,"children":1154},{},[1155],{"type":45,"value":1156},"Cross-correlate across reports:",{"type":45,"value":1158}," Look for relationships — DAU trends vs. retention, funnel drop-off vs. feature adoption.",{"type":40,"tag":650,"props":1160,"children":1162},{"id":1161},"phase-a4-present-analysis",[1163],{"type":45,"value":1164},"Phase A4: Present Analysis",{"type":40,"tag":48,"props":1166,"children":1167},{},[1168],{"type":45,"value":1169},"Structure findings as:",{"type":40,"tag":1171,"props":1172,"children":1173},"ol",{},[1174,1184,1194,1204],{"type":40,"tag":688,"props":1175,"children":1176},{},[1177,1182],{"type":40,"tag":105,"props":1178,"children":1179},{},[1180],{"type":45,"value":1181},"Dashboard overview",{"type":45,"value":1183}," — title, purpose, section count, report count",{"type":40,"tag":688,"props":1185,"children":1186},{},[1187,1192],{"type":40,"tag":105,"props":1188,"children":1189},{},[1190],{"type":45,"value":1191},"Section-by-section breakdown",{"type":45,"value":1193}," — what each section measures, key findings",{"type":40,"tag":688,"props":1195,"children":1196},{},[1197,1202],{"type":40,"tag":105,"props":1198,"children":1199},{},[1200],{"type":45,"value":1201},"Cross-metric insights",{"type":45,"value":1203}," — correlations, anomalies, patterns",{"type":40,"tag":688,"props":1205,"children":1206},{},[1207,1212],{"type":40,"tag":105,"props":1208,"children":1209},{},[1210],{"type":45,"value":1211},"Suggestions",{"type":45,"value":1213}," — missing metrics, better chart types, layout improvements",{"type":40,"tag":650,"props":1215,"children":1217},{"id":1216},"multi-dashboard-analysis",[1218],{"type":45,"value":1219},"Multi-Dashboard Analysis",{"type":40,"tag":48,"props":1221,"children":1222},{},[1223],{"type":45,"value":1224},"When analyzing multiple dashboards, build a unified picture:",{"type":40,"tag":185,"props":1226,"children":1228},{"className":187,"code":1227,"language":189,"meta":190,"style":190},"dashboard_ids = [1001, 1002, 1003]\nall_data = {}\nfor did in dashboard_ids:\n    dash = ws.get_dashboard(did)\n    for cid, info in dash.contents.get(\"report\", {}).items():\n        result = ws.query_saved_report(info[\"id\"], bookmark_type=info[\"type\"])\n        all_data[f\"{dash.title}\u002F{info['name']}\"] = result.df\n# Cross-dashboard: join DataFrames on date index, compute correlations\n",[1229],{"type":40,"tag":193,"props":1230,"children":1231},{"__ignoreMap":190},[1232,1240,1248,1256,1264,1272,1280,1288],{"type":40,"tag":197,"props":1233,"children":1234},{"class":199,"line":200},[1235],{"type":40,"tag":197,"props":1236,"children":1237},{},[1238],{"type":45,"value":1239},"dashboard_ids = [1001, 1002, 1003]\n",{"type":40,"tag":197,"props":1241,"children":1242},{"class":199,"line":209},[1243],{"type":40,"tag":197,"props":1244,"children":1245},{},[1246],{"type":45,"value":1247},"all_data = {}\n",{"type":40,"tag":197,"props":1249,"children":1250},{"class":199,"line":218},[1251],{"type":40,"tag":197,"props":1252,"children":1253},{},[1254],{"type":45,"value":1255},"for did in dashboard_ids:\n",{"type":40,"tag":197,"props":1257,"children":1258},{"class":199,"line":228},[1259],{"type":40,"tag":197,"props":1260,"children":1261},{},[1262],{"type":45,"value":1263},"    dash = ws.get_dashboard(did)\n",{"type":40,"tag":197,"props":1265,"children":1266},{"class":199,"line":237},[1267],{"type":40,"tag":197,"props":1268,"children":1269},{},[1270],{"type":45,"value":1271},"    for cid, info in dash.contents.get(\"report\", {}).items():\n",{"type":40,"tag":197,"props":1273,"children":1274},{"class":199,"line":246},[1275],{"type":40,"tag":197,"props":1276,"children":1277},{},[1278],{"type":45,"value":1279},"        result = ws.query_saved_report(info[\"id\"], bookmark_type=info[\"type\"])\n",{"type":40,"tag":197,"props":1281,"children":1282},{"class":199,"line":255},[1283],{"type":40,"tag":197,"props":1284,"children":1285},{},[1286],{"type":45,"value":1287},"        all_data[f\"{dash.title}\u002F{info['name']}\"] = result.df\n",{"type":40,"tag":197,"props":1289,"children":1290},{"class":199,"line":263},[1291],{"type":40,"tag":197,"props":1292,"children":1293},{},[1294],{"type":45,"value":1295},"# Cross-dashboard: join DataFrames on date index, compute correlations\n",{"type":40,"tag":635,"props":1297,"children":1298},{},[],{"type":40,"tag":54,"props":1300,"children":1302},{"id":1301},"mode-build",[1303],{"type":45,"value":1304},"Mode: Build",{"type":40,"tag":48,"props":1306,"children":1307},{},[1308],{"type":45,"value":1309},"Create new dashboards from scratch. Five phases.",{"type":40,"tag":650,"props":1311,"children":1313},{"id":1312},"phase-b1-investigate",[1314],{"type":45,"value":1315},"Phase B1: Investigate",{"type":40,"tag":48,"props":1317,"children":1318},{},[1319],{"type":45,"value":1320},"Before building, discover the data. Never build reports for events with zero volume.",{"type":40,"tag":185,"props":1322,"children":1324},{"className":187,"code":1323,"language":189,"meta":190,"style":190},"ws = mp.Workspace()\ntop = ws.top_events(limit=15)\nfor t in top:\n    print(f\"{t.event}: {t.count:,} ({t.percent_change:+.1%})\")\n\n# Validate candidate events\nfor event in candidate_events:\n    result = ws.query(event, from_date=\"2025-01-01\", to_date=\"2025-03-31\")\n    print(f\"{event}: {result.df['count'].sum():,.0f} total\")\n\n# Explore properties for breakdowns\nprops = ws.properties(event=\"key_event\")\nvalues = ws.property_values(event=\"key_event\", property=\"platform\", limit=20)\n",[1325],{"type":40,"tag":193,"props":1326,"children":1327},{"__ignoreMap":190},[1328,1335,1343,1351,1359,1366,1374,1382,1390,1398,1405,1413,1421],{"type":40,"tag":197,"props":1329,"children":1330},{"class":199,"line":200},[1331],{"type":40,"tag":197,"props":1332,"children":1333},{},[1334],{"type":45,"value":234},{"type":40,"tag":197,"props":1336,"children":1337},{"class":199,"line":209},[1338],{"type":40,"tag":197,"props":1339,"children":1340},{},[1341],{"type":45,"value":1342},"top = ws.top_events(limit=15)\n",{"type":40,"tag":197,"props":1344,"children":1345},{"class":199,"line":218},[1346],{"type":40,"tag":197,"props":1347,"children":1348},{},[1349],{"type":45,"value":1350},"for t in top:\n",{"type":40,"tag":197,"props":1352,"children":1353},{"class":199,"line":228},[1354],{"type":40,"tag":197,"props":1355,"children":1356},{},[1357],{"type":45,"value":1358},"    print(f\"{t.event}: {t.count:,} ({t.percent_change:+.1%})\")\n",{"type":40,"tag":197,"props":1360,"children":1361},{"class":199,"line":237},[1362],{"type":40,"tag":197,"props":1363,"children":1364},{"emptyLinePlaceholder":222},[1365],{"type":45,"value":225},{"type":40,"tag":197,"props":1367,"children":1368},{"class":199,"line":246},[1369],{"type":40,"tag":197,"props":1370,"children":1371},{},[1372],{"type":45,"value":1373},"# Validate candidate events\n",{"type":40,"tag":197,"props":1375,"children":1376},{"class":199,"line":255},[1377],{"type":40,"tag":197,"props":1378,"children":1379},{},[1380],{"type":45,"value":1381},"for event in candidate_events:\n",{"type":40,"tag":197,"props":1383,"children":1384},{"class":199,"line":263},[1385],{"type":40,"tag":197,"props":1386,"children":1387},{},[1388],{"type":45,"value":1389},"    result = ws.query(event, from_date=\"2025-01-01\", to_date=\"2025-03-31\")\n",{"type":40,"tag":197,"props":1391,"children":1392},{"class":199,"line":272},[1393],{"type":40,"tag":197,"props":1394,"children":1395},{},[1396],{"type":45,"value":1397},"    print(f\"{event}: {result.df['count'].sum():,.0f} total\")\n",{"type":40,"tag":197,"props":1399,"children":1400},{"class":199,"line":281},[1401],{"type":40,"tag":197,"props":1402,"children":1403},{"emptyLinePlaceholder":222},[1404],{"type":45,"value":225},{"type":40,"tag":197,"props":1406,"children":1407},{"class":199,"line":290},[1408],{"type":40,"tag":197,"props":1409,"children":1410},{},[1411],{"type":45,"value":1412},"# Explore properties for breakdowns\n",{"type":40,"tag":197,"props":1414,"children":1415},{"class":199,"line":299},[1416],{"type":40,"tag":197,"props":1417,"children":1418},{},[1419],{"type":45,"value":1420},"props = ws.properties(event=\"key_event\")\n",{"type":40,"tag":197,"props":1422,"children":1423},{"class":199,"line":308},[1424],{"type":40,"tag":197,"props":1425,"children":1426},{},[1427],{"type":45,"value":1428},"values = ws.property_values(event=\"key_event\", property=\"platform\", limit=20)\n",{"type":40,"tag":650,"props":1430,"children":1432},{"id":1431},"phase-b2-plan-structure",[1433],{"type":45,"value":1434},"Phase B2: Plan Structure",{"type":40,"tag":48,"props":1436,"children":1437},{},[1438,1440,1446],{"type":45,"value":1439},"Present a proposed structure before building. Choose a template from ",{"type":40,"tag":193,"props":1441,"children":1443},{"className":1442},[],[1444],{"type":45,"value":1445},"references\u002Fdashboard-templates.md",{"type":45,"value":1447},".",{"type":40,"tag":48,"props":1449,"children":1450},{},[1451,1456],{"type":40,"tag":105,"props":1452,"children":1453},{},[1454],{"type":45,"value":1455},"A plan includes:",{"type":45,"value":1457}," title + description, sections with text card headers, reports per section with chart type, grid layout.",{"type":40,"tag":48,"props":1459,"children":1460},{},[1461,1466],{"type":40,"tag":105,"props":1462,"children":1463},{},[1464],{"type":45,"value":1465},"Text cards use HTML",{"type":45,"value":1467}," (not markdown). Every dashboard must have an intro text card and section headers.",{"type":40,"tag":48,"props":1469,"children":1470},{},[1471,1476,1478,1484,1485,1490,1491,1497,1498,1504,1505,1511,1512,1518,1519,1525,1526,1532,1533,1539,1540,1546,1547,1553,1554,1560,1561,1567,1568,1574,1575,1581,1582,1588,1589],{"type":40,"tag":105,"props":1472,"children":1473},{},[1474],{"type":45,"value":1475},"Allowed HTML tags:",{"type":45,"value":1477}," ",{"type":40,"tag":193,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":45,"value":1483},"\u003Ch1>",{"type":45,"value":723},{"type":40,"tag":193,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":45,"value":871},{"type":45,"value":723},{"type":40,"tag":193,"props":1492,"children":1494},{"className":1493},[],[1495],{"type":45,"value":1496},"\u003Ch3>",{"type":45,"value":723},{"type":40,"tag":193,"props":1499,"children":1501},{"className":1500},[],[1502],{"type":45,"value":1503},"\u003Cp>",{"type":45,"value":723},{"type":40,"tag":193,"props":1506,"children":1508},{"className":1507},[],[1509],{"type":45,"value":1510},"\u003Cstrong>",{"type":45,"value":723},{"type":40,"tag":193,"props":1513,"children":1515},{"className":1514},[],[1516],{"type":45,"value":1517},"\u003Cem>",{"type":45,"value":723},{"type":40,"tag":193,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":45,"value":1524},"\u003Cu>",{"type":45,"value":723},{"type":40,"tag":193,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":45,"value":1531},"\u003Cs>",{"type":45,"value":723},{"type":40,"tag":193,"props":1534,"children":1536},{"className":1535},[],[1537],{"type":45,"value":1538},"\u003Cmark>",{"type":45,"value":723},{"type":40,"tag":193,"props":1541,"children":1543},{"className":1542},[],[1544],{"type":45,"value":1545},"\u003Ccode>",{"type":45,"value":723},{"type":40,"tag":193,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":45,"value":1552},"\u003Cblockquote>",{"type":45,"value":723},{"type":40,"tag":193,"props":1555,"children":1557},{"className":1556},[],[1558],{"type":45,"value":1559},"\u003Chr>",{"type":45,"value":723},{"type":40,"tag":193,"props":1562,"children":1564},{"className":1563},[],[1565],{"type":45,"value":1566},"\u003Cbr>",{"type":45,"value":723},{"type":40,"tag":193,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":45,"value":1573},"\u003Cul>",{"type":45,"value":723},{"type":40,"tag":193,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":45,"value":1580},"\u003Col>",{"type":45,"value":723},{"type":40,"tag":193,"props":1583,"children":1585},{"className":1584},[],[1586],{"type":45,"value":1587},"\u003Cli>",{"type":45,"value":723},{"type":40,"tag":193,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":45,"value":1594},"\u003Ca href=\"...\">",{"type":40,"tag":48,"props":1596,"children":1597},{},[1598,1603,1604,1610,1611,1617,1618,1624,1626,1631,1633,1639,1640,1645,1646,1652,1653],{"type":40,"tag":105,"props":1599,"children":1600},{},[1601],{"type":45,"value":1602},"Forbidden (stripped):",{"type":45,"value":1477},{"type":40,"tag":193,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":45,"value":1609},"\u003Cdiv>",{"type":45,"value":723},{"type":40,"tag":193,"props":1612,"children":1614},{"className":1613},[],[1615],{"type":45,"value":1616},"\u003Cspan>",{"type":45,"value":723},{"type":40,"tag":193,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":45,"value":1623},"\u003Cb>",{"type":45,"value":1625}," (use ",{"type":40,"tag":193,"props":1627,"children":1629},{"className":1628},[],[1630],{"type":45,"value":1510},{"type":45,"value":1632},"), ",{"type":40,"tag":193,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":45,"value":1638},"\u003Ci>",{"type":45,"value":1625},{"type":40,"tag":193,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":45,"value":1517},{"type":45,"value":1632},{"type":40,"tag":193,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":45,"value":1651},"\u003Cimg>",{"type":45,"value":723},{"type":40,"tag":193,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":45,"value":1658},"\u003Ctable>",{"type":40,"tag":48,"props":1660,"children":1661},{},[1662,1667,1669,1675],{"type":40,"tag":105,"props":1663,"children":1664},{},[1665],{"type":45,"value":1666},"Critical:",{"type":45,"value":1668}," Strip ",{"type":40,"tag":193,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":45,"value":1674},"\\n",{"type":45,"value":1676}," and collapse whitespace from HTML before sending. Each element renders as its own line.",{"type":40,"tag":48,"props":1678,"children":1679},{},[1680],{"type":40,"tag":105,"props":1681,"children":1682},{},[1683],{"type":45,"value":1684},"Text card patterns:",{"type":40,"tag":185,"props":1686,"children":1690},{"className":1687,"code":1689,"language":45},[1688],"language-text","Intro:     \u003Ch2>Dashboard Title\u003C\u002Fh2>\u003Cp>What and why. Time period: last 90 days.\u003C\u002Fp>\nSection:   \u003Ch2>Acquisition\u003C\u002Fh2>\u003Cp>How users discover and sign up.\u003C\u002Fp>\nExplainer: \u003Cp>^ Signup conversion is \u003Cstrong>23.4%\u003C\u002Fstrong>, up 2.1pp.\u003C\u002Fp>\n",[1691],{"type":40,"tag":193,"props":1692,"children":1693},{"__ignoreMap":190},[1694],{"type":45,"value":1689},{"type":40,"tag":650,"props":1696,"children":1698},{"id":1697},"phase-b3-query-and-build",[1699],{"type":45,"value":1700},"Phase B3: Query and Build",{"type":40,"tag":48,"props":1702,"children":1703},{},[1704],{"type":45,"value":1705},"Query each metric, verify data, then create with layout in one call.",{"type":40,"tag":185,"props":1707,"children":1709},{"className":187,"code":1708,"language":189,"meta":190,"style":190},"def text(html):\n    return DashboardRowContent(content_type=\"text\", content_params={\"markdown\": html})\n\ndef report(name, btype, result, description=None):\n    params = {\"bookmark\": {\"name\": name, \"type\": btype, \"params\": json.dumps(result.params)}}\n    if description:\n        params[\"bookmark\"][\"description\"] = description\n    return DashboardRowContent(content_type=\"report\", content_params=params)\n\ndashboard = ws.create_dashboard(CreateDashboardParams(\n    title=\"Product Health Dashboard\",\n    description=\"Key metrics for product health monitoring.\",\n    rows=[\n        DashboardRow(contents=[text(\"\u003Ch2>Product Health\u003C\u002Fh2>\u003Cp>Updated daily.\u003C\u002Fp>\")]),\n        DashboardRow(contents=[\n            report(\"DAU (90d)\", \"insights\", dau),\n            report(\"Signups (90d)\", \"insights\", signups),\n            report(\"Revenue (90d)\", \"insights\", revenue),\n        ]),\n        DashboardRow(contents=[text(\"\u003Ch2>Conversion\u003C\u002Fh2>\u003Cp>Key funnels.\u003C\u002Fp>\")]),\n        DashboardRow(contents=[report(\"Signup Funnel\", \"funnels\", funnel)]),\n    ],\n))\n",[1710],{"type":40,"tag":193,"props":1711,"children":1712},{"__ignoreMap":190},[1713,1720,1727,1734,1742,1750,1758,1766,1774,1781,1788,1796,1804,1811,1819,1827,1835,1843,1851,1859,1867,1875,1882],{"type":40,"tag":197,"props":1714,"children":1715},{"class":199,"line":200},[1716],{"type":40,"tag":197,"props":1717,"children":1718},{},[1719],{"type":45,"value":523},{"type":40,"tag":197,"props":1721,"children":1722},{"class":199,"line":209},[1723],{"type":40,"tag":197,"props":1724,"children":1725},{},[1726],{"type":45,"value":531},{"type":40,"tag":197,"props":1728,"children":1729},{"class":199,"line":218},[1730],{"type":40,"tag":197,"props":1731,"children":1732},{"emptyLinePlaceholder":222},[1733],{"type":45,"value":225},{"type":40,"tag":197,"props":1735,"children":1736},{"class":199,"line":228},[1737],{"type":40,"tag":197,"props":1738,"children":1739},{},[1740],{"type":45,"value":1741},"def report(name, btype, result, description=None):\n",{"type":40,"tag":197,"props":1743,"children":1744},{"class":199,"line":237},[1745],{"type":40,"tag":197,"props":1746,"children":1747},{},[1748],{"type":45,"value":1749},"    params = {\"bookmark\": {\"name\": name, \"type\": btype, \"params\": json.dumps(result.params)}}\n",{"type":40,"tag":197,"props":1751,"children":1752},{"class":199,"line":246},[1753],{"type":40,"tag":197,"props":1754,"children":1755},{},[1756],{"type":45,"value":1757},"    if description:\n",{"type":40,"tag":197,"props":1759,"children":1760},{"class":199,"line":255},[1761],{"type":40,"tag":197,"props":1762,"children":1763},{},[1764],{"type":45,"value":1765},"        params[\"bookmark\"][\"description\"] = description\n",{"type":40,"tag":197,"props":1767,"children":1768},{"class":199,"line":263},[1769],{"type":40,"tag":197,"props":1770,"children":1771},{},[1772],{"type":45,"value":1773},"    return DashboardRowContent(content_type=\"report\", content_params=params)\n",{"type":40,"tag":197,"props":1775,"children":1776},{"class":199,"line":272},[1777],{"type":40,"tag":197,"props":1778,"children":1779},{"emptyLinePlaceholder":222},[1780],{"type":45,"value":225},{"type":40,"tag":197,"props":1782,"children":1783},{"class":199,"line":281},[1784],{"type":40,"tag":197,"props":1785,"children":1786},{},[1787],{"type":45,"value":577},{"type":40,"tag":197,"props":1789,"children":1790},{"class":199,"line":290},[1791],{"type":40,"tag":197,"props":1792,"children":1793},{},[1794],{"type":45,"value":1795},"    title=\"Product Health Dashboard\",\n",{"type":40,"tag":197,"props":1797,"children":1798},{"class":199,"line":299},[1799],{"type":40,"tag":197,"props":1800,"children":1801},{},[1802],{"type":45,"value":1803},"    description=\"Key metrics for product health monitoring.\",\n",{"type":40,"tag":197,"props":1805,"children":1806},{"class":199,"line":308},[1807],{"type":40,"tag":197,"props":1808,"children":1809},{},[1810],{"type":45,"value":593},{"type":40,"tag":197,"props":1812,"children":1813},{"class":199,"line":317},[1814],{"type":40,"tag":197,"props":1815,"children":1816},{},[1817],{"type":45,"value":1818},"        DashboardRow(contents=[text(\"\u003Ch2>Product Health\u003C\u002Fh2>\u003Cp>Updated daily.\u003C\u002Fp>\")]),\n",{"type":40,"tag":197,"props":1820,"children":1821},{"class":199,"line":326},[1822],{"type":40,"tag":197,"props":1823,"children":1824},{},[1825],{"type":45,"value":1826},"        DashboardRow(contents=[\n",{"type":40,"tag":197,"props":1828,"children":1829},{"class":199,"line":335},[1830],{"type":40,"tag":197,"props":1831,"children":1832},{},[1833],{"type":45,"value":1834},"            report(\"DAU (90d)\", \"insights\", dau),\n",{"type":40,"tag":197,"props":1836,"children":1837},{"class":199,"line":344},[1838],{"type":40,"tag":197,"props":1839,"children":1840},{},[1841],{"type":45,"value":1842},"            report(\"Signups (90d)\", \"insights\", signups),\n",{"type":40,"tag":197,"props":1844,"children":1845},{"class":199,"line":353},[1846],{"type":40,"tag":197,"props":1847,"children":1848},{},[1849],{"type":45,"value":1850},"            report(\"Revenue (90d)\", \"insights\", revenue),\n",{"type":40,"tag":197,"props":1852,"children":1853},{"class":199,"line":362},[1854],{"type":40,"tag":197,"props":1855,"children":1856},{},[1857],{"type":45,"value":1858},"        ]),\n",{"type":40,"tag":197,"props":1860,"children":1861},{"class":199,"line":371},[1862],{"type":40,"tag":197,"props":1863,"children":1864},{},[1865],{"type":45,"value":1866},"        DashboardRow(contents=[text(\"\u003Ch2>Conversion\u003C\u002Fh2>\u003Cp>Key funnels.\u003C\u002Fp>\")]),\n",{"type":40,"tag":197,"props":1868,"children":1869},{"class":199,"line":379},[1870],{"type":40,"tag":197,"props":1871,"children":1872},{},[1873],{"type":45,"value":1874},"        DashboardRow(contents=[report(\"Signup Funnel\", \"funnels\", funnel)]),\n",{"type":40,"tag":197,"props":1876,"children":1877},{"class":199,"line":388},[1878],{"type":40,"tag":197,"props":1879,"children":1880},{},[1881],{"type":45,"value":617},{"type":40,"tag":197,"props":1883,"children":1884},{"class":199,"line":397},[1885],{"type":40,"tag":197,"props":1886,"children":1887},{},[1888],{"type":45,"value":625},{"type":40,"tag":48,"props":1890,"children":1891},{},[1892,1897],{"type":40,"tag":105,"props":1893,"children":1894},{},[1895],{"type":45,"value":1896},"On report failure",{"type":45,"value":1898},", substitute a fallback text card:",{"type":40,"tag":185,"props":1900,"children":1902},{"className":187,"code":1901,"language":189,"meta":190,"style":190},"try:\n    result = ws.query(event, math=\"total\", last=90)\n    row_items.append(report(f\"{event} Trend\", \"insights\", result))\nexcept Exception as e:\n    row_items.append(text(f\"\u003Cp>\u003Cstrong>Failed:\u003C\u002Fstrong> {event} — {e}\u003C\u002Fp>\"))\n",[1903],{"type":40,"tag":193,"props":1904,"children":1905},{"__ignoreMap":190},[1906,1914,1922,1930,1938],{"type":40,"tag":197,"props":1907,"children":1908},{"class":199,"line":200},[1909],{"type":40,"tag":197,"props":1910,"children":1911},{},[1912],{"type":45,"value":1913},"try:\n",{"type":40,"tag":197,"props":1915,"children":1916},{"class":199,"line":209},[1917],{"type":40,"tag":197,"props":1918,"children":1919},{},[1920],{"type":45,"value":1921},"    result = ws.query(event, math=\"total\", last=90)\n",{"type":40,"tag":197,"props":1923,"children":1924},{"class":199,"line":218},[1925],{"type":40,"tag":197,"props":1926,"children":1927},{},[1928],{"type":45,"value":1929},"    row_items.append(report(f\"{event} Trend\", \"insights\", result))\n",{"type":40,"tag":197,"props":1931,"children":1932},{"class":199,"line":228},[1933],{"type":40,"tag":197,"props":1934,"children":1935},{},[1936],{"type":45,"value":1937},"except Exception as e:\n",{"type":40,"tag":197,"props":1939,"children":1940},{"class":199,"line":237},[1941],{"type":40,"tag":197,"props":1942,"children":1943},{},[1944],{"type":45,"value":1945},"    row_items.append(text(f\"\u003Cp>\u003Cstrong>Failed:\u003C\u002Fstrong> {event} — {e}\u003C\u002Fp>\"))\n",{"type":40,"tag":650,"props":1947,"children":1949},{"id":1948},"phase-b4-enhance",[1950],{"type":45,"value":1951},"Phase B4: Enhance",{"type":40,"tag":684,"props":1953,"children":1954},{},[1955,1972,1987,1997],{"type":40,"tag":688,"props":1956,"children":1957},{},[1958,1963,1964,1970],{"type":40,"tag":105,"props":1959,"children":1960},{},[1961],{"type":45,"value":1962},"Pin for team visibility:",{"type":45,"value":1477},{"type":40,"tag":193,"props":1965,"children":1967},{"className":1966},[],[1968],{"type":45,"value":1969},"ws.pin_dashboard(dashboard.id)",{"type":45,"value":1971}," — dashboards are invisible by default",{"type":40,"tag":688,"props":1973,"children":1974},{},[1975,1980,1981],{"type":40,"tag":105,"props":1976,"children":1977},{},[1978],{"type":45,"value":1979},"Favorite for personal use:",{"type":45,"value":1477},{"type":40,"tag":193,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":45,"value":1986},"ws.favorite_dashboard(dashboard.id)",{"type":40,"tag":688,"props":1988,"children":1989},{},[1990,1995],{"type":40,"tag":105,"props":1991,"children":1992},{},[1993],{"type":45,"value":1994},"Add explainer cards:",{"type":45,"value":1996}," see Mode: Explain",{"type":40,"tag":688,"props":1998,"children":1999},{},[2000,2005,2007,2013],{"type":40,"tag":105,"props":2001,"children":2002},{},[2003],{"type":45,"value":2004},"Adjust heights:",{"type":45,"value":2006}," see ",{"type":40,"tag":193,"props":2008,"children":2010},{"className":2009},[],[2011],{"type":45,"value":2012},"references\u002Fdashboard-reference.md",{"type":45,"value":2014}," Section 3.4",{"type":40,"tag":650,"props":2016,"children":2018},{"id":2017},"phase-b5-verify",[2019],{"type":45,"value":2020},"Phase B5: Verify",{"type":40,"tag":48,"props":2022,"children":2023},{},[2024],{"type":45,"value":2025},"Open the dashboard and confirm all reports render with data, text cards display correctly, and layout matches the plan.",{"type":40,"tag":635,"props":2027,"children":2028},{},[],{"type":40,"tag":54,"props":2030,"children":2032},{"id":2031},"mode-modify",[2033],{"type":45,"value":2034},"Mode: Modify",{"type":40,"tag":48,"props":2036,"children":2037},{},[2038],{"type":45,"value":2039},"Update existing dashboards. Read first, then apply changes in the correct order.",{"type":40,"tag":650,"props":2041,"children":2043},{"id":2042},"phase-m1-read-current-state",[2044],{"type":45,"value":2045},"Phase M1: Read Current State",{"type":40,"tag":48,"props":2047,"children":2048},{},[2049],{"type":45,"value":2050},"Use Analyze Phase A1-A2 to understand the dashboard's structure. Present to user before making changes.",{"type":40,"tag":650,"props":2052,"children":2054},{"id":2053},"phase-m2-plan-changes",[2055],{"type":45,"value":2056},"Phase M2: Plan Changes",{"type":40,"tag":48,"props":2058,"children":2059},{},[2060,2062,2067],{"type":45,"value":2061},"Classify each change and plan execution order. Operations ",{"type":40,"tag":105,"props":2063,"children":2064},{},[2065],{"type":45,"value":2066},"must",{"type":45,"value":2068}," follow this sequence:",{"type":40,"tag":1171,"props":2070,"children":2071},{},[2072,2082,2092,2110,2120,2130],{"type":40,"tag":688,"props":2073,"children":2074},{},[2075,2080],{"type":40,"tag":105,"props":2076,"children":2077},{},[2078],{"type":45,"value":2079},"Metadata",{"type":45,"value":2081}," (title\u002Fdescription) — standalone PATCH",{"type":40,"tag":688,"props":2083,"children":2084},{},[2085,2090],{"type":40,"tag":105,"props":2086,"children":2087},{},[2088],{"type":45,"value":2089},"Cell creates",{"type":45,"value":2091}," — add new content first",{"type":40,"tag":688,"props":2093,"children":2094},{},[2095,2100,2102,2108],{"type":40,"tag":105,"props":2096,"children":2097},{},[2098],{"type":45,"value":2099},"Row reorder",{"type":45,"value":2101}," (",{"type":40,"tag":193,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":45,"value":2107},"rows_order",{"type":45,"value":2109},") — after creates so temp IDs resolve",{"type":40,"tag":688,"props":2111,"children":2112},{},[2113,2118],{"type":40,"tag":105,"props":2114,"children":2115},{},[2116],{"type":45,"value":2117},"Cell updates",{"type":45,"value":2119}," — modify existing content",{"type":40,"tag":688,"props":2121,"children":2122},{},[2123,2128],{"type":40,"tag":105,"props":2124,"children":2125},{},[2126],{"type":45,"value":2127},"Cell deletes",{"type":45,"value":2129}," — remove content",{"type":40,"tag":688,"props":2131,"children":2132},{},[2133,2138],{"type":40,"tag":105,"props":2134,"children":2135},{},[2136],{"type":45,"value":2137},"Row deletes",{"type":45,"value":2139}," — remove entire rows last",{"type":40,"tag":650,"props":2141,"children":2143},{"id":2142},"phase-m3-execute-changes",[2144],{"type":45,"value":2145},"Phase M3: Execute Changes",{"type":40,"tag":48,"props":2147,"children":2148},{},[2149,2154,2156,2162,2164,2170],{"type":40,"tag":105,"props":2150,"children":2151},{},[2152],{"type":45,"value":2153},"Adding content to a specific existing row",{"type":45,"value":2155}," — send ",{"type":40,"tag":193,"props":2157,"children":2159},{"className":2158},[],[2160],{"type":45,"value":2161},"content",{"type":45,"value":2163}," AND ",{"type":40,"tag":193,"props":2165,"children":2167},{"className":2166},[],[2168],{"type":45,"value":2169},"layout",{"type":45,"value":2171}," together:",{"type":40,"tag":185,"props":2173,"children":2175},{"className":187,"code":2174,"language":189,"meta":190,"style":190},"import copy\ndash = ws.get_dashboard(dashboard_id)\nlayout = copy.deepcopy(dash.layout)\ntarget_row = layout[\"rows\"][target_row_id]\n\n# Redistribute widths\nnew_count = len(target_row[\"cells\"]) + 1\ncell_width = 12 \u002F\u002F new_count\nfor cell in target_row[\"cells\"]:\n    cell[\"width\"] = cell_width\ntarget_row[\"cells\"].append({\"temp_id\": \"-1\", \"width\": cell_width})\n\nws.update_dashboard(dashboard_id, UpdateDashboardParams(\n    content={\"action\": \"create\", \"content_type\": \"report\",\n             \"content_params\": {\"bookmark\": {\"name\": \"New Report\", \"type\": \"insights\",\n                                              \"params\": json.dumps(result.params)}}},\n    layout={\"rows_order\": layout[\"order\"], \"rows\": layout[\"rows\"]},\n))\n",[2176],{"type":40,"tag":193,"props":2177,"children":2178},{"__ignoreMap":190},[2179,2187,2194,2202,2210,2217,2225,2233,2241,2249,2257,2265,2272,2280,2288,2296,2304,2312],{"type":40,"tag":197,"props":2180,"children":2181},{"class":199,"line":200},[2182],{"type":40,"tag":197,"props":2183,"children":2184},{},[2185],{"type":45,"value":2186},"import copy\n",{"type":40,"tag":197,"props":2188,"children":2189},{"class":199,"line":209},[2190],{"type":40,"tag":197,"props":2191,"children":2192},{},[2193],{"type":45,"value":670},{"type":40,"tag":197,"props":2195,"children":2196},{"class":199,"line":218},[2197],{"type":40,"tag":197,"props":2198,"children":2199},{},[2200],{"type":45,"value":2201},"layout = copy.deepcopy(dash.layout)\n",{"type":40,"tag":197,"props":2203,"children":2204},{"class":199,"line":228},[2205],{"type":40,"tag":197,"props":2206,"children":2207},{},[2208],{"type":45,"value":2209},"target_row = layout[\"rows\"][target_row_id]\n",{"type":40,"tag":197,"props":2211,"children":2212},{"class":199,"line":237},[2213],{"type":40,"tag":197,"props":2214,"children":2215},{"emptyLinePlaceholder":222},[2216],{"type":45,"value":225},{"type":40,"tag":197,"props":2218,"children":2219},{"class":199,"line":246},[2220],{"type":40,"tag":197,"props":2221,"children":2222},{},[2223],{"type":45,"value":2224},"# Redistribute widths\n",{"type":40,"tag":197,"props":2226,"children":2227},{"class":199,"line":255},[2228],{"type":40,"tag":197,"props":2229,"children":2230},{},[2231],{"type":45,"value":2232},"new_count = len(target_row[\"cells\"]) + 1\n",{"type":40,"tag":197,"props":2234,"children":2235},{"class":199,"line":263},[2236],{"type":40,"tag":197,"props":2237,"children":2238},{},[2239],{"type":45,"value":2240},"cell_width = 12 \u002F\u002F new_count\n",{"type":40,"tag":197,"props":2242,"children":2243},{"class":199,"line":272},[2244],{"type":40,"tag":197,"props":2245,"children":2246},{},[2247],{"type":45,"value":2248},"for cell in target_row[\"cells\"]:\n",{"type":40,"tag":197,"props":2250,"children":2251},{"class":199,"line":281},[2252],{"type":40,"tag":197,"props":2253,"children":2254},{},[2255],{"type":45,"value":2256},"    cell[\"width\"] = cell_width\n",{"type":40,"tag":197,"props":2258,"children":2259},{"class":199,"line":290},[2260],{"type":40,"tag":197,"props":2261,"children":2262},{},[2263],{"type":45,"value":2264},"target_row[\"cells\"].append({\"temp_id\": \"-1\", \"width\": cell_width})\n",{"type":40,"tag":197,"props":2266,"children":2267},{"class":199,"line":299},[2268],{"type":40,"tag":197,"props":2269,"children":2270},{"emptyLinePlaceholder":222},[2271],{"type":45,"value":225},{"type":40,"tag":197,"props":2273,"children":2274},{"class":199,"line":308},[2275],{"type":40,"tag":197,"props":2276,"children":2277},{},[2278],{"type":45,"value":2279},"ws.update_dashboard(dashboard_id, UpdateDashboardParams(\n",{"type":40,"tag":197,"props":2281,"children":2282},{"class":199,"line":317},[2283],{"type":40,"tag":197,"props":2284,"children":2285},{},[2286],{"type":45,"value":2287},"    content={\"action\": \"create\", \"content_type\": \"report\",\n",{"type":40,"tag":197,"props":2289,"children":2290},{"class":199,"line":326},[2291],{"type":40,"tag":197,"props":2292,"children":2293},{},[2294],{"type":45,"value":2295},"             \"content_params\": {\"bookmark\": {\"name\": \"New Report\", \"type\": \"insights\",\n",{"type":40,"tag":197,"props":2297,"children":2298},{"class":199,"line":335},[2299],{"type":40,"tag":197,"props":2300,"children":2301},{},[2302],{"type":45,"value":2303},"                                              \"params\": json.dumps(result.params)}}},\n",{"type":40,"tag":197,"props":2305,"children":2306},{"class":199,"line":344},[2307],{"type":40,"tag":197,"props":2308,"children":2309},{},[2310],{"type":45,"value":2311},"    layout={\"rows_order\": layout[\"order\"], \"rows\": layout[\"rows\"]},\n",{"type":40,"tag":197,"props":2313,"children":2314},{"class":199,"line":353},[2315],{"type":40,"tag":197,"props":2316,"children":2317},{},[2318],{"type":45,"value":625},{"type":40,"tag":48,"props":2320,"children":2321},{},[2322,2327],{"type":40,"tag":105,"props":2323,"children":2324},{},[2325],{"type":45,"value":2326},"Adding content as a new row",{"type":45,"value":2328}," — content action alone (appends to bottom):",{"type":40,"tag":185,"props":2330,"children":2332},{"className":187,"code":2331,"language":189,"meta":190,"style":190},"ws.update_dashboard(dashboard_id, UpdateDashboardParams(\n    content={\"action\": \"create\", \"content_type\": \"text\",\n             \"content_params\": {\"markdown\": \"\u003Cp>^ Explainer card.\u003C\u002Fp>\"}},\n))\n",[2333],{"type":40,"tag":193,"props":2334,"children":2335},{"__ignoreMap":190},[2336,2343,2351,2359],{"type":40,"tag":197,"props":2337,"children":2338},{"class":199,"line":200},[2339],{"type":40,"tag":197,"props":2340,"children":2341},{},[2342],{"type":45,"value":2279},{"type":40,"tag":197,"props":2344,"children":2345},{"class":199,"line":209},[2346],{"type":40,"tag":197,"props":2347,"children":2348},{},[2349],{"type":45,"value":2350},"    content={\"action\": \"create\", \"content_type\": \"text\",\n",{"type":40,"tag":197,"props":2352,"children":2353},{"class":199,"line":218},[2354],{"type":40,"tag":197,"props":2355,"children":2356},{},[2357],{"type":45,"value":2358},"             \"content_params\": {\"markdown\": \"\u003Cp>^ Explainer card.\u003C\u002Fp>\"}},\n",{"type":40,"tag":197,"props":2360,"children":2361},{"class":199,"line":228},[2362],{"type":40,"tag":197,"props":2363,"children":2364},{},[2365],{"type":45,"value":625},{"type":40,"tag":48,"props":2367,"children":2368},{},[2369],{"type":40,"tag":105,"props":2370,"children":2371},{},[2372],{"type":45,"value":2373},"Deleting content:",{"type":40,"tag":185,"props":2375,"children":2377},{"className":187,"code":2376,"language":189,"meta":190,"style":190},"ws.update_dashboard(dashboard_id, UpdateDashboardParams(\n    content={\"action\": \"delete\", \"content_type\": \"report\", \"content_id\": content_id},\n))\n",[2378],{"type":40,"tag":193,"props":2379,"children":2380},{"__ignoreMap":190},[2381,2388,2396],{"type":40,"tag":197,"props":2382,"children":2383},{"class":199,"line":200},[2384],{"type":40,"tag":197,"props":2385,"children":2386},{},[2387],{"type":45,"value":2279},{"type":40,"tag":197,"props":2389,"children":2390},{"class":199,"line":209},[2391],{"type":40,"tag":197,"props":2392,"children":2393},{},[2394],{"type":45,"value":2395},"    content={\"action\": \"delete\", \"content_type\": \"report\", \"content_id\": content_id},\n",{"type":40,"tag":197,"props":2397,"children":2398},{"class":199,"line":218},[2399],{"type":40,"tag":197,"props":2400,"children":2401},{},[2402],{"type":45,"value":625},{"type":40,"tag":48,"props":2404,"children":2405},{},[2406,2411,2413,2418],{"type":40,"tag":105,"props":2407,"children":2408},{},[2409],{"type":45,"value":2410},"Cross-type updates",{"type":45,"value":2412}," (e.g., text → report): API rejects changing ",{"type":40,"tag":193,"props":2414,"children":2416},{"className":2415},[],[2417],{"type":45,"value":729},{"type":45,"value":2419}," on update. Delete the old cell, then create the new one.",{"type":40,"tag":48,"props":2421,"children":2422},{},[2423,2425,2430],{"type":45,"value":2424},"See ",{"type":40,"tag":193,"props":2426,"children":2428},{"className":2427},[],[2429],{"type":45,"value":2012},{"type":45,"value":2431}," Section 8 for temp ID resolution, operation ordering details, and report-link semantics.",{"type":40,"tag":635,"props":2433,"children":2434},{},[],{"type":40,"tag":54,"props":2436,"children":2438},{"id":2437},"mode-explain",[2439],{"type":45,"value":2440},"Mode: Explain",{"type":40,"tag":48,"props":2442,"children":2443},{},[2444],{"type":45,"value":2445},"Combine analysis with targeted text card insertion.",{"type":40,"tag":1171,"props":2447,"children":2448},{},[2449,2458,2523],{"type":40,"tag":688,"props":2450,"children":2451},{},[2452,2456],{"type":40,"tag":105,"props":2453,"children":2454},{},[2455],{"type":45,"value":109},{"type":45,"value":2457}," — run Mode: Analyze to extract structure and execute reports",{"type":40,"tag":688,"props":2459,"children":2460},{},[2461,2466,2468],{"type":40,"tag":105,"props":2462,"children":2463},{},[2464],{"type":45,"value":2465},"Generate insights",{"type":45,"value":2467}," — for each report, compute key metrics from the DataFrame:\n",{"type":40,"tag":185,"props":2469,"children":2471},{"className":187,"code":2470,"language":189,"meta":190,"style":190},"latest = df.iloc[-1][\"count\"]\nprev = df.iloc[-8][\"count\"]\ntrend = ((latest - prev) \u002F prev) * 100\nhtml = (f\"\u003Cp>^ DAU is \u003Cstrong>{latest:,.0f}\u003C\u002Fstrong>, \"\n        f\"{'up' if trend > 0 else 'down'} \u003Cstrong>{abs(trend):.1f}%\u003C\u002Fstrong> \"\n        f\"vs. last week.\u003C\u002Fp>\").replace(\"\\n\", \"\")\n",[2472],{"type":40,"tag":193,"props":2473,"children":2474},{"__ignoreMap":190},[2475,2483,2491,2499,2507,2515],{"type":40,"tag":197,"props":2476,"children":2477},{"class":199,"line":200},[2478],{"type":40,"tag":197,"props":2479,"children":2480},{},[2481],{"type":45,"value":2482},"latest = df.iloc[-1][\"count\"]\n",{"type":40,"tag":197,"props":2484,"children":2485},{"class":199,"line":209},[2486],{"type":40,"tag":197,"props":2487,"children":2488},{},[2489],{"type":45,"value":2490},"prev = df.iloc[-8][\"count\"]\n",{"type":40,"tag":197,"props":2492,"children":2493},{"class":199,"line":218},[2494],{"type":40,"tag":197,"props":2495,"children":2496},{},[2497],{"type":45,"value":2498},"trend = ((latest - prev) \u002F prev) * 100\n",{"type":40,"tag":197,"props":2500,"children":2501},{"class":199,"line":228},[2502],{"type":40,"tag":197,"props":2503,"children":2504},{},[2505],{"type":45,"value":2506},"html = (f\"\u003Cp>^ DAU is \u003Cstrong>{latest:,.0f}\u003C\u002Fstrong>, \"\n",{"type":40,"tag":197,"props":2508,"children":2509},{"class":199,"line":237},[2510],{"type":40,"tag":197,"props":2511,"children":2512},{},[2513],{"type":45,"value":2514},"        f\"{'up' if trend > 0 else 'down'} \u003Cstrong>{abs(trend):.1f}%\u003C\u002Fstrong> \"\n",{"type":40,"tag":197,"props":2516,"children":2517},{"class":199,"line":246},[2518],{"type":40,"tag":197,"props":2519,"children":2520},{},[2521],{"type":45,"value":2522},"        f\"vs. last week.\u003C\u002Fp>\").replace(\"\\n\", \"\")\n",{"type":40,"tag":688,"props":2524,"children":2525},{},[2526,2531,2533],{"type":40,"tag":105,"props":2527,"children":2528},{},[2529],{"type":45,"value":2530},"Insert cards",{"type":45,"value":2532}," — add as new rows below each report section:\n",{"type":40,"tag":185,"props":2534,"children":2536},{"className":187,"code":2535,"language":189,"meta":190,"style":190},"ws.update_dashboard(dashboard_id, UpdateDashboardParams(\n    content={\"action\": \"create\", \"content_type\": \"text\",\n             \"content_params\": {\"markdown\": html}},\n))\n",[2537],{"type":40,"tag":193,"props":2538,"children":2539},{"__ignoreMap":190},[2540,2547,2554,2562],{"type":40,"tag":197,"props":2541,"children":2542},{"class":199,"line":200},[2543],{"type":40,"tag":197,"props":2544,"children":2545},{},[2546],{"type":45,"value":2279},{"type":40,"tag":197,"props":2548,"children":2549},{"class":199,"line":209},[2550],{"type":40,"tag":197,"props":2551,"children":2552},{},[2553],{"type":45,"value":2350},{"type":40,"tag":197,"props":2555,"children":2556},{"class":199,"line":218},[2557],{"type":40,"tag":197,"props":2558,"children":2559},{},[2560],{"type":45,"value":2561},"             \"content_params\": {\"markdown\": html}},\n",{"type":40,"tag":197,"props":2563,"children":2564},{"class":199,"line":228},[2565],{"type":40,"tag":197,"props":2566,"children":2567},{},[2568],{"type":45,"value":625},{"type":40,"tag":635,"props":2570,"children":2571},{},[],{"type":40,"tag":54,"props":2573,"children":2575},{"id":2574},"critical-gotchas",[2576],{"type":45,"value":2577},"Critical Gotchas",{"type":40,"tag":1171,"props":2579,"children":2580},{},[2581,2620,2638,2648,2677,2701,2731,2767,2785,2810,2820,2837,2855,2871],{"type":40,"tag":688,"props":2582,"children":2583},{},[2584,2589,2591,2596,2598,2603,2605,2611,2613,2618],{"type":40,"tag":105,"props":2585,"children":2586},{},[2587],{"type":45,"value":2588},"Combined content+layout PATCH",{"type":45,"value":2590}," — send both ",{"type":40,"tag":193,"props":2592,"children":2594},{"className":2593},[],[2595],{"type":45,"value":2161},{"type":45,"value":2597}," and ",{"type":40,"tag":193,"props":2599,"children":2601},{"className":2600},[],[2602],{"type":45,"value":2169},{"type":45,"value":2604}," in the same ",{"type":40,"tag":193,"props":2606,"children":2608},{"className":2607},[],[2609],{"type":45,"value":2610},"UpdateDashboardParams",{"type":45,"value":2612}," to add cells to specific existing rows. Without ",{"type":40,"tag":193,"props":2614,"children":2616},{"className":2615},[],[2617],{"type":45,"value":2169},{"type":45,"value":2619},", new content appends as a full-width row at the bottom.",{"type":40,"tag":688,"props":2621,"children":2622},{},[2623,2628,2630,2636],{"type":40,"tag":105,"props":2624,"children":2625},{},[2626],{"type":45,"value":2627},"Width auto-redistribution",{"type":45,"value":2629}," — when adding to an existing row with N cells, set all cells (including new) to ",{"type":40,"tag":193,"props":2631,"children":2633},{"className":2632},[],[2634],{"type":45,"value":2635},"12 \u002F\u002F (N+1)",{"type":45,"value":2637}," width.",{"type":40,"tag":688,"props":2639,"children":2640},{},[2641,2646],{"type":40,"tag":105,"props":2642,"children":2643},{},[2644],{"type":45,"value":2645},"Update operation ordering",{"type":45,"value":2647}," — metadata → cell creates → rows_order → cell updates → cell deletes → row deletes. Wrong order causes failures.",{"type":40,"tag":688,"props":2649,"children":2650},{},[2651,2668,2670,2676],{"type":40,"tag":105,"props":2652,"children":2653},{},[2654,2660,2662],{"type":40,"tag":193,"props":2655,"children":2657},{"className":2656},[],[2658],{"type":45,"value":2659},"per_user",{"type":45,"value":2661}," requires ",{"type":40,"tag":193,"props":2663,"children":2665},{"className":2664},[],[2666],{"type":45,"value":2667},"math_property",{"type":45,"value":2669}," — using per-user aggregation without a numeric property raises ",{"type":40,"tag":193,"props":2671,"children":2673},{"className":2672},[],[2674],{"type":45,"value":2675},"BookmarkValidationError",{"type":45,"value":1447},{"type":40,"tag":688,"props":2678,"children":2679},{},[2680,2691,2693,2699],{"type":40,"tag":105,"props":2681,"children":2682},{},[2683,2689],{"type":40,"tag":193,"props":2684,"children":2686},{"className":2685},[],[2687],{"type":45,"value":2688},"CreateBookmarkParams(dashboard_id=X)",{"type":45,"value":2690}," does NOT add to layout",{"type":45,"value":2692}," — use ",{"type":40,"tag":193,"props":2694,"children":2696},{"className":2695},[],[2697],{"type":45,"value":2698},"add_report_to_dashboard()",{"type":45,"value":2700}," or inline content action.",{"type":40,"tag":688,"props":2702,"children":2703},{},[2704,2714,2716,2722,2723,2729],{"type":40,"tag":105,"props":2705,"children":2706},{},[2707,2712],{"type":40,"tag":193,"props":2708,"children":2710},{"className":2709},[],[2711],{"type":45,"value":2698},{"type":45,"value":2713}," CLONES",{"type":45,"value":2715}," — creates \"Duplicate of...\" copy. Use ",{"type":40,"tag":193,"props":2717,"children":2719},{"className":2718},[],[2720],{"type":45,"value":2721},"rows",{"type":45,"value":982},{"type":40,"tag":193,"props":2724,"children":2726},{"className":2725},[],[2727],{"type":45,"value":2728},"CreateDashboardParams",{"type":45,"value":2730}," or inline content action instead.",{"type":40,"tag":688,"props":2732,"children":2733},{},[2734,2752,2754,2759,2761,2766],{"type":40,"tag":105,"props":2735,"children":2736},{},[2737,2739,2745,2747],{"type":45,"value":2738},"GET ",{"type":40,"tag":193,"props":2740,"children":2742},{"className":2741},[],[2743],{"type":45,"value":2744},"order",{"type":45,"value":2746}," vs PATCH ",{"type":40,"tag":193,"props":2748,"children":2750},{"className":2749},[],[2751],{"type":45,"value":2107},{"type":45,"value":2753}," — layout from GET uses ",{"type":40,"tag":193,"props":2755,"children":2757},{"className":2756},[],[2758],{"type":45,"value":2744},{"type":45,"value":2760},"; PATCH expects ",{"type":40,"tag":193,"props":2762,"children":2764},{"className":2763},[],[2765],{"type":45,"value":2107},{"type":45,"value":1447},{"type":40,"tag":688,"props":2768,"children":2769},{},[2770,2783],{"type":40,"tag":105,"props":2771,"children":2772},{},[2773,2775,2781],{"type":45,"value":2774},"Never include ",{"type":40,"tag":193,"props":2776,"children":2778},{"className":2777},[],[2779],{"type":45,"value":2780},"version",{"type":45,"value":2782}," in layout PATCH",{"type":45,"value":2784}," — the API rejects it.",{"type":40,"tag":688,"props":2786,"children":2787},{},[2788,2800,2802,2808],{"type":40,"tag":105,"props":2789,"children":2790},{},[2791,2793,2798],{"type":45,"value":2792},"Strip ",{"type":40,"tag":193,"props":2794,"children":2796},{"className":2795},[],[2797],{"type":45,"value":1674},{"type":45,"value":2799}," and collapse whitespace",{"type":45,"value":2801}," — call ",{"type":40,"tag":193,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":45,"value":2807},".replace(\"\\n\", \"\").strip()",{"type":45,"value":2809}," on text card HTML. Newlines cause TipTap to mangle content.",{"type":40,"tag":688,"props":2811,"children":2812},{},[2813,2818],{"type":40,"tag":105,"props":2814,"children":2815},{},[2816],{"type":45,"value":2817},"Limits",{"type":45,"value":2819}," — title 255 chars, description 400 chars, text cards 2,000 chars, max 4 items\u002Frow, max 30 rows.",{"type":40,"tag":688,"props":2821,"children":2822},{},[2823,2828,2830,2835],{"type":40,"tag":105,"props":2824,"children":2825},{},[2826],{"type":45,"value":2827},"Cross-type cell updates require delete+create",{"type":45,"value":2829}," — API rejects changing ",{"type":40,"tag":193,"props":2831,"children":2833},{"className":2832},[],[2834],{"type":45,"value":729},{"type":45,"value":2836}," on an update action.",{"type":40,"tag":688,"props":2838,"children":2839},{},[2840,2845,2847,2853],{"type":40,"tag":105,"props":2841,"children":2842},{},[2843],{"type":45,"value":2844},"Report-link cells are read-only",{"type":45,"value":2846}," — ",{"type":40,"tag":193,"props":2848,"children":2850},{"className":2849},[],[2851],{"type":45,"value":2852},"content_type: \"report-link\"",{"type":45,"value":2854}," references a report owned by another dashboard. You can view but not edit its params.",{"type":40,"tag":688,"props":2856,"children":2857},{},[2858,2863,2865,2870],{"type":40,"tag":105,"props":2859,"children":2860},{},[2861],{"type":45,"value":2862},"Auto-pin after creation",{"type":45,"value":2864}," — dashboards are invisible to the team by default. Call ",{"type":40,"tag":193,"props":2866,"children":2868},{"className":2867},[],[2869],{"type":45,"value":1969},{"type":45,"value":1447},{"type":40,"tag":688,"props":2872,"children":2873},{},[2874,2886],{"type":40,"tag":105,"props":2875,"children":2876},{},[2877,2879,2884],{"type":45,"value":2878},"The ",{"type":40,"tag":193,"props":2880,"children":2882},{"className":2881},[],[2883],{"type":45,"value":805},{"type":45,"value":2885}," field accepts only HTML",{"type":45,"value":2887}," — despite the name. Markdown syntax renders as literal text.",{"type":40,"tag":54,"props":2889,"children":2891},{"id":2890},"see-also",[2892],{"type":45,"value":2893},"See Also",{"type":40,"tag":684,"props":2895,"children":2896},{},[2897,2907,2917,2928],{"type":40,"tag":688,"props":2898,"children":2899},{},[2900,2905],{"type":40,"tag":193,"props":2901,"children":2903},{"className":2902},[],[2904],{"type":45,"value":2012},{"type":45,"value":2906}," — Complete API reference, layout system, content actions, text card formatting, update operations, analysis patterns",{"type":40,"tag":688,"props":2908,"children":2909},{},[2910,2915],{"type":40,"tag":193,"props":2911,"children":2913},{"className":2912},[],[2914],{"type":45,"value":1445},{"type":45,"value":2916}," — 9 purpose-built dashboard templates with section layouts and report specs",{"type":40,"tag":688,"props":2918,"children":2919},{},[2920,2926],{"type":40,"tag":193,"props":2921,"children":2923},{"className":2922},[],[2924],{"type":45,"value":2925},"references\u002Fbookmark-pipeline.md",{"type":45,"value":2927}," — End-to-end pipeline from typed query to dashboard report for all 4 engines",{"type":40,"tag":688,"props":2929,"children":2930},{},[2931,2937],{"type":40,"tag":193,"props":2932,"children":2934},{"className":2933},[],[2935],{"type":45,"value":2936},"references\u002Fchart-types.md",{"type":45,"value":2938}," — Chart type selection guide with slugs, use cases, and width recommendations",{"type":40,"tag":2940,"props":2941,"children":2942},"style",{},[2943],{"type":45,"value":2944},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2946,"total":3151},[2947,2968,2991,3008,3024,3043,3062,3078,3094,3108,3120,3135],{"slug":2948,"name":2948,"fn":2949,"description":2950,"org":2951,"tags":2952,"stars":2965,"repoUrl":2966,"updatedAt":2967},"prior-auth-packet-builder","build healthcare prior authorization packets","Build a concise prior authorization packet from local case files and payer policy docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2953,2956,2959,2962],{"name":2954,"slug":2955,"type":15},"Documents","documents",{"name":2957,"slug":2958,"type":15},"Healthcare","healthcare",{"name":2960,"slug":2961,"type":15},"Insurance","insurance",{"name":2963,"slug":2964,"type":15},"Regulatory Compliance","regulatory-compliance",28169,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python","2026-04-16T05:11:39.180399",{"slug":2969,"name":2969,"fn":2970,"description":2971,"org":2972,"tags":2973,"stars":2988,"repoUrl":2989,"updatedAt":2990},"aspnet-core","build ASP.NET Core web applications","Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2974,2977,2979,2982,2985],{"name":2975,"slug":2976,"type":15},".NET","dotnet",{"name":2978,"slug":2969,"type":15},"ASP.NET Core",{"name":2980,"slug":2981,"type":15},"Blazor","blazor",{"name":2983,"slug":2984,"type":15},"C#","csharp",{"name":2986,"slug":2987,"type":15},"Web Development","web-development",23787,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills","2026-04-12T05:07:02.819491",{"slug":2992,"name":2992,"fn":2993,"description":2994,"org":2995,"tags":2996,"stars":2988,"repoUrl":2989,"updatedAt":3007},"chatgpt-apps","build ChatGPT Apps SDK applications","Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI. Use when Codex needs to design tools, register UI resources, wire the MCP Apps bridge or ChatGPT compatibility APIs, apply Apps SDK metadata or CSP or domain settings, or produce a docs-aligned project scaffold. Prefer a docs-first workflow by invoking the openai-docs skill or OpenAI developer docs MCP tools before generating code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2997,3000,3003,3006],{"name":2998,"slug":2999,"type":15},"Apps SDK","apps-sdk",{"name":3001,"slug":3002,"type":15},"ChatGPT","chatgpt",{"name":3004,"slug":3005,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},"2026-04-12T05:07:05.468097",{"slug":3009,"name":3009,"fn":3010,"description":3011,"org":3012,"tags":3013,"stars":2988,"repoUrl":2989,"updatedAt":3023},"cli-creator","build CLIs from API docs","Build a composable CLI for Codex from API docs, an OpenAPI spec, existing curl examples, an SDK, a web app, an admin tool, or a local script. Use when the user wants Codex to create a command-line tool that can run from any repo, expose composable read\u002Fwrite commands, return stable JSON, manage auth, and pair with a companion skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3014,3017,3020],{"name":3015,"slug":3016,"type":15},"API Development","api-development",{"name":3018,"slug":3019,"type":15},"CLI","cli",{"name":3021,"slug":3022,"type":15},"Codex","codex","2026-04-12T05:07:04.132762",{"slug":3025,"name":3025,"fn":3026,"description":3027,"org":3028,"tags":3029,"stars":2988,"repoUrl":2989,"updatedAt":3042},"cloudflare-deploy","deploy projects to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3030,3033,3036,3039],{"name":3031,"slug":3032,"type":15},"Cloudflare","cloudflare",{"name":3034,"slug":3035,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":3037,"slug":3038,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":3040,"slug":3041,"type":15},"Deployment","deployment","2026-04-12T05:07:14.275118",{"slug":3044,"name":3044,"fn":3045,"description":3046,"org":3047,"tags":3048,"stars":2988,"repoUrl":2989,"updatedAt":3061},"define-goal","define and set measurable project goals","Help the user define a concrete, measurable goal before starting work, especially when they ask to use the goal tool, create a goal, set an objective, clarify success criteria, or turn a fuzzy intention into a quantitative outcome. Use this skill for goal creation and goal refinement only; it does not manage durable snapshots, decision logs, or long-running execution artifacts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3049,3052,3055,3058],{"name":3050,"slug":3051,"type":15},"Productivity","productivity",{"name":3053,"slug":3054,"type":15},"Project Management","project-management",{"name":3056,"slug":3057,"type":15},"Strategy","strategy",{"name":3059,"slug":3060,"type":15},"Task Management","task-management","2026-05-23T06:17:16.870838",{"slug":3063,"name":3063,"fn":3064,"description":3065,"org":3066,"tags":3067,"stars":2988,"repoUrl":2989,"updatedAt":3077},"figma","translate Figma designs into code","Use the Figma MCP server to fetch design context, screenshots, variables, and assets from Figma, and to translate Figma nodes into production code. Trigger when a task involves Figma URLs, node IDs, design-to-code implementation, or Figma MCP setup and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3068,3071,3073,3076],{"name":3069,"slug":3070,"type":15},"Design","design",{"name":3072,"slug":3063,"type":15},"Figma",{"name":3074,"slug":3075,"type":15},"Frontend","frontend",{"name":3004,"slug":3005,"type":15},"2026-04-12T05:06:47.939943",{"slug":3079,"name":3079,"fn":3080,"description":3081,"org":3082,"tags":3083,"stars":2988,"repoUrl":2989,"updatedAt":3093},"figma-code-connect-components","connect Figma designs to code components","Connects Figma design components to code components using Code Connect mapping tools. Use when user says \"code connect\", \"connect this component to code\", \"map this component\", \"link component to code\", \"create code connect mapping\", or wants to establish mappings between Figma designs and code implementations. For canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3084,3085,3088,3089,3090],{"name":3069,"slug":3070,"type":15},{"name":3086,"slug":3087,"type":15},"Design System","design-system",{"name":3072,"slug":3063,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3091,"slug":3092,"type":15},"UI Components","ui-components","2026-05-10T05:59:52.971881",{"slug":3095,"name":3095,"fn":3096,"description":3097,"org":3098,"tags":3099,"stars":2988,"repoUrl":2989,"updatedAt":3107},"figma-create-design-system-rules","generate design system rules from Figma","Generates custom design system rules for the user's codebase. Use when user says \"create design system rules\", \"generate rules for my project\", \"set up design rules\", \"customize design system guidelines\", or wants to establish project-specific conventions for Figma-to-code workflows. Requires Figma MCP server connection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3100,3101,3102,3105,3106],{"name":3069,"slug":3070,"type":15},{"name":3086,"slug":3087,"type":15},{"name":3103,"slug":3104,"type":15},"Documentation","documentation",{"name":3072,"slug":3063,"type":15},{"name":3074,"slug":3075,"type":15},"2026-05-16T06:07:47.821474",{"slug":3109,"name":3109,"fn":3110,"description":3111,"org":3112,"tags":3113,"stars":2988,"repoUrl":2989,"updatedAt":3119},"figma-implement-design","translate Figma designs into application code","Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions \"implement design\", \"generate code\", \"implement component\", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3114,3115,3116,3117,3118],{"name":3069,"slug":3070,"type":15},{"name":3072,"slug":3063,"type":15},{"name":3074,"slug":3075,"type":15},{"name":3091,"slug":3092,"type":15},{"name":2986,"slug":2987,"type":15},"2026-05-16T06:07:40.583615",{"slug":3121,"name":3121,"fn":3122,"description":3123,"org":3124,"tags":3125,"stars":2988,"repoUrl":2989,"updatedAt":3134},"hatch-pet","create animated pets for Codex","Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3126,3129,3130,3133],{"name":3127,"slug":3128,"type":15},"Animation","animation",{"name":3021,"slug":3022,"type":15},{"name":3131,"slug":3132,"type":15},"Creative","creative",{"name":3069,"slug":3070,"type":15},"2026-05-02T05:31:48.48485",{"slug":3136,"name":3136,"fn":3137,"description":3138,"org":3139,"tags":3140,"stars":2988,"repoUrl":2989,"updatedAt":3150},"imagegen","generate and edit raster images","Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG\u002Fvector\u002Fcode-native assets, extending an established icon or logo system, or building the visual directly in HTML\u002FCSS\u002Fcanvas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3141,3142,3143,3146,3149],{"name":3131,"slug":3132,"type":15},{"name":3069,"slug":3070,"type":15},{"name":3144,"slug":3145,"type":15},"Image Generation","image-generation",{"name":3147,"slug":3148,"type":15},"Images","images",{"name":9,"slug":8,"type":15},"2026-05-15T06:23:24.312127",675,{"items":3153,"total":3264},[3154,3168,3184,3196,3214,3232,3252],{"slug":3155,"name":3155,"fn":3156,"description":3157,"org":3158,"tags":3159,"stars":22,"repoUrl":23,"updatedAt":24},"accessibility-and-inclusive-visualization","make data visualizations accessible","Make data visualizations accessible and inclusive. Use when the user needs chart or diagram accessibility guidance, text alternatives for complex visuals, color and contrast review, keyboard support, reduced-motion behavior for animation or parallax, or an accessibility QA workflow for exported figures, UML-like diagrams, and dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3160,3163,3166,3167],{"name":3161,"slug":3162,"type":15},"Accessibility","accessibility",{"name":3164,"slug":3165,"type":15},"Charts","charts",{"name":17,"slug":18,"type":15},{"name":3069,"slug":3070,"type":15},{"slug":3169,"name":3169,"fn":3170,"description":3171,"org":3172,"tags":3173,"stars":22,"repoUrl":23,"updatedAt":3183},"agent-browser","automate browser interactions for agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, verify dev server output, test web apps, navigate pages, fill forms, click buttons, take screenshots, extract data, or automate any browser task. Also triggers when a dev server starts so you can verify it visually.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3174,3177,3180],{"name":3175,"slug":3176,"type":15},"Agents","agents",{"name":3178,"slug":3179,"type":15},"Browser Automation","browser-automation",{"name":3181,"slug":3182,"type":15},"Testing","testing","2026-04-06T18:41:03.44016",{"slug":3185,"name":3185,"fn":3186,"description":3187,"org":3188,"tags":3189,"stars":22,"repoUrl":23,"updatedAt":3195},"agent-browser-verify","verify dev server output with automated browser","Automated browser verification for dev servers. Triggers when a dev server starts to run a visual gut-check with agent-browser — verifies the page loads, checks for console errors, validates key UI elements, and reports pass\u002Ffail before continuing.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3190,3191,3194],{"name":3178,"slug":3179,"type":15},{"name":3192,"slug":3193,"type":15},"Local Development","local-development",{"name":3181,"slug":3182,"type":15},"2026-04-06T18:41:17.526867",{"slug":3197,"name":3197,"fn":3198,"description":3199,"org":3200,"tags":3201,"stars":22,"repoUrl":23,"updatedAt":3213},"agents-sdk","build AI agents on Cloudflare Workers","Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, or chat applications. Covers Agent class, state management, callable RPC, Workflows integration, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3202,3203,3204,3207,3210],{"name":3175,"slug":3176,"type":15},{"name":3037,"slug":3038,"type":15},{"name":3205,"slug":3206,"type":15},"SDK","sdk",{"name":3208,"slug":3209,"type":15},"Serverless","serverless",{"name":3211,"slug":3212,"type":15},"WebSockets","websockets","2026-04-06T18:39:51.717063",{"slug":3215,"name":3215,"fn":3216,"description":3217,"org":3218,"tags":3219,"stars":22,"repoUrl":23,"updatedAt":3231},"ai-elements","build chat UIs with AI Elements","AI Elements component library guidance — pre-built React components for AI interfaces built on shadcn\u002Fui. Use when building chat UIs, message displays, tool call rendering, streaming responses, reasoning panels, or any AI-native interface with the AI SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3220,3221,3224,3227,3228],{"name":3074,"slug":3075,"type":15},{"name":3222,"slug":3223,"type":15},"React","react",{"name":3225,"slug":3226,"type":15},"shadcn\u002Fui","shadcn-ui",{"name":3091,"slug":3092,"type":15},{"name":3229,"slug":3230,"type":15},"Vercel","vercel","2026-04-06T18:40:59.619419",{"slug":3233,"name":3233,"fn":3234,"description":3235,"org":3236,"tags":3237,"stars":22,"repoUrl":23,"updatedAt":3251},"ai-gateway","configure Vercel AI Gateway","Vercel AI Gateway expert guidance. Use when configuring model routing, provider failover, cost tracking, or managing multiple AI providers through a unified API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3238,3241,3244,3247,3250],{"name":3239,"slug":3240,"type":15},"AI Infrastructure","ai-infrastructure",{"name":3242,"slug":3243,"type":15},"Cost Optimization","cost-optimization",{"name":3245,"slug":3246,"type":15},"LLM","llm",{"name":3248,"slug":3249,"type":15},"Performance","performance",{"name":3229,"slug":3230,"type":15},"2026-04-06T18:40:44.377464",{"slug":3253,"name":3253,"fn":3254,"description":3255,"org":3256,"tags":3257,"stars":22,"repoUrl":23,"updatedAt":3263},"ai-generation-persistence","implement persistence patterns for AI generations","AI generation persistence patterns — unique IDs, addressable URLs, database storage, and cost tracking for every LLM generation",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3258,3259,3262],{"name":3242,"slug":3243,"type":15},{"name":3260,"slug":3261,"type":15},"Database","database",{"name":3245,"slug":3246,"type":15},"2026-04-06T18:41:08.513425",600]