[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-google-cloud-verifyunused":3,"mdc--ju4gem-key":35,"related-org-google-cloud-verifyunused":719,"related-repo-google-cloud-verifyunused":906},{"slug":4,"name":5,"fn":6,"description":7,"org":8,"tags":13,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":33,"mdContent":34},"verifyunused","verify_unused","verify GKE cluster usage before deletion","Verifies if a GKE or Kubernetes cluster is unused (no active compute, external exposure, or persistent data) before allowing deletion. Evaluates external exposure (LoadBalancer Service, Ingress, Gateway, MultiClusterIngress), persistent data (Bound PVC), and active compute (Running\u002FPending Pods in user namespaces) with low-overhead queries and fail-close timeouts.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},"google-cloud","Google Cloud","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fgoogle-cloud.png","GoogleCloudPlatform",[14,18,21,24],{"name":15,"slug":16,"type":17},"Security","security","tag",{"name":19,"slug":20,"type":17},"Operations","operations",{"name":22,"slug":23,"type":17},"Kubernetes","kubernetes",{"name":10,"slug":9,"type":17},161,"https:\u002F\u002Fgithub.com\u002FGoogleCloudPlatform\u002Fgke-mcp","2026-07-12T07:39:33.567019",null,78,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":28},[],"https:\u002F\u002Fgithub.com\u002FGoogleCloudPlatform\u002Fgke-mcp\u002Ftree\u002FHEAD\u002Fskills\u002Fverify_unused","---\nname: verify_unused\ndescription: Verifies if a GKE or Kubernetes cluster is unused (no active compute, external exposure, or persistent data) before allowing deletion. Evaluates external exposure (LoadBalancer Service, Ingress, Gateway, MultiClusterIngress), persistent data (Bound PVC), and active compute (Running\u002FPending Pods in user namespaces) with low-overhead queries and fail-close timeouts.\n---\n\n# verify_unused\n\nUse this skill to safety-check whether a GKE or Kubernetes cluster is active or unused **before** executing any cluster deletion commands (`DeleteCluster`, `gcloud container clusters delete`, or `kubectl delete`). This prevents accidental data loss, service interruption, and destruction of active environments.\n\n## Critical Rule\n\n> [!IMPORTANT]\n> **NEVER** delete a GKE or Kubernetes cluster without running this verification skill first or verifying that `deletion_policy: VERIFY_UNUSED` is enforced. If this check returns `[ACTIVE]` (exit code `1`) or fails due to network\u002Fserver timeout (`[FAIL-CLOSE]`, exit code `2`), you must **block the deletion** and prompt the user for explicit confirmation or intervention.\n\n## Safety Criteria\n\nThe safety verification evaluates three core heuristics. If any condition is met, deletion is blocked:\n\n### 1. External Exposure\n\n- **Failure Condition:** Presence of $\\ge 1$ `Service` of type `LoadBalancer`, OR any `Ingress`, `Gateway` (Gateway API), or `MultiClusterIngress` resource in any namespace.\n- **Rationale:** These resources indicate the cluster is actively serving (or configured to serve) ingress traffic. Deleting the cluster would cause an immediate service disruption for users or connected systems.\n\n### 2. Persistent Data\n\n- **Failure Condition:** Presence of $\\ge 1$ `PersistentVolumeClaim` (PVC) in the `Bound` state in any namespace.\n- **Rationale:** A Bound PVC indicates a persistent disk attached containing application state. Deleting the cluster could result in permanent, unrecoverable data loss.\n\n### 3. Active Compute\n\n- **Failure Condition:** Presence of $\\ge 1$ `Pod` in `Running` or `Pending` state in any user namespace (includes `default`, but excludes system namespaces like `kube-system` or those prefixed with `gke-`).\n- **Rationale:** Running pods represent active compute, and Pending pods indicate a system attempting to schedule or scale work. System namespaces (`kube-system`, `gke-*`) are excluded to avoid blocking deletion on cluster control-plane and addon overhead.\n\n## Performance Overhead & Reliability\n\nTo ensure checks add minimal overhead and operate safely under adverse network conditions:\n\n- **Low-Overhead Queries (Early Return):** Because the policy only needs to confirm the existence of at least one active resource to block deletion, lists use standard chunk sizes (`--chunk-size=500`) and the Python script terminates immediately upon finding the first offending resource.\n  Note that passing `--chunk-size=1` with `kubectl -o json` is avoided because `kubectl` sequentially loops through all pages before formatting output, which causes N sequential API requests.\n- **Bounded Timeouts & Fail-Close Behavior:** Synchronous API queries enforce explicit timeouts (`--request-timeout`).\n  If the checks do not complete within the timeout window or encounter API errors, the operation **fails close** (exit code `2`), blocking cluster deletion rather than assuming safety during control-plane latency or outages.\n\n## Usage Instructions\n\n### Step 1: Execute Verification Script\n\nExecute the bundled safety verification script (`scripts\u002Fverify_unused.py` located inside this skill folder) against the target cluster:\n\n```bash\npython3 \u003Cskill_directory>\u002Fscripts\u002Fverify_unused.py --timeout 5.0\n```\n\n_(Optional flags: `--kubeconfig \u003Cpath>` or `--context \u003Cname>` can be passed to target specific environments)._\n\n### Step 2: Interpret Output & Exit Codes\n\n- **Exit Code `0` (`[UNUSED]`)**:\n\n  ```text\n  [UNUSED] Cluster is verified unused (no active compute, exposure, or persistent data).\n  It is safe to proceed with cluster deletion.\n  ```\n\n  _Action:_ Safe to proceed with cluster deletion.\n\n- **Exit Code `1` (`[ACTIVE]`)**:\n\n  ```text\n  [ACTIVE] Cluster is currently in use! Deletion blocked.\n  Active workloads\u002Fresources detected:\n    - External Exposure: Service prod\u002Ffrontend is of type LoadBalancer\n  ```\n\n  _Action:_ **DO NOT delete the cluster.** Stop immediately and present the detected active resources to the user.\n\n- **Exit Code `2` (`[FAIL-CLOSE]`)**:\n  ```text\n  [FAIL-CLOSE] Cluster safety check failed due to query error or timeout!\n  ```\n  _Action:_ **DO NOT delete the cluster.** Stop and report that verification failed close due to query error or API server timeout.\n",{"data":36,"body":37},{"name":5,"description":7},{"type":38,"children":39},"root",[40,47,86,93,160,166,171,178,242,248,284,290,372,378,383,459,465,471,484,545,569,575,713],{"type":41,"tag":42,"props":43,"children":44},"element","h1",{"id":5},[45],{"type":46,"value":5},"text",{"type":41,"tag":48,"props":49,"children":50},"p",{},[51,53,59,61,68,70,76,78,84],{"type":46,"value":52},"Use this skill to safety-check whether a GKE or Kubernetes cluster is active or unused ",{"type":41,"tag":54,"props":55,"children":56},"strong",{},[57],{"type":46,"value":58},"before",{"type":46,"value":60}," executing any cluster deletion commands (",{"type":41,"tag":62,"props":63,"children":65},"code",{"className":64},[],[66],{"type":46,"value":67},"DeleteCluster",{"type":46,"value":69},", ",{"type":41,"tag":62,"props":71,"children":73},{"className":72},[],[74],{"type":46,"value":75},"gcloud container clusters delete",{"type":46,"value":77},", or ",{"type":41,"tag":62,"props":79,"children":81},{"className":80},[],[82],{"type":46,"value":83},"kubectl delete",{"type":46,"value":85},"). This prevents accidental data loss, service interruption, and destruction of active environments.",{"type":41,"tag":87,"props":88,"children":90},"h2",{"id":89},"critical-rule",[91],{"type":46,"value":92},"Critical Rule",{"type":41,"tag":94,"props":95,"children":96},"blockquote",{},[97],{"type":41,"tag":48,"props":98,"children":99},{},[100,106,111,113,119,121,127,129,135,137,143,145,151,153,158],{"type":41,"tag":101,"props":102,"children":103},"span",{},[104],{"type":46,"value":105},"!IMPORTANT",{"type":41,"tag":54,"props":107,"children":108},{},[109],{"type":46,"value":110},"NEVER",{"type":46,"value":112}," delete a GKE or Kubernetes cluster without running this verification skill first or verifying that ",{"type":41,"tag":62,"props":114,"children":116},{"className":115},[],[117],{"type":46,"value":118},"deletion_policy: VERIFY_UNUSED",{"type":46,"value":120}," is enforced. If this check returns ",{"type":41,"tag":62,"props":122,"children":124},{"className":123},[],[125],{"type":46,"value":126},"[ACTIVE]",{"type":46,"value":128}," (exit code ",{"type":41,"tag":62,"props":130,"children":132},{"className":131},[],[133],{"type":46,"value":134},"1",{"type":46,"value":136},") or fails due to network\u002Fserver timeout (",{"type":41,"tag":62,"props":138,"children":140},{"className":139},[],[141],{"type":46,"value":142},"[FAIL-CLOSE]",{"type":46,"value":144},", exit code ",{"type":41,"tag":62,"props":146,"children":148},{"className":147},[],[149],{"type":46,"value":150},"2",{"type":46,"value":152},"), you must ",{"type":41,"tag":54,"props":154,"children":155},{},[156],{"type":46,"value":157},"block the deletion",{"type":46,"value":159}," and prompt the user for explicit confirmation or intervention.",{"type":41,"tag":87,"props":161,"children":163},{"id":162},"safety-criteria",[164],{"type":46,"value":165},"Safety Criteria",{"type":41,"tag":48,"props":167,"children":168},{},[169],{"type":46,"value":170},"The safety verification evaluates three core heuristics. If any condition is met, deletion is blocked:",{"type":41,"tag":172,"props":173,"children":175},"h3",{"id":174},"_1-external-exposure",[176],{"type":46,"value":177},"1. External Exposure",{"type":41,"tag":179,"props":180,"children":181},"ul",{},[182,232],{"type":41,"tag":183,"props":184,"children":185},"li",{},[186,191,193,199,201,207,209,215,216,222,224,230],{"type":41,"tag":54,"props":187,"children":188},{},[189],{"type":46,"value":190},"Failure Condition:",{"type":46,"value":192}," Presence of $\\ge 1$ ",{"type":41,"tag":62,"props":194,"children":196},{"className":195},[],[197],{"type":46,"value":198},"Service",{"type":46,"value":200}," of type ",{"type":41,"tag":62,"props":202,"children":204},{"className":203},[],[205],{"type":46,"value":206},"LoadBalancer",{"type":46,"value":208},", OR any ",{"type":41,"tag":62,"props":210,"children":212},{"className":211},[],[213],{"type":46,"value":214},"Ingress",{"type":46,"value":69},{"type":41,"tag":62,"props":217,"children":219},{"className":218},[],[220],{"type":46,"value":221},"Gateway",{"type":46,"value":223}," (Gateway API), or ",{"type":41,"tag":62,"props":225,"children":227},{"className":226},[],[228],{"type":46,"value":229},"MultiClusterIngress",{"type":46,"value":231}," resource in any namespace.",{"type":41,"tag":183,"props":233,"children":234},{},[235,240],{"type":41,"tag":54,"props":236,"children":237},{},[238],{"type":46,"value":239},"Rationale:",{"type":46,"value":241}," These resources indicate the cluster is actively serving (or configured to serve) ingress traffic. Deleting the cluster would cause an immediate service disruption for users or connected systems.",{"type":41,"tag":172,"props":243,"children":245},{"id":244},"_2-persistent-data",[246],{"type":46,"value":247},"2. Persistent Data",{"type":41,"tag":179,"props":249,"children":250},{},[251,275],{"type":41,"tag":183,"props":252,"children":253},{},[254,258,259,265,267,273],{"type":41,"tag":54,"props":255,"children":256},{},[257],{"type":46,"value":190},{"type":46,"value":192},{"type":41,"tag":62,"props":260,"children":262},{"className":261},[],[263],{"type":46,"value":264},"PersistentVolumeClaim",{"type":46,"value":266}," (PVC) in the ",{"type":41,"tag":62,"props":268,"children":270},{"className":269},[],[271],{"type":46,"value":272},"Bound",{"type":46,"value":274}," state in any namespace.",{"type":41,"tag":183,"props":276,"children":277},{},[278,282],{"type":41,"tag":54,"props":279,"children":280},{},[281],{"type":46,"value":239},{"type":46,"value":283}," A Bound PVC indicates a persistent disk attached containing application state. Deleting the cluster could result in permanent, unrecoverable data loss.",{"type":41,"tag":172,"props":285,"children":287},{"id":286},"_3-active-compute",[288],{"type":46,"value":289},"3. Active Compute",{"type":41,"tag":179,"props":291,"children":292},{},[293,349],{"type":41,"tag":183,"props":294,"children":295},{},[296,300,301,307,309,315,317,323,325,331,333,339,341,347],{"type":41,"tag":54,"props":297,"children":298},{},[299],{"type":46,"value":190},{"type":46,"value":192},{"type":41,"tag":62,"props":302,"children":304},{"className":303},[],[305],{"type":46,"value":306},"Pod",{"type":46,"value":308}," in ",{"type":41,"tag":62,"props":310,"children":312},{"className":311},[],[313],{"type":46,"value":314},"Running",{"type":46,"value":316}," or ",{"type":41,"tag":62,"props":318,"children":320},{"className":319},[],[321],{"type":46,"value":322},"Pending",{"type":46,"value":324}," state in any user namespace (includes ",{"type":41,"tag":62,"props":326,"children":328},{"className":327},[],[329],{"type":46,"value":330},"default",{"type":46,"value":332},", but excludes system namespaces like ",{"type":41,"tag":62,"props":334,"children":336},{"className":335},[],[337],{"type":46,"value":338},"kube-system",{"type":46,"value":340}," or those prefixed with ",{"type":41,"tag":62,"props":342,"children":344},{"className":343},[],[345],{"type":46,"value":346},"gke-",{"type":46,"value":348},").",{"type":41,"tag":183,"props":350,"children":351},{},[352,356,358,363,364,370],{"type":41,"tag":54,"props":353,"children":354},{},[355],{"type":46,"value":239},{"type":46,"value":357}," Running pods represent active compute, and Pending pods indicate a system attempting to schedule or scale work. System namespaces (",{"type":41,"tag":62,"props":359,"children":361},{"className":360},[],[362],{"type":46,"value":338},{"type":46,"value":69},{"type":41,"tag":62,"props":365,"children":367},{"className":366},[],[368],{"type":46,"value":369},"gke-*",{"type":46,"value":371},") are excluded to avoid blocking deletion on cluster control-plane and addon overhead.",{"type":41,"tag":87,"props":373,"children":375},{"id":374},"performance-overhead-reliability",[376],{"type":46,"value":377},"Performance Overhead & Reliability",{"type":41,"tag":48,"props":379,"children":380},{},[381],{"type":46,"value":382},"To ensure checks add minimal overhead and operate safely under adverse network conditions:",{"type":41,"tag":179,"props":384,"children":385},{},[386,428],{"type":41,"tag":183,"props":387,"children":388},{},[389,394,396,402,404,410,412,418,420,426],{"type":41,"tag":54,"props":390,"children":391},{},[392],{"type":46,"value":393},"Low-Overhead Queries (Early Return):",{"type":46,"value":395}," Because the policy only needs to confirm the existence of at least one active resource to block deletion, lists use standard chunk sizes (",{"type":41,"tag":62,"props":397,"children":399},{"className":398},[],[400],{"type":46,"value":401},"--chunk-size=500",{"type":46,"value":403},") and the Python script terminates immediately upon finding the first offending resource.\nNote that passing ",{"type":41,"tag":62,"props":405,"children":407},{"className":406},[],[408],{"type":46,"value":409},"--chunk-size=1",{"type":46,"value":411}," with ",{"type":41,"tag":62,"props":413,"children":415},{"className":414},[],[416],{"type":46,"value":417},"kubectl -o json",{"type":46,"value":419}," is avoided because ",{"type":41,"tag":62,"props":421,"children":423},{"className":422},[],[424],{"type":46,"value":425},"kubectl",{"type":46,"value":427}," sequentially loops through all pages before formatting output, which causes N sequential API requests.",{"type":41,"tag":183,"props":429,"children":430},{},[431,436,438,444,446,451,452,457],{"type":41,"tag":54,"props":432,"children":433},{},[434],{"type":46,"value":435},"Bounded Timeouts & Fail-Close Behavior:",{"type":46,"value":437}," Synchronous API queries enforce explicit timeouts (",{"type":41,"tag":62,"props":439,"children":441},{"className":440},[],[442],{"type":46,"value":443},"--request-timeout",{"type":46,"value":445},").\nIf the checks do not complete within the timeout window or encounter API errors, the operation ",{"type":41,"tag":54,"props":447,"children":448},{},[449],{"type":46,"value":450},"fails close",{"type":46,"value":128},{"type":41,"tag":62,"props":453,"children":455},{"className":454},[],[456],{"type":46,"value":150},{"type":46,"value":458},"), blocking cluster deletion rather than assuming safety during control-plane latency or outages.",{"type":41,"tag":87,"props":460,"children":462},{"id":461},"usage-instructions",[463],{"type":46,"value":464},"Usage Instructions",{"type":41,"tag":172,"props":466,"children":468},{"id":467},"step-1-execute-verification-script",[469],{"type":46,"value":470},"Step 1: Execute Verification Script",{"type":41,"tag":48,"props":472,"children":473},{},[474,476,482],{"type":46,"value":475},"Execute the bundled safety verification script (",{"type":41,"tag":62,"props":477,"children":479},{"className":478},[],[480],{"type":46,"value":481},"scripts\u002Fverify_unused.py",{"type":46,"value":483}," located inside this skill folder) against the target cluster:",{"type":41,"tag":485,"props":486,"children":491},"pre",{"className":487,"code":488,"language":489,"meta":490,"style":490},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","python3 \u003Cskill_directory>\u002Fscripts\u002Fverify_unused.py --timeout 5.0\n","bash","",[492],{"type":41,"tag":62,"props":493,"children":494},{"__ignoreMap":490},[495],{"type":41,"tag":101,"props":496,"children":499},{"class":497,"line":498},"line",1,[500,506,512,518,524,529,534,539],{"type":41,"tag":101,"props":501,"children":503},{"style":502},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[504],{"type":46,"value":505},"python3",{"type":41,"tag":101,"props":507,"children":509},{"style":508},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[510],{"type":46,"value":511}," \u003C",{"type":41,"tag":101,"props":513,"children":515},{"style":514},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[516],{"type":46,"value":517},"skill_director",{"type":41,"tag":101,"props":519,"children":521},{"style":520},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[522],{"type":46,"value":523},"y",{"type":41,"tag":101,"props":525,"children":526},{"style":508},[527],{"type":46,"value":528},">",{"type":41,"tag":101,"props":530,"children":531},{"style":514},[532],{"type":46,"value":533},"\u002Fscripts\u002Fverify_unused.py",{"type":41,"tag":101,"props":535,"children":536},{"style":514},[537],{"type":46,"value":538}," --timeout",{"type":41,"tag":101,"props":540,"children":542},{"style":541},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[543],{"type":46,"value":544}," 5.0\n",{"type":41,"tag":48,"props":546,"children":547},{},[548],{"type":41,"tag":549,"props":550,"children":551},"em",{},[552,554,560,561,567],{"type":46,"value":553},"(Optional flags: ",{"type":41,"tag":62,"props":555,"children":557},{"className":556},[],[558],{"type":46,"value":559},"--kubeconfig \u003Cpath>",{"type":46,"value":316},{"type":41,"tag":62,"props":562,"children":564},{"className":563},[],[565],{"type":46,"value":566},"--context \u003Cname>",{"type":46,"value":568}," can be passed to target specific environments).",{"type":41,"tag":172,"props":570,"children":572},{"id":571},"step-2-interpret-output-exit-codes",[573],{"type":46,"value":574},"Step 2: Interpret Output & Exit Codes",{"type":41,"tag":179,"props":576,"children":577},{},[578,625,670],{"type":41,"tag":183,"props":579,"children":580},{},[581,602,604,614,618,623],{"type":41,"tag":54,"props":582,"children":583},{},[584,586,592,594,600],{"type":46,"value":585},"Exit Code ",{"type":41,"tag":62,"props":587,"children":589},{"className":588},[],[590],{"type":46,"value":591},"0",{"type":46,"value":593}," (",{"type":41,"tag":62,"props":595,"children":597},{"className":596},[],[598],{"type":46,"value":599},"[UNUSED]",{"type":46,"value":601},")",{"type":46,"value":603},":",{"type":41,"tag":485,"props":605,"children":609},{"className":606,"code":608,"language":46,"meta":490},[607],"language-text","[UNUSED] Cluster is verified unused (no active compute, exposure, or persistent data).\nIt is safe to proceed with cluster deletion.\n",[610],{"type":41,"tag":62,"props":611,"children":612},{"__ignoreMap":490},[613],{"type":46,"value":608},{"type":41,"tag":615,"props":616,"children":617},"br",{},[],{"type":41,"tag":549,"props":619,"children":620},{},[621],{"type":46,"value":622},"Action:",{"type":46,"value":624}," Safe to proceed with cluster deletion.",{"type":41,"tag":183,"props":626,"children":627},{},[628,644,645,654,657,661,663,668],{"type":41,"tag":54,"props":629,"children":630},{},[631,632,637,638,643],{"type":46,"value":585},{"type":41,"tag":62,"props":633,"children":635},{"className":634},[],[636],{"type":46,"value":134},{"type":46,"value":593},{"type":41,"tag":62,"props":639,"children":641},{"className":640},[],[642],{"type":46,"value":126},{"type":46,"value":601},{"type":46,"value":603},{"type":41,"tag":485,"props":646,"children":649},{"className":647,"code":648,"language":46,"meta":490},[607],"[ACTIVE] Cluster is currently in use! Deletion blocked.\nActive workloads\u002Fresources detected:\n  - External Exposure: Service prod\u002Ffrontend is of type LoadBalancer\n",[650],{"type":41,"tag":62,"props":651,"children":652},{"__ignoreMap":490},[653],{"type":46,"value":648},{"type":41,"tag":615,"props":655,"children":656},{},[],{"type":41,"tag":549,"props":658,"children":659},{},[660],{"type":46,"value":622},{"type":46,"value":662}," ",{"type":41,"tag":54,"props":664,"children":665},{},[666],{"type":46,"value":667},"DO NOT delete the cluster.",{"type":46,"value":669}," Stop immediately and present the detected active resources to the user.",{"type":41,"tag":183,"props":671,"children":672},{},[673,689,690,699,702,706,707,711],{"type":41,"tag":54,"props":674,"children":675},{},[676,677,682,683,688],{"type":46,"value":585},{"type":41,"tag":62,"props":678,"children":680},{"className":679},[],[681],{"type":46,"value":150},{"type":46,"value":593},{"type":41,"tag":62,"props":684,"children":686},{"className":685},[],[687],{"type":46,"value":142},{"type":46,"value":601},{"type":46,"value":603},{"type":41,"tag":485,"props":691,"children":694},{"className":692,"code":693,"language":46,"meta":490},[607],"[FAIL-CLOSE] Cluster safety check failed due to query error or timeout!\n",[695],{"type":41,"tag":62,"props":696,"children":697},{"__ignoreMap":490},[698],{"type":46,"value":693},{"type":41,"tag":615,"props":700,"children":701},{},[],{"type":41,"tag":549,"props":703,"children":704},{},[705],{"type":46,"value":622},{"type":46,"value":662},{"type":41,"tag":54,"props":708,"children":709},{},[710],{"type":46,"value":667},{"type":46,"value":712}," Stop and report that verification failed close due to query error or API server timeout.",{"type":41,"tag":714,"props":715,"children":716},"style",{},[717],{"type":46,"value":718},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":720,"total":905},[721,739,755,777,791,800,814,831,848,861,877,887],{"slug":722,"name":722,"fn":723,"description":724,"org":725,"tags":726,"stars":736,"repoUrl":737,"updatedAt":738},"kb-search","search and extract local knowledge base documents","Allows listing, searching and extracting information from local knowledge base documents for information about tables\n",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[727,730,733],{"name":728,"slug":729,"type":17},"Documentation","documentation",{"name":731,"slug":732,"type":17},"Knowledge Base","knowledge-base",{"name":734,"slug":735,"type":17},"Search","search",6749,"https:\u002F\u002Fgithub.com\u002FGoogleCloudPlatform\u002Fknowledge-catalog","2026-07-12T07:38:52.157375",{"slug":740,"name":741,"fn":742,"description":743,"org":744,"tags":745,"stars":736,"repoUrl":737,"updatedAt":754},"knowledgecatalogdiscoveryagent","knowledge_catalog_discovery_agent","search and rank Knowledge Catalog data entries","Analyzes user queries, extracts relevant predicates, and utilizes Knowledge Catalog Search to find and rank the most relevant data entries. Engages with the user throughout the process.\n",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[746,749,750,753],{"name":747,"slug":748,"type":17},"Data Analysis","data-analysis",{"name":10,"slug":9,"type":17},{"name":751,"slug":752,"type":17},"Knowledge Management","knowledge-management",{"name":734,"slug":735,"type":17},"2026-07-12T07:38:22.196851",{"slug":756,"name":756,"fn":757,"description":758,"org":759,"tags":760,"stars":774,"repoUrl":775,"updatedAt":776},"contributing","contribute to Cloud Foundation Fabric","End-to-end workflow for contributing to Cloud Foundation Fabric: triaging GitHub issues, proactive feature development, validating with tests and Policy Troubleshooter, and submitting sanitized Pull Requests. Use when addressing a Fabric GitHub issue, developing a module or FAST stage change, or preparing a branch for a pull request.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[761,764,767,770,771],{"name":762,"slug":763,"type":17},"Automation","automation",{"name":765,"slug":766,"type":17},"Engineering","engineering",{"name":768,"slug":769,"type":17},"GitHub","github",{"name":10,"slug":9,"type":17},{"name":772,"slug":773,"type":17},"Pull Requests","pull-requests",2062,"https:\u002F\u002Fgithub.com\u002FGoogleCloudPlatform\u002Fcloud-foundation-fabric","2026-07-31T06:23:36.935005",{"slug":778,"name":778,"fn":779,"description":780,"org":781,"tags":782,"stars":774,"repoUrl":775,"updatedAt":790},"fabric-builder","generate Terraform code for Google Cloud","Generates idiomatic Cloud Foundation Fabric (CFF) Terraform code using CFF modules. Use when users ask to create GCP resources, use Fabric modules, or generate Terraform code for Google Cloud.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[783,784,787],{"name":10,"slug":9,"type":17},{"name":785,"slug":786,"type":17},"Infrastructure as Code","infrastructure-as-code",{"name":788,"slug":789,"type":17},"Terraform","terraform","2026-07-12T07:38:23.514555",{"slug":792,"name":792,"fn":793,"description":794,"org":795,"tags":796,"stars":774,"repoUrl":775,"updatedAt":799},"fast-0-org-setup-prereqs","prepare prerequisites for FAST 0-org-setup","Guides the user step-by-step through the prerequisites for the FAST 0-org-setup stage, supporting both Standard GCP and Google Cloud Dedicated (GCD) environments. Use when a user asks to prepare or run prerequisites for 0-org-setup or bootstrap the FAST landing zone.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[797,798],{"name":10,"slug":9,"type":17},{"name":19,"slug":20,"type":17},"2026-07-12T07:38:28.127148",{"slug":801,"name":801,"fn":802,"description":803,"org":804,"tags":805,"stars":811,"repoUrl":812,"updatedAt":813},"agent-aware-cli","design agent-aware command-line interfaces","Guide for designing and implementing command-line interfaces (CLIs) that are equally usable by human developers and automated coding agents. Use when the user wants to build a CLI, apply CLI best practices, or use Go with Cobra and Viper.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[806,809,810],{"name":807,"slug":808,"type":17},"CLI","cli",{"name":765,"slug":766,"type":17},{"name":10,"slug":9,"type":17},1150,"https:\u002F\u002Fgithub.com\u002FGoogleCloudPlatform\u002Fvertex-ai-creative-studio","2026-07-12T07:39:08.41406",{"slug":815,"name":815,"fn":816,"description":817,"org":818,"tags":819,"stars":811,"repoUrl":812,"updatedAt":830},"build-mcp-genmedia","build and configure GenAI MCP servers","Builds the mcp-genmedia Go MCP servers (nanobanana, veo, lyria, gemini-multimodal, chirp3-hd, avtool) from source and wires them into settings.json. Use this skill whenever the MCP tools are missing or broken — typically at the start of a new session, after a container restart, or when \u002Ftmp has been wiped. The prebuilt binaries in \u002Fworkspace\u002F.local\u002Fbin\u002F have no exec bit and live on a noexec mount; this skill compiles fresh executables into \u002Ftmp\u002Fbin\u002F where execution is allowed.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[820,823,824,827],{"name":821,"slug":822,"type":17},"API Development","api-development",{"name":10,"slug":9,"type":17},{"name":825,"slug":826,"type":17},"LLM","llm",{"name":828,"slug":829,"type":17},"MCP","mcp","2026-07-12T07:39:10.911302",{"slug":832,"name":832,"fn":833,"description":834,"org":835,"tags":836,"stars":811,"repoUrl":812,"updatedAt":847},"genmedia-audio-engineer","synthesize and mix audio content","Expert in audio synthesis, music generation, and mixing. Use when creating podcasts, background scores, or multi-track audio layering using mcp-chirp3-go, mcp-lyria-go, mcp-gemini-go, mcp-nanobanana-go, and mcp-avtool-go.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[837,840,843,844],{"name":838,"slug":839,"type":17},"Audio","audio",{"name":841,"slug":842,"type":17},"Creative","creative",{"name":10,"slug":9,"type":17},{"name":845,"slug":846,"type":17},"Vertex AI","vertex-ai","2026-07-12T07:39:16.623879",{"slug":849,"name":849,"fn":850,"description":851,"org":852,"tags":853,"stars":811,"repoUrl":812,"updatedAt":860},"genmedia-image-artist","generate and edit AI images","Expert in AI image generation and editing. Use when the user needs high-quality textures, character-consistent visuals, or image-to-image editing using mcp-nanobanana-go.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[854,855,856,859],{"name":841,"slug":842,"type":17},{"name":10,"slug":9,"type":17},{"name":857,"slug":858,"type":17},"Image Generation","image-generation",{"name":845,"slug":846,"type":17},"2026-07-12T07:39:15.372822",{"slug":862,"name":862,"fn":863,"description":864,"org":865,"tags":866,"stars":811,"repoUrl":812,"updatedAt":876},"genmedia-producer","produce multi-step media content","Expert media production assistant. Use when requested to help with storyboarding, podcast creation, audio assembly, or complex multi-step media workflows using the GenMedia MCP servers (Veo, Lyria, Gemini TTS, NanoBanana).",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[867,868,869,870,873],{"name":838,"slug":839,"type":17},{"name":841,"slug":842,"type":17},{"name":10,"slug":9,"type":17},{"name":871,"slug":872,"type":17},"Media","media",{"name":874,"slug":875,"type":17},"Video","video","2026-07-12T07:39:09.672849",{"slug":878,"name":878,"fn":879,"description":880,"org":881,"tags":882,"stars":811,"repoUrl":812,"updatedAt":886},"genmedia-video-editor","edit and compose video content","Expert in video composition, editing, and format conversion. Use when the user wants to generate high-quality video, overlay images on video, concatenate clips, create GIFs, or sync audio to video using mcp-avtool-go and mcp-veo-go.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[883,884,885],{"name":841,"slug":842,"type":17},{"name":10,"slug":9,"type":17},{"name":874,"slug":875,"type":17},"2026-07-12T07:39:13.749081",{"slug":888,"name":888,"fn":889,"description":890,"org":891,"tags":892,"stars":811,"repoUrl":812,"updatedAt":904},"genmedia-voice-director","generate expressive text-to-speech with Gemini","Expert in casting, directing, and generating expressive text-to-speech using Gemini TTS. Use this when the user needs virtual voice actor personas, expressive speech generation, or multiple variations of a voiceover (like \"take 3 on the bounce\").",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[893,894,895,898,901],{"name":838,"slug":839,"type":17},{"name":841,"slug":842,"type":17},{"name":896,"slug":897,"type":17},"Gemini","gemini",{"name":899,"slug":900,"type":17},"Speech","speech",{"name":902,"slug":903,"type":17},"Text-to-Speech","text-to-speech","2026-07-12T07:39:17.86673",80,{"items":907,"total":999},[908,920,935,948,961,972,988],{"slug":909,"name":909,"fn":910,"description":911,"org":912,"tags":913,"stars":25,"repoUrl":26,"updatedAt":919},"custom-golden-image-discovery","discover golden base images for GKE nodes","Expert at discovering golden base images for GKE custom nodes using technical specs or context clues.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[914,917,918],{"name":915,"slug":916,"type":17},"Deployment","deployment",{"name":10,"slug":9,"type":17},{"name":22,"slug":23,"type":17},"2026-07-12T07:39:30.888879",{"slug":921,"name":921,"fn":922,"description":923,"org":924,"tags":925,"stars":25,"repoUrl":26,"updatedAt":934},"gke-ai-troubleshooting-handle-disruption-gpu-tpu","diagnose GPU and TPU workload disruptions","Diagnose and predict node disruption during Compute Engine host maintenance for GPU and TPU workloads.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[926,929,930,931],{"name":927,"slug":928,"type":17},"Debugging","debugging",{"name":10,"slug":9,"type":17},{"name":22,"slug":23,"type":17},{"name":932,"slug":933,"type":17},"Performance","performance","2026-07-28T05:34:18.149515",{"slug":936,"name":936,"fn":937,"description":938,"org":939,"tags":940,"stars":25,"repoUrl":26,"updatedAt":947},"gke-ai-troubleshooting-jobset-interruption","diagnose GKE JobSet interruptions","Systematically diagnose GKE JobSet interruptions, restarts, and preemptions for AI\u002FML training workloads. Identifies preemption events, maintenance interruptions, bad host VMs, unhealthy pods, and coordinator worker failures.\n",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[941,942,943,944],{"name":927,"slug":928,"type":17},{"name":10,"slug":9,"type":17},{"name":22,"slug":23,"type":17},{"name":945,"slug":946,"type":17},"Observability","observability","2026-07-12T07:40:04.511878",{"slug":949,"name":949,"fn":950,"description":951,"org":952,"tags":953,"stars":25,"repoUrl":26,"updatedAt":960},"gke-ai-troubleshooting-skill-creation-guide","create GKE troubleshooting skill bundles","Expert instructions for building high-quality GKE troubleshooting skills. Codifies Step 0 context rules, zero-hallucination signatures, and explicit LQL\u002FPromQL query requirements.\n",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[954,955,956,957],{"name":728,"slug":729,"type":17},{"name":765,"slug":766,"type":17},{"name":10,"slug":9,"type":17},{"name":958,"slug":959,"type":17},"Technical Writing","technical-writing","2026-07-12T07:39:50.73484",{"slug":962,"name":962,"fn":963,"description":964,"org":965,"tags":966,"stars":25,"repoUrl":26,"updatedAt":971},"gke-ai-troubleshooting-tpu-connection-failure-vbar-oom","diagnose GKE TPU connection failures","Diagnose and prevent `vbar_control_agent` segfaults and OOMs caused by race conditions during TPU device resets and frequent metrics collection (e.g. every 3s). Use when TPU slice initialization fails or `vbar_control_agent` crashes on TPU v6e nodes.\n",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[967,968,969,970],{"name":927,"slug":928,"type":17},{"name":10,"slug":9,"type":17},{"name":22,"slug":23,"type":17},{"name":932,"slug":933,"type":17},"2026-07-12T07:39:49.482979",{"slug":973,"name":973,"fn":974,"description":975,"org":976,"tags":977,"stars":25,"repoUrl":26,"updatedAt":987},"gke-app-onboarding","containerize and deploy apps to GKE","Workflows for containerizing and deploying applications to GKE for the first time.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[978,981,982,983,984],{"name":979,"slug":980,"type":17},"Containers","containers",{"name":915,"slug":916,"type":17},{"name":10,"slug":9,"type":17},{"name":22,"slug":23,"type":17},{"name":985,"slug":986,"type":17},"Onboarding","onboarding","2026-07-12T07:39:41.935837",{"slug":989,"name":989,"fn":990,"description":991,"org":992,"tags":993,"stars":25,"repoUrl":26,"updatedAt":998},"gke-backup-dr","configure GKE backup and disaster recovery","Workflows for configuring Backup for GKE and disaster recovery.",{"slug":9,"name":10,"logoUrl":11,"githubOrg":12},[994,995,996,997],{"name":915,"slug":916,"type":17},{"name":10,"slug":9,"type":17},{"name":22,"slug":23,"type":17},{"name":19,"slug":20,"type":17},"2026-07-12T07:39:34.806995",25]