[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-posthog-auditing-warehouse-source-health":3,"mdc--hy9axo-key":48,"related-repo-posthog-auditing-warehouse-source-health":1047,"related-org-posthog-auditing-warehouse-source-health":1141},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":43,"sourceUrl":46,"mdContent":47},"auditing-warehouse-source-health","audit PostHog data warehouse source health","Audit the health of a PostHog project's data warehouse sources and syncs — find every broken or degraded source connection, sync schema, and webhook channel. Use when the user asks \"why are my imports failing?\", \"what's broken with my sources?\", \"why is my warehouse data stale?\", or wants a one-shot triage of source\u002Fsync health before deciding where to dig in. Produces a prioritized report grouped by severity, with recommended next steps. For materialized-view health use `auditing-warehouse-view-health`; for a single failing sync use `diagnosing-failed-warehouse-syncs`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"posthog","PostHog","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fposthog.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Data Warehouse","data-warehouse",{"name":21,"slug":22,"type":15},"Audit","audit",35568,"https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog","2026-06-18T08:22:57.67984",null,2977,[29,30,31,32,19,33,34,35,36,37,38,39,40,41,42],"ab-testing","ai-analytics","analytics","cdp","experiments","feature-flags","javascript","product-analytics","python","react","session-replay","surveys","typescript","web-analytics",{"repoUrl":24,"stars":23,"forks":27,"topics":44,"description":45},[29,30,31,32,19,33,34,35,36,37,38,39,40,41,42],"🦔 PostHog is an all-in-one developer platform for building successful products. We offer product analytics, web analytics, session replay, error tracking, feature flags, experimentation, surveys, data warehouse, a CDP, and an AI product assistant to help debug your code, ship features faster, and keep all your usage and customer data in one stack.","https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog\u002Ftree\u002FHEAD\u002Fproducts\u002Fwarehouse_sources\u002Fskills\u002Fauditing-warehouse-source-health","---\nname: auditing-warehouse-source-health\ndescription: >\n  Audit the health of a PostHog project's data warehouse sources and syncs — find every broken or degraded source\n  connection, sync schema, and webhook channel. Use when the user asks \"why are my imports failing?\", \"what's broken\n  with my sources?\", \"why is my warehouse data stale?\", or wants a one-shot triage of source\u002Fsync health before\n  deciding where to dig in. Produces a prioritized report grouped by severity, with recommended next steps. For\n  materialized-view health use `auditing-warehouse-view-health`; for a single failing sync use\n  `diagnosing-failed-warehouse-syncs`.\n---\n\n# Auditing data warehouse source health\n\nThis skill produces a project-wide audit of the **source and sync** side of the data warehouse pipeline — source\nconnections, sync schemas, and webhook push channels. Use it when the user wants a **summary of what's broken with\ntheir imports**, not a deep-dive on one sync. The deep-dive on individual failures is\n`diagnosing-failed-warehouse-syncs`; this skill is the scan that tells them where to look first.\n\nThe same underlying endpoint (`data-warehouse-data-health-issues-retrieve`) also reports materialized-view,\nbatch-export-destination, and transformation issues. Materialized views are covered by\n`auditing-warehouse-view-health`. Destinations (batch exports) and transformations are owned by other products — surface\nthem if they appear, but route them to the relevant team rather than diagnosing here.\n\n## When to use this skill\n\n- \"Why are my imports failing?\" \u002F \"What's broken with my sources?\"\n- \"Why is my warehouse data stale?\"\n- The user is new to a project and wants to know which sources they've inherited and whether they're healthy\n- Weekly or monthly review of source\u002Fsync health\n- Dashboards are stale and the user isn't sure which source is at fault\n\n## Available tools\n\n| Tool                                          | Purpose                                                            |\n| --------------------------------------------- | ------------------------------------------------------------------ |\n| `data-warehouse-data-health-issues-retrieve`  | One-shot: all failed\u002Fdegraded items across the whole pipeline      |\n| `external-data-sources-list`                  | All sources with status and latest error                           |\n| `external-data-schemas-list`                  | All schemas with status, last_synced_at, latest_error              |\n| `external-data-sources-webhook-info-retrieve` | Check per-source webhook state (not covered by data-health-issues) |\n\nThe `data-health-issues` endpoint aggregates across the whole pipeline — it's the fastest path to a summary. Filter\nits results to the `source` and `external_data_sync` types for this audit. Use the list endpoints when you need more\ncontext than the summary provides (row counts, non-failing items, schema-level detail).\n\n## What counts as a source\u002Fsync \"issue\"\n\nFrom the data-health endpoint, this audit cares about two of the five categories:\n\n| `type`               | Trigger                                                                                                                                       | Typical urgency |\n| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |\n| `source`             | `ExternalDataSource.status = Error` — whole source connection broken                                                                          | High            |\n| `external_data_sync` | schema in Failed or BillingLimitReached state (the data-health endpoint returns `status: \"failed\"` or `status: \"billing_limit\"` respectively) | Medium–High     |\n\nEach entry includes `id`, `name`, `type`, `status`, `error`, `failed_at`, `url`, and `source_type`.\n\nThe other categories the endpoint returns are out of scope for this skill:\n\n- `materialized_view` → `auditing-warehouse-view-health`\n- `destination` (batch export) → owned by the batch exports \u002F data pipelines product\n- `transformation` (HogFunction) → owned by the CDP \u002F ingestion side\n\nNote the data-health endpoint only reports _active failures_. For source\u002Fsync health it doesn't flag:\n\n- Schemas paused by the user (`should_sync = false`)\n- Schemas that are slow or stale but technically `Completed`\n- **Webhook problems on `sync_type: \"webhook\"` schemas.** The bulk-sync safety net can succeed while the webhook\n  push channel is silently broken (deregistered, disabled on the remote side, failing signature verification).\n  These don't surface in `data-health-issues` — check per-source with `webhook-info-retrieve`.\n\nIf the user asks about staleness or unused items, reach beyond this endpoint — see Step 4.\n\n## Workflow\n\n### Step 1 — One-shot pull\n\nCall `data-warehouse-data-health-issues-retrieve` and keep the `source` and `external_data_sync` entries.\n\nIf there are no source\u002Fsync issues, tell the user their sources are healthy and stop. Don't invent problems.\n\n### Step 2 — Group and prioritize\n\n1. **Sources in Error first.** A source failure cascades — every schema under it is effectively dead until the\n   source reconnects. Fix these first.\n2. **Sync schemas next**, in this order:\n   - `status: \"billing_limit\"` entries (billing issue, non-technical — flag and route to billing)\n   - `Failed` on heavily-used tables (user asks \u002F check row counts via schemas-list if needed)\n   - `Failed` on less-used tables\n\n### Step 3 — Present the audit\n\nRender a prioritized report. Don't dump the raw JSON — human-readable table per category:\n\n```text\n## Data warehouse source health — 4 issues\n\n### 🔴 Sources (1)\n- Stripe — authentication failed (failed 2h ago). All 8 tables under it are currently dead.\n  → `diagnosing-failed-warehouse-syncs` on this source\n\n### 🟠 Sync schemas (3)\n- postgres_prod.orders (Failed 6h ago) — column \"updated_at\" does not exist\n- postgres_prod.invoices (Failed 6h ago) — column \"updated_at\" does not exist\n- hubspot.contacts (BillingLimitReached) — team quota exceeded\n\nRecommended order:\n1. Stripe auth (everything under it is dead)\n2. Schema-drift on postgres_prod.orders \u002F invoices — looks like upstream renamed a column\n3. Billing limit on hubspot\n```\n\nThe exact format is less important than: prioritized, grouped, actionable, and hinting at the right next skill.\n\n### Step 4 — Go beyond active failures (when asked)\n\nIf the user wants more than just \"what's on fire\" — e.g. \"what else should I look at?\" — cross-check:\n\n**Stale but \"Completed\" schemas:**\nCall `external-data-schemas-list` and look for schemas with old `last_synced_at` relative to their `sync_frequency`.\nA schema on `1hour` frequency that last synced 3 days ago is effectively broken even if status says `Completed`.\n\n**Sources with zero sync activity:**\nSources where every schema has `should_sync: false` or `status = Paused`. These were set up and then abandoned —\ncandidates for cleanup via `external-data-sources-destroy`.\n\n**Broken webhooks on webhook-type schemas:**\nIterate the sources that have any schema with `sync_type: \"webhook\"` (visible via `external-data-schemas-list`). For\neach, call `external-data-sources-webhook-info-retrieve({source_id})`:\n\n- `exists: false` while a schema is `sync_type: \"webhook\"` → webhook was never registered, or was deleted. Push\n  channel is dead; only the bulk fallback is ingesting.\n- `external_status.error` present → remote service is reporting a problem (permission revoked, endpoint\n  deleted on their dashboard).\n- `external_status.status` not `\"enabled\"` → remote has disabled the endpoint (often after repeated delivery\n  failures).\n\nReport these separately from the primary audit — they're a different shape of problem than failed syncs, and the fix\nis a different skill (`diagnosing-failed-warehouse-syncs` scenario I, or `setting-up-a-data-warehouse-source` step\n5.5).\n\nOnly run these extra checks if the user explicitly asks for a broader audit — they involve more tool calls and\nheuristics.\n\n### Step 5 — Offer the next step\n\nEnd the audit with a clear hand-off:\n\n- \"Want me to dig into the Stripe failure?\" → hands off to `diagnosing-failed-warehouse-syncs`\n- \"Want me to fix the schema drift on orders?\" → hands off to `tuning-incremental-sync-config`\n- \"Want to disable the billing-capped schemas?\" → one-click via `external-data-schemas-partial-update`\n\nNever start applying fixes autonomously from an audit — the audit's job is to report and recommend, not remediate.\nAny fix should be confirmed explicitly before executing.\n\n## Important notes\n\n- **The audit is read-only.** Never call destructive tools from the audit flow. Hand off to the diagnosis\u002Ftuning\n  skills — which in turn confirm before acting.\n- **Empty = healthy.** Don't pad an empty audit with hypothetical issues. \"No source issues found\" is a good answer.\n- **Source failures cascade.** When reporting a source in Error, also mention which schemas under it are affected\n  (or will be, once they try to sync again). The user needs to understand the blast radius.\n- **Billing limits aren't technical problems.** Flag them but route to billing \u002F quota discussion, not to a\n  recovery action.\n- **`data-health-issues` only surfaces active failures.** For staleness or abandoned sources you need to cross-check\n  the list endpoints. Only do this when the user explicitly asks for a deeper audit.\n- **Webhook health is separate from schema health.** The data-health endpoint doesn't know about webhook state.\n  When a user's request mentions \"real-time\", \"Stripe webhook\", or \"why is data hours behind on a webhook\n  source\", go straight to `webhook-info-retrieve` rather than inferring from schema status.\n- **Materialized views, destinations, and transformations are out of scope here.** They share the data-health\n  endpoint but belong to other audits\u002Fproducts — route, don't diagnose.\n",{"data":49,"body":50},{"name":4,"description":6},{"type":51,"children":52},"root",[53,62,92,113,120,150,156,251,280,286,291,386,449,454,495,508,567,572,578,585,610,615,621,679,685,690,702,707,713,718,765,797,829,880,900,905,911,916,951,956,962],{"type":54,"tag":55,"props":56,"children":58},"element","h1",{"id":57},"auditing-data-warehouse-source-health",[59],{"type":60,"value":61},"text","Auditing data warehouse source health",{"type":54,"tag":63,"props":64,"children":65},"p",{},[66,68,74,76,81,83,90],{"type":60,"value":67},"This skill produces a project-wide audit of the ",{"type":54,"tag":69,"props":70,"children":71},"strong",{},[72],{"type":60,"value":73},"source and sync",{"type":60,"value":75}," side of the data warehouse pipeline — source\nconnections, sync schemas, and webhook push channels. Use it when the user wants a ",{"type":54,"tag":69,"props":77,"children":78},{},[79],{"type":60,"value":80},"summary of what's broken with\ntheir imports",{"type":60,"value":82},", not a deep-dive on one sync. The deep-dive on individual failures is\n",{"type":54,"tag":84,"props":85,"children":87},"code",{"className":86},[],[88],{"type":60,"value":89},"diagnosing-failed-warehouse-syncs",{"type":60,"value":91},"; this skill is the scan that tells them where to look first.",{"type":54,"tag":63,"props":93,"children":94},{},[95,97,103,105,111],{"type":60,"value":96},"The same underlying endpoint (",{"type":54,"tag":84,"props":98,"children":100},{"className":99},[],[101],{"type":60,"value":102},"data-warehouse-data-health-issues-retrieve",{"type":60,"value":104},") also reports materialized-view,\nbatch-export-destination, and transformation issues. Materialized views are covered by\n",{"type":54,"tag":84,"props":106,"children":108},{"className":107},[],[109],{"type":60,"value":110},"auditing-warehouse-view-health",{"type":60,"value":112},". Destinations (batch exports) and transformations are owned by other products — surface\nthem if they appear, but route them to the relevant team rather than diagnosing here.",{"type":54,"tag":114,"props":115,"children":117},"h2",{"id":116},"when-to-use-this-skill",[118],{"type":60,"value":119},"When to use this skill",{"type":54,"tag":121,"props":122,"children":123},"ul",{},[124,130,135,140,145],{"type":54,"tag":125,"props":126,"children":127},"li",{},[128],{"type":60,"value":129},"\"Why are my imports failing?\" \u002F \"What's broken with my sources?\"",{"type":54,"tag":125,"props":131,"children":132},{},[133],{"type":60,"value":134},"\"Why is my warehouse data stale?\"",{"type":54,"tag":125,"props":136,"children":137},{},[138],{"type":60,"value":139},"The user is new to a project and wants to know which sources they've inherited and whether they're healthy",{"type":54,"tag":125,"props":141,"children":142},{},[143],{"type":60,"value":144},"Weekly or monthly review of source\u002Fsync health",{"type":54,"tag":125,"props":146,"children":147},{},[148],{"type":60,"value":149},"Dashboards are stale and the user isn't sure which source is at fault",{"type":54,"tag":114,"props":151,"children":153},{"id":152},"available-tools",[154],{"type":60,"value":155},"Available tools",{"type":54,"tag":157,"props":158,"children":159},"table",{},[160,179],{"type":54,"tag":161,"props":162,"children":163},"thead",{},[164],{"type":54,"tag":165,"props":166,"children":167},"tr",{},[168,174],{"type":54,"tag":169,"props":170,"children":171},"th",{},[172],{"type":60,"value":173},"Tool",{"type":54,"tag":169,"props":175,"children":176},{},[177],{"type":60,"value":178},"Purpose",{"type":54,"tag":180,"props":181,"children":182},"tbody",{},[183,200,217,234],{"type":54,"tag":165,"props":184,"children":185},{},[186,195],{"type":54,"tag":187,"props":188,"children":189},"td",{},[190],{"type":54,"tag":84,"props":191,"children":193},{"className":192},[],[194],{"type":60,"value":102},{"type":54,"tag":187,"props":196,"children":197},{},[198],{"type":60,"value":199},"One-shot: all failed\u002Fdegraded items across the whole pipeline",{"type":54,"tag":165,"props":201,"children":202},{},[203,212],{"type":54,"tag":187,"props":204,"children":205},{},[206],{"type":54,"tag":84,"props":207,"children":209},{"className":208},[],[210],{"type":60,"value":211},"external-data-sources-list",{"type":54,"tag":187,"props":213,"children":214},{},[215],{"type":60,"value":216},"All sources with status and latest error",{"type":54,"tag":165,"props":218,"children":219},{},[220,229],{"type":54,"tag":187,"props":221,"children":222},{},[223],{"type":54,"tag":84,"props":224,"children":226},{"className":225},[],[227],{"type":60,"value":228},"external-data-schemas-list",{"type":54,"tag":187,"props":230,"children":231},{},[232],{"type":60,"value":233},"All schemas with status, last_synced_at, latest_error",{"type":54,"tag":165,"props":235,"children":236},{},[237,246],{"type":54,"tag":187,"props":238,"children":239},{},[240],{"type":54,"tag":84,"props":241,"children":243},{"className":242},[],[244],{"type":60,"value":245},"external-data-sources-webhook-info-retrieve",{"type":54,"tag":187,"props":247,"children":248},{},[249],{"type":60,"value":250},"Check per-source webhook state (not covered by data-health-issues)",{"type":54,"tag":63,"props":252,"children":253},{},[254,256,262,264,270,272,278],{"type":60,"value":255},"The ",{"type":54,"tag":84,"props":257,"children":259},{"className":258},[],[260],{"type":60,"value":261},"data-health-issues",{"type":60,"value":263}," endpoint aggregates across the whole pipeline — it's the fastest path to a summary. Filter\nits results to the ",{"type":54,"tag":84,"props":265,"children":267},{"className":266},[],[268],{"type":60,"value":269},"source",{"type":60,"value":271}," and ",{"type":54,"tag":84,"props":273,"children":275},{"className":274},[],[276],{"type":60,"value":277},"external_data_sync",{"type":60,"value":279}," types for this audit. Use the list endpoints when you need more\ncontext than the summary provides (row counts, non-failing items, schema-level detail).",{"type":54,"tag":114,"props":281,"children":283},{"id":282},"what-counts-as-a-sourcesync-issue",[284],{"type":60,"value":285},"What counts as a source\u002Fsync \"issue\"",{"type":54,"tag":63,"props":287,"children":288},{},[289],{"type":60,"value":290},"From the data-health endpoint, this audit cares about two of the five categories:",{"type":54,"tag":157,"props":292,"children":293},{},[294,319],{"type":54,"tag":161,"props":295,"children":296},{},[297],{"type":54,"tag":165,"props":298,"children":299},{},[300,309,314],{"type":54,"tag":169,"props":301,"children":302},{},[303],{"type":54,"tag":84,"props":304,"children":306},{"className":305},[],[307],{"type":60,"value":308},"type",{"type":54,"tag":169,"props":310,"children":311},{},[312],{"type":60,"value":313},"Trigger",{"type":54,"tag":169,"props":315,"children":316},{},[317],{"type":60,"value":318},"Typical urgency",{"type":54,"tag":180,"props":320,"children":321},{},[322,349],{"type":54,"tag":165,"props":323,"children":324},{},[325,333,344],{"type":54,"tag":187,"props":326,"children":327},{},[328],{"type":54,"tag":84,"props":329,"children":331},{"className":330},[],[332],{"type":60,"value":269},{"type":54,"tag":187,"props":334,"children":335},{},[336,342],{"type":54,"tag":84,"props":337,"children":339},{"className":338},[],[340],{"type":60,"value":341},"ExternalDataSource.status = Error",{"type":60,"value":343}," — whole source connection broken",{"type":54,"tag":187,"props":345,"children":346},{},[347],{"type":60,"value":348},"High",{"type":54,"tag":165,"props":350,"children":351},{},[352,360,381],{"type":54,"tag":187,"props":353,"children":354},{},[355],{"type":54,"tag":84,"props":356,"children":358},{"className":357},[],[359],{"type":60,"value":277},{"type":54,"tag":187,"props":361,"children":362},{},[363,365,371,373,379],{"type":60,"value":364},"schema in Failed or BillingLimitReached state (the data-health endpoint returns ",{"type":54,"tag":84,"props":366,"children":368},{"className":367},[],[369],{"type":60,"value":370},"status: \"failed\"",{"type":60,"value":372}," or ",{"type":54,"tag":84,"props":374,"children":376},{"className":375},[],[377],{"type":60,"value":378},"status: \"billing_limit\"",{"type":60,"value":380}," respectively)",{"type":54,"tag":187,"props":382,"children":383},{},[384],{"type":60,"value":385},"Medium–High",{"type":54,"tag":63,"props":387,"children":388},{},[389,391,397,399,405,406,411,412,418,419,425,426,432,433,439,441,447],{"type":60,"value":390},"Each entry includes ",{"type":54,"tag":84,"props":392,"children":394},{"className":393},[],[395],{"type":60,"value":396},"id",{"type":60,"value":398},", ",{"type":54,"tag":84,"props":400,"children":402},{"className":401},[],[403],{"type":60,"value":404},"name",{"type":60,"value":398},{"type":54,"tag":84,"props":407,"children":409},{"className":408},[],[410],{"type":60,"value":308},{"type":60,"value":398},{"type":54,"tag":84,"props":413,"children":415},{"className":414},[],[416],{"type":60,"value":417},"status",{"type":60,"value":398},{"type":54,"tag":84,"props":420,"children":422},{"className":421},[],[423],{"type":60,"value":424},"error",{"type":60,"value":398},{"type":54,"tag":84,"props":427,"children":429},{"className":428},[],[430],{"type":60,"value":431},"failed_at",{"type":60,"value":398},{"type":54,"tag":84,"props":434,"children":436},{"className":435},[],[437],{"type":60,"value":438},"url",{"type":60,"value":440},", and ",{"type":54,"tag":84,"props":442,"children":444},{"className":443},[],[445],{"type":60,"value":446},"source_type",{"type":60,"value":448},".",{"type":54,"tag":63,"props":450,"children":451},{},[452],{"type":60,"value":453},"The other categories the endpoint returns are out of scope for this skill:",{"type":54,"tag":121,"props":455,"children":456},{},[457,473,484],{"type":54,"tag":125,"props":458,"children":459},{},[460,466,468],{"type":54,"tag":84,"props":461,"children":463},{"className":462},[],[464],{"type":60,"value":465},"materialized_view",{"type":60,"value":467}," → ",{"type":54,"tag":84,"props":469,"children":471},{"className":470},[],[472],{"type":60,"value":110},{"type":54,"tag":125,"props":474,"children":475},{},[476,482],{"type":54,"tag":84,"props":477,"children":479},{"className":478},[],[480],{"type":60,"value":481},"destination",{"type":60,"value":483}," (batch export) → owned by the batch exports \u002F data pipelines product",{"type":54,"tag":125,"props":485,"children":486},{},[487,493],{"type":54,"tag":84,"props":488,"children":490},{"className":489},[],[491],{"type":60,"value":492},"transformation",{"type":60,"value":494}," (HogFunction) → owned by the CDP \u002F ingestion side",{"type":54,"tag":63,"props":496,"children":497},{},[498,500,506],{"type":60,"value":499},"Note the data-health endpoint only reports ",{"type":54,"tag":501,"props":502,"children":503},"em",{},[504],{"type":60,"value":505},"active failures",{"type":60,"value":507},". For source\u002Fsync health it doesn't flag:",{"type":54,"tag":121,"props":509,"children":510},{},[511,524,535],{"type":54,"tag":125,"props":512,"children":513},{},[514,516,522],{"type":60,"value":515},"Schemas paused by the user (",{"type":54,"tag":84,"props":517,"children":519},{"className":518},[],[520],{"type":60,"value":521},"should_sync = false",{"type":60,"value":523},")",{"type":54,"tag":125,"props":525,"children":526},{},[527,529],{"type":60,"value":528},"Schemas that are slow or stale but technically ",{"type":54,"tag":84,"props":530,"children":532},{"className":531},[],[533],{"type":60,"value":534},"Completed",{"type":54,"tag":125,"props":536,"children":537},{},[538,551,553,558,560,566],{"type":54,"tag":69,"props":539,"children":540},{},[541,543,549],{"type":60,"value":542},"Webhook problems on ",{"type":54,"tag":84,"props":544,"children":546},{"className":545},[],[547],{"type":60,"value":548},"sync_type: \"webhook\"",{"type":60,"value":550}," schemas.",{"type":60,"value":552}," The bulk-sync safety net can succeed while the webhook\npush channel is silently broken (deregistered, disabled on the remote side, failing signature verification).\nThese don't surface in ",{"type":54,"tag":84,"props":554,"children":556},{"className":555},[],[557],{"type":60,"value":261},{"type":60,"value":559}," — check per-source with ",{"type":54,"tag":84,"props":561,"children":563},{"className":562},[],[564],{"type":60,"value":565},"webhook-info-retrieve",{"type":60,"value":448},{"type":54,"tag":63,"props":568,"children":569},{},[570],{"type":60,"value":571},"If the user asks about staleness or unused items, reach beyond this endpoint — see Step 4.",{"type":54,"tag":114,"props":573,"children":575},{"id":574},"workflow",[576],{"type":60,"value":577},"Workflow",{"type":54,"tag":579,"props":580,"children":582},"h3",{"id":581},"step-1-one-shot-pull",[583],{"type":60,"value":584},"Step 1 — One-shot pull",{"type":54,"tag":63,"props":586,"children":587},{},[588,590,595,597,602,603,608],{"type":60,"value":589},"Call ",{"type":54,"tag":84,"props":591,"children":593},{"className":592},[],[594],{"type":60,"value":102},{"type":60,"value":596}," and keep the ",{"type":54,"tag":84,"props":598,"children":600},{"className":599},[],[601],{"type":60,"value":269},{"type":60,"value":271},{"type":54,"tag":84,"props":604,"children":606},{"className":605},[],[607],{"type":60,"value":277},{"type":60,"value":609}," entries.",{"type":54,"tag":63,"props":611,"children":612},{},[613],{"type":60,"value":614},"If there are no source\u002Fsync issues, tell the user their sources are healthy and stop. Don't invent problems.",{"type":54,"tag":579,"props":616,"children":618},{"id":617},"step-2-group-and-prioritize",[619],{"type":60,"value":620},"Step 2 — Group and prioritize",{"type":54,"tag":622,"props":623,"children":624},"ol",{},[625,635],{"type":54,"tag":125,"props":626,"children":627},{},[628,633],{"type":54,"tag":69,"props":629,"children":630},{},[631],{"type":60,"value":632},"Sources in Error first.",{"type":60,"value":634}," A source failure cascades — every schema under it is effectively dead until the\nsource reconnects. Fix these first.",{"type":54,"tag":125,"props":636,"children":637},{},[638,643,645],{"type":54,"tag":69,"props":639,"children":640},{},[641],{"type":60,"value":642},"Sync schemas next",{"type":60,"value":644},", in this order:\n",{"type":54,"tag":121,"props":646,"children":647},{},[648,658,669],{"type":54,"tag":125,"props":649,"children":650},{},[651,656],{"type":54,"tag":84,"props":652,"children":654},{"className":653},[],[655],{"type":60,"value":378},{"type":60,"value":657}," entries (billing issue, non-technical — flag and route to billing)",{"type":54,"tag":125,"props":659,"children":660},{},[661,667],{"type":54,"tag":84,"props":662,"children":664},{"className":663},[],[665],{"type":60,"value":666},"Failed",{"type":60,"value":668}," on heavily-used tables (user asks \u002F check row counts via schemas-list if needed)",{"type":54,"tag":125,"props":670,"children":671},{},[672,677],{"type":54,"tag":84,"props":673,"children":675},{"className":674},[],[676],{"type":60,"value":666},{"type":60,"value":678}," on less-used tables",{"type":54,"tag":579,"props":680,"children":682},{"id":681},"step-3-present-the-audit",[683],{"type":60,"value":684},"Step 3 — Present the audit",{"type":54,"tag":63,"props":686,"children":687},{},[688],{"type":60,"value":689},"Render a prioritized report. Don't dump the raw JSON — human-readable table per category:",{"type":54,"tag":691,"props":692,"children":697},"pre",{"className":693,"code":695,"language":60,"meta":696},[694],"language-text","## Data warehouse source health — 4 issues\n\n### 🔴 Sources (1)\n- Stripe — authentication failed (failed 2h ago). All 8 tables under it are currently dead.\n  → `diagnosing-failed-warehouse-syncs` on this source\n\n### 🟠 Sync schemas (3)\n- postgres_prod.orders (Failed 6h ago) — column \"updated_at\" does not exist\n- postgres_prod.invoices (Failed 6h ago) — column \"updated_at\" does not exist\n- hubspot.contacts (BillingLimitReached) — team quota exceeded\n\nRecommended order:\n1. Stripe auth (everything under it is dead)\n2. Schema-drift on postgres_prod.orders \u002F invoices — looks like upstream renamed a column\n3. Billing limit on hubspot\n","",[698],{"type":54,"tag":84,"props":699,"children":700},{"__ignoreMap":696},[701],{"type":60,"value":695},{"type":54,"tag":63,"props":703,"children":704},{},[705],{"type":60,"value":706},"The exact format is less important than: prioritized, grouped, actionable, and hinting at the right next skill.",{"type":54,"tag":579,"props":708,"children":710},{"id":709},"step-4-go-beyond-active-failures-when-asked",[711],{"type":60,"value":712},"Step 4 — Go beyond active failures (when asked)",{"type":54,"tag":63,"props":714,"children":715},{},[716],{"type":60,"value":717},"If the user wants more than just \"what's on fire\" — e.g. \"what else should I look at?\" — cross-check:",{"type":54,"tag":63,"props":719,"children":720},{},[721,726,728,733,735,741,743,749,751,757,759,764],{"type":54,"tag":69,"props":722,"children":723},{},[724],{"type":60,"value":725},"Stale but \"Completed\" schemas:",{"type":60,"value":727},"\nCall ",{"type":54,"tag":84,"props":729,"children":731},{"className":730},[],[732],{"type":60,"value":228},{"type":60,"value":734}," and look for schemas with old ",{"type":54,"tag":84,"props":736,"children":738},{"className":737},[],[739],{"type":60,"value":740},"last_synced_at",{"type":60,"value":742}," relative to their ",{"type":54,"tag":84,"props":744,"children":746},{"className":745},[],[747],{"type":60,"value":748},"sync_frequency",{"type":60,"value":750},".\nA schema on ",{"type":54,"tag":84,"props":752,"children":754},{"className":753},[],[755],{"type":60,"value":756},"1hour",{"type":60,"value":758}," frequency that last synced 3 days ago is effectively broken even if status says ",{"type":54,"tag":84,"props":760,"children":762},{"className":761},[],[763],{"type":60,"value":534},{"type":60,"value":448},{"type":54,"tag":63,"props":766,"children":767},{},[768,773,775,781,782,788,790,796],{"type":54,"tag":69,"props":769,"children":770},{},[771],{"type":60,"value":772},"Sources with zero sync activity:",{"type":60,"value":774},"\nSources where every schema has ",{"type":54,"tag":84,"props":776,"children":778},{"className":777},[],[779],{"type":60,"value":780},"should_sync: false",{"type":60,"value":372},{"type":54,"tag":84,"props":783,"children":785},{"className":784},[],[786],{"type":60,"value":787},"status = Paused",{"type":60,"value":789},". These were set up and then abandoned —\ncandidates for cleanup via ",{"type":54,"tag":84,"props":791,"children":793},{"className":792},[],[794],{"type":60,"value":795},"external-data-sources-destroy",{"type":60,"value":448},{"type":54,"tag":63,"props":798,"children":799},{},[800,805,807,812,814,819,821,827],{"type":54,"tag":69,"props":801,"children":802},{},[803],{"type":60,"value":804},"Broken webhooks on webhook-type schemas:",{"type":60,"value":806},"\nIterate the sources that have any schema with ",{"type":54,"tag":84,"props":808,"children":810},{"className":809},[],[811],{"type":60,"value":548},{"type":60,"value":813}," (visible via ",{"type":54,"tag":84,"props":815,"children":817},{"className":816},[],[818],{"type":60,"value":228},{"type":60,"value":820},"). For\neach, call ",{"type":54,"tag":84,"props":822,"children":824},{"className":823},[],[825],{"type":60,"value":826},"external-data-sources-webhook-info-retrieve({source_id})",{"type":60,"value":828},":",{"type":54,"tag":121,"props":830,"children":831},{},[832,850,861],{"type":54,"tag":125,"props":833,"children":834},{},[835,841,843,848],{"type":54,"tag":84,"props":836,"children":838},{"className":837},[],[839],{"type":60,"value":840},"exists: false",{"type":60,"value":842}," while a schema is ",{"type":54,"tag":84,"props":844,"children":846},{"className":845},[],[847],{"type":60,"value":548},{"type":60,"value":849}," → webhook was never registered, or was deleted. Push\nchannel is dead; only the bulk fallback is ingesting.",{"type":54,"tag":125,"props":851,"children":852},{},[853,859],{"type":54,"tag":84,"props":854,"children":856},{"className":855},[],[857],{"type":60,"value":858},"external_status.error",{"type":60,"value":860}," present → remote service is reporting a problem (permission revoked, endpoint\ndeleted on their dashboard).",{"type":54,"tag":125,"props":862,"children":863},{},[864,870,872,878],{"type":54,"tag":84,"props":865,"children":867},{"className":866},[],[868],{"type":60,"value":869},"external_status.status",{"type":60,"value":871}," not ",{"type":54,"tag":84,"props":873,"children":875},{"className":874},[],[876],{"type":60,"value":877},"\"enabled\"",{"type":60,"value":879}," → remote has disabled the endpoint (often after repeated delivery\nfailures).",{"type":54,"tag":63,"props":881,"children":882},{},[883,885,890,892,898],{"type":60,"value":884},"Report these separately from the primary audit — they're a different shape of problem than failed syncs, and the fix\nis a different skill (",{"type":54,"tag":84,"props":886,"children":888},{"className":887},[],[889],{"type":60,"value":89},{"type":60,"value":891}," scenario I, or ",{"type":54,"tag":84,"props":893,"children":895},{"className":894},[],[896],{"type":60,"value":897},"setting-up-a-data-warehouse-source",{"type":60,"value":899}," step\n5.5).",{"type":54,"tag":63,"props":901,"children":902},{},[903],{"type":60,"value":904},"Only run these extra checks if the user explicitly asks for a broader audit — they involve more tool calls and\nheuristics.",{"type":54,"tag":579,"props":906,"children":908},{"id":907},"step-5-offer-the-next-step",[909],{"type":60,"value":910},"Step 5 — Offer the next step",{"type":54,"tag":63,"props":912,"children":913},{},[914],{"type":60,"value":915},"End the audit with a clear hand-off:",{"type":54,"tag":121,"props":917,"children":918},{},[919,929,940],{"type":54,"tag":125,"props":920,"children":921},{},[922,924],{"type":60,"value":923},"\"Want me to dig into the Stripe failure?\" → hands off to ",{"type":54,"tag":84,"props":925,"children":927},{"className":926},[],[928],{"type":60,"value":89},{"type":54,"tag":125,"props":930,"children":931},{},[932,934],{"type":60,"value":933},"\"Want me to fix the schema drift on orders?\" → hands off to ",{"type":54,"tag":84,"props":935,"children":937},{"className":936},[],[938],{"type":60,"value":939},"tuning-incremental-sync-config",{"type":54,"tag":125,"props":941,"children":942},{},[943,945],{"type":60,"value":944},"\"Want to disable the billing-capped schemas?\" → one-click via ",{"type":54,"tag":84,"props":946,"children":948},{"className":947},[],[949],{"type":60,"value":950},"external-data-schemas-partial-update",{"type":54,"tag":63,"props":952,"children":953},{},[954],{"type":60,"value":955},"Never start applying fixes autonomously from an audit — the audit's job is to report and recommend, not remediate.\nAny fix should be confirmed explicitly before executing.",{"type":54,"tag":114,"props":957,"children":959},{"id":958},"important-notes",[960],{"type":60,"value":961},"Important notes",{"type":54,"tag":121,"props":963,"children":964},{},[965,975,985,995,1005,1020,1037],{"type":54,"tag":125,"props":966,"children":967},{},[968,973],{"type":54,"tag":69,"props":969,"children":970},{},[971],{"type":60,"value":972},"The audit is read-only.",{"type":60,"value":974}," Never call destructive tools from the audit flow. Hand off to the diagnosis\u002Ftuning\nskills — which in turn confirm before acting.",{"type":54,"tag":125,"props":976,"children":977},{},[978,983],{"type":54,"tag":69,"props":979,"children":980},{},[981],{"type":60,"value":982},"Empty = healthy.",{"type":60,"value":984}," Don't pad an empty audit with hypothetical issues. \"No source issues found\" is a good answer.",{"type":54,"tag":125,"props":986,"children":987},{},[988,993],{"type":54,"tag":69,"props":989,"children":990},{},[991],{"type":60,"value":992},"Source failures cascade.",{"type":60,"value":994}," When reporting a source in Error, also mention which schemas under it are affected\n(or will be, once they try to sync again). The user needs to understand the blast radius.",{"type":54,"tag":125,"props":996,"children":997},{},[998,1003],{"type":54,"tag":69,"props":999,"children":1000},{},[1001],{"type":60,"value":1002},"Billing limits aren't technical problems.",{"type":60,"value":1004}," Flag them but route to billing \u002F quota discussion, not to a\nrecovery action.",{"type":54,"tag":125,"props":1006,"children":1007},{},[1008,1018],{"type":54,"tag":69,"props":1009,"children":1010},{},[1011,1016],{"type":54,"tag":84,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":60,"value":261},{"type":60,"value":1017}," only surfaces active failures.",{"type":60,"value":1019}," For staleness or abandoned sources you need to cross-check\nthe list endpoints. Only do this when the user explicitly asks for a deeper audit.",{"type":54,"tag":125,"props":1021,"children":1022},{},[1023,1028,1030,1035],{"type":54,"tag":69,"props":1024,"children":1025},{},[1026],{"type":60,"value":1027},"Webhook health is separate from schema health.",{"type":60,"value":1029}," The data-health endpoint doesn't know about webhook state.\nWhen a user's request mentions \"real-time\", \"Stripe webhook\", or \"why is data hours behind on a webhook\nsource\", go straight to ",{"type":54,"tag":84,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":60,"value":565},{"type":60,"value":1036}," rather than inferring from schema status.",{"type":54,"tag":125,"props":1038,"children":1039},{},[1040,1045],{"type":54,"tag":69,"props":1041,"children":1042},{},[1043],{"type":60,"value":1044},"Materialized views, destinations, and transformations are out of scope here.",{"type":60,"value":1046}," They share the data-health\nendpoint but belong to other audits\u002Fproducts — route, don't diagnose.",{"items":1048,"total":1140},[1049,1063,1073,1080,1092,1107,1123],{"slug":1050,"name":1050,"fn":1051,"description":1052,"org":1053,"tags":1054,"stars":23,"repoUrl":24,"updatedAt":1062},"analyzing-expensive-users","analyze expensive users in AI observability","Analyze the most expensive users in AI observability and explain why they cost so much. Use when the user asks about top spenders, expensive users, per-user LLM cost, user-level cost drivers, or patterns behind high AI observability spend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1055,1057,1060,1061],{"name":1056,"slug":31,"type":15},"Analytics",{"name":1058,"slug":1059,"type":15},"Cost Optimization","cost-optimization",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-07-28T05:34:11.117757",{"slug":1064,"name":1064,"fn":1065,"description":1066,"org":1067,"tags":1068,"stars":23,"repoUrl":24,"updatedAt":1072},"auditing-endpoints","audit PostHog project endpoints","Audit every endpoint in a PostHog project for staleness, failed materialisations, and unused materialised versions. Use when the user asks \"what endpoints can I clean up?\", \"are any of my endpoints broken?\", \"which materialised versions are still being called?\", or wants a one-shot cleanup pass over the Endpoints product. Produces a prioritised report grouped by issue type, with recommended actions but does not modify anything without explicit confirmation.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1069,1070,1071],{"name":1056,"slug":31,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},"2026-06-08T08:08:33.693989",{"slug":4,"name":4,"fn":5,"description":6,"org":1074,"tags":1075,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1076,1077,1078,1079],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":110,"name":110,"fn":1081,"description":1082,"org":1083,"tags":1084,"stars":23,"repoUrl":24,"updatedAt":1091},"audit PostHog materialized view health","Audit the health of a PostHog project's materialized views (saved queries) — find every failed materialization and flag unused or stale materialized views that cost storage and compute. Use when the user asks \"which of my views are broken?\", \"why is this materialized view failing?\", \"are any of my views wasting compute?\", or wants a one-shot triage of view health. For source\u002Fsync health use `auditing-warehouse-source-health`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1085,1086,1087,1090],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":1088,"slug":1089,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-06-18T08:25:10.936787",{"slug":1093,"name":1093,"fn":1094,"description":1095,"org":1096,"tags":1097,"stars":23,"repoUrl":24,"updatedAt":1106},"authoring-error-tracking-alerts","author PostHog error tracking alerts","Author error tracking alerts that fire when an issue is created, reopened, or starts spiking. Use when the user asks to set up error notifications, route exceptions to Slack\u002Fwebhook\u002FLinear, or evaluate which error events are worth alerting on. Covers trigger-event selection, integration choice, dedup against existing alerts, and shipping with the canonical message body shape.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1098,1101,1104,1105],{"name":1099,"slug":1100,"type":15},"Alerting","alerting",{"name":1102,"slug":1103,"type":15},"Debugging","debugging",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:24:40.318583",{"slug":1108,"name":1108,"fn":1109,"description":1110,"org":1111,"tags":1112,"stars":23,"repoUrl":24,"updatedAt":1122},"authoring-log-alerts","author log alerts in PostHog","Author useful, low-noise log alerts on services in a PostHog project. Use when the user asks to set up alerts for their logs, suggest alerts they should add, or evaluate whether a service is worth monitoring. Covers service triage, baseline characterisation, threshold drafting, back-testing via simulate, and shipping with a notification destination.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1113,1114,1117,1118,1121],{"name":1056,"slug":31,"type":15},{"name":1115,"slug":1116,"type":15},"Monitoring","monitoring",{"name":13,"slug":14,"type":15},{"name":1119,"slug":1120,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-07-18T05:10:54.430898",{"slug":1124,"name":1124,"fn":1125,"description":1126,"org":1127,"tags":1128,"stars":23,"repoUrl":24,"updatedAt":1139},"building-workflows","build and edit PostHog workflows","Build, edit, test, enable, and monitor PostHog workflows over MCP. Author the action\u002Fedge graph so it runs and opens cleanly in the visual editor, then change drafts surgically with patch operations. Use when asked to build, set up, automate, change, fix, or debug a workflow, campaign, broadcast, drip sequence, or event-triggered automation in the workflows product.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1129,1132,1135,1136],{"name":1130,"slug":1131,"type":15},"Automation","automation",{"name":1133,"slug":1134,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},{"name":1137,"slug":1138,"type":15},"Workflow Automation","workflow-automation","2026-07-28T05:34:12.167015",61,{"items":1142,"total":1259},[1143,1150,1156,1163,1170,1177,1185,1192,1206,1221,1231,1249],{"slug":1050,"name":1050,"fn":1051,"description":1052,"org":1144,"tags":1145,"stars":23,"repoUrl":24,"updatedAt":1062},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1146,1147,1148,1149],{"name":1056,"slug":31,"type":15},{"name":1058,"slug":1059,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1064,"name":1064,"fn":1065,"description":1066,"org":1151,"tags":1152,"stars":23,"repoUrl":24,"updatedAt":1072},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1153,1154,1155],{"name":1056,"slug":31,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1157,"tags":1158,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1159,1160,1161,1162],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":110,"name":110,"fn":1081,"description":1082,"org":1164,"tags":1165,"stars":23,"repoUrl":24,"updatedAt":1091},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1166,1167,1168,1169],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":1088,"slug":1089,"type":15},{"name":9,"slug":8,"type":15},{"slug":1093,"name":1093,"fn":1094,"description":1095,"org":1171,"tags":1172,"stars":23,"repoUrl":24,"updatedAt":1106},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1173,1174,1175,1176],{"name":1099,"slug":1100,"type":15},{"name":1102,"slug":1103,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1108,"name":1108,"fn":1109,"description":1110,"org":1178,"tags":1179,"stars":23,"repoUrl":24,"updatedAt":1122},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1180,1181,1182,1183,1184],{"name":1056,"slug":31,"type":15},{"name":1115,"slug":1116,"type":15},{"name":13,"slug":14,"type":15},{"name":1119,"slug":1120,"type":15},{"name":9,"slug":8,"type":15},{"slug":1124,"name":1124,"fn":1125,"description":1126,"org":1186,"tags":1187,"stars":23,"repoUrl":24,"updatedAt":1139},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1188,1189,1190,1191],{"name":1130,"slug":1131,"type":15},{"name":1133,"slug":1134,"type":15},{"name":9,"slug":8,"type":15},{"name":1137,"slug":1138,"type":15},{"slug":1193,"name":1193,"fn":1194,"description":1195,"org":1196,"tags":1197,"stars":23,"repoUrl":24,"updatedAt":1205},"check-posthog-loading","inspect PostHog SDK loading across URLs","Inspect how the PostHog JavaScript SDK is loaded across a list of URLs. Use to confirm consistent installation across pages, find pages missing the snippet, detect mismatched API keys or hosts between pages, and verify the load method (head snippet vs deferred vs array.js).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1198,1199,1200,1203,1204],{"name":1056,"slug":31,"type":15},{"name":1102,"slug":1103,"type":15},{"name":1201,"slug":1202,"type":15},"Frontend","frontend",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-05-07T05:56:19.828048",{"slug":1207,"name":1207,"fn":1208,"description":1209,"org":1210,"tags":1211,"stars":23,"repoUrl":24,"updatedAt":1220},"consuming-endpoints-from-client-code","integrate PostHog endpoints into client applications","Wire a PostHog endpoint into a client app or SDK. Covers fetching the OpenAPI spec, generating a typed client with openapi-generator or @hey-api\u002Fopenapi-ts, sending the right auth header, shaping the variables payload (HogQL code_name vs insight breakdown property), handling rate-limit and materialised-endpoint error responses. Use when the user says \"how do I call my endpoint\", \"generate a client for this\", or \"what auth header do I use\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1212,1215,1216,1217],{"name":1213,"slug":1214,"type":15},"API Development","api-development",{"name":1201,"slug":1202,"type":15},{"name":9,"slug":8,"type":15},{"name":1218,"slug":1219,"type":15},"SDK","sdk","2026-06-08T08:08:34.929454",{"slug":1222,"name":1222,"fn":1223,"description":1224,"org":1225,"tags":1226,"stars":23,"repoUrl":24,"updatedAt":1230},"copying-endpoints-across-projects","copy PostHog endpoints across projects","Copy a PostHog endpoint (a saved HogQL\u002Finsight query exposed as an API route) to another project in the same organization, or duplicate it under a new name in the same project. Use when the user wants to duplicate an endpoint, promote an endpoint from staging to production, replicate an endpoint's query\u002Fvariables\u002Ffreshness config in another workspace, or clone an endpoint to iterate on it. Unlike feature flags and experiments, endpoints have NO native cross-project copy tool — this skill covers the read-then-recreate flow (endpoint-get then endpoint-create), the active-project switching it requires, name-collision checks, and the safe defaults (land unmaterialised in the target, verify with endpoint-run). Does not cover editing endpoint versions (see managing-endpoint-versions) or authoring a brand-new endpoint from scratch (see creating-an-endpoint).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1227,1228,1229],{"name":1213,"slug":1214,"type":15},{"name":1119,"slug":1120,"type":15},{"name":9,"slug":8,"type":15},"2026-07-15T05:29:58.442727",{"slug":1232,"name":1232,"fn":1233,"description":1234,"org":1235,"tags":1236,"stars":23,"repoUrl":24,"updatedAt":1248},"creating-ai-subscription","schedule recurring AI-generated PostHog reports","Create a recurring AI-generated PostHog report — schedule a free-text prompt to run on a cron, with the LLM-synthesized markdown delivered to email or Slack on each tick. Use when the user wants a recurring AI summary of X on any cadence (daily, weekly, monthly, yearly) rather than a one-off report. (To attach an AI summary to an existing insight\u002Fdashboard subscription instead of a free-text prompt, see `managing-subscriptions` and its `summary_enabled` option.)\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1237,1238,1241,1242,1245],{"name":1130,"slug":1131,"type":15},{"name":1239,"slug":1240,"type":15},"Email","email",{"name":9,"slug":8,"type":15},{"name":1243,"slug":1244,"type":15},"Reporting","reporting",{"name":1246,"slug":1247,"type":15},"Slack","slack","2026-06-09T07:32:27.935712",{"slug":1250,"name":1250,"fn":1251,"description":1252,"org":1253,"tags":1254,"stars":23,"repoUrl":24,"updatedAt":1258},"creating-an-endpoint","create PostHog API endpoints","Create a PostHog endpoint with the right shape on the first try — covers query kind choice, name conventions, what to expose as variables (HogQL code_name vs insight breakdown), data_freshness_seconds, and whether to materialise on day one. Use when the user says \"create an endpoint\", \"expose this query as an API\", \"turn this insight into an endpoint\", or asks for help structuring a new endpoint. Steers away from common mistakes: materialising a query with cohort breakdowns or compare mode, inline-only variables on a materialised endpoint, unbounded date ranges, ambiguous names.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1255,1256,1257],{"name":1056,"slug":31,"type":15},{"name":1213,"slug":1214,"type":15},{"name":9,"slug":8,"type":15},"2026-06-08T08:08:29.624498",231]