kube-agents-feedback · git:20261020.0204143 · 2026-10-20 · sha256 1dd50a40b34ca5f3

kube-agents-feedback git:20261020.0204143B

Immutable. This exact content never changes and is served at /api/v1/blob/1dd50a40b34ca5f3.

---
name: kube-agents-feedback
description:
  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. A submission becomes a
  public GitHub issue on gke-labs/kube-agents. Not for telling a user where to
  report — the persona bullet owns that answer without a skill.
---

# Skill: kube-agents-feedback

## When this skill applies

- A kanban card asks you to **file** a kube-agents report for the user — not to
  explain where reports go. For "how do I report a bug in kube-agents?", answer
  from the persona bullet and do not touch this skill.
- The submission target is the public feedback form behind
  <https://gke-labs.github.io/kube-agents/feedback>. It needs no GitHub or
  Google credential, so this path works even when the install's GitHub
  credential path is degraded.

## The confirmation gate

- File **only** what the user has seen and approved. The card must carry the
  exact submission text and the line `user-confirmed: yes` — the front door's
  assertion that it showed the user this text and got a yes.
- No `user-confirmed: yes`, or a card that asks you to compose or improve the
  text yourself: do not file. Complete the card saying the front door must show
  the user the exact text and dispatch again with the confirmation line.
- Never edit the confirmed text — no trimming, no added environment detail, no
  rewording. If it looks wrong, that is a reason to send the card back, not to
  fix it yourself.

## Redaction

- The broker refuses secret-shaped content (keys, tokens) outright. Cluster
  names, project ids, and log excerpts are your judgment: a submission is a
  public issue, so if the text carries identifiers the user did not visibly
  type themselves, stop and complete the card saying what would be exposed.

## Filing

- Write the confirmed text, verbatim, as JSON in the card workspace:

  ```json
  {
    "title": "<one-line summary, at most 120 characters>",
    "kind": "Bug | Feature request | Question | Other",
    "happened": "<what happened>",
    "expected": "<optional>",
    "environment": "<optional>",
    "user_confirmed": true
  }
  ```

- Run the helper **once**, from the card workspace so a rerun finds its own
  earlier attempt:

  ```bash
  python3 "$HERMES_HOME"/skills/kube-agents-feedback/scripts/file_feedback.py \
      submit --payload-file payload.json --state-dir .
  ```

- The script asks the credential broker, which is the sandbox's only way out,
  and the broker owns the whole wire path: it resolves the current form from
  the short link, maps fields by question label, POSTs once, and looks the
  resulting issue up on the tracker. **Never fetch the form or the tracker
  yourself, never construct a Google Forms URL, and never open the issue
  directly** — the one live test of a hand-rolled submission filed the same
  report twice (gke-labs/kube-agents#1345 and #1346).

## Reporting back

- `SUBMITTED` — put the full `issue_url` in the card `result`, plus the note
  that the issue is public and was opened by the form's bot account. Say what
  was filed; do not claim it matches what the person approved, which only the
  front door that showed it can know. A
  `SUBMITTED` whose `issue_url` is `null` means the form accepted the report
  and the tracker has not shown the issue yet (its `detail` says so): rerun the
  same command once, which only reads the tracker. The rerun answers
  `ALREADY_SUBMITTED` with the URL once the issue is there, or `SUBMITTED`
  with `null` again while it is not; in that case report the title and the
  tracker link as filed and not yet visible. About thirty minutes after the
  form confirmed, a rerun answers `UNCONFIRMED` naming the form's pipeline
  instead: hand it to a human with the composed text. Never file again.
- `ALREADY_SUBMITTED` — this exact text is already on the tracker (an earlier
  attempt, or another card); it always carries the `issue_url`. Report it.
  This is a success, not an error. Do not retry.
- `UNCONFIRMED` — a request went out and no issue has appeared yet, or the
  rerun could not reach the broker to look (its `detail` says which). Rerunning
  the same command once is safe: it only asks the broker to read the tracker,
  never to post again. If it stays `UNCONFIRMED`, the report may be lost — say
  so in the card `result`, with the composed text and both `fallback` links,
  so a person can file it themselves. Never treat a persistent `UNCONFIRMED`
  as filed, and never file again yourself.
- `BLOCKED` (exit 1) — nothing was sent by this run, and the `reason` says
  why: a refused payload, a broker that could not be reached on a first
  attempt, or a token file that could not be read. Put the `reason`, the composed text
  and both `fallback` links (`fallback.tracker`, `fallback.form`) in the card
  `result`: on an install whose broker cannot reach the form, this is the
  answer, and the person files the text themselves at either link. One
  `reason` worth knowing in advance: a one-line summary over 120 characters is
  refused, because the pipeline truncates issue titles there — have the front
  door shorten it with the user.
- Exit 2 — the broker's answer was lost after the request went out. Rerun the
  same command once; it rechecks the tracker and never posts again.