Source: c81 phase1-pages — Tools (PRO-31); inventory-agent-expand-v2's Tools panel promoted to fleet grain with the c19 row grammar, allowlist config left in policy-config-tool-allowlist, re-derived from the phase1 world
36 tools, 40,912 calls in 30d — 212 calls on 3 tools outside the allowlist went through.
browser.navigate ×121, screenshot ×64, click ×27 (unreviewed server) · postgres-prod.query ×1 denied, policy working
Tools
ranked outside-the-allowlist-and-went-through first, then denied, then callsKind | Belongs to | Calls · 30d | Agents | People | Denied · 30d | Allowlisted | |
|---|---|---|---|---|---|---|---|
| browser.navigate | mcp | 121 | 2 | 2 | 0 | not allowlisted 121 went through | |
| browser.screenshot | mcp | 64 | 2 | 2 | 0 | not allowlisted 64 went through | |
| browser.click | mcp | 27 | 1 | 1 | 0 | not allowlisted 27 went through | |
| Bash | builtin | 7,400 | 6 | 6 | 14 at the prompt | yes | |
| shell | builtin | 2,600 | 3 | 3 | 4 at the prompt | yes | |
| Write | builtin | 2,200 | 5 | 5 | 3 at the prompt | yes | |
| WebFetch | builtin | 340 | 2 | 2 | 9 at the prompt | yes | |
| run_shell_command | builtin | 180 | 3 | 3 | 1 at the prompt | yes | |
| slack.post_message | mcp | 90 | 2 | 2 | 2 at the prompt | yes | |
| postgres-prod.query | mcp | 1 | 1 | 1 | 1 by policy | not allowlisted every call denied | |
| Read | builtin | 9,800 | 6 | 6 | 0 | yes | |
| Edit | builtin | 6,100 | 6 | 6 | 0 | yes | |
| Grep | builtin | 4,100 | 6 | 6 | 0 | yes | |
| Glob | builtin | 1,900 | 4 | 4 | 0 | yes | |
| apply_patch | builtin | 1,500 | 3 | 3 | 0 | yes | |
| showing 15 of 36 — | |||||||
36 tools · 40,912 calls and 34 denials in 30d (1 by policy, 33 at the harness prompt). Calls and denials are 30-day fleet totals; agents and people derive from which installs called the tool; sessions are the 4 event-grain transcripts in the 7-day sample. Allowlist configuration lives in the Tool Allow-List policy, not here.
Composition notes
- Question: what can agents do, and what do they actually call? Can is the table of every tool with what it belongs to and whether it is allowlisted; do is calls, agents, people, the called-vs-never pair in the band, and the sessions on record.
- Verdict line from toolsVerdict(world) (derived/tools.ts, sharpening verdicts.tools): it separates calls outside the allowlist that went through (attention debt — the unreviewed browser server) from calls outside it that were denied (a receipt — policy working). The all-clear state keeps the amber by the Stage-1 ruling, and says "policy working" so the color is honest.
- Framing band = four claims as filter buttons (Phase1StatBlock button): tools (reset), called in 30d ("n of 36" — can vs do), never called (quiet; names them), and the one attention device: calls outside the allowlist that went through, as the big number, with the tools it names and the denial count ("policy working") as the sub — the debt is the value, the receipt is the sub. At zero it reads clear. The kind mix is a three-segment bar in structural greys whose legend filters by kind; both filters compose and cross-foot with the visible rows, including under ?mcp=.
- Table is the raw UxTableList family so ?id= can pre-open a row. Rows from toolRows(world, { mcpId }), pre-ranked: outside-the-allowlist-and-went-through → denied > 0 → calls desc (a deliberate deviation from "denied first": Bash's prompt-declines are policy working quietly; the browser tools are the debt). Fifteen rows by default — the rank puts everything that matters in them — with "show all n" in the table's footer row; ?id= lifts the cap when the row it opens is past it. MCP tools print as server.name. Search rides the Tool header. Belongs-to is a chip: MCP server (filters here as ?mcp=), skill (→ Skills), or the harness technologies that call a builtin (→ Inventory). Denied prints its decision source; Allowlisted is the quiet column — grey yes, plain "not allowlisted", amber only on the rows whose outside-allowlist calls went through — and links to the policy page rather than rebuilding it.
- Last call is not a column: only skill tools carry it at tool grain, mcp tools have the server's last call, builtins only what the four event-grain sessions show. The expand prints it with its grain named instead of mixing grains in one column.
- Expand = three UxTableListExpandSection cards (the inventory exemplar's idiom): header with the derived story note, callers (agent chips → Agent detail, person chips → User detail), on record (event-grain sessions where a tool_call matched by kind + name + server → Session detail). "view details →" is an honest stub: the protocol has no tool detail page.
- Fabricated, minimally: the decision source of a denial (policy when the tool is not allowlisted, prompt when it is) — the world stores only denied30d; c59 says decision_source is captured at T2. Marked TODO(reconcile) in the derived file.
- Open: amber in the calm state for a policy receipt (attention color is rationed to debt); the default rank deviation; whether the sibling pages (Skills, Plugins) name the belongs-to column the same way.