[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M72119CQFA9TC5TH6TKAFSFP":3,"skill-same:01M72119CQFA9TC5TH6TKAFSFP":55},{"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},"01M72119CQFA9TC5TH6TKAFSFP","kube-agents-feedback",null,"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.","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\u002Fkube-agents-feedback\u002FSKILL.md",[],[],"2026-11-10 18:39:20",false,"---\nname: kube-agents-feedback\ndescription:\n  File a bug report, feature request, or question about kube-agents itself on\n  the user's behalf, through the project's public feedback form, exactly once,\n  after the user has confirmed the exact text in chat, and render the install's\n  audited usage summary for a card that asks only for that, filing nothing. A\n  submission becomes a public GitHub issue on gke-labs\u002Fkube-agents. Not for\n  telling a user where to report — the persona bullet owns that answer without\n  a skill.\n---\n\n# Skill: kube-agents-feedback\n\n## When this skill applies\n\n- A kanban card asks you to **file** a kube-agents report for the user — not to\n  explain where reports go. For \"how do I report a bug in kube-agents?\", answer\n  from the persona bullet and do not touch this skill.\n- A kanban card asks only for the install's **usage summary**, because the\n  person said `add the usage summary` to a draft the front door showed them.\n  That card renders the block and files nothing (\"The usage summary\", below).\n- The submission target is the public feedback form behind\n  \u003Chttps:\u002F\u002Fgke-labs.github.io\u002Fkube-agents\u002Ffeedback>. It needs no GitHub or\n  Google credential, so this path works even when the install's GitHub\n  credential path is degraded.\n\n## The confirmation gate\n\n- File **only** what the user has seen and approved. The card must carry the\n  exact submission text and the line `user-confirmed: yes` — the front door's\n  assertion that it showed the user this text and got a yes.\n- No `user-confirmed: yes`, or a card that asks you to compose or improve the\n  text yourself: do not file. Complete the card saying the front door must show\n  the user the exact text and dispatch again with the confirmation line.\n- Never edit the confirmed text — no trimming, no added environment detail, no\n  rewording. If it looks wrong, that is a reason to send the card back, not to\n  fix it yourself.\n\n## Redaction\n\n- The broker refuses secret-shaped content (keys, tokens) outright. Cluster\n  names, project ids, and log excerpts are your judgment: a submission is a\n  public issue, so if the text carries identifiers the user did not visibly\n  type themselves, stop and complete the card saying what would be exposed.\n\n## The usage summary\n\n- A summary card carries no text to file and needs no confirmation line. Run\n  the helper's second subcommand, which reads the `PlatformAgent` resource\n  through the sandbox's `kubectl` and nothing in a pod:\n\n  ```bash\n  python3 \"$HERMES_HOME\"\u002Fskills\u002Fkube-agents-feedback\u002Fscripts\u002Ffile_feedback.py summary\n  ```\n\n- Exit 0 prints one fenced block: versions, mode, readiness, the usage counters,\n  and `unavailable` for the token, spend, latency and task lines the sandbox\n  cannot read. Complete the card with that block as the `result`, **verbatim**,\n  fences included: the front door shows it inside the re-shown draft, and the\n  person's yes is to those exact lines. Do not trim, reorder or annotate it.\n- Exit 1 prints a `BLOCKED` line: the resource could not be read, or the block\n  named an identifier read from it and the `reason` says how many, never\n  which. Complete the card with the `reason` and nothing else; the front door\n  offers the draft without the block. Never retry with a different namespace\n  or name, never assemble a block by hand, and never run `kubectl` yourself to\n  fill in what the helper refused.\n\n## Filing\n\n- A filing card whose body carries a usage summary block under its environment\n  carries it because the person saw that block in the draft and said yes. It\n  goes into `environment` exactly as the card has it, fences included; a card\n  with no block files with whatever environment the person typed, or none.\n- Write the confirmed text, verbatim, as JSON in the card workspace:\n\n  ```json\n  {\n    \"title\": \"\u003Cone-line summary, at most 120 characters>\",\n    \"kind\": \"Bug | Feature request | Question | Other\",\n    \"happened\": \"\u003Cwhat happened>\",\n    \"expected\": \"\u003Coptional>\",\n    \"environment\": \"\u003Coptional>\",\n    \"user_confirmed\": true\n  }\n  ```\n\n- Run the helper **once**, from the card workspace so a rerun finds its own\n  earlier attempt:\n\n  ```bash\n  python3 \"$HERMES_HOME\"\u002Fskills\u002Fkube-agents-feedback\u002Fscripts\u002Ffile_feedback.py \\\n      submit --payload-file payload.json --state-dir .\n  ```\n\n- The script asks the credential broker, which is the sandbox's only way out,\n  and the broker owns the whole wire path: it resolves the current form from\n  the short link, maps fields by question label, POSTs once, and looks the\n  resulting issue up on the tracker. **Never fetch the form or the tracker\n  yourself, never construct a Google Forms URL, and never open the issue\n  directly** — the one live test of a hand-rolled submission filed the same\n  report twice (gke-labs\u002Fkube-agents#1345 and #1346).\n\n## Reporting back\n\n- `SUBMITTED` — put the full `issue_url` in the card `result`, plus the note\n  that the issue is public and was opened by the form's bot account. Say what\n  was filed; do not claim it matches what the person approved, which only the\n  front door that showed it can know. A\n  `SUBMITTED` whose `issue_url` is `null` means the form accepted the report\n  and the tracker has not shown the issue yet (its `detail` says so): rerun the\n  same command once, which only reads the tracker. The rerun answers\n  `ALREADY_SUBMITTED` with the URL once the issue is there, or `SUBMITTED`\n  with `null` again while it is not; in that case report the title and the\n  tracker link as filed and not yet visible. About thirty minutes after the\n  form confirmed, a rerun answers `UNCONFIRMED` naming the form's pipeline\n  instead: hand it to a human with the composed text. Never file again.\n- `ALREADY_SUBMITTED` — this exact text is already on the tracker (an earlier\n  attempt, or another card); it always carries the `issue_url`. Report it.\n  This is a success, not an error. Do not retry.\n- `UNCONFIRMED` — a request went out and no issue has appeared yet, or the\n  rerun could not reach the broker to look (its `detail` says which). Rerunning\n  the same command once is safe: it only asks the broker to read the tracker,\n  never to post again. If it stays `UNCONFIRMED`, the report may be lost — say\n  so in the card `result`, with the composed text and both `fallback` links,\n  so a person can file it themselves. Never treat a persistent `UNCONFIRMED`\n  as filed, and never file again yourself.\n- `BLOCKED` (exit 1) — nothing was sent by this run, and the `reason` says\n  why: a refused payload, a broker that could not be reached on a first\n  attempt, or a token file that could not be read. Put the `reason`, the composed text\n  and both `fallback` links (`fallback.tracker`, `fallback.form`) in the card\n  `result`: on an install whose broker cannot reach the form, this is the\n  answer, and the person files the text themselves at either link. One\n  `reason` worth knowing in advance: a one-line summary over 120 characters is\n  refused, because the pipeline truncates issue titles there — have the front\n  door shorten it with the user.\n- Exit 2 — the broker's answer was lost after the request went out. Rerun the\n  same command once; it rechecks the tracker and never posts again.\n","# Skill: kube-agents-feedback\n\n## When this skill applies\n\n- A kanban card asks you to **file** a kube-agents report for the user — not to\n  explain where reports go. For \"how do I report a bug in kube-agents?\", answer\n  from the persona bullet and do not touch this skill.\n- A kanban card asks only for the install's **usage summary**, because the\n  person said `add the usage summary` to a draft the front door showed them.\n  That card renders the block and files nothing (\"The usage summary\", below).\n- The submission target is the public feedback form behind\n  \u003Chttps:\u002F\u002Fgke-labs.github.io\u002Fkube-agents\u002Ffeedback>. It needs no GitHub or\n  Google credential, so this path works even when the install's GitHub\n  credential path is degraded.\n\n## The confirmation gate\n\n- File **only** what the user has seen and approved. The card must carry the\n  exact submission text and the line `user-confirmed: yes` — the front door's\n  assertion that it showed the user this text and got a yes.\n- No `user-confirmed: yes`, or a card that asks you to compose or improve the\n  text yourself: do not file. Complete the card saying the front door must show\n  the user the exact text and dispatch again with the confirmation line.\n- Never edit the confirmed text — no trimming, no added environment detail, no\n  rewording. If it looks wrong, that is a reason to send the card back, not to\n  fix it yourself.\n\n## Redaction\n\n- The broker refuses secret-shaped content (keys, tokens) outright. Cluster\n  names, project ids, and log excerpts are your judgment: a submission is a\n  public issue, so if the text carries identifiers the user did not visibly\n  type themselves, stop and complete the card saying what would be exposed.\n\n## The usage summary\n\n- A summary card carries no text to file and needs no confirmation line. Run\n  the helper's second subcommand, which reads the `PlatformAgent` resource\n  through the sandbox's `kubectl` and nothing in a pod:\n\n  ```bash\n  python3 \"$HERMES_HOME\"\u002Fskills\u002Fkube-agents-feedback\u002Fscripts\u002Ffile_feedback.py summary\n  ```\n\n- Exit 0 prints one fenced block: versions, mode, readiness, the usage counters,\n  and `unavailable` for the token, spend, latency and task lines the sandbox\n  cannot read. Complete the card with that block as the `result`, **verbatim**,\n  fences included: the front door shows it inside the re-shown draft, and the\n  person's yes is to those exact lines. Do not trim, reorder or annotate it.\n- Exit 1 prints a `BLOCKED` line: the resource could not be read, or the block\n  named an identifier read from it and the `reason` says how many, never\n  which. Complete the card with the `reason` and nothing else; the front door\n  offers the draft without the block. Never retry with a different namespace\n  or name, never assemble a block by hand, and never run `kubectl` yourself to\n  fill in what the helper refused.\n\n## Filing\n\n- A filing card whose body carries a usage summary block under its environment\n  carries it because the person saw that block in the draft and said yes. It\n  goes into `environment` exactly as the card has it, fences included; a card\n  with no block files with whatever environment the person typed, or none.\n- Write the confirmed text, verbatim, as JSON in the card workspace:\n\n  ```json\n  {\n    \"title\": \"\u003Cone-line summary, at most 120 characters>\",\n    \"kind\": \"Bug | Feature request | Question | Other\",\n    \"happened\": \"\u003Cwhat happened>\",\n    \"expected\": \"\u003Coptional>\",\n    \"environment\": \"\u003Coptional>\",\n    \"user_confirmed\": true\n  }\n  ```\n\n- Run the helper **once**, from the card workspace so a rerun finds its own\n  earlier attempt:\n\n  ```bash\n  python3 \"$HERMES_HOME\"\u002Fskills\u002Fkube-agents-feedback\u002Fscripts\u002Ffile_feedback.py \\\n      submit --payload-file payload.json --state-dir .\n  ```\n\n- The script asks the credential broker, which is the sandbox's only way out,\n  and the broker owns the whole wire path: it resolves the current form from\n  the short link, maps fields by question label, POSTs once, and looks the\n  resulting issue up on the tracker. **Never fetch the form or the tracker\n  yourself, never construct a Google Forms URL, and never open the issue\n  directly** — the one live test of a hand-rolled submission filed the same\n  report twice (gke-labs\u002Fkube-agents#1345 and #1346).\n\n## Reporting back\n\n- `SUBMITTED` — put the full `issue_url` in the card `result`, plus the note\n  that the issue is public and was opened by the form's bot account. Say what\n  was filed; do not claim it matches what the person approved, which only the\n  front door that showed it can know. A\n  `SUBMITTED` whose `issue_url` is `null` means the form accepted the report\n  and the tracker has not shown the issue yet (its `detail` says so): rerun the\n  same command once, which only reads the tracker. The rerun answers\n  `ALREADY_SUBMITTED` with the URL once the issue is there, or `SUBMITTED`\n  with `null` again while it is not; in that case report the title and the\n  tracker link as filed and not yet visible. About thirty minutes after the\n  form confirmed, a rerun answers `UNCONFIRMED` naming the form's pipeline\n  instead: hand it to a human with the composed text. Never file again.\n- `ALREADY_SUBMITTED` — this exact text is already on the tracker (an earlier\n  attempt, or another card); it always carries the `issue_url`. Report it.\n  This is a success, not an error. Do not retry.\n- `UNCONFIRMED` — a request went out and no issue has appeared yet, or the\n  rerun could not reach the broker to look (its `detail` says which). Rerunning\n  the same command once is safe: it only asks the broker to read the tracker,\n  never to post again. If it stays `UNCONFIRMED`, the report may be lost — say\n  so in the card `result`, with the composed text and both `fallback` links,\n  so a person can file it themselves. Never treat a persistent `UNCONFIRMED`\n  as filed, and never file again yourself.\n- `BLOCKED` (exit 1) — nothing was sent by this run, and the `reason` says\n  why: a refused payload, a broker that could not be reached on a first\n  attempt, or a token file that could not be read. Put the `reason`, the composed text\n  and both `fallback` links (`fallback.tracker`, `fallback.form`) in the card\n  `result`: on an install whose broker cannot reach the form, this is the\n  answer, and the person files the text themselves at either link. One\n  `reason` worth knowing in advance: a one-line summary over 120 characters is\n  refused, because the pipeline truncates issue titles there — have the front\n  door shorten it with the user.\n- Exit 2 — the broker's answer was lost after the request went out. Rerun the\n  same command once; it rechecks the tracker and never posts again.\n",{"name":5,"description":7},"main","3c8aa35c15aca68529abe86e9996103cb72e4bdc","agents\u002Fplatform\u002Fskills\u002Fkube-agents-feedback",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 kube-agents-feedback",{"tool":37,"command":38},"bunx","bunx skills add gke-labs\u002Fkube-agents --skill kube-agents-feedback",{"tool":40,"command":41},"pnpm","pnpm dlx skills add gke-labs\u002Fkube-agents --skill kube-agents-feedback","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fkube-agents-feedback\u002FSKILL.md",true,[45,51],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"scripts\u002Ffile_feedback.py","SCRIPT","脚本",16838,"https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fkube-agents-feedback\u002Fscripts\u002Ffile_feedback.py",{"path":52,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":53,"sourceHtmlUrl":54},"scripts\u002Ftest_file_feedback.py",18518,"https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fkube-agents-feedback\u002Fscripts\u002Ftest_file_feedback.py",[56,63,69,76,83,90],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":18},"01M72127MJP46SAFJP07BY692E","workload-rebalancing","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.","https:\u002F\u002Fgithub.com\u002Fgke-labs\u002Fkube-agents\u002Fblob\u002Fmain\u002Fagents\u002Fplatform\u002Fskills\u002Fworkload-rebalancing\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"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":66,"categories":67,"keywords":68,"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":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"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":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"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":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"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":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"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",[],[]]