Surface data, don't classify it

This is the one rule in the codebase's own CLAUDE.md literally labeled a Principle:

The CLI's job is to fetch and present raw-enough data; the agent's job is to interpret it. Whenever the CLI is tempted to derive a categorical enum from raw GitHub fields (e.g. "this CI failure is transient", "this comment is noise", "this review is a nit"), prefer instead to ship the raw fields and any context the agent would otherwise have to fetch separately — log tails, step names, summaries, author logins.

The test, not the vibe

The rule of thumb is a concrete test, not a stylistic preference:

If removing a classification would force the agent to make another tool call to recover the same information, surface that information in the CLI output instead. If the agent already has the data and the classification is just a one-liner over it, delete the classification.

That test cuts both ways. It is not "never classify anything" — a rollup that summarizes raw state without discarding it is fine. It's specifically aimed at a categorical judgment that replaces the underlying fields, forcing the agent to either trust the label blindly or re-fetch what it was hiding.

What this looks like in the output

What's exempt, and why

Two categories are exempt because they are not classifications of ambiguous signal — they are the state machine's own vocabulary:

The downstream effect: an honest "not supported" list

Held to consistently, this principle produces a specific kind of humility. Shepherd explicitly does not decide whether a CI failure needs a code fix or a rerun, and does not label a thread actionable vs informational — both are listed as non-goals in features.md, not silently punted. Declining to classify is treated as a design decision worth stating, not a gap to paper over.