# Callers

> Every feature against every caller — a person, an agent, CI, a screen reader and another program — and the test that holds each cell.

Source: https://burgee.interlace.tools/docs/callers

Generated by `npm run callers:page` from `examples/conformance/src/callers.ts`.
Do not edit by hand.

Five callers arrive at a command, and each one is told apart by what it can observe — whether
stdout is a terminal, the environment, the flags — never by guessing who is on the other end.
Every feature has a cell per caller. A cell is held by a named test, does not apply (and says
why, and that caller gets the plain static text), or is missing. A missing cell is a gap we
publish, and the count of them may only fall.

**43 held · 7 n/a · 5 missing**, of 55 cells.

## The callers

| Caller | Who | Told apart by | Mode |
| :--- | :--- | :--- | :--- |
| tty | a person at a terminal | stdout is a TTY, no agent variable, no CI | `tty` |
| agent | an AI agent | a pipe, `--json`, or an agent variable (CLAUDECODE, AI_AGENT, …) even on a TTY | `json · pipe` |
| ci | CI or a script | a pipe, or `CI` set | `ci` |
| accessible | a screen reader | a TTY with `CLI_ACCESSIBLE` set | `accessible` |
| program | another program | `--schema`, `--mcp`, a completion script, the Fig spec | `json` |

## The matrix

| Feature | Package | tty | agent | ci | accessible | program |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: |
| help | burgee | ✅ | ✅ | ✅ | ✅ | ✅ |
| errors | burgee | ✅ | ✅ | ✅ | ❌ missing | ✅ |
| prompts | caique | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| spinner | flagstaff | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| progress | flagstaff | ✅ | ✅ | ✅ | ✅ | ✅ |
| table | flagstaff | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| box | flagstaff | ✅ | ✅ | ✅ | ✅ | ❌ missing |
| theme | roundel | ✅ | ✅ | ✅ | ✅ | n/a |
| plugins | burgee · flagstaff | ✅ | ✅ | ✅ | ✅ | ✅ |
| completions | burgee | ✅ | n/a | n/a | n/a | ✅ |
| mcp | burgee | n/a | ✅ | n/a | n/a | ✅ |

## Each cell

| Feature | Caller | Held by |
| :--- | :--- | :--- |
| help | tty | ✅ [`packages/burgee/src/help.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/help.test.ts) › “takes its width from the injected stdout when it has columns (H3)” |
| help | agent | ✅ [`packages/burgee/src/color.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/color.test.ts) › “a detected agent reads plain help even on a terminal, as it reads non-interactive (N12)” |
| help | ci | ✅ [`packages/burgee/src/color.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/color.test.ts) › “is styled on a terminal, and only there” |
| help | accessible | ✅ [`packages/burgee/src/color.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/color.test.ts) › “is plain under CLI_ACCESSIBLE, as every accessible surface is” |
| help | program | ✅ [`packages/burgee/src/help-json.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/help-json.test.ts) › “is the same shape as `--schema`, scoped to one command” |
| errors | tty | ✅ [`packages/burgee/src/json-failure.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/json-failure.test.ts) › “$name: at a terminal, stderr is the prose alone — no JSON (R6)” |
| errors | agent | ✅ [`packages/burgee/src/json-failure.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/json-failure.test.ts) › “$name: the envelope is on stdout, alone, and stderr is the one structured line (R6)” |
| errors | ci | ✅ [`packages/burgee/src/json-failure.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/json-failure.test.ts) › “$name: plain mode keeps its prose on stderr, nothing on stdout, and the structured line last when stderr is piped (R6)” |
| errors | accessible | ❌ missing — no test holds this cell yet |
| errors | program | ✅ [`packages/burgee/src/json-failure.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/json-failure.test.ts) › “$name: isError with the envelope as the text, then answers the next call” |
| prompts | tty | ✅ [`packages/caique/src/shape.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/caique/src/shape.test.ts) › “on a terminal, the same call is a prompt” |
| prompts | agent | ✅ [`scripts/prompt-exit-codes.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/scripts/prompt-exit-codes.test.ts) › “carries the code into the JSON envelope an agent reads” |
| prompts | ci | ✅ [`scripts/prompt-exit-codes.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/scripts/prompt-exit-codes.test.ts) › “a question nobody can answer — no TTY — exits 2, naming the flag to pass instead” |
| prompts | accessible | ✅ [`packages/caique/src/ask.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/caique/src/ask.test.ts) › “writes no escape sequence and no carriage return — it is the accessible mode” |
| prompts | program | ❌ missing — no test holds this cell yet |
| spinner | tty | ✅ [`packages/flagstaff/src/spinner.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/spinner.test.ts) › “hoisted on a terminal with a manual clock, the frames are exact” |
| spinner | agent | ✅ [`packages/flagstaff/src/loop.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/loop.test.ts) › “json: one NDJSON event per transition on stderr, stdout untouched” |
| spinner | ci | ✅ [`packages/flagstaff/src/ora.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/ora.test.ts) › “under CI the same, even when the stream claims to be a terminal” |
| spinner | accessible | ✅ [`packages/flagstaff/src/loop.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/loop.test.ts) › “%s: the static projection once per state change, no repaint” |
| spinner | program | ❌ missing — no test holds this cell yet |
| progress | tty | ✅ [`packages/flagstaff/src/builtins.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/builtins.test.ts) › “the drawn bar is exactly the width it was given” |
| progress | agent | ✅ [`packages/flagstaff/src/loop.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/loop.test.ts) › “json: one NDJSON event per transition on stderr, stdout untouched” |
| progress | ci | ✅ [`packages/flagstaff/src/builtins.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/builtins.test.ts) › “%s writes no carriage return and no escape on a pipe” |
| progress | accessible | ✅ [`packages/flagstaff/src/loop.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/loop.test.ts) › “%s: the static projection once per state change, no repaint” |
| progress | program | ✅ [`packages/flagstaff/src/progress.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/progress.test.ts) › “sends done, total and the static line through ctx.progress, and draws nothing in either projection” |
| table | tty | ✅ [`packages/flagstaff/src/builtins.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/builtins.test.ts) › “draws a grid whose every row is the same measured width” |
| table | agent | ✅ [`packages/flagstaff/src/builtins.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/builtins.test.ts) › “the component emits header-and-value pairs off a terminal, not the grid” |
| table | ci | ✅ [`packages/flagstaff/src/builtins.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/builtins.test.ts) › “%s writes no carriage return and no escape on a pipe” |
| table | accessible | ✅ [`packages/flagstaff/src/loop.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/loop.test.ts) › “%s: the static projection once per state change, no repaint” |
| table | program | ❌ missing — no test holds this cell yet |
| box | tty | ✅ [`packages/flagstaff/src/builtins.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/builtins.test.ts) › “draws the border it was asked for, at the width it was given” |
| box | agent | ✅ [`packages/flagstaff/src/loop.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/loop.test.ts) › “json: one NDJSON event per transition on stderr, stdout untouched” |
| box | ci | ✅ [`packages/flagstaff/src/builtins.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/builtins.test.ts) › “the component says the text off a terminal, and draws only on one” |
| box | accessible | ✅ [`packages/flagstaff/src/loop.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/loop.test.ts) › “%s: the static projection once per state change, no repaint” |
| box | program | ❌ missing — no test holds this cell yet |
| theme | tty | ✅ [`packages/roundel/src/theme.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/roundel/src/theme.test.ts) › “degrades to the nearest readable of 256 at level 2” |
| theme | agent | ✅ [`packages/roundel/src/theme.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/roundel/src/theme.test.ts) › “flies at level 0 when the run was asked for --json” |
| theme | ci | ✅ [`packages/roundel/src/policy.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/roundel/src/policy.test.ts) › “an empty CI with no vendor is the table’s floor, not the terminal’s level” |
| theme | accessible | ✅ [`packages/roundel/src/policy.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/roundel/src/policy.test.ts) › “defaults to 0 on the most colour-capable terminal there is” |
| theme | program | n/a — `--schema` and `--mcp` carry data, never styled text: the json row of the colour policy (level 0) is what they get |
| plugins | tty | ✅ [`packages/flagstaff/src/cli.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/cli.test.ts) › “prints the plugin in all five modes side by side and exits 0” |
| plugins | agent | ✅ [`packages/flagstaff/src/cli.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/cli.test.ts) › “prints the plugin in all five modes side by side and exits 0” |
| plugins | ci | ✅ [`packages/flagstaff/src/cli.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/cli.test.ts) › “prints the plugin in all five modes side by side and exits 0” |
| plugins | accessible | ✅ [`packages/flagstaff/src/cli.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/flagstaff/src/cli.test.ts) › “prints the plugin in all five modes side by side and exits 0” |
| plugins | program | ✅ [`packages/burgee/src/schema-fields.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/schema-fields.test.ts) › “names the plugin that contributed it” |
| completions | tty | ✅ [`packages/burgee/src/mcp.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/mcp.test.ts) › “the Fig spec and the shell completions still offer it, because a person is not an agent” |
| completions | agent | n/a — a completion script is what a shell sources; this caller runs commands, and reads `--schema` for what they take |
| completions | ci | n/a — a completion script is what a shell sources; this caller runs commands, and reads `--schema` for what they take |
| completions | accessible | n/a — the candidate list is drawn by the shell, not by the program; the script hands it plain words, one per line |
| completions | program | ✅ [`packages/burgee/src/completions.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/completions.test.ts) › “%s script is deterministic and mentions every visible command and option” |
| mcp | tty | n/a — `--mcp` speaks JSON-RPC on stdio to an MCP client; this caller is not one, and runs the same commands directly |
| mcp | agent | ✅ [`packages/burgee/src/mcp.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/mcp.test.ts) › “lists exactly the commands the author did not withhold, generated from the manifest (N1, N2, N6)” |
| mcp | ci | n/a — `--mcp` speaks JSON-RPC on stdio to an MCP client; this caller is not one, and runs the same commands directly |
| mcp | accessible | n/a — `--mcp` speaks JSON-RPC on stdio to an MCP client; this caller is not one, and runs the same commands directly |
| mcp | program | ✅ [`packages/burgee/src/mcp.test.ts`](https://github.com/ofri-peretz/burgee/blob/main/packages/burgee/src/mcp.test.ts) › “completes the handshake and names the program (N1)” |
