01Safety
30.0 / 30
What changed in the harness
Selection accuracy 88→91, token cost up 3%, 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
23.4 / 30
16.5 / 20
16.0 / 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
8 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_experiences |
no_return_description |
Search for shows, theatre, events, tours and experiences in a specific city on tickadoo. Supports optional free-text query matching against titles and descriptions, optional category filtering (theatre, musicals, tours, food, family, nightlife, sightseeing, concerts, comedy, shows, outdoor, workshops, cruises, sports), optional min/max price filtering in the local currency, optional date filtering with dateFrom/dateTo, and optional sorting (relevance, popular, price_low, price_high, rating, best_value). Returns the matching experiences with their titles, descriptions, prices, and localised booking URLs, honouring the applied filters, pagination (max_results, offset), and sort order. Supports 40+ languages — pass a language code (e.g. 'de', 'fr', 'es', 'ja') to get localised booking URLs. Use when a user asks what to do in a city, wants event/show recommendations, or is looking for tickets. |
search_by_mood |
no_return_description |
Search tickadoo experiences by emotional intent instead of category. Maps moods (adventurous, romantic, relaxing, family_fun, cultural, thrill_seeking, foodie, budget_friendly, luxury, rainy_day) to the most relevant audience, tag, setting, rating, and price filters, then runs a city search. Returns a curated list of experiences that fit the chosen mood, with titles, descriptions, prices, and localised booking URLs. Supports 40+ languages — pass a language code (e.g. 'de', 'fr', 'es', 'ja') to get localised booking URLs. Use when a user says things like "something romantic", "we need to relax", "kids are bored", or "luxury options in Paris". |
get_last_minute |
no_return_description |
Find tickadoo experiences starting within the next few hours in a city. Returns a list of imminent experiences sorted by soonest start time, each with countdown text like "starts in 47 minutes", and flags high urgency when a start is imminent or inventory is low. Supports 40+ languages — pass a language code (e.g. 'de', 'fr', 'es', 'ja') to get localised booking URLs. |
whats_on_tonight |
no_return_description |
Find bookable experiences happening later today in a city. Automatically filters to today, removes already-started events, and returns a list of tonight's options sorted by soonest start time with evening/show/nightlife boosts, each with "starts in" countdowns and urgency signals from inventory data. Supports 40+ languages — pass a language code (e.g. 'de', 'fr', 'es', 'ja') to get localised booking URLs. Use for concierge-style requests like "what's on tonight in London?" or "any shows tonight in Paris?". |
find_nearby_experiences |
params_unexplained no_return_description |
Find shows, events and experiences near a geographic location on tickadoo. The latitude and longitude parameters define the reference point (typically the user's location) around which to search, with radius_km controlling how far out to look. Returns a list of matching experiences with titles, descriptions, prices, and localised booking URLs. Supports optional date filtering with dateFrom/dateTo. Supports 40+ languages — pass a language code (e.g. 'de', 'fr', 'es', 'ja') to get localised booking URLs. Use when a user shares their location or asks for things to do near them. |
list_cities |
name_restates_behavior no_return_description |
Return the cities where tickadoo has bookable experiences, useful for destination discovery and for confirming which cities a later search supports. Returns a list of city names and slugs, optionally filtered by a name or slug substring via the query parameter, capped by the limit parameter, and localised for booking URLs via the language parameter. Use to help users discover available destinations or validate a city before searching. |
get_experience_details |
no_return_description |
Get details for a specific tickadoo experience, returning its availability calendar for the requested number of days (default 30, max 180), venue details, and images. Prefer passing the tickadoo slug or booking URL path; provider and provider_id are legacy fallback inputs. Supports 40+ languages — pass a language code (e.g. 'de', 'fr', 'es', 'ja') to get localised booking URLs. |
get_family_day |
no_return_description |
Build a full family day in one city. Returns a chronologically ordered day itinerary with a morning activity, lunch tip, afternoon attraction, and optional evening stop, including timings and booking details. Uses kids_ages for age-aware filtering, prefers wheelchair-friendly options when toddlers make stroller access likely, and clusters the day geographically to reduce travel. Supports 40+ languages — pass a language code (e.g. 'de', 'fr', 'es', 'ja') to get localised booking URLs. |
Selection evidence
8 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
search_experiences |
search_by_mood |
medium | A request like 'something romantic in Paris' or 'relaxing things to do in Tokyo' can be handled either by passing 'romantic'/'relaxing' as a free-text query to search_experiences or by using the mood parameter of search_by_mood; both are city-based search tools returning the same kind of results, so a mood-word query is genuinely ambiguous. |
get_whats_on_this_week |
whats_on_tonight |
high | 'What's happening in London today?', 'any shows on this evening?', or 'events this week' sit on the boundary between the two: get_whats_on_this_week returns a day-by-day 7-day breakdown (including today/tonight slots) while whats_on_tonight is dedicated to later today, and their descriptions overlap heavily on time-window phrasing. |
get_city_guide |
get_travel_tips |
medium | A user asking 'what should I know before visiting Tokyo' or 'give me tips for Paris' maps to get_travel_tips (its own example trigger), but get_city_guide also advertises a 'pre-arrival city briefing' with 'insider tips', so the intended tool is unclear from surface phrasing. |
search_experiences |
compare_experiences |
medium | A task like 'compare the top theatre experiences in London' or 'which of these shows is best value' can be read as discover-then-compare; 'compare' points to compare_experiences while search_experiences (with sorting) could also be invoked to get a comparison-like ranking, and neither alone fully satisfies without the other. |
search_experiences |
find_nearby_experiences |
medium | Requests that mix area and city, e.g. 'shows near the Eiffel Tower' or 'experiences near my hotel in Paris', are ambiguous: search_experiences takes a city and free-text query while find_nearby_experiences takes coordinates, and the agent may pick either to satisfy a location-flavoured 'things to do around here' request. |
get_travel_tips |
get_transfer_info |
medium | 'How do I get around Paris' or 'what's the best way from the airport to the hotel' overlaps: get_transfer_info gives specific hub-to-hotel routes while get_travel_tips covers a transport topic, so a generic transport/airport question may route to the wrong tool. |
get_experience_details |
compare_experiences |
low | A task like 'show me details for these two London shows side by side' could be met by fetching details for each experience or by calling compare_experiences; both operate on specific experiences, though compare's explicit slugs array somewhat disambiguates. |
search_experiences |
get_experience_details |
low | When a user names a specific experience ('details on the London Dungeon', 'the ghost tour available dates') without giving a slug, the agent may call search_experiences to locate it instead of get_experience_details, since the descriptions distinguish discovery from details but the natural phrasing doesn't. |
Compare the field