What ran, how it went, what it returned

A run is mostly a list of these. So the collapsed header carries everything needed to skim it (the tool, the target, the outcome, the time), and the body carries everything needed to audit it.

Statuses

The container stays neutral, so a long run reads as a list rather than a wall of tinted cards. Only the two states someone has to act on, awaiting approval and failed, take a coloured border as well.

read_filepackage.jsonDone0.1s
bashnpm run lintRunning
write_filesrc/app/page.tsxNeeds approval
ENOENT: no such file or directory

Arguments and result

Pass the call's detail as children and the header becomes a disclosure. With nothing to disclose it renders as a plain row instead: a row that cannot open should not look pressable.

json
{
  "path": "src/tokens/tokens-light.css",
  "pattern": "--color-status-"
}

Waiting on a person

Approval controls render outside the collapsible panel. Someone deciding whether to allow a write should not have to expand the call to find the button, and someone who wants to check the arguments first can still open it.

json
{
  "path": "src/components/Button/Button.tsx",
  "bytes": 4182
}