# feedback

`sexpgpu feedback` sends a bug report or feedback to SexpGPU's authors from the
machine it happened on. Agents are its usual reporters: when a verb does what
its page says it should not, or a diagnostic or a page leaves you guessing,
report it where it happened instead of working around it.

```bash
sexpgpu feedback --bug "doctor says run ok, then run --device cuda panics at device open"
sexpgpu feedback "explain --json would diff better with the knobs sorted"
sexpgpu feedback --bug --reply-to me@example.com "check accepts :warmup-steps 0"
sexpgpu feedback --bug - <<EOF        # a long report, with its log
run --resume latest on o41:// starts again at step 0
$(tail -40 run.log)
EOF
```

```console
$ sexpgpu feedback --bug "check accepts :warmup-steps 0 and run divides by it"
feedback 8c1f6d2e-4b7a-4c39-9d1e-2f6a5b3c7d10 recorded
```

The message is the one operand, quoted, or standard input when the operand is
`-`; `feedback` is the only verb that reads standard input. A message that
starts with `-` reads as a flag, so give it on standard input.

## What it sends

One JSON object, posted to `https://sx.041.io/api/feedback`:

| field     | value                                                                                                                   |
| --------- | ----------------------------------------------------------------------------------------------------------------------- |
| `kind`    | `bug` with `--bug`, otherwise `feedback`                                                                                |
| `message` | the message without leading and trailing whitespace, 1 to 20000 UTF-16 code units                                       |
| `replyTo` | `--reply-to`: an email address or an `http(s)` URL to answer at, at most 500 UTF-16 code units; absent without the flag |
| `context` | the binary and the system, below                                                                                        |

```json
{
  "client": { "name": "sexpgpu", "version": "0.1.0", "features": ["metal"] },
  "os": { "platform": "darwin", "arch": "arm64", "release": "24.6.0" }
}
```

`version` is what `sexpgpu --version` prints, `features` the devices the binary
supports (`cuda`, `metal`, or none), `platform` and `arch` the system's names
(`darwin`, `linux`; `arm64`, `x64`), and `release` what `uname -r` prints,
`null` when `uname` fails. Nothing else goes: no login or key of any kind, no
file, no working directory, no environment variable, and no GPU is probed.

A character outside the Basic Multilingual Plane, as most emoji are, counts two
UTF-16 units, so 20000 units hold 20000 Latin, Cyrillic or common Chinese
characters, or 10000 emoji.

## The answer

A recorded report prints `feedback <id> recorded` on standard output and exits
`0`, also when standard output has closed, so a closed pipe never makes a
recorded report look failed and get sent again; the id names the report. A
report the endpoint refuses prints its reason, `sexpgpu feedback: <reason>`, or
the status when it gives none, `sexpgpu feedback: <url> answered 404 Not Found`,
and exits `1`, as does an endpoint that cannot be reached or does not answer
within 15 seconds. An empty message, one past 20000 UTF-16 units once trimmed,
standard input that is not UTF-8, or standard input over 1 MiB, which is read no
further, exits `2` before anything is sent.

Related: [the command line](https://sx.041.io/docs/cli.md), [working as an agent](https://sx.041.io/docs/agents.md).

---

SexpGPU documentation. Every page: https://sx.041.io/llms.txt
