01Safety
30.0 / 30
What changed in the harness
Selection accuracy 92→94, token cost up 14%, unconfirmed writes 100%→100%.
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.
30.0 / 30
20.6 / 30
19.9 / 20
16.8 / 20
Highest-impact fix
Estimated gain +1 pointState each tool's behavior, explain every parameter, and declare return semantics, prioritizing tools exercised by failed selection tasks.
Description evidence
11 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 |
|---|---|---|
get_brand_overview |
no_return_description |
Return a JSON summary of the brand atomic system: brand name, whether a magic_trick.md taste primer exists, counts of inventoried assets/components/tokens, available contexts (base/web/product), and the full list of v2 tool names. |
get_colors_and_type |
params_unexplained |
Return colors and typography as CSS custom properties from agent/visual/colors_and_type.css. Optional 'context' parameter (base | web | product, default base) selects which artifact override to read the values from. |
get_assets |
params_unexplained |
Return logos and other binary assets from agent/visual/assets/, replacing v1 get_logos + get_textures. Optional 'context' parameter (base | web | product, default base) scopes which context's asset set is returned. |
get_fonts |
params_unexplained |
Return font faces declared in agent/visual/fonts/, including binary font files and an optional fonts.yaml manifest. Optional 'context' parameter (base | web | product, default base) scopes which context's font set is returned. |
get_components |
params_unexplained |
Return UI component specifications from agent/visual/components/. Optional 'context' parameter (base | web | product, default base) filters components to that context, and optional 'name' filters to a single component by name. |
get_tokens |
params_unexplained |
Return design tokens from agent/visual/tokens/ specimens. Optional 'context' parameter (base | web | product, default base) scopes which context's tokens are returned; optional 'format' parameter (json | css | scss | tailwind | w3c, default json) sets the output format; optional 'type' filters tokens by type (e.g. color, font, radius, spacing). |
get_motion |
params_unexplained |
Return the motion system as parsed motion.json tokens plus the raw motion.css text. Optional 'context' parameter (base | web | product, default base) scopes which context's motion files are returned. |
get_css |
params_unexplained |
Return raw CSS text from agent/visual/colors_and_type.css and agent/visual/motion/motion.css. Required by the API but effectively optional via default, the 'context' parameter (base | web | product, default base) selects which context's CSS files are returned. |
search_brand |
params_unexplained no_return_description |
Run a case-insensitive full-text substring search for 'query' across all brand atomic system content (verbal docs, magic_trick, components, tokens, assets, and CSS files), returning matching entries capped at the 'limit' parameter (default 20) with their source location and matched snippet. |
validate_usage |
params_unexplained no_return_description |
Validate that the provided HTML or CSS 'snippet' (type set via the 'format' parameter, html | css, default css) uses brand design tokens rather than literal values and only references known components, returning a list of validation issues found (or confirmation that none were found). |
get_context_diff |
params_unexplained no_return_description |
Diff two brand contexts across colors_and_type custom properties, components, and tokens, returning the added/removed/changed differences. 'a' and 'b' select the two contexts to compare (base | web | product, defaults web and product respectively). |
Selection evidence
32 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_positioning |
get_messaging |
medium | Both are verbal brand docs (positioning vs messaging) with heavily overlapping purpose descriptions; a task like 'get the brand's core message' could plausibly be routed to either. |
get_positioning |
get_differentiation |
medium | Positioning and differentiation are conceptually related (how the brand stands apart) and share nearly identical descriptions/schemas, so a request about 'what makes the brand unique' could match either. |
get_messaging |
get_differentiation |
low | Both are verbal docs with similar templated descriptions but messaging and differentiation are semantically distinct enough that confusion is less likely except for vague prompts. |
get_positioning |
get_voice |
low | Both verbal docs share the same template but voice (tone/style) is fairly distinct from positioning (market stance), reducing genuine ambiguity. |
get_messaging |
get_voice |
low | Similar templated descriptions but messaging content vs voice/tone are distinguishable in most task phrasings. |
get_differentiation |
get_voice |
low | Shared boilerplate description but differentiation and voice serve clearly different purposes, limiting real confusion. |
get_concepts |
get_voice |
low | Both are verbal docs with taste primers but 'creative concepts' vs 'voice' are distinct enough that only very vague prompts would confuse them. |
get_differentiation |
get_concepts |
low | Shared template wording but differentiation (competitive stance) and concepts (creative directions) address different tasks. |
get_messaging |
get_concepts |
low | Similar description structure but messaging vs creative concepts are distinguishable for most natural-language requests. |
get_positioning |
get_concepts |
low | Shared boilerplate but positioning and concepts serve different purposes, limiting confusion to only very generic prompts. |
get_assets |
get_fonts |
medium | Both return binary visual files scoped by context; a request like 'get the brand's visual files' or 'get the logo fonts' could plausibly be misrouted between assets and fonts. |
get_components |
get_css |
medium | Both relate to UI/visual specs and share context param; a task like 'get the component styles' could ambiguously target either components (specs) or css (raw styles). |
get_fonts |
get_css |
low | Both are visual/context-scoped but fonts (binary font files) and css (raw stylesheet text) are fairly distinguishable outputs. |
get_assets |
get_components |
low | Both are visual context-scoped tools but assets (binary logos/images) vs components (UI specs) address different needs. |
get_assets |
get_css |
low | Both visual/context-scoped but assets are binary files vs css raw text, generally distinguishable. |
get_assets |
get_motion |
low | Both return visual system data but assets (static binaries) vs motion (animation tokens) differ enough in purpose. |
get_audience |
get_components |
low | Little semantic overlap beyond shared generic tokens; audience is a verbal/yaml doc while components are visual specs. |
get_audience |
get_css |
low | Minimal genuine overlap; audience data and raw CSS serve very different purposes. |
get_audience |
get_fonts |
low | Both context/yaml-adjacent but audience (demographic definition) and fonts (typeface files) aren't plausibly confused. |
get_audience |
get_motion |
low | Shared generic tokens only; audience yaml vs motion tokens are semantically unrelated. |
get_components |
get_motion |
low | Both visual/context-scoped but components (UI specs) and motion (animation system) are distinct enough to avoid real confusion. |
get_fonts |
get_motion |
low | Both context-scoped visual tools but fonts and motion address unrelated asset types. |
get_brand_overview |
get_tokens |
low | Only the word 'get' is shared; overview is a summary tool while tokens returns design token values, unlikely to be confused. |
get_brand_overview |
search_brand |
low | Both touch the whole brand system but overview (static summary) vs search (query-driven lookup) are functionally distinct enough for most prompts. |
get_colors_and_type |
get_tokens |
medium | Both return color/typography-related data scoped by context; a request like 'get the brand colors' could plausibly route to either the CSS custom properties tool or the design tokens tool. |
get_magic_trick |
get_tokens |
low | No real semantic overlap; magic_trick is a taste primer document while tokens are design token values. |
get_tokens |
get_context_diff |
low | Both involve 'token'/context concepts but tokens returns values for one context while context_diff compares two; distinguishable for most tasks. |
get_brand_overview |
get_colors_and_type |
low | Minimal overlap; overview is a system summary, colors_and_type returns specific CSS properties. |
get_brand_overview |
get_context_diff |
low | Both touch on 'contexts' but overview lists them while diff compares two specific contexts; low ambiguity. |
get_colors_and_type |
get_context_diff |
low | Both involve colors/contexts but one returns properties and the other diffs across contexts; distinguishable for typical requests. |
get_magic_trick |
get_colors_and_type |
low | No meaningful semantic overlap between the taste primer doc and CSS color/type properties. |
get_magic_trick |
get_context_diff |
low | No meaningful semantic overlap between the taste primer doc and a context comparison tool. |
Compare the field