[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M72127MJP46SAFJP07BY692E":3,"skill-same:01M72127MJP46SAFJP07BY692E":45},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":30,"install":31,"resources":44},"01M72127MJP46SAFJP07BY692E","workload-rebalancing",null,"Orchestrate cross-cluster workload rebalancing using the kanban board with the validation-then-declare pattern. Use when fleet utilization shows one cluster overutilized and another with headroom and a workload should move.","gke-labs\u002Fkube-agents","gke-labs","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F197140281?v=4","01M720MEZR8K6WD2WTHNQE346Q","01M720MF0BRA9RGH1QVT4J0M0E",126,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fworkload-rebalancing\u002FSKILL.md",[],[],"2026-11-10 18:39:20",false,"---\nname: workload-rebalancing\ndescription: Orchestrate cross-cluster workload rebalancing using the kanban board with the validation-then-declare pattern. Use when fleet utilization shows one cluster overutilized and another with headroom and a workload should move.\n---\n\n# Workload Rebalancing Skill (validation-then-declare)\n\nWhen live cluster utilization — checked via the read-only `gke` MCP \u002F `kubectl top` on each cluster — shows a cluster **overutilized \u002F under pressure** and another with **headroom**, you may relocate a workload. You act as an **orchestrator**: cluster agents _validate_ feasibility (read-only); **you** _declare_ the change as a single GitOps PR; **KCC** reconciles the actual move. Never issue imperative start\u002Fstop.\n\n## When to use vs. do-it-yourself\n\nDelegating is optional. Use this fan-out when you want per-cluster local validation and a single aggregated decision. For a trivial single-cluster change, act directly.\n\n## The card graph (fan-out validation → decide on your own card)\n\nResolve each cluster's profile name first with the `get_cluster_profile_name(project, cluster, location)` tool, and assign a card only to a profile it reports as existing (for a cluster with none, validate it yourself — `SOUL.md` §6 step 1), then:\n\n1. **Card A — can clusterA host it?** `kanban_create(assignee=\"\u003CclusterA-profile>\", title=\"Validate can-host \u003Cworkload>\", body=\"Can you host \u003Cns\u002Fworkload> (needs ~\u003Ccpu>\u002F\u003Cmem>)? Check capacity, affinity\u002Ftaints, quotas. Do NOT mutate.\")`\n2. **Card B — is clusterB safe to evacuate?** `kanban_create(assignee=\"\u003CclusterB-profile>\", title=\"Validate safe-to-evacuate \u003Cworkload>\", body=\"Is it safe to evacuate \u003Cns\u002Fworkload>? Check PDBs, statefulness\u002Flocal PVs, in-flight work. Do NOT mutate.\")`\n3. **Wait on your own card:** poll A and B with `kanban_show(\u003Cid>)` (`terminal(command=\"sleep 60\", timeout=90)` between rounds) until both are settled, then read their `metadata`.\n\nCards A and B are created with **no `parents`** so they run in **parallel** immediately (independent read-only checks) while you wait. Do not add your own currently-running card to A or B's `parents` — `parents` means \"runs after\", and that would stop them being claimed at all (`SOUL.md` §0). Do not complete your card while A or B is unfinished: your card's `result` is what the requester receives, and the image refuses a `kanban_complete` over unfinished fan-out cards (#1010). (The actual make-before-break ordering of the move is handled by KCC when it reconciles the PR, not by the agents.)\n\n## Expected validation `metadata`\n\nCard A (clusterA):\n\n```json\n{\n  \"can_host\": true,\n  \"workload\": { \"namespace\": \"...\", \"name\": \"...\" },\n  \"headroom_after\": { \"cpu_vcpu\": 54, \"memory_gib\": 194 },\n  \"constraints\": [],\n  \"confidence\": \"high\"\n}\n```\n\nCard B (clusterB):\n\n```json\n{\n  \"safe_to_evacuate\": true,\n  \"workload\": { \"namespace\": \"...\", \"name\": \"...\" },\n  \"blockers\": [],\n  \"pdb_ok\": true,\n  \"stateful\": false,\n  \"in_flight_work\": false,\n  \"notes\": \"...\"\n}\n```\n\n## Decide & declare (your card, once A and B settle)\n\n- **Both green →** generate the relocation change (move the workload's manifest from clusterB's overlay to clusterA's, or flip its target-cluster field) and open **one** PR via `submit-suggestion`. KCC\u002FConfig Sync performs the move. Report the decision and the PR URL in `kanban_complete(result=...)`, and record the machine-readable form alongside it: `metadata={\"decision\":\"proceed\",\"from\":\"clusterB\",\"to\":\"clusterA\",\"pr_url\":\"...\",\"rationale\":\"...\"}`.\n- **Either red →** do not declare. Report blockers to the user, or `kanban_block(kind=\"needs_input\")` if a human must decide.\n\n## Safety\n\nThe change is a PR, so rollback is a revert. A failed validation aborts the declaration (no partial move). Escalate ambiguity via `needs_input`. You never mutate clusters directly — cluster agents are read-only and you emit declarative artifacts only.\n","# Workload Rebalancing Skill (validation-then-declare)\n\nWhen live cluster utilization — checked via the read-only `gke` MCP \u002F `kubectl top` on each cluster — shows a cluster **overutilized \u002F under pressure** and another with **headroom**, you may relocate a workload. You act as an **orchestrator**: cluster agents _validate_ feasibility (read-only); **you** _declare_ the change as a single GitOps PR; **KCC** reconciles the actual move. Never issue imperative start\u002Fstop.\n\n## When to use vs. do-it-yourself\n\nDelegating is optional. Use this fan-out when you want per-cluster local validation and a single aggregated decision. For a trivial single-cluster change, act directly.\n\n## The card graph (fan-out validation → decide on your own card)\n\nResolve each cluster's profile name first with the `get_cluster_profile_name(project, cluster, location)` tool, and assign a card only to a profile it reports as existing (for a cluster with none, validate it yourself — `SOUL.md` §6 step 1), then:\n\n1. **Card A — can clusterA host it?** `kanban_create(assignee=\"\u003CclusterA-profile>\", title=\"Validate can-host \u003Cworkload>\", body=\"Can you host \u003Cns\u002Fworkload> (needs ~\u003Ccpu>\u002F\u003Cmem>)? Check capacity, affinity\u002Ftaints, quotas. Do NOT mutate.\")`\n2. **Card B — is clusterB safe to evacuate?** `kanban_create(assignee=\"\u003CclusterB-profile>\", title=\"Validate safe-to-evacuate \u003Cworkload>\", body=\"Is it safe to evacuate \u003Cns\u002Fworkload>? Check PDBs, statefulness\u002Flocal PVs, in-flight work. Do NOT mutate.\")`\n3. **Wait on your own card:** poll A and B with `kanban_show(\u003Cid>)` (`terminal(command=\"sleep 60\", timeout=90)` between rounds) until both are settled, then read their `metadata`.\n\nCards A and B are created with **no `parents`** so they run in **parallel** immediately (independent read-only checks) while you wait. Do not add your own currently-running card to A or B's `parents` — `parents` means \"runs after\", and that would stop them being claimed at all (`SOUL.md` §0). Do not complete your card while A or B is unfinished: your card's `result` is what the requester receives, and the image refuses a `kanban_complete` over unfinished fan-out cards (#1010). (The actual make-before-break ordering of the move is handled by KCC when it reconciles the PR, not by the agents.)\n\n## Expected validation `metadata`\n\nCard A (clusterA):\n\n```json\n{\n  \"can_host\": true,\n  \"workload\": { \"namespace\": \"...\", \"name\": \"...\" },\n  \"headroom_after\": { \"cpu_vcpu\": 54, \"memory_gib\": 194 },\n  \"constraints\": [],\n  \"confidence\": \"high\"\n}\n```\n\nCard B (clusterB):\n\n```json\n{\n  \"safe_to_evacuate\": true,\n  \"workload\": { \"namespace\": \"...\", \"name\": \"...\" },\n  \"blockers\": [],\n  \"pdb_ok\": true,\n  \"stateful\": false,\n  \"in_flight_work\": false,\n  \"notes\": \"...\"\n}\n```\n\n## Decide & declare (your card, once A and B settle)\n\n- **Both green →** generate the relocation change (move the workload's manifest from clusterB's overlay to clusterA's, or flip its target-cluster field) and open **one** PR via `submit-suggestion`. KCC\u002FConfig Sync performs the move. Report the decision and the PR URL in `kanban_complete(result=...)`, and record the machine-readable form alongside it: `metadata={\"decision\":\"proceed\",\"from\":\"clusterB\",\"to\":\"clusterA\",\"pr_url\":\"...\",\"rationale\":\"...\"}`.\n- **Either red →** do not declare. Report blockers to the user, or `kanban_block(kind=\"needs_input\")` if a human must decide.\n\n## Safety\n\nThe change is a PR, so rollback is a revert. A failed validation aborts the declaration (no partial move). Escalate ambiguity via `needs_input`. You never mutate clusters directly — cluster agents are read-only and you emit declarative artifacts only.\n",{"name":5,"description":7},"main","3c8aa35c15aca68529abe86e9996103cb72e4bdc","agents\u002Fplatform\u002Fskills\u002Fworkload-rebalancing",44,"https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents","https:\u002F\u002Fgke-labs.github.io\u002Fkube-agents\u002F","https:\u002F\u002Fgithub.com\u002Fgke-labs","2026-11-13 04:37:57",{"source":8,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add gke-labs\u002Fkube-agents --skill workload-rebalancing",{"tool":37,"command":38},"bunx","bunx skills add gke-labs\u002Fkube-agents --skill workload-rebalancing",{"tool":40,"command":41},"pnpm","pnpm dlx skills add gke-labs\u002Fkube-agents --skill workload-rebalancing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fworkload-rebalancing\u002FSKILL.md",true,[],[46,53,59,66,73,80],{"skillNo":47,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":18},"01M72119CQFA9TC5TH6TKAFSFP","kube-agents-feedback","File a bug report, feature request, or question about kube-agents itself on the user's behalf, through the project's public feedback form, exactly once, after the user has confirmed the exact text in chat, and render the install's audited usage summary for a card that asks only for that, filing nothing. A submission becomes a public GitHub issue on gke-labs\u002Fkube-agents. Not for telling a user where to report — the persona bullet owns that answer without a skill.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fkube-agents-feedback\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":18},"01M720VF2R142ZCD6QCKYNXAS9","cluster-agent-lifecycle","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fcluster-agent-lifecycle\u002FSKILL.md",[],[],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":18},"01M720PHKEH8JCRZ6QR7AXEWSS","review-preflight","Runs the pre-PR review passes — adversarial and docs-drift on every change, plus chat UX whenever chat output changes — each in a context that did not write the change, and merges what they return into one disposition list.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview-preflight\u002FSKILL.md",[],[],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":18},"01M720VZZQNT2JQVK1JJCXX977","gce-compute-fleet-audit","Audits standalone GCE virtual machines, Managed Instance Groups (MIGs), serial console boot failures, sole-tenant node group headroom, and orphaned disk snapshots.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fgce-compute-fleet-audit\u002FSKILL.md",[],[],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":18},"01M720VKEW26G8QGT9NY4XQDR5","fleet-audit","Publish the findings of an autonomous fleet audit as one continuously-rewritten issue per audit stream per install on the GitOps repository's forge, and propose fixes as narrow remediation pull requests (merge requests on GitLab).","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Ffleet-audit\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":18},"01M720SYHF3JZYBM8CW52MCXS8","gke-rightsizing-checks","Five required checks, and the arithmetic, before any proposal to lower a workload's CPU or memory requests or limits, or to change a node pool's machine type or size, and before any claim of capacity freed. Read-only. For \"lower the requests of X\", \"right-size this deployment\", \"can this pool use a smaller machine type\", and any answer that claims nodes, CPU, memory or a percentage freed.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fcluster\u002Fskills\u002Fgke-rightsizing-checks\u002FSKILL.md",[],[]]