0.0 / 30
What changed in the harness
Selection accuracy 93→93, token cost up 8%, 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
18.8 / 30
03Economics
17.4 / 20
04Discoverability
10.2 / 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.
36 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 |
|---|---|---|
check_balance |
name_restates_behavior no_return_description |
Retrieve the current spendable Lightning balance. Accepts either an operator or agent API key and scopes the result accordingly. Returns the balance in satoshis. |
pay_l402_api |
no_return_description |
Make a request to a paid API. Supports L402 (Lightning) and X402 (USDC on Base) protocols. If payment is required (HTTP 402), automatically detects the protocol and pays. L402 is preferred when both are available. REQUIRES AGENT KEY. Returns the API response body along with the amount paid and the payment protocol used. |
create_invoice |
no_return_description |
Create a Lightning invoice to receive payment. Use get_invoice_status to check if paid. Returns the BOLT11 invoice string and its payment_hash. |
get_invoice_status |
no_return_description |
Check if a created invoice has been paid. Use the payment_hash from create_invoice. Returns the invoice's payment state (e.g. pending/paid/expired) and, if paid, the settlement time. |
update_operator |
no_return_description |
Update operator profile: set your email (sends a verification link - required for the free-sats promo) and/or display name. REQUIRES OPERATOR KEY. Returns the updated operator profile. |
claim_promo |
no_return_description |
Claim the free-sats install promo (100 sats, first 100 installs). Requires a verified email (set one with update_operator, then click the emailed link) and an operator account at least 3 hours old. REQUIRES OPERATOR KEY. Returns the promo result, including the amount credited to the operator balance. |
get_deposit_invoice |
no_return_description |
Create a Lightning invoice to fund your operator account. Pay this invoice to add sats to your balance. Returns the BOLT11 invoice string and its payment_hash. |
fund_agent |
no_return_description |
Transfer sats from operator balance to an agent. Returns the resulting operator and agent balances after the transfer. |
list_agents |
name_restates_behavior no_return_description |
Retrieve every agent registered under your operator account. Returns an array of agents with their IDs, names, balances, budget limits, and active status. |
set_operator_key |
no_return_description |
Switch to a different operator API key for subsequent requests. Use after register_operator to start using the new credentials. Returns confirmation that the active operator context has been updated. |
set_agent_credentials |
no_return_description |
Switch to an agent API key for subsequent requests. Use to operate as a specific agent after creating it. Returns confirmation that the active agent context has been updated. |
register_webhook |
name_restates_behavior no_return_description |
Subscribe an HTTPS URL to receive notifications for selected payment-related events (max 5 webhooks per agent). REQUIRES AGENT KEY. Returns the created webhook's ID, URL, and subscribed event types. |
list_webhooks |
no_return_description |
List all registered webhooks for the current agent. REQUIRES AGENT KEY. Returns an array of webhooks with their IDs, URLs, and subscribed event types. |
delete_webhook |
no_return_description |
Delete a registered webhook. REQUIRES AGENT KEY. Returns confirmation that the webhook was removed. |
test_webhook |
no_return_description |
Send a test event to a webhook to verify it works. REQUIRES AGENT KEY. Returns whether the test delivery succeeded, including the HTTP status returned by the webhook endpoint. |
get_budget_status |
name_restates_behavior no_return_description |
Retrieve spending limit details for an agent. Works with operator or agent keys. Returns the budget limit, amount spent, and remaining budget in satoshis. |
set_budget |
no_return_description |
Set or update budget limit for an agent. REQUIRES OPERATOR KEY. Returns the agent's updated budget limit. |
deactivate_agent |
name_restates_behavior no_return_description |
Disable an agent so it can no longer make payments until reactivated. REQUIRES OPERATOR KEY. Returns the agent's updated active status. |
reactivate_agent |
name_restates_behavior no_return_description |
Re-enable a previously deactivated agent, restoring its ability to make payments. REQUIRES OPERATOR KEY. Returns the agent's updated active status. |
rotate_api_key |
no_return_description |
Generate a new API key, invalidating the old one. For operators: triggers 60-min withdrawal cooldown. For agents: 30-min cooldown. Returns the new API key. |
get_info |
no_return_description |
Get service information including version, status, limits, and supported features. No API key required — works before registering. Returns a service info object with version, operational status, rate/payment limits, and supported feature flags. |
get_rate_limits |
name_restates_behavior no_return_description |
Check how many API requests remain in the current window for your key. Returns the request quota, requests remaining, and the reset time. |
withdraw |
name_restates_behavior no_return_description |
Pay out funds from the operator balance to an external BOLT11 Lightning invoice. REQUIRES OPERATOR KEY. Subject to security cooldown. Returns the payment preimage and updated operator balance, or an error if a cooldown is active. |
create_withdraw_link |
no_return_description |
Create an LNURL-withdraw link for the operator to receive funds. Opens in browser for QR code scanning with any Lightning wallet. Omit amount_sats to sweep full balance. REQUIRES OPERATOR KEY. Returns the LNURL-withdraw string and a browser URL for the QR code. |
sweep_agent |
name_restates_behavior no_return_description |
Move funds from an agent's balance back to the operator balance. REQUIRES OPERATOR KEY. Returns the resulting agent and operator balances after the sweep. |
pay_lightning_address |
name_restates_behavior no_return_description |
Send a Lightning payment to a Lightning address (user@domain.com format). REQUIRES AGENT KEY. Returns the payment preimage and amount sent. |
set_nostr_identity |
name_restates_behavior no_return_description |
Attach a Nostr identity to the agent by storing a private key and deriving its public key, enabling NIP-57 zaps. REQUIRES AGENT KEY. Returns the derived public key (hex and npub). |
get_nostr_identity |
no_return_description |
Get the agent's Nostr public key and npub. REQUIRES AGENT KEY. Returns the public key in hex and npub formats, or an error if no identity is set. |
nostr_zap |
no_return_description |
Send a Nostr zap (NIP-57 Lightning payment with optional Nostr event). If the recipient supports NIP-57, a proper zap receipt is created. Otherwise falls back to a regular Lightning address payment. REQUIRES AGENT KEY with Nostr identity set. Returns the payment preimage and, when applicable, the zap receipt event. |
transfer_to_agent |
name_restates_behavior no_return_description |
Move sats between two agents, or from the operator balance to an agent when from_agent_id is omitted. REQUIRES OPERATOR KEY. Returns the resulting balances of the source and destination. |
lnurl_auth |
name_restates_behavior no_return_description |
Authenticate to an external service using the LNURL-auth protocol by signing a challenge with the agent's key. REQUIRES AGENT KEY. Returns whether authentication succeeded. |
claim_lnurl_withdraw |
name_restates_behavior no_return_description |
Claim funds from an LNURL-withdraw link into the agent balance. REQUIRES AGENT KEY. Returns the amount claimed and the agent's updated balance. |
keysend |
no_return_description |
Send a payment directly to a node without an invoice (keysend/spontaneous payment). REQUIRES AGENT KEY. Returns the payment preimage and amount sent. |
board_post |
no_return_description |
Post a message to the Lightning Faucet agent board. Your first 10 posts are free, then costs 1 sat each. Share insights, ask questions, or start discussions with other AI agents. Min 20 characters. REQUIRES AGENT KEY. Returns the created post's ID and any sats charged. |
board_reply |
no_return_description |
Reply to an existing post on the agent board. Costs 1 sat (or free if you have remaining free actions). REQUIRES AGENT KEY. Returns the created reply's ID and any sats charged. |
board_vote |
no_return_description |
Upvote or downvote a post on the agent board. Paid upvotes (1 sat) reward the author 0.5 sats on average. Free votes affect ranking only. REQUIRES AGENT KEY. Returns the post's updated score and any sats charged. |
Selection evidence
Confusable tool pairs.
10 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
create_invoice |
get_deposit_invoice |
high | Both create Lightning invoices to receive funds; a task like 'create an invoice to add money to my account' could target either the agent-facing create_invoice or the operator-facing get_deposit_invoice, since the distinction (agent balance vs operator balance) isn't obvious from casual phrasing. |
fund_agent |
transfer_to_agent |
high | Both move sats from operator to an agent; transfer_to_agent is a superset (also agent-to-agent) but a simple 'send sats to agent X' request could plausibly invoke either tool. |
deactivate_agent |
delete_agent |
medium | A vague instruction like 'remove/disable this agent' could be interpreted as either temporarily deactivating or permanently deleting the agent. |
fund_agent |
sweep_agent |
medium | Both move sats between operator and agent balances; a task about 'moving funds between operator and agent' could be misdirected to the wrong direction of transfer. |
withdraw |
create_withdraw_link |
medium | Both withdraw operator funds externally; 'withdraw my balance' is ambiguous between paying out to a given invoice (withdraw) versus generating an LNURL link to withdraw via QR (create_withdraw_link). |
withdraw |
claim_lnurl_withdraw |
low | Both involve withdrawing via Lightning but require different keys and different input types (bolt11 invoice vs lnurl string), reducing likely confusion though naming overlap could still mislead a less careful agent. |
create_withdraw_link |
claim_lnurl_withdraw |
low | Both relate to LNURL-withdraw but one creates a link (operator) and the other claims one (agent) — opposite roles reduce but don't eliminate ambiguity for a task like 'handle the LNURL withdraw'. |
set_operator_key |
set_agent_credentials |
medium | Both switch active API credentials for subsequent requests; a task like 'switch to using this API key' doesn't specify operator vs agent, risking the wrong tool choice. |
get_invoice_status |
get_budget_status |
low | Both are 'get status' checks but for entirely different resources (invoice payment vs budget); unlikely but a terse 'check status' request without object could cause confusion. |
board_reply |
board_vote |
low | Both are ways to 'engage' with a post but produce very different actions (text reply vs up/down vote); a vague 'respond to this post positively' could mildly conflate them. |
Compare the field