0.0 / 30
What changed in the harness
Selection accuracy 92→98, token cost down 0%, unconfirmed writes 0%→0%.
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
19.0 / 30
03Economics
14.1 / 20
04Discoverability
10.8 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
42 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 |
|---|---|---|
list_containers |
no_return_description |
List containers secured by RAD Security, optionally filtered by image name, image digest, namespace, cluster_id, or free-text search. Returns the matching containers with their details, paginated by offset and limit. |
get_container_details |
no_return_description |
Get detailed information about a single container secured by RAD Security, identified by its container_id. Returns the container's full metadata, including image and runtime details. |
list_clusters |
name_restates_behavior no_return_description |
List the Kubernetes clusters managed by RAD Security, paginated with page and page_size. Returns each cluster with its ID and metadata so you can use cluster_id in other tools. |
get_cluster_details |
no_return_description |
Get detailed information about a specific Kubernetes cluster managed by RAD Security, identified by its cluster_id. Returns the cluster's configuration and status metadata. |
who_shelled_into_pod |
params_unexplained no_return_description |
Get Kubernetes audit logs of users who shelled into a pod. Filter by pod name, namespace, cluster_id, and time range (from_time/to_time) to narrow the search. Returns the matching audit events, paginated by page and limit. |
list_images |
no_return_description |
List container images in the account, optionally filtered by page, page size, sort order, image filters (e.g., eol:reached, name:nginx, tag:1.26.0), and free-text search. Returns the matching image records. |
list_image_vulnerabilities |
name_restates_behavior no_return_description |
List the vulnerabilities found in a container image, identified by its digest. Optionally filter by severity levels. Returns the matching vulnerabilities, paginated by page and page_size. |
get_top_vulnerable_images |
name_restates_behavior no_return_description |
Get the most vulnerable images in the account, ranked by exposure so you can prioritize remediation. Returns a ranked list of images with their vulnerability counts. |
get_image_sbom |
name_restates_behavior no_return_description |
Get the Software Bill of Materials (SBOM) for a container image, identified by its digest. Returns the image's components, dependencies, and versions. |
ignore_cve |
no_return_description |
Ignore a CVE for this account so it no longer appears in vulnerability reporting. Optionally scope the ignore to a cluster_id, image_digest, or image_repo/image_name pair, and record a reason for audit. Returns a confirmation of the created disposition. Use for confirmed false positives, accepted risks, or won't-fix decisions; do not use for remediated CVEs, which drop off automatically. |
unignore_cve |
no_return_description |
Remove the account-wide ignore/disposition for a CVE (by cve_name), restoring it to vulnerability reporting. Returns a confirmation of the removed disposition. |
list_cve_dispositions |
name_restates_behavior no_return_description |
List the active CVE dispositions (ignored/false positive) for this account. Each entry includes the CVE, the reason, and the author, so you can review and undo past ignore decisions. |
get_k8s_resource_details |
no_return_description |
Get the latest manifest of a Kubernetes resource in a cluster, identified by cluster_id and resource_uid. Returns the resource's manifest and metadata. |
list_k8s_resources |
no_return_description |
List Kubernetes resources, optionally filtered by namespace, resource kinds (e.g., Deployment, ServiceAccount, Pod), and cluster_id. Returns the matching resources, paginated by page and page_size. |
get_containers_process_trees |
name_restates_behavior no_return_description |
Get the process tree (parent-child process hierarchy) for each container in container_ids, limited by processes_limit per container. Useful for investigating container runtime behavior. Returns the process trees keyed by container. |
get_containers_baselines |
name_restates_behavior no_return_description |
Get the runtime baseline for each container in container_ids, describing the expected behavior RAD has learned for it. Returns the baseline descriptions keyed by container. |
get_container_llm_analysis |
name_restates_behavior no_return_description |
Get an LLM-generated analysis of a container's process tree, summarizing what the container does and flagging notable or anomalous behavior. Returns the analysis text for the given container_id. |
list_security_findings |
name_restates_behavior no_return_description |
List security findings, optionally filtered by finding types (k8s_misconfiguration, runtime_alert, k8s_audit_logs_anomaly), severities, source kinds/types/names/namespaces, status, and time range. Returns the matching findings, paginated by limit. |
update_security_finding_status |
name_restates_behavior no_return_description |
Update the status of a security finding (open, closed, or ignored) by its id. Returns the updated finding. |
mark_inbox_item_as_false_positive |
name_restates_behavior no_return_description |
Mark an inbox item as a false positive (or clear the mark with value=false) and record the reason. Returns the updated inbox item. |
list_inbox_items |
no_return_description |
List inbox items, optionally filtered by any field using a filter query string (e.g., search:cve-2024-12345 and severity:high). Returns the matching inbox items, paginated by offset and limit. |
get_inbox_item_details |
name_restates_behavior no_return_description |
Get the full details of a specific inbox item by its inbox_item_id, including its content and metadata such as title and severity. Returns the inbox item record. |
list_workflows |
name_restates_behavior no_return_description |
List all workflows available in the account. Returns each workflow's ID and metadata; use get_workflow for full definitions and run parameters. |
get_workflow |
no_return_description |
Get a specific workflow by its workflow_id. Returns the workflow definition, default arguments, and the schema describing how to run it. |
list_workflow_runs |
name_restates_behavior no_return_description |
List the execution runs of a specific workflow by workflow_id. Returns each run's ID, status, and execution metadata. |
get_workflow_run |
name_restates_behavior params_unexplained no_return_description |
Get detailed information about a specific workflow run, identified by workflow_id (the parent workflow) and run_id (the specific run to fetch). Returns the run's status, inputs, and outputs. |
run_workflow |
name_restates_behavior no_return_description |
Run a workflow with its workflow_id, optionally overriding arguments via args. When async is true (default), returns immediately with the run ID; when false, waits for completion and returns the run results. |
list_workflow_schedules |
name_restates_behavior no_return_description |
List the schedules configured for a specific workflow by workflow_id. Returns each schedule's cadence and settings. |
search_knowledge_base |
no_return_description |
Search your organization's knowledge base for relevant uploaded documents, procedures, reports, and other content using a natural language query. Optionally restrict to specific collections or document_ids, and tune results with top_k and min_score. Returns the most relevant document excerpts with scores and source document IDs. |
list_knowledge_base_collections |
name_restates_behavior no_return_description |
List all collections in your organization's knowledge base, which are used to organize and categorize documents. Returns the collections, paginated by offset and limit. |
list_knowledge_base_documents |
name_restates_behavior no_return_description |
List documents in your organization's knowledge base, optionally filtered by collections, file_type (pdf, markdown, plaintext, csv), or status (ready, processing, error). Returns the matching documents with their IDs and metadata. |
get_knowledge_base_document_download_url |
no_return_description |
Get a time-limited download URL for the original knowledge base document file (any format, including PDF/DOCX binaries). Use it to fetch the original file into a sandbox for structural parsing, or when extracted text is unavailable. Returns a signed, expiring URL. |
radql_list_filter_values |
no_return_description |
List the possible values for a specific RadQL filter field (e.g., namespace, cluster_id, severity) on a data type, so you can build valid dynamic filters. Returns the distinct values available for the given data_type and filter_name. |
radql_query |
no_return_description |
Execute RadQL queries for security investigations, supporting list (filter/search), get_by_id (single item), and stats (aggregations). Returns the matching records, a single item, or aggregation results, honoring limit/offset and optionally including relations. Follow the workflow radql_list_data_types -> radql_get_type_metadata -> radql_query and the quoting rules for valid queries. |
radql_query_builder |
params_unexplained no_return_description |
Helper tool that builds a RadQL query string programmatically from structured filter conditions (field, operator, value), combined with AND/OR logic, and optionally an aggregation function with aggregate_field, group_by, and time_group. group_by lists the fields to group aggregation results by. Returns a ready-to-use query for radql_query. |
radql_batch_query |
no_return_description |
Execute up to 10 RadQL queries in parallel, one per entry in queries, for example fetching container details, vulnerabilities, and network connections together. Returns the results of each query in the order given. |
list_widget_templates |
name_restates_behavior no_return_description |
List widget templates, optionally filtered by visualization_type and category. Returns the matching widget templates with their configuration, paginated by offset and limit. |
get_widget_template |
name_restates_behavior params_unexplained no_return_description |
Get a specific widget template by its widget_template_id (a template used to create dashboard widgets), returning its configuration and visualization properties. |
list_dashboard_templates |
name_restates_behavior no_return_description |
List dashboard templates, optionally filtered by category. Returns the matching dashboard templates with their configuration, paginated by offset and limit. |
get_dashboard_template |
name_restates_behavior params_unexplained no_return_description |
Get a specific dashboard template by its dashboard_template_id, returning its configuration and the widget templates it contains. |
list_dashboards |
name_restates_behavior no_return_description |
List the dashboards for the account, paginated by offset and limit. Returns each dashboard's ID and metadata. |
get_dashboard |
name_restates_behavior params_unexplained no_return_description |
Get a specific dashboard by its dashboard_id, returning its configuration, layout, and the widgets it contains. |
Selection evidence
Confusable tool pairs.
11 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_workflow |
get_workflow_run |
medium | Both 'get detailed information about a specific workflow/run'; a task like 'show me details about workflow X' is ambiguous as to whether the user wants the definition/schema or the results of an execution, so an agent may fetch the wrong object. |
get_workflow_run |
run_workflow |
low | Phrasing like 'give me the run of workflow X' could mean execute it (run_workflow) or retrieve an existing run's record (get_workflow_run, which needs a run_id the user may not have supplied), making the intended verb ambiguous. |
list_workflows |
list_workflow_runs |
low | 'Show me my workflows' is ambiguous between the definitions and their executions; a user asking for workflow activity might mean runs, and list_workflow_runs requires a workflow_id so an agent may fall back to list_workflows incorrectly. |
list_workflows |
list_workflow_schedules |
low | A request like 'which workflows are set to run' or 'list the workflows I have scheduled' could push an agent toward either listing workflows themselves or their schedules, since both tools are keyed to workflow_id and both involve the word workflow. |
radql_query |
radql_query_builder |
medium | Both names start with radql_query and both describe building/executing RadQL queries; a task like 'query for containers with critical severity' may select query_builder, which only constructs a query string and returns no results, instead of radql_query which executes it. |
get_knowledge_base_document_content |
get_knowledge_base_document_download_url |
medium | Both are 'get document X' tools differing only in extracted text vs original binary file; a user request to 'get/fetch/read document X' (e.g., a PDF) is genuinely ambiguous about whether they want the full text or the original file for parsing. |
list_knowledge_base_collections |
list_knowledge_base_documents |
medium | An under-specified task like 'show me what's in our knowledge base' fits both tools since collections organize documents and documents are the content; an agent may list collections when documents were intended or vice versa. |
query_knowledge_base_document |
get_knowledge_base_document_content |
low | A task like 'tell me what's in document X' could map to the CSV natural-language query tool or the full-text content tool; the intended tool only becomes clear if the user mentions it is a CSV or wants the entire document. |
ignore_cve |
unignore_cve |
medium | These are opposite polarity actions on the same CVE reporting state; a user request to change a CVE's reporting status (e.g., 'stop flagging this', 'make this one show up again', or 'remove the ignore') can send an agent to the wrong direction without careful reading. |
get_containers_process_trees |
get_container_llm_analysis |
low | A request to 'analyze what processes container X runs' could select the raw process-tree tool or the LLM-analysis-of-process-tree tool, since the llm tool's description references the process tree and both are container-process tools. |
get_k8s_resource_details |
list_k8s_resources |
low | A task like 'get me info about the deployments in cluster X' is ambiguous between fetching the latest manifest of one resource (needs a UID) and listing multiple resources by kind/namespace; an agent may pick the detail tool when enumeration is intended. |
Compare the field