30.0 / 30
What changed in the harness
Selection accuracy 100→95, token cost up 21%, unconfirmed writes 100%→100%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
20.6 / 30
03Economics
19.7 / 20
04Discoverability
14.6 / 20
Highest-impact fix
Estimated gain +1 pointRewrite 17 underspecified tool descriptions
State each tool's behavior, explain every parameter, and declare return semantics, prioritizing tools exercised by failed selection tasks.
Description evidence
Defects and rewrites.
17 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 |
|---|---|---|
base64_encode |
name_restates_behavior no_return_description |
Convert a plain-text string into its Base64-encoded representation, commonly used to safely transmit or store data over ASCII-only channels. Returns the Base64-encoded string for the given input. |
base64_decode |
name_restates_behavior no_return_description |
Decode a Base64-encoded string back into its original plain-text form. Use when you need to recover the text that was Base64-encoded. Returns the decoded string for the given input. |
uuid_generate |
name_restates_behavior no_return_description |
Generate one or more random version-4 (UUIDv4) identifiers, useful when you need unique keys without centralized coordination. Returns an array of random UUID v4 strings, one per count (default 1, up to 100). |
ulid_generate |
name_restates_behavior no_return_description |
Generate a single ULID, a Universally Unique Lexicographically Sortable Identifier whose lexical order follows creation time, useful for chronologically sortable keys. Returns the generated ULID string. |
hash |
name_restates_behavior no_return_description |
Compute a hash of a string using one of md5, sha1, sha256, sha384, or sha512 (default sha256). Use to create checksums or verify data integrity. Returns the hex-encoded digest for the chosen algorithm. |
hash_all |
name_restates_behavior no_return_description |
Compute the hash of a string with every supported algorithm (md5, sha1, sha256, sha384, sha512) in a single call, useful for comparing digests across algorithms. Returns the digest produced by each supported algorithm for the input. |
jwt_decode |
name_restates_behavior no_return_description |
Decode a JWT token without cryptographically verifying its signature, exposing the encoded header, payload, and expiry claim. Use to inspect the contents of a token locally. Returns the decoded header, payload, and expiry information for the token. |
cron_explain |
name_restates_behavior no_return_description |
Return a plain-English explanation of what a 5-field cron expression (e.g. 0 9 * * 1-5) schedules, breaking down the minute, hour, day, month, and weekday on which it triggers. Use to verify or document a cron schedule. |
cron_validate |
name_restates_behavior no_return_description |
Check whether a 5-field cron expression is syntactically valid. Use to confirm a schedule before deploying it. Returns a validation result indicating whether the expression is valid and, if not, why it is invalid. |
cron_next |
name_restates_behavior no_return_description |
Compute the upcoming scheduled run times for a 5-field cron expression, returning count future occurrences (default 5, max 20). Use to preview or test when a cron job will fire. |
timestamp_to_iso |
name_restates_behavior no_return_description |
Convert a Unix timestamp, given in either seconds or milliseconds, into its equivalent ISO 8601 date-time string. Use to turn raw epoch values into readable dates. Returns the formatted ISO 8601 string. |
iso_to_timestamp |
name_restates_behavior no_return_description |
Convert an ISO 8601 date-time string into a Unix timestamp. Use to normalize human-readable dates into a numeric epoch value. Returns the Unix timestamp for the given date. |
timestamp_now |
no_return_description |
Return the current system time represented in multiple formats (such as a Unix timestamp and ISO 8601), useful as a reference point for logs or time calculations. Returns the current time in those several formats. |
json_format |
name_restates_behavior no_return_description |
Pretty-print a JSON string with configurable indentation (default 2 spaces, from 1 to 8) so it is easy to read. Use to beautify compact or minified JSON. Returns the reformatted, indented JSON string. |
json_minify |
no_return_description |
Remove all insignificant whitespace from a JSON string to produce its most compact form. Use to shrink payloads before storage or transmission. Returns the minified JSON string. |
json_validate |
name_restates_behavior no_return_description |
Check whether a string is valid JSON and identify the JSON type of its top-level value. Use to verify data before parsing. Returns a validation result indicating validity and, if valid, the detected type. |
regex_test |
no_return_description |
Test whether a regular expression pattern matches the provided string, applying the given flags (default g). Use to verify regex behavior before relying on it. Returns the match result and which portions of the test string matched. |
Selection evidence
Confusable tool pairs.
7 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
timestamp_to_iso |
iso_to_timestamp |
high | Both convert between Unix timestamps and ISO 8601 strings in opposite directions; a task like 'convert this timestamp' or 'convert this date' gives no direction clue, so an agent can easily pick the wrong member. |
hash |
hash_all |
medium | Both hash an input string using supported algorithms; a task like 'hash this string' or 'get a hash of X' is ambiguous unless the agent reads that hash_all runs every algorithm at once. |
base64_encode |
base64_decode |
medium | Classic encoding-direction pair; a task phrased such as 'convert this to base64' or 'base64 this string' can select the wrong direction when the names are scanned quickly. |
cron_explain |
cron_next |
medium | Both operate on a cron expression; a task like 'explain this cron' can plausibly be read as wanting the next run times rather than a plain-English description. |
cron_explain |
cron_validate |
low | Names mostly disambiguate, but a task like 'is this cron correct?' or 'check this cron expression' could plausibly summon explain instead of validate. |
json_format |
json_minify |
medium | Both reshape a JSON string; a generic task like 'make this JSON readable' or 'reformat this JSON' is ambiguous between pretty-printing and minifying. |
uuid_generate |
ulid_generate |
medium | Both generate a unique identifier; a task saying 'generate an id' does not specify UUID vs ULID, so the agent must rely on the descriptions to decide. |
Compare the field