01Safety
30.0 / 30
What changed in the harness
Selection accuracy 98→95, token cost up 1%, 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
26.8 / 30
18.1 / 20
16.9 / 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
5 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 |
|---|---|---|
compare_units |
no_return_description |
Compare 2-4 Warhammer 40K units or Kill Team operatives side by side. Returns a side-by-side comparison showing each unit's or operative's stats, weapons, abilities, and keywords. |
game_flow |
no_return_description |
Show the turn sequence for a game mode, or highlight the current phase and what comes next. When current_phase is given, returns the current phase together with the phases that follow it; when omitted, returns the full ordered turn sequence for the specified game mode. |
wound_calculator |
params_unexplained |
Calculate expected wounds and damage for a Warhammer 40,000 attack sequence. Pure math — input an attack profile and target stats, get probabilities and expected results for hits, wounds, saves, and damage. The 'attacks' parameter is the weapon's Attacks characteristic, i.e. the number of hit dice rolled (e.g. 3 means 3 hit rolls). |
determine_primary_mission |
no_return_description |
Determine each player's Primary Mission from their Force Dispositions, per Warhammer 40,000 11th Edition Matched Play. Returns your Primary Mission and your opponent's Primary Mission: each player's mission is looked up from their OPPONENT's Force Disposition, so in a non-mirror matchup the two players get different missions. |
lookup_crusade |
no_return_description |
Look up Warhammer 40,000 Crusade content: Battle Traits, Crusade Relics, Battle Scars, and Boon tables. Returns the matching entries with their rules and applicable tier (generic/universal, faction-specific, or campaign-specific — Tyrannic War, Pariah Nexus, Nachmund Gauntlet, Armageddon); 11th Edition only. Pass faction to see everything a Crusade army of that faction can pick, campaign to add a campaign's pool, category to narrow to one content type, or name to search by name/description text. At least one of faction, campaign, category, or name is required. |
Selection evidence
9 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
lookup_detachment |
lookup_enhancement |
medium | A task like 'which enhancements can I take in detachment X' fits both tools: lookup_detachment returns a detachment's available enhancements, while lookup_enhancement accepts a detachment filter and returns the detachment each enhancement belongs to. Neither description pins down which tool should answer, so an agent can route such a request to the wrong member. |
lookup_stratagem |
lookup_detachment |
medium | A task naming a detachment but wanting its stratagems (e.g., 'what stratagems does the Pariah Nexus detachment use?') is ambiguous: lookup_detachment returns the detachment's associated stratagems, while lookup_stratagem also exposes a detachment filter. Conversely, requesting one stratagem by name while mentioning its detachment can pull an agent toward lookup_detachment. |
lookup_stratagem |
search_stratagems |
medium | These two share an identical parameter schema (name/faction/phase/detachment) and the same subject matter, differing only in verb. 'Search for a stratagem that works in the Fight phase' maps to search_stratagems and 'look up stratagem Y' to lookup_stratagem, but opposite-verb phrasings ('look up all fight-phase stratagems', 'search the stratagem Overwatch') can plausibly pick the wrong member. |
lookup_stratagem |
lookup_enhancement |
low | Both take name/faction/detachment and describe a named rule carrying a cost. An untyped request like 'what does X do and what does it cost' gives no cue about which category X falls into, so an agent may pick either; the definitions only disambiguate when the task explicitly labels the item as a stratagem or enhancement. |
lookup_unit |
search_units |
low | A request phrased as 'search for unit X' or 'find me the unit by name' fits search_units's query parameter even when lookup_unit's full datasheet is the better fit, and both accept name and faction filters. The compact-list vs full-datasheet output difference is not salient enough to force the correct choice. |
lookup_unit |
lookup_ploy |
low | Both are name-based lookups in the Kill Team domain, and lookup_unit explicitly accepts a kill_team game mode while lookup_ploy is the Kill Team rule counterpart. An untyped task like 'in Kill Team, what does X do' gives no signal whether X is an operative datasheet or a ploy, so an agent can choose the wrong member. |
lookup_keyword |
lookup_enhancement |
low | lookup_keyword describes itself as looking up a 'keyword or rule' with a plain-English explanation, which overlaps with retrieving a named enhancement's effect. For an untyped request like 'explain the rule X', the agent cannot tell from the definitions whether X is a keyword or an enhancement. |
lookup_keyword |
lookup_stratagem |
low | The same overlap applies as with enhancements: lookup_keyword claims 'keyword or rule' lookups, so naming a stratagem in an untyped 'what does X do' or 'explain the rule X' request can route the agent to lookup_keyword instead of lookup_stratagem. |
lookup_phase |
lookup_ploy |
low | Both sit in the Kill Team phase/rule space: lookup_ploy returns a ploy's timing (a phase) while lookup_phase returns step-by-step phase instructions for kill_team. A task like 'which ploys can I use in the Firefight phase' or 'what happens during the Strategic Ploy step' can plausibly be sent to either member. |
Compare the field