01Safety
0.0 / 30
What changed in the harness
Selection accuracy 96→96, token cost up 1%, 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
23.9 / 30
12.2 / 20
16.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
4 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 |
|---|---|---|
track_upsert |
params_unexplained |
Find a track matching name and type, or create it if none exists. Use when a workflow needs a named target track but should avoid duplicates. The optional index sets the insertion position used only when a new track is created (ignored when an existing match is found); omit to append at the end. Idempotent: returns changed=false when the track already exists; verified by returned name/type/index. |
clip_set_loop |
params_unexplained no_return_description |
Configure a clip's loop_start, loop_end, and/or looping flag while preserving any fields omitted from the call. loop_start and loop_end are given in beats from the clip start (loop_end must exceed loop_start); looping toggles whether the clip repeats. Use for clip loop edits after locating the clip via track_index/clip_slot_index. Idempotent within 1e-4; returns the before/after values of only the fields provided by the caller, with a verification diff on mismatch. |
push_set_pad_color |
params_unexplained |
Set the color of one Ableton Push 2/3 pad on the 0..63 grid (pad indexed row-major across the 8x8 grid). color is a Push RGB-LED palette index (0-127), not a raw RGB value. Use for visual feedback or performance layouts after hardware detection. Requires Push 2/3; returns sent=true with the pad and color accepted by the bridge. |
push_set_button_led |
params_unexplained |
Set the LED color and animation mode for a named Push transport or utility button (e.g. Play, Record, Mute). color is a Push RGB-LED palette index (0-127), not a raw RGB value; mode selects solid, blink, or pulse animation and defaults to solid. Use for hardware feedback after Push detection. Requires Push 2/3; returns sent=true with the accepted button/color/mode. |
Selection evidence
15 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
stop |
clip_stop |
high | A task like 'stop that clip' or 'stop it' without specifying scope could lead the agent to call global transport stop instead of the slot-specific clip_stop, or vice versa, since both halt playback and share near-identical descriptions. |
track_create |
track_upsert |
high | A request like 'create a track named Bass' is ambiguous: track_create always makes a new track while track_upsert finds-or-creates by name, and the user rarely specifies whether duplicates are acceptable. |
device_inspect_patcher |
device_inspect_plugin |
medium | Both are read-only 'inspect this device' tools differing only by device technology (M4L patcher vs VST/AU plugin); a generic task like 'inspect the device on track 2' gives no signal on which to pick without already knowing the device type. |
track_set_name |
clip_set_name |
medium | A vague rename request such as 'rename this to Intro' doesn't indicate whether the user means the track or a specific clip, and both tools share nearly identical parameter shapes and descriptions. |
track_get_info |
session_get_info |
medium | A task like 'give me info about the current state' could target either the whole session (session_get_info) or a specific track (track_get_info), especially if the user hasn't specified an index yet. |
session_get_info |
session_snapshot |
medium | Both are read-only orientation tools returning session state; session_get_info is described as a 'snapshot' and session_snapshot is a 'deep snapshot', so a task like 'capture the current session state' is ambiguous about depth/verbosity needed. |
clip_fire |
clip_stop |
medium | A task phrased as 'toggle clip 2 on track 1' or ambiguous playback instructions could cause the agent to pick the wrong directional action since both target the same slot with opposite effects. |
clip_fire |
scene_fire |
medium | A task like 'launch this' or 'trigger row 3' is ambiguous between firing a single clip slot versus an entire scene row, especially if the user conflates clip and scene terminology. |
list_recipes |
list_prompts |
medium | list_prompts' description explicitly says 'use when the user asks what workflows are available', which overlaps with list_recipes' music workflow/pattern listings, creating genuine ambiguity for a task like 'what workflows can I use?' |
list_recipes |
apply_recipe |
medium | A task like 'use the tech-house drum recipe' could be misrouted to list_recipes (to find it) instead of apply_recipe (to actually apply it) if the agent isn't sure the recipe_id is already known. |
push_set_pad_color |
push_set_button_led |
medium | Both set visual feedback on Push hardware; a task like 'light up the Play control in red' is ambiguous whether it refers to a pad or a named transport button, especially if the user's terminology is imprecise. |
device_get_parameters |
device_inspect_patcher |
medium | A generic task like 'tell me about this device' could route to either the parameter listing or the M4L patcher discovery tool, since both are read-only device introspection with overlapping descriptions. |
device_get_parameters |
device_inspect_plugin |
medium | A task like 'what plugin is this and what can I adjust' blends parameter listing and plugin identity discovery, making it unclear which read-only device tool to call first. |
track_create |
create_midi_clip |
low | Both are 'create' actions in a music production flow ('create a new MIDI track' vs 'create a MIDI clip'), and a terse task like 'create MIDI for the drums' could be misparsed as creating a track rather than a clip. |
session_snapshot |
session_diff |
low | These are meant to be used together (snapshot before, diff after), so a task like 'show me what changed' could mistakenly trigger session_snapshot again instead of session_diff if the agent hasn't tracked the prior snapshot state. |
Compare the field