[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-planetscale-planetscale-query-insights-and-tags":3,"mdc--quyoih-key":34,"related-repo-planetscale-planetscale-query-insights-and-tags":1338,"related-org-planetscale-planetscale-query-insights-and-tags":1447},{"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":29,"sourceUrl":32,"mdContent":33},"planetscale-query-insights-and-tags","analyze database load with PlanetScale Insights","Use PlanetScale Insights and SQLCommenter-style query tags to attribute database load, identify risky queries, and prepare safe Traffic Control or schema recommendations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"planetscale","PlanetScale","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fplanetscale.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":17,"slug":18,"type":15},"Performance","performance",{"name":20,"slug":21,"type":15},"Database","database",{"name":9,"slug":8,"type":15},50,"https:\u002F\u002Fgithub.com\u002Fplanetscale\u002Fskills","2026-07-07T06:38:36.042801",null,1,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Skills that help you configure and get the most out of PlanetScale","https:\u002F\u002Fgithub.com\u002Fplanetscale\u002Fskills\u002Ftree\u002FHEAD\u002F04-query-insights-and-tags","---\nname: planetscale-query-insights-and-tags\ndescription: Use PlanetScale Insights and SQLCommenter-style query tags to attribute database load, identify risky queries, and prepare safe Traffic Control or schema recommendations.\n---\n\n# Query Insights and tags\n\n## Purpose\n\nUse PlanetScale Insights to understand query behavior, then recommend SQLCommenter-compatible tags that make future diagnosis and Traffic Control possible. Do not change database settings or repository code without approval.\n\n## What to inspect\n\n### Query behavior\n\nFor the selected database and branch, inspect:\n\n- Top queries by total time.\n- Top queries by time per execution.\n- Top queries by rows read.\n- Top queries by execution count.\n- For Postgres, top queries by CPU usage (`sort=cpuTime` or\n  `sort=percentCpuTime` on the Insights API).\n- Queries with errors.\n- Notable queries and active anomalies.\n- Query patterns affected by recent deploys.\n- Query patterns attached to schema recommendations.\n- For sharded Vitess databases, vindex usage for each query pattern: the\n  percentage of traffic using relevant vindexes and the vindex-usage trend\n  over time. The API exposes per-pattern `index_usages` and\n  `routing_index_usages`; get the trend from the dashboard Vindexes tab or\n  by comparing API windows. Treat missing or declining relevant-vindex\n  usage as an indexing or routing investigation input, not as proof that a\n  new index is required.\n\n### Insights API surface\n\nQuery Insights is public API: read-only GET endpoints under\n`organizations\u002F{org}\u002Fdatabases\u002F{db}\u002Fbranches\u002F{branch}`, authorized by a\nservice token or OAuth token with `read_databases`\u002F`read_database`.\n\n- `\u002Finsights` — aggregated statistics per query pattern over the requested\n  window. Set the window with `from`\u002F`to` (ISO 8601) or `period` (for\n  example `1h`, `24h`); search SQL patterns with `q`; sort server-side with\n  `sort` and `dir` — sort keys include `count`, `errorCount`, `rowsRead`,\n  `totalTime`, `cpuTime`, `ioTime`, `percentTime`, `percentCpuTime`,\n  `p50Latency`, `p99Latency`, `maxLatency`, `egressBytes`, and the\n  `trafficControlWarnings`\u002F`trafficControlThrottled` family. Filter with\n  `tablet_type` (`primary`, `replica`, `rdonly`) and `type` (`SELECT`,\n  `INSERT`, `UPDATE`, `DELETE`); trim responses with `fields`; paginate\n  with `page`\u002F`per_page`.\n- `\u002Finsights\u002F{fingerprint}` — individual collected executions for a\n  pattern (timestamps, duration, rows, username, client address, error\n  message). Available regardless of raw query collection; raw collection\n  adds literal parameter values to these records.\n  `\u002Finsights\u002F{fingerprint}\u002Fsummary` returns the single-pattern aggregate;\n  `\u002Finsights\u002Fqueries\u002F{id}` fetches one execution.\n- `\u002Finsights\u002Ferrors` — error fingerprints with counts and messages (`q`\n  searches the error message; sort by `count`, `lastRun`, `totalTime`, or\n  `timePerQuery`). `\u002Finsights\u002Ferrors\u002F{fingerprint}` lists the failing\n  executions behind one error fingerprint.\n- `\u002Finsights\u002Fanomalies` and `\u002Finsights\u002Fanomalies\u002F{id}` — anomaly windows\n  with per-query correlation coefficients identifying which patterns moved\n  with the anomaly.\n- `\u002Finsights\u002Ftags` — tag keys with observed values (`values_limit`,\n  `literal_values_only`, and `fingerprint`\u002F`keyspace` filters);\n  `\u002Finsights\u002Ftags\u002F{tag}` for a single key. `\u002Finsights\u002Ftags\u002Fsummaries`\n  groups the full statistics schema by one or more tag keys via the `tags`\n  parameter — use it to attribute load to routes, jobs, or features\n  without client-side aggregation.\n- `\u002Finsights\u002F{fingerprint}\u002Ftraffic\u002Fbudgets` — the Traffic Control budgets\n  and rules that affect a fingerprint (Postgres).\n\nAggregates cover the requested window. Duration fields use names like\n`sum_total_duration_millis`, with explicit share-of-window percent fields\n(`sum_total_duration_percent`); both totals and percentages are reliable\nfor the window requested.\n\nThe response schema is shared across engines, but some fields are\nengine-specific: CPU\u002FIO durations and block-cache statistics\n(`sum_cpu_duration_millis`, `blocks_read`, `block_cache_hit_ratio`, …) are\npopulated for Postgres; shard queries, keyspaces, `tablet_type`, and\nrouting-index (vindex) usage are populated for Vitess.\n\n### Tag coverage\n\nFor each expensive or anomalous query, determine:\n\n- Is it tagged?\n- Which service produced it?\n- Which route, job, controller, or action produced it?\n- Which deployment SHA produced it?\n- Is the tag cardinality safe?\n- Are tags consistent across frameworks and languages?\n- Use the tags API to answer these questions: `\u002Finsights\u002Ftags` shows which\n  keys and values are present, and `\u002Finsights\u002Ftags\u002Fsummaries?tags=...`\n  attributes load per tag value. In the Vitess dashboard, filter the query\n  table with `tag:key:value` and drill into query details to see tags on\n  individual executions. Built-in query metadata and SQLCommenter tags are\n  both valid attribution sources.\n\n### Raw query collection\n\nCheck whether raw query \u002F complete query collection is enabled. On\nPostgres the effective state is the `pginsights.raw_queries` cluster\nparameter (per branch, dashboard Extensions tab, default `false`); the\ndatabase API object's `insights_raw_queries` field is a separate surface.\nWhen the two differ, report the cluster parameter as the effective state\nand do not describe the difference as an inconsistency. On Vitess there\nis no cluster parameter; the database API's `insights_raw_queries` field\nis the effective state.\n\nReport it as a capability state, not a risk posture. Raw query collection\nrecords literal parameter values per execution, which pattern-level Insights\ndata does not provide. It is the mechanism for isolating which specific\ninvocation of a pattern is pathological. Execution-level records are\nretrievable from `\u002Finsights\u002F{fingerprint}` with or without raw collection;\nraw collection adds the literal parameter values to those records.\n\nWhen it is disabled, the finding is a capability gap: identify the query\npatterns in this assessment where pattern-level data is insufficient\n(unexplained latency variance within a fingerprint, tenant- or\nparameter-dependent behavior) and state that raw collection would resolve\nthem. State the operational property once, as fact: literal values become\nvisible to the observability pipeline. Where the customer's data-handling\nrequirements constrain this, scoped enablement (incident windows, defined\nretention) and leaving collection disabled are both valid outcomes —\nrecord the rationale rather than a default judgment in either direction.\n\nTags and raw collection are complementary instruments: tags attribute a\npattern to a code path; raw collection identifies the specific invocation.\nAssessments should evaluate both.\n\n## SQLCommenter tag schema\n\nRecommend this baseline tag set:\n\n- `application`: stable app name.\n- `service`: service or process name.\n- `environment`: production, staging, development.\n- `route`: normalized route template, for example `\u002Faccounts\u002F:id\u002Forders`, not `\u002Faccounts\u002F123\u002Forders`.\n- `controller`: framework controller name where applicable.\n- `action`: framework action name where applicable.\n- `job`: background job class or worker name.\n- `queue`: background queue.\n- `feature`: bounded feature name for traffic classes like export, report, search, billing, checkout.\n- `release_sha`: short git SHA or deploy identifier.\n- `source`: app, worker, script, agent, mcp, bi, integration.\n- `tenant_tier`: free, pro, enterprise, internal, only if bounded.\n\nDo not recommend these tags by default:\n\n- `user_id`\n- `request_id`\n- `tenant_id`\n- `email`\n- `session_id`\n- raw URL\n- unbounded GraphQL operation text\n- access token\n- secret\n\nIf the customer needs tenant-level isolation, recommend a bounded abstraction first, such as tenant tier, cell, shard, or customer class. Tenant ID is only acceptable with explicit approval after cardinality and privacy review.\n\n## Cardinality rules\n\nFlag a tag as unsafe when:\n\n- Values are unbounded.\n- Values include IDs, UUIDs, emails, slugs, or raw paths.\n- The same query pattern emits many unique tag combinations.\n- The tag would make Insights or Traffic Control aggregation noisy.\n\nRecommend normalizing at the application boundary.\n\n## Analysis output\n\nFor each top query pattern, produce:\n\n- Fingerprint or normalized query.\n- Current metrics.\n- Current tags.\n- Missing tags.\n- Likely source in application code.\n- Whether it is a schema recommendation candidate.\n- Whether it is a Traffic Control candidate.\n- Whether it is an application optimization candidate.\n\n## Recommendation classes\n\n### Add tags\n\nRecommend SQLCommenter instrumentation when query attribution is weak.\n\n### Improve tag normalization\n\nRecommend replacing high-cardinality tags with bounded values.\n\n### Add Traffic Control warning budget\n\nFor Postgres only, recommend `warn` mode budgets for expensive but important routes, jobs, analytics, exports, or third-party integrations.\n\n### Add schema recommendation workflow\n\nFor Vitess, recommend turning open schema recommendations into branch\u002Fdeploy-request work. For Postgres, recommend turning them into reviewed migrations against a non-production branch.\n\n### Fix code path\n\nRecommend a repository PR when the expensive query is caused by N+1, missing pagination, accidental eager load, unbounded export, broad search, or polling.\n\n## Safety rules\n\nDo not:\n\n- Enable raw query collection.\n- Add tags to code.\n- Change Traffic Control budgets.\n- Apply schema recommendations.\n- Run production EXPLAIN ANALYZE on expensive queries.\n\nWithout explicit approval.\n\n## Output\n\nReturn:\n\n- Query risk table.\n- Tag coverage table.\n- Bad\u002Fhigh-cardinality tag table.\n- Recommended tag schema for this application.\n- Candidate Traffic Control slices.\n- Candidate schema and code changes.\n- Proposed changes requiring approval.\n\nEnd with:\n\n“No Insights, tag, repository, or Traffic Control changes have been applied.”\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,48,55,61,67,74,79,167,173,202,643,664,698,704,709,770,776,812,824,829,834,840,845,995,1000,1068,1073,1079,1084,1107,1112,1118,1123,1166,1172,1178,1183,1189,1194,1200,1213,1219,1224,1230,1235,1241,1246,1274,1279,1285,1290,1328,1333],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"query-insights-and-tags",[45],{"type":46,"value":47},"text","Query Insights and tags",{"type":40,"tag":49,"props":50,"children":52},"h2",{"id":51},"purpose",[53],{"type":46,"value":54},"Purpose",{"type":40,"tag":56,"props":57,"children":58},"p",{},[59],{"type":46,"value":60},"Use PlanetScale Insights to understand query behavior, then recommend SQLCommenter-compatible tags that make future diagnosis and Traffic Control possible. Do not change database settings or repository code without approval.",{"type":40,"tag":49,"props":62,"children":64},{"id":63},"what-to-inspect",[65],{"type":46,"value":66},"What to inspect",{"type":40,"tag":68,"props":69,"children":71},"h3",{"id":70},"query-behavior",[72],{"type":46,"value":73},"Query behavior",{"type":40,"tag":56,"props":75,"children":76},{},[77],{"type":46,"value":78},"For the selected database and branch, inspect:",{"type":40,"tag":80,"props":81,"children":82},"ul",{},[83,89,94,99,104,126,131,136,141,146],{"type":40,"tag":84,"props":85,"children":86},"li",{},[87],{"type":46,"value":88},"Top queries by total time.",{"type":40,"tag":84,"props":90,"children":91},{},[92],{"type":46,"value":93},"Top queries by time per execution.",{"type":40,"tag":84,"props":95,"children":96},{},[97],{"type":46,"value":98},"Top queries by rows read.",{"type":40,"tag":84,"props":100,"children":101},{},[102],{"type":46,"value":103},"Top queries by execution count.",{"type":40,"tag":84,"props":105,"children":106},{},[107,109,116,118,124],{"type":46,"value":108},"For Postgres, top queries by CPU usage (",{"type":40,"tag":110,"props":111,"children":113},"code",{"className":112},[],[114],{"type":46,"value":115},"sort=cpuTime",{"type":46,"value":117}," or\n",{"type":40,"tag":110,"props":119,"children":121},{"className":120},[],[122],{"type":46,"value":123},"sort=percentCpuTime",{"type":46,"value":125}," on the Insights API).",{"type":40,"tag":84,"props":127,"children":128},{},[129],{"type":46,"value":130},"Queries with errors.",{"type":40,"tag":84,"props":132,"children":133},{},[134],{"type":46,"value":135},"Notable queries and active anomalies.",{"type":40,"tag":84,"props":137,"children":138},{},[139],{"type":46,"value":140},"Query patterns affected by recent deploys.",{"type":40,"tag":84,"props":142,"children":143},{},[144],{"type":46,"value":145},"Query patterns attached to schema recommendations.",{"type":40,"tag":84,"props":147,"children":148},{},[149,151,157,159,165],{"type":46,"value":150},"For sharded Vitess databases, vindex usage for each query pattern: the\npercentage of traffic using relevant vindexes and the vindex-usage trend\nover time. The API exposes per-pattern ",{"type":40,"tag":110,"props":152,"children":154},{"className":153},[],[155],{"type":46,"value":156},"index_usages",{"type":46,"value":158}," and\n",{"type":40,"tag":110,"props":160,"children":162},{"className":161},[],[163],{"type":46,"value":164},"routing_index_usages",{"type":46,"value":166},"; get the trend from the dashboard Vindexes tab or\nby comparing API windows. Treat missing or declining relevant-vindex\nusage as an indexing or routing investigation input, not as proof that a\nnew index is required.",{"type":40,"tag":68,"props":168,"children":170},{"id":169},"insights-api-surface",[171],{"type":46,"value":172},"Insights API surface",{"type":40,"tag":56,"props":174,"children":175},{},[176,178,184,186,192,194,200],{"type":46,"value":177},"Query Insights is public API: read-only GET endpoints under\n",{"type":40,"tag":110,"props":179,"children":181},{"className":180},[],[182],{"type":46,"value":183},"organizations\u002F{org}\u002Fdatabases\u002F{db}\u002Fbranches\u002F{branch}",{"type":46,"value":185},", authorized by a\nservice token or OAuth token with ",{"type":40,"tag":110,"props":187,"children":189},{"className":188},[],[190],{"type":46,"value":191},"read_databases",{"type":46,"value":193},"\u002F",{"type":40,"tag":110,"props":195,"children":197},{"className":196},[],[198],{"type":46,"value":199},"read_database",{"type":46,"value":201},".",{"type":40,"tag":80,"props":203,"children":204},{},[205,468,495,549,567,632],{"type":40,"tag":84,"props":206,"children":207},{},[208,214,216,222,223,229,231,237,239,245,247,253,255,261,263,269,271,277,279,285,286,292,293,299,301,307,308,314,315,321,322,328,329,335,336,342,343,349,350,356,357,363,365,371,372,378,380,386,388,394,395,401,402,408,410,416,417,423,424,430,431,437,438,444,446,452,454,460,461,467],{"type":40,"tag":110,"props":209,"children":211},{"className":210},[],[212],{"type":46,"value":213},"\u002Finsights",{"type":46,"value":215}," — aggregated statistics per query pattern over the requested\nwindow. Set the window with ",{"type":40,"tag":110,"props":217,"children":219},{"className":218},[],[220],{"type":46,"value":221},"from",{"type":46,"value":193},{"type":40,"tag":110,"props":224,"children":226},{"className":225},[],[227],{"type":46,"value":228},"to",{"type":46,"value":230}," (ISO 8601) or ",{"type":40,"tag":110,"props":232,"children":234},{"className":233},[],[235],{"type":46,"value":236},"period",{"type":46,"value":238}," (for\nexample ",{"type":40,"tag":110,"props":240,"children":242},{"className":241},[],[243],{"type":46,"value":244},"1h",{"type":46,"value":246},", ",{"type":40,"tag":110,"props":248,"children":250},{"className":249},[],[251],{"type":46,"value":252},"24h",{"type":46,"value":254},"); search SQL patterns with ",{"type":40,"tag":110,"props":256,"children":258},{"className":257},[],[259],{"type":46,"value":260},"q",{"type":46,"value":262},"; sort server-side with\n",{"type":40,"tag":110,"props":264,"children":266},{"className":265},[],[267],{"type":46,"value":268},"sort",{"type":46,"value":270}," and ",{"type":40,"tag":110,"props":272,"children":274},{"className":273},[],[275],{"type":46,"value":276},"dir",{"type":46,"value":278}," — sort keys include ",{"type":40,"tag":110,"props":280,"children":282},{"className":281},[],[283],{"type":46,"value":284},"count",{"type":46,"value":246},{"type":40,"tag":110,"props":287,"children":289},{"className":288},[],[290],{"type":46,"value":291},"errorCount",{"type":46,"value":246},{"type":40,"tag":110,"props":294,"children":296},{"className":295},[],[297],{"type":46,"value":298},"rowsRead",{"type":46,"value":300},",\n",{"type":40,"tag":110,"props":302,"children":304},{"className":303},[],[305],{"type":46,"value":306},"totalTime",{"type":46,"value":246},{"type":40,"tag":110,"props":309,"children":311},{"className":310},[],[312],{"type":46,"value":313},"cpuTime",{"type":46,"value":246},{"type":40,"tag":110,"props":316,"children":318},{"className":317},[],[319],{"type":46,"value":320},"ioTime",{"type":46,"value":246},{"type":40,"tag":110,"props":323,"children":325},{"className":324},[],[326],{"type":46,"value":327},"percentTime",{"type":46,"value":246},{"type":40,"tag":110,"props":330,"children":332},{"className":331},[],[333],{"type":46,"value":334},"percentCpuTime",{"type":46,"value":300},{"type":40,"tag":110,"props":337,"children":339},{"className":338},[],[340],{"type":46,"value":341},"p50Latency",{"type":46,"value":246},{"type":40,"tag":110,"props":344,"children":346},{"className":345},[],[347],{"type":46,"value":348},"p99Latency",{"type":46,"value":246},{"type":40,"tag":110,"props":351,"children":353},{"className":352},[],[354],{"type":46,"value":355},"maxLatency",{"type":46,"value":246},{"type":40,"tag":110,"props":358,"children":360},{"className":359},[],[361],{"type":46,"value":362},"egressBytes",{"type":46,"value":364},", and the\n",{"type":40,"tag":110,"props":366,"children":368},{"className":367},[],[369],{"type":46,"value":370},"trafficControlWarnings",{"type":46,"value":193},{"type":40,"tag":110,"props":373,"children":375},{"className":374},[],[376],{"type":46,"value":377},"trafficControlThrottled",{"type":46,"value":379}," family. Filter with\n",{"type":40,"tag":110,"props":381,"children":383},{"className":382},[],[384],{"type":46,"value":385},"tablet_type",{"type":46,"value":387}," (",{"type":40,"tag":110,"props":389,"children":391},{"className":390},[],[392],{"type":46,"value":393},"primary",{"type":46,"value":246},{"type":40,"tag":110,"props":396,"children":398},{"className":397},[],[399],{"type":46,"value":400},"replica",{"type":46,"value":246},{"type":40,"tag":110,"props":403,"children":405},{"className":404},[],[406],{"type":46,"value":407},"rdonly",{"type":46,"value":409},") and ",{"type":40,"tag":110,"props":411,"children":413},{"className":412},[],[414],{"type":46,"value":415},"type",{"type":46,"value":387},{"type":40,"tag":110,"props":418,"children":420},{"className":419},[],[421],{"type":46,"value":422},"SELECT",{"type":46,"value":300},{"type":40,"tag":110,"props":425,"children":427},{"className":426},[],[428],{"type":46,"value":429},"INSERT",{"type":46,"value":246},{"type":40,"tag":110,"props":432,"children":434},{"className":433},[],[435],{"type":46,"value":436},"UPDATE",{"type":46,"value":246},{"type":40,"tag":110,"props":439,"children":441},{"className":440},[],[442],{"type":46,"value":443},"DELETE",{"type":46,"value":445},"); trim responses with ",{"type":40,"tag":110,"props":447,"children":449},{"className":448},[],[450],{"type":46,"value":451},"fields",{"type":46,"value":453},"; paginate\nwith ",{"type":40,"tag":110,"props":455,"children":457},{"className":456},[],[458],{"type":46,"value":459},"page",{"type":46,"value":193},{"type":40,"tag":110,"props":462,"children":464},{"className":463},[],[465],{"type":46,"value":466},"per_page",{"type":46,"value":201},{"type":40,"tag":84,"props":469,"children":470},{},[471,477,479,485,487,493],{"type":40,"tag":110,"props":472,"children":474},{"className":473},[],[475],{"type":46,"value":476},"\u002Finsights\u002F{fingerprint}",{"type":46,"value":478}," — individual collected executions for a\npattern (timestamps, duration, rows, username, client address, error\nmessage). Available regardless of raw query collection; raw collection\nadds literal parameter values to these records.\n",{"type":40,"tag":110,"props":480,"children":482},{"className":481},[],[483],{"type":46,"value":484},"\u002Finsights\u002F{fingerprint}\u002Fsummary",{"type":46,"value":486}," returns the single-pattern aggregate;\n",{"type":40,"tag":110,"props":488,"children":490},{"className":489},[],[491],{"type":46,"value":492},"\u002Finsights\u002Fqueries\u002F{id}",{"type":46,"value":494}," fetches one execution.",{"type":40,"tag":84,"props":496,"children":497},{},[498,504,506,511,513,518,519,525,526,531,533,539,541,547],{"type":40,"tag":110,"props":499,"children":501},{"className":500},[],[502],{"type":46,"value":503},"\u002Finsights\u002Ferrors",{"type":46,"value":505}," — error fingerprints with counts and messages (",{"type":40,"tag":110,"props":507,"children":509},{"className":508},[],[510],{"type":46,"value":260},{"type":46,"value":512},"\nsearches the error message; sort by ",{"type":40,"tag":110,"props":514,"children":516},{"className":515},[],[517],{"type":46,"value":284},{"type":46,"value":246},{"type":40,"tag":110,"props":520,"children":522},{"className":521},[],[523],{"type":46,"value":524},"lastRun",{"type":46,"value":246},{"type":40,"tag":110,"props":527,"children":529},{"className":528},[],[530],{"type":46,"value":306},{"type":46,"value":532},", or\n",{"type":40,"tag":110,"props":534,"children":536},{"className":535},[],[537],{"type":46,"value":538},"timePerQuery",{"type":46,"value":540},"). ",{"type":40,"tag":110,"props":542,"children":544},{"className":543},[],[545],{"type":46,"value":546},"\u002Finsights\u002Ferrors\u002F{fingerprint}",{"type":46,"value":548}," lists the failing\nexecutions behind one error fingerprint.",{"type":40,"tag":84,"props":550,"children":551},{},[552,558,559,565],{"type":40,"tag":110,"props":553,"children":555},{"className":554},[],[556],{"type":46,"value":557},"\u002Finsights\u002Fanomalies",{"type":46,"value":270},{"type":40,"tag":110,"props":560,"children":562},{"className":561},[],[563],{"type":46,"value":564},"\u002Finsights\u002Fanomalies\u002F{id}",{"type":46,"value":566}," — anomaly windows\nwith per-query correlation coefficients identifying which patterns moved\nwith the anomaly.",{"type":40,"tag":84,"props":568,"children":569},{},[570,576,578,584,585,591,593,599,600,606,608,614,616,622,624,630],{"type":40,"tag":110,"props":571,"children":573},{"className":572},[],[574],{"type":46,"value":575},"\u002Finsights\u002Ftags",{"type":46,"value":577}," — tag keys with observed values (",{"type":40,"tag":110,"props":579,"children":581},{"className":580},[],[582],{"type":46,"value":583},"values_limit",{"type":46,"value":300},{"type":40,"tag":110,"props":586,"children":588},{"className":587},[],[589],{"type":46,"value":590},"literal_values_only",{"type":46,"value":592},", and ",{"type":40,"tag":110,"props":594,"children":596},{"className":595},[],[597],{"type":46,"value":598},"fingerprint",{"type":46,"value":193},{"type":40,"tag":110,"props":601,"children":603},{"className":602},[],[604],{"type":46,"value":605},"keyspace",{"type":46,"value":607}," filters);\n",{"type":40,"tag":110,"props":609,"children":611},{"className":610},[],[612],{"type":46,"value":613},"\u002Finsights\u002Ftags\u002F{tag}",{"type":46,"value":615}," for a single key. ",{"type":40,"tag":110,"props":617,"children":619},{"className":618},[],[620],{"type":46,"value":621},"\u002Finsights\u002Ftags\u002Fsummaries",{"type":46,"value":623},"\ngroups the full statistics schema by one or more tag keys via the ",{"type":40,"tag":110,"props":625,"children":627},{"className":626},[],[628],{"type":46,"value":629},"tags",{"type":46,"value":631},"\nparameter — use it to attribute load to routes, jobs, or features\nwithout client-side aggregation.",{"type":40,"tag":84,"props":633,"children":634},{},[635,641],{"type":40,"tag":110,"props":636,"children":638},{"className":637},[],[639],{"type":46,"value":640},"\u002Finsights\u002F{fingerprint}\u002Ftraffic\u002Fbudgets",{"type":46,"value":642}," — the Traffic Control budgets\nand rules that affect a fingerprint (Postgres).",{"type":40,"tag":56,"props":644,"children":645},{},[646,648,654,656,662],{"type":46,"value":647},"Aggregates cover the requested window. Duration fields use names like\n",{"type":40,"tag":110,"props":649,"children":651},{"className":650},[],[652],{"type":46,"value":653},"sum_total_duration_millis",{"type":46,"value":655},", with explicit share-of-window percent fields\n(",{"type":40,"tag":110,"props":657,"children":659},{"className":658},[],[660],{"type":46,"value":661},"sum_total_duration_percent",{"type":46,"value":663},"); both totals and percentages are reliable\nfor the window requested.",{"type":40,"tag":56,"props":665,"children":666},{},[667,669,675,676,682,683,689,691,696],{"type":46,"value":668},"The response schema is shared across engines, but some fields are\nengine-specific: CPU\u002FIO durations and block-cache statistics\n(",{"type":40,"tag":110,"props":670,"children":672},{"className":671},[],[673],{"type":46,"value":674},"sum_cpu_duration_millis",{"type":46,"value":246},{"type":40,"tag":110,"props":677,"children":679},{"className":678},[],[680],{"type":46,"value":681},"blocks_read",{"type":46,"value":246},{"type":40,"tag":110,"props":684,"children":686},{"className":685},[],[687],{"type":46,"value":688},"block_cache_hit_ratio",{"type":46,"value":690},", …) are\npopulated for Postgres; shard queries, keyspaces, ",{"type":40,"tag":110,"props":692,"children":694},{"className":693},[],[695],{"type":46,"value":385},{"type":46,"value":697},", and\nrouting-index (vindex) usage are populated for Vitess.",{"type":40,"tag":68,"props":699,"children":701},{"id":700},"tag-coverage",[702],{"type":46,"value":703},"Tag coverage",{"type":40,"tag":56,"props":705,"children":706},{},[707],{"type":46,"value":708},"For each expensive or anomalous query, determine:",{"type":40,"tag":80,"props":710,"children":711},{},[712,717,722,727,732,737,742],{"type":40,"tag":84,"props":713,"children":714},{},[715],{"type":46,"value":716},"Is it tagged?",{"type":40,"tag":84,"props":718,"children":719},{},[720],{"type":46,"value":721},"Which service produced it?",{"type":40,"tag":84,"props":723,"children":724},{},[725],{"type":46,"value":726},"Which route, job, controller, or action produced it?",{"type":40,"tag":84,"props":728,"children":729},{},[730],{"type":46,"value":731},"Which deployment SHA produced it?",{"type":40,"tag":84,"props":733,"children":734},{},[735],{"type":46,"value":736},"Is the tag cardinality safe?",{"type":40,"tag":84,"props":738,"children":739},{},[740],{"type":46,"value":741},"Are tags consistent across frameworks and languages?",{"type":40,"tag":84,"props":743,"children":744},{},[745,747,752,754,760,762,768],{"type":46,"value":746},"Use the tags API to answer these questions: ",{"type":40,"tag":110,"props":748,"children":750},{"className":749},[],[751],{"type":46,"value":575},{"type":46,"value":753}," shows which\nkeys and values are present, and ",{"type":40,"tag":110,"props":755,"children":757},{"className":756},[],[758],{"type":46,"value":759},"\u002Finsights\u002Ftags\u002Fsummaries?tags=...",{"type":46,"value":761},"\nattributes load per tag value. In the Vitess dashboard, filter the query\ntable with ",{"type":40,"tag":110,"props":763,"children":765},{"className":764},[],[766],{"type":46,"value":767},"tag:key:value",{"type":46,"value":769}," and drill into query details to see tags on\nindividual executions. Built-in query metadata and SQLCommenter tags are\nboth valid attribution sources.",{"type":40,"tag":68,"props":771,"children":773},{"id":772},"raw-query-collection",[774],{"type":46,"value":775},"Raw query collection",{"type":40,"tag":56,"props":777,"children":778},{},[779,781,787,789,795,797,803,805,810],{"type":46,"value":780},"Check whether raw query \u002F complete query collection is enabled. On\nPostgres the effective state is the ",{"type":40,"tag":110,"props":782,"children":784},{"className":783},[],[785],{"type":46,"value":786},"pginsights.raw_queries",{"type":46,"value":788}," cluster\nparameter (per branch, dashboard Extensions tab, default ",{"type":40,"tag":110,"props":790,"children":792},{"className":791},[],[793],{"type":46,"value":794},"false",{"type":46,"value":796},"); the\ndatabase API object's ",{"type":40,"tag":110,"props":798,"children":800},{"className":799},[],[801],{"type":46,"value":802},"insights_raw_queries",{"type":46,"value":804}," field is a separate surface.\nWhen the two differ, report the cluster parameter as the effective state\nand do not describe the difference as an inconsistency. On Vitess there\nis no cluster parameter; the database API's ",{"type":40,"tag":110,"props":806,"children":808},{"className":807},[],[809],{"type":46,"value":802},{"type":46,"value":811}," field\nis the effective state.",{"type":40,"tag":56,"props":813,"children":814},{},[815,817,822],{"type":46,"value":816},"Report it as a capability state, not a risk posture. Raw query collection\nrecords literal parameter values per execution, which pattern-level Insights\ndata does not provide. It is the mechanism for isolating which specific\ninvocation of a pattern is pathological. Execution-level records are\nretrievable from ",{"type":40,"tag":110,"props":818,"children":820},{"className":819},[],[821],{"type":46,"value":476},{"type":46,"value":823}," with or without raw collection;\nraw collection adds the literal parameter values to those records.",{"type":40,"tag":56,"props":825,"children":826},{},[827],{"type":46,"value":828},"When it is disabled, the finding is a capability gap: identify the query\npatterns in this assessment where pattern-level data is insufficient\n(unexplained latency variance within a fingerprint, tenant- or\nparameter-dependent behavior) and state that raw collection would resolve\nthem. State the operational property once, as fact: literal values become\nvisible to the observability pipeline. Where the customer's data-handling\nrequirements constrain this, scoped enablement (incident windows, defined\nretention) and leaving collection disabled are both valid outcomes —\nrecord the rationale rather than a default judgment in either direction.",{"type":40,"tag":56,"props":830,"children":831},{},[832],{"type":46,"value":833},"Tags and raw collection are complementary instruments: tags attribute a\npattern to a code path; raw collection identifies the specific invocation.\nAssessments should evaluate both.",{"type":40,"tag":49,"props":835,"children":837},{"id":836},"sqlcommenter-tag-schema",[838],{"type":46,"value":839},"SQLCommenter tag schema",{"type":40,"tag":56,"props":841,"children":842},{},[843],{"type":46,"value":844},"Recommend this baseline tag set:",{"type":40,"tag":80,"props":846,"children":847},{},[848,859,870,881,907,918,929,940,951,962,973,984],{"type":40,"tag":84,"props":849,"children":850},{},[851,857],{"type":40,"tag":110,"props":852,"children":854},{"className":853},[],[855],{"type":46,"value":856},"application",{"type":46,"value":858},": stable app name.",{"type":40,"tag":84,"props":860,"children":861},{},[862,868],{"type":40,"tag":110,"props":863,"children":865},{"className":864},[],[866],{"type":46,"value":867},"service",{"type":46,"value":869},": service or process name.",{"type":40,"tag":84,"props":871,"children":872},{},[873,879],{"type":40,"tag":110,"props":874,"children":876},{"className":875},[],[877],{"type":46,"value":878},"environment",{"type":46,"value":880},": production, staging, development.",{"type":40,"tag":84,"props":882,"children":883},{},[884,890,892,898,900,906],{"type":40,"tag":110,"props":885,"children":887},{"className":886},[],[888],{"type":46,"value":889},"route",{"type":46,"value":891},": normalized route template, for example ",{"type":40,"tag":110,"props":893,"children":895},{"className":894},[],[896],{"type":46,"value":897},"\u002Faccounts\u002F:id\u002Forders",{"type":46,"value":899},", not ",{"type":40,"tag":110,"props":901,"children":903},{"className":902},[],[904],{"type":46,"value":905},"\u002Faccounts\u002F123\u002Forders",{"type":46,"value":201},{"type":40,"tag":84,"props":908,"children":909},{},[910,916],{"type":40,"tag":110,"props":911,"children":913},{"className":912},[],[914],{"type":46,"value":915},"controller",{"type":46,"value":917},": framework controller name where applicable.",{"type":40,"tag":84,"props":919,"children":920},{},[921,927],{"type":40,"tag":110,"props":922,"children":924},{"className":923},[],[925],{"type":46,"value":926},"action",{"type":46,"value":928},": framework action name where applicable.",{"type":40,"tag":84,"props":930,"children":931},{},[932,938],{"type":40,"tag":110,"props":933,"children":935},{"className":934},[],[936],{"type":46,"value":937},"job",{"type":46,"value":939},": background job class or worker name.",{"type":40,"tag":84,"props":941,"children":942},{},[943,949],{"type":40,"tag":110,"props":944,"children":946},{"className":945},[],[947],{"type":46,"value":948},"queue",{"type":46,"value":950},": background queue.",{"type":40,"tag":84,"props":952,"children":953},{},[954,960],{"type":40,"tag":110,"props":955,"children":957},{"className":956},[],[958],{"type":46,"value":959},"feature",{"type":46,"value":961},": bounded feature name for traffic classes like export, report, search, billing, checkout.",{"type":40,"tag":84,"props":963,"children":964},{},[965,971],{"type":40,"tag":110,"props":966,"children":968},{"className":967},[],[969],{"type":46,"value":970},"release_sha",{"type":46,"value":972},": short git SHA or deploy identifier.",{"type":40,"tag":84,"props":974,"children":975},{},[976,982],{"type":40,"tag":110,"props":977,"children":979},{"className":978},[],[980],{"type":46,"value":981},"source",{"type":46,"value":983},": app, worker, script, agent, mcp, bi, integration.",{"type":40,"tag":84,"props":985,"children":986},{},[987,993],{"type":40,"tag":110,"props":988,"children":990},{"className":989},[],[991],{"type":46,"value":992},"tenant_tier",{"type":46,"value":994},": free, pro, enterprise, internal, only if bounded.",{"type":40,"tag":56,"props":996,"children":997},{},[998],{"type":46,"value":999},"Do not recommend these tags by default:",{"type":40,"tag":80,"props":1001,"children":1002},{},[1003,1012,1021,1030,1039,1048,1053,1058,1063],{"type":40,"tag":84,"props":1004,"children":1005},{},[1006],{"type":40,"tag":110,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":46,"value":1011},"user_id",{"type":40,"tag":84,"props":1013,"children":1014},{},[1015],{"type":40,"tag":110,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":46,"value":1020},"request_id",{"type":40,"tag":84,"props":1022,"children":1023},{},[1024],{"type":40,"tag":110,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":46,"value":1029},"tenant_id",{"type":40,"tag":84,"props":1031,"children":1032},{},[1033],{"type":40,"tag":110,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":46,"value":1038},"email",{"type":40,"tag":84,"props":1040,"children":1041},{},[1042],{"type":40,"tag":110,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":46,"value":1047},"session_id",{"type":40,"tag":84,"props":1049,"children":1050},{},[1051],{"type":46,"value":1052},"raw URL",{"type":40,"tag":84,"props":1054,"children":1055},{},[1056],{"type":46,"value":1057},"unbounded GraphQL operation text",{"type":40,"tag":84,"props":1059,"children":1060},{},[1061],{"type":46,"value":1062},"access token",{"type":40,"tag":84,"props":1064,"children":1065},{},[1066],{"type":46,"value":1067},"secret",{"type":40,"tag":56,"props":1069,"children":1070},{},[1071],{"type":46,"value":1072},"If the customer needs tenant-level isolation, recommend a bounded abstraction first, such as tenant tier, cell, shard, or customer class. Tenant ID is only acceptable with explicit approval after cardinality and privacy review.",{"type":40,"tag":49,"props":1074,"children":1076},{"id":1075},"cardinality-rules",[1077],{"type":46,"value":1078},"Cardinality rules",{"type":40,"tag":56,"props":1080,"children":1081},{},[1082],{"type":46,"value":1083},"Flag a tag as unsafe when:",{"type":40,"tag":80,"props":1085,"children":1086},{},[1087,1092,1097,1102],{"type":40,"tag":84,"props":1088,"children":1089},{},[1090],{"type":46,"value":1091},"Values are unbounded.",{"type":40,"tag":84,"props":1093,"children":1094},{},[1095],{"type":46,"value":1096},"Values include IDs, UUIDs, emails, slugs, or raw paths.",{"type":40,"tag":84,"props":1098,"children":1099},{},[1100],{"type":46,"value":1101},"The same query pattern emits many unique tag combinations.",{"type":40,"tag":84,"props":1103,"children":1104},{},[1105],{"type":46,"value":1106},"The tag would make Insights or Traffic Control aggregation noisy.",{"type":40,"tag":56,"props":1108,"children":1109},{},[1110],{"type":46,"value":1111},"Recommend normalizing at the application boundary.",{"type":40,"tag":49,"props":1113,"children":1115},{"id":1114},"analysis-output",[1116],{"type":46,"value":1117},"Analysis output",{"type":40,"tag":56,"props":1119,"children":1120},{},[1121],{"type":46,"value":1122},"For each top query pattern, produce:",{"type":40,"tag":80,"props":1124,"children":1125},{},[1126,1131,1136,1141,1146,1151,1156,1161],{"type":40,"tag":84,"props":1127,"children":1128},{},[1129],{"type":46,"value":1130},"Fingerprint or normalized query.",{"type":40,"tag":84,"props":1132,"children":1133},{},[1134],{"type":46,"value":1135},"Current metrics.",{"type":40,"tag":84,"props":1137,"children":1138},{},[1139],{"type":46,"value":1140},"Current tags.",{"type":40,"tag":84,"props":1142,"children":1143},{},[1144],{"type":46,"value":1145},"Missing tags.",{"type":40,"tag":84,"props":1147,"children":1148},{},[1149],{"type":46,"value":1150},"Likely source in application code.",{"type":40,"tag":84,"props":1152,"children":1153},{},[1154],{"type":46,"value":1155},"Whether it is a schema recommendation candidate.",{"type":40,"tag":84,"props":1157,"children":1158},{},[1159],{"type":46,"value":1160},"Whether it is a Traffic Control candidate.",{"type":40,"tag":84,"props":1162,"children":1163},{},[1164],{"type":46,"value":1165},"Whether it is an application optimization candidate.",{"type":40,"tag":49,"props":1167,"children":1169},{"id":1168},"recommendation-classes",[1170],{"type":46,"value":1171},"Recommendation classes",{"type":40,"tag":68,"props":1173,"children":1175},{"id":1174},"add-tags",[1176],{"type":46,"value":1177},"Add tags",{"type":40,"tag":56,"props":1179,"children":1180},{},[1181],{"type":46,"value":1182},"Recommend SQLCommenter instrumentation when query attribution is weak.",{"type":40,"tag":68,"props":1184,"children":1186},{"id":1185},"improve-tag-normalization",[1187],{"type":46,"value":1188},"Improve tag normalization",{"type":40,"tag":56,"props":1190,"children":1191},{},[1192],{"type":46,"value":1193},"Recommend replacing high-cardinality tags with bounded values.",{"type":40,"tag":68,"props":1195,"children":1197},{"id":1196},"add-traffic-control-warning-budget",[1198],{"type":46,"value":1199},"Add Traffic Control warning budget",{"type":40,"tag":56,"props":1201,"children":1202},{},[1203,1205,1211],{"type":46,"value":1204},"For Postgres only, recommend ",{"type":40,"tag":110,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":46,"value":1210},"warn",{"type":46,"value":1212}," mode budgets for expensive but important routes, jobs, analytics, exports, or third-party integrations.",{"type":40,"tag":68,"props":1214,"children":1216},{"id":1215},"add-schema-recommendation-workflow",[1217],{"type":46,"value":1218},"Add schema recommendation workflow",{"type":40,"tag":56,"props":1220,"children":1221},{},[1222],{"type":46,"value":1223},"For Vitess, recommend turning open schema recommendations into branch\u002Fdeploy-request work. For Postgres, recommend turning them into reviewed migrations against a non-production branch.",{"type":40,"tag":68,"props":1225,"children":1227},{"id":1226},"fix-code-path",[1228],{"type":46,"value":1229},"Fix code path",{"type":40,"tag":56,"props":1231,"children":1232},{},[1233],{"type":46,"value":1234},"Recommend a repository PR when the expensive query is caused by N+1, missing pagination, accidental eager load, unbounded export, broad search, or polling.",{"type":40,"tag":49,"props":1236,"children":1238},{"id":1237},"safety-rules",[1239],{"type":46,"value":1240},"Safety rules",{"type":40,"tag":56,"props":1242,"children":1243},{},[1244],{"type":46,"value":1245},"Do not:",{"type":40,"tag":80,"props":1247,"children":1248},{},[1249,1254,1259,1264,1269],{"type":40,"tag":84,"props":1250,"children":1251},{},[1252],{"type":46,"value":1253},"Enable raw query collection.",{"type":40,"tag":84,"props":1255,"children":1256},{},[1257],{"type":46,"value":1258},"Add tags to code.",{"type":40,"tag":84,"props":1260,"children":1261},{},[1262],{"type":46,"value":1263},"Change Traffic Control budgets.",{"type":40,"tag":84,"props":1265,"children":1266},{},[1267],{"type":46,"value":1268},"Apply schema recommendations.",{"type":40,"tag":84,"props":1270,"children":1271},{},[1272],{"type":46,"value":1273},"Run production EXPLAIN ANALYZE on expensive queries.",{"type":40,"tag":56,"props":1275,"children":1276},{},[1277],{"type":46,"value":1278},"Without explicit approval.",{"type":40,"tag":49,"props":1280,"children":1282},{"id":1281},"output",[1283],{"type":46,"value":1284},"Output",{"type":40,"tag":56,"props":1286,"children":1287},{},[1288],{"type":46,"value":1289},"Return:",{"type":40,"tag":80,"props":1291,"children":1292},{},[1293,1298,1303,1308,1313,1318,1323],{"type":40,"tag":84,"props":1294,"children":1295},{},[1296],{"type":46,"value":1297},"Query risk table.",{"type":40,"tag":84,"props":1299,"children":1300},{},[1301],{"type":46,"value":1302},"Tag coverage table.",{"type":40,"tag":84,"props":1304,"children":1305},{},[1306],{"type":46,"value":1307},"Bad\u002Fhigh-cardinality tag table.",{"type":40,"tag":84,"props":1309,"children":1310},{},[1311],{"type":46,"value":1312},"Recommended tag schema for this application.",{"type":40,"tag":84,"props":1314,"children":1315},{},[1316],{"type":46,"value":1317},"Candidate Traffic Control slices.",{"type":40,"tag":84,"props":1319,"children":1320},{},[1321],{"type":46,"value":1322},"Candidate schema and code changes.",{"type":40,"tag":84,"props":1324,"children":1325},{},[1326],{"type":46,"value":1327},"Proposed changes requiring approval.",{"type":40,"tag":56,"props":1329,"children":1330},{},[1331],{"type":46,"value":1332},"End with:",{"type":40,"tag":56,"props":1334,"children":1335},{},[1336],{"type":46,"value":1337},"“No Insights, tag, repository, or Traffic Control changes have been applied.”",{"items":1339,"total":1446},[1340,1358,1369,1384,1400,1417,1429],{"slug":1341,"name":1341,"fn":1342,"description":1343,"org":1344,"tags":1345,"stars":23,"repoUrl":24,"updatedAt":1357},"planetscale-autonomous-execution-mode","execute autonomous PlanetScale database changes","Execute approved PlanetScale changes end-to-end without per-step approval when the operator has explicitly acknowledged the risk. Defines the risk-acknowledgment contract, scoped autonomy levels, sensible execution ordering, continuous status reporting, halt conditions, and rollback discipline. Extremely safe, very enabling.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1346,1349,1350,1353,1354],{"name":1347,"slug":1348,"type":15},"Automation","automation",{"name":20,"slug":21,"type":15},{"name":1351,"slug":1352,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},{"name":1355,"slug":1356,"type":15},"Risk Assessment","risk-assessment","2026-07-05T06:32:41.490537",{"slug":1359,"name":1359,"fn":1360,"description":1361,"org":1362,"tags":1363,"stars":23,"repoUrl":24,"updatedAt":1368},"planetscale-best-practices-matrix","evaluate PlanetScale best practices feature matrix","A concise feature matrix for deciding which PlanetScale safety, observability, and automation recommendations apply by engine.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1364,1365,1366,1367],{"name":1347,"slug":1348,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-07-27T06:07:48.188419",{"slug":1370,"name":1370,"fn":1371,"description":1372,"org":1373,"tags":1374,"stars":23,"repoUrl":24,"updatedAt":1383},"planetscale-change-gates-and-approval-contract","enforce approval gates for database mutations","Enforce explicit approval gates for any PlanetScale, database, repository, credential, network, or automation mutation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1375,1378,1379,1382],{"name":1376,"slug":1377,"type":15},"Approvals","approvals",{"name":20,"slug":21,"type":15},{"name":1380,"slug":1381,"type":15},"Governance","governance",{"name":9,"slug":8,"type":15},"2026-07-07T06:38:42.512288",{"slug":1385,"name":1385,"fn":1386,"description":1387,"org":1388,"tags":1389,"stars":23,"repoUrl":24,"updatedAt":1399},"planetscale-codebase-sqlcommenter-instrumentation","instrument PlanetScale applications with SQLCommenter","Inspect an application repository connected to PlanetScale and recommend SQLCommenter-compatible query tagging packages and conventions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1390,1393,1394,1395,1396],{"name":1391,"slug":1392,"type":15},"Code Analysis","code-analysis",{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":1397,"slug":1398,"type":15},"SQL","sql","2026-07-07T06:38:43.813568",{"slug":1401,"name":1401,"fn":1402,"description":1403,"org":1404,"tags":1405,"stars":23,"repoUrl":24,"updatedAt":1416},"planetscale-customer-report-template","generate PlanetScale best practices reports","Produce the final PlanetScale best-practices report after running the inventory and relevant review skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1406,1409,1410,1413],{"name":1407,"slug":1408,"type":15},"Documentation","documentation",{"name":9,"slug":8,"type":15},{"name":1411,"slug":1412,"type":15},"Reporting","reporting",{"name":1414,"slug":1415,"type":15},"Templates","templates","2026-07-07T06:38:37.362061",{"slug":1418,"name":1418,"fn":1419,"description":1420,"org":1421,"tags":1422,"stars":23,"repoUrl":24,"updatedAt":1428},"planetscale-mcp-agent-operating-model","configure safe PlanetScale MCP agent behavior","Configure safe agent behavior around PlanetScale MCP, Insights, schema recommendations, and repository work without autonomous production mutation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1423,1426,1427],{"name":1424,"slug":1425,"type":15},"MCP","mcp",{"name":1351,"slug":1352,"type":15},{"name":9,"slug":8,"type":15},"2026-07-07T06:38:38.675213",{"slug":1430,"name":1430,"fn":1431,"description":1432,"org":1433,"tags":1434,"stars":23,"repoUrl":24,"updatedAt":1445},"planetscale-postgres-safety-review","review PlanetScale Postgres safety and configuration","Review PlanetScale Postgres for Traffic Control, query tags, roles, pg_strict, backups\u002FPITR, private connectivity, webhooks, branches, and safe agent operation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1435,1438,1439,1442],{"name":1436,"slug":1437,"type":15},"Audit","audit",{"name":9,"slug":8,"type":15},{"name":1440,"slug":1441,"type":15},"PostgreSQL","postgresql",{"name":1443,"slug":1444,"type":15},"Security","security","2026-07-07T06:38:34.75135",15,{"items":1448,"total":1564},[1449,1466,1477,1488,1501,1509,1516,1523,1531,1538,1544,1551],{"slug":1450,"name":1450,"fn":1451,"description":1452,"org":1453,"tags":1454,"stars":1463,"repoUrl":1464,"updatedAt":1465},"mysql","plan and optimize MySQL database schemas","Plan and review MySQL\u002FInnoDB schema, indexing, query tuning, transactions, and operations. Use when creating or modifying MySQL tables, indexes, or queries; diagnosing slow\u002Flocking behavior; planning migrations; or troubleshooting replication and connection issues. Load when using a MySQL database.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1455,1458,1459,1461,1462],{"name":1456,"slug":1457,"type":15},"Data Modeling","data-modeling",{"name":20,"slug":21,"type":15},{"name":1460,"slug":1450,"type":15},"MySQL",{"name":17,"slug":18,"type":15},{"name":1397,"slug":1398,"type":15},557,"https:\u002F\u002Fgithub.com\u002Fplanetscale\u002Fdatabase-skills","2026-04-06T18:43:45.381961",{"slug":1467,"name":1467,"fn":1468,"description":1469,"org":1470,"tags":1471,"stars":1463,"repoUrl":1464,"updatedAt":1476},"neki","manage sharded PostgreSQL with Neki","Overview and information about Neki, the sharded Postgres product by PlanetScale. Load when working with Neki-related tasks and the need to scale or shard postgres. Load when facing Postgres scaling or sharding issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1472,1473,1474,1475],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":1440,"slug":1441,"type":15},"2026-07-24T05:38:09.09841",{"slug":1478,"name":1478,"fn":1479,"description":1480,"org":1481,"tags":1482,"stars":1463,"repoUrl":1464,"updatedAt":1487},"postgres","optimize PostgreSQL database performance","PostgreSQL best practices, query optimization, connection troubleshooting, and performance improvement. Load when working with Postgres databases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1483,1484,1485,1486],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":1440,"slug":1441,"type":15},{"name":1397,"slug":1398,"type":15},"2026-04-06T18:43:44.126777",{"slug":1489,"name":1489,"fn":1490,"description":1491,"org":1492,"tags":1493,"stars":1463,"repoUrl":1464,"updatedAt":1500},"vitess","optimize Vitess database performance and sharding","Vitess best practices, query optimization, and connection troubleshooting for PlanetScale Vitess databases. Load when working with Vitess databases, sharding, VSchema configuration, keyspace management, or MySQL scaling issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1494,1495,1496,1497,1498],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":1397,"slug":1398,"type":15},{"name":1499,"slug":1489,"type":15},"Vitess","2026-04-06T18:43:42.890969",{"slug":1341,"name":1341,"fn":1342,"description":1343,"org":1502,"tags":1503,"stars":23,"repoUrl":24,"updatedAt":1357},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1504,1505,1506,1507,1508],{"name":1347,"slug":1348,"type":15},{"name":20,"slug":21,"type":15},{"name":1351,"slug":1352,"type":15},{"name":9,"slug":8,"type":15},{"name":1355,"slug":1356,"type":15},{"slug":1359,"name":1359,"fn":1360,"description":1361,"org":1510,"tags":1511,"stars":23,"repoUrl":24,"updatedAt":1368},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1512,1513,1514,1515],{"name":1347,"slug":1348,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":1370,"name":1370,"fn":1371,"description":1372,"org":1517,"tags":1518,"stars":23,"repoUrl":24,"updatedAt":1383},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1519,1520,1521,1522],{"name":1376,"slug":1377,"type":15},{"name":20,"slug":21,"type":15},{"name":1380,"slug":1381,"type":15},{"name":9,"slug":8,"type":15},{"slug":1385,"name":1385,"fn":1386,"description":1387,"org":1524,"tags":1525,"stars":23,"repoUrl":24,"updatedAt":1399},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1526,1527,1528,1529,1530],{"name":1391,"slug":1392,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":1397,"slug":1398,"type":15},{"slug":1401,"name":1401,"fn":1402,"description":1403,"org":1532,"tags":1533,"stars":23,"repoUrl":24,"updatedAt":1416},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1534,1535,1536,1537],{"name":1407,"slug":1408,"type":15},{"name":9,"slug":8,"type":15},{"name":1411,"slug":1412,"type":15},{"name":1414,"slug":1415,"type":15},{"slug":1418,"name":1418,"fn":1419,"description":1420,"org":1539,"tags":1540,"stars":23,"repoUrl":24,"updatedAt":1428},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1541,1542,1543],{"name":1424,"slug":1425,"type":15},{"name":1351,"slug":1352,"type":15},{"name":9,"slug":8,"type":15},{"slug":1430,"name":1430,"fn":1431,"description":1432,"org":1545,"tags":1546,"stars":23,"repoUrl":24,"updatedAt":1445},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1547,1548,1549,1550],{"name":1436,"slug":1437,"type":15},{"name":9,"slug":8,"type":15},{"name":1440,"slug":1441,"type":15},{"name":1443,"slug":1444,"type":15},{"slug":1552,"name":1552,"fn":1553,"description":1554,"org":1555,"tags":1556,"stars":23,"repoUrl":24,"updatedAt":1563},"planetscale-pscale-cli-automation","automate PlanetScale CLI operations","Use the PlanetScale CLI (pscale) from automated agents with --format json, auth check, pscale sql, and per-command --force. Run before other PlanetScale skills when driving pscale directly. Use when the user asks to automate pscale, run CLI commands headless, or verify pscale auth from an agent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1557,1558,1561,1562],{"name":1347,"slug":1348,"type":15},{"name":1559,"slug":1560,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},"2026-07-07T06:38:33.465495",19]