01Safety
0.0 / 30
What changed in the harness
Selection accuracy 98→100, token cost up 4%, unconfirmed writes 0%→0%.
Category breakdown
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
0.0 / 30
28.7 / 30
19.8 / 20
14.1 / 20
Highest-impact fix
Estimated gain +30 pointsExpose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
3 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
search_artworks |
params_unexplained |
Search across registered open-access museum collections. Returns artwork records that pass source-specific rights verification (ambiguous records excluded by default). `limit` caps how many records are returned (1–50, default 10); later post-verification filters such as medium or color_family run over a bounded candidate window, so results may be fewer than `limit`. Supports an optional date-range filter (`year_min`/`year_max`) for researcher queries like "Dutch genre painting 1640–1680". |
get_artwork |
no_return_description |
Fetch a single artwork by its normalized ID (e.g. met:436533). Returns the full artwork record for that ID — including artist, title, date, museum, license, and image URL — or an error if the ID is unknown or invalid. |
cite |
no_return_description |
Render a citation for an artwork. Styles: "full" (artist, title, date, museum, license, URL), "caption" (image caption form), "short" (inline reference). Returns the formatted citation text as a string for the requested style (default "full"). |
Selection evidence
1 pair where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
search_artworks |
get_artwork |
low | The descriptions sharply demarcate the two: search_artworks is for free-text queries returning many records across collections, while get_artwork requires a normalized museumcode:numericid and returns a single record. A task like 'find artworks by Rembrandt' clearly maps to search, and 'fetch the artwork met:436533' clearly maps to get by ID. The only overlap is the shared 'artwork' token; the operation (search vs. fetch-by-ID) and required inputs (free-text vs. ID) would steer an agent correctly, so genuine selection confusion is unlikely. |
Compare the field