{"audit":{"version":"1.3","generated_at":"2026-05-22T23:42:37.013253+00:00","generated_by":"Agenstry","report_url":"https://agenstry.com/agents/willform.ai","methodology_url":"https://agenstry.com/methodology","verifier_jwks_url":"https://agenstry.com/.well-known/jwks.json","subject":{"domain":"willform.ai","name":"Willform","url":"https://willform.ai/.well-known/agent-card.json"}},"identity":{"provider":{"organization":"Willform","url":"https://willform.ai"},"registry_verification":null,"signature":{"signed":false,"signature_valid":null}},"protocol":{"version":"0.3.0","supports_streaming":false,"supports_push_notifications":false},"operational":{"live_state":"wrong_response","live_responds":false,"last_status_code":530,"last_elapsed_ms":null,"last_error":"HTTP 530"},"track_record":{"first_seen":"2026-05-14T13:14:46.336671+00:00","last_checked":"2026-05-22T08:30:02.009587+00:00","last_seen_ok":"2026-05-20T23:54:11.335100+00:00","checks_total":12,"checks_ok":11,"uptime_pct":91.7,"archived":false,"archived_reason":null},"conformance":{"score":56,"grade":"D","summary":"D-grade: significant issues — auth-gated, partially broken, or stale.","criteria":[{"key":"valid_card","label":"Valid AgentCard","points":10,"max_points":10,"status":"pass","detail":"Schema-validated A2A AgentCard returned by the well-known endpoint."},{"key":"live_responds","label":"Live JSON-RPC","points":5,"max_points":25,"status":"fail","detail":"Endpoint replies but body isn't a valid JSON-RPC 2.0 A2A response."},{"key":"protocol_version","label":"Protocol version","points":5,"max_points":10,"status":"partial","detail":"Declares pre-1.0 A2A 0.3.0 (Google preview). Upgrade to v1.x for full points."},{"key":"signature","label":"JWS signature","points":0,"max_points":10,"status":"info","detail":"Card is unsigned (most published agents are)."},{"key":"uptime","label":"Uptime track record","points":14,"max_points":15,"status":"partial","detail":"11/12 probes succeeded (92% uptime)."},{"key":"skills","label":"Skill declaration","points":10,"max_points":10,"status":"pass","detail":"Declares 20 skills with structured metadata."},{"key":"verified_identity","label":"Verified Identity","points":5,"max_points":10,"status":"partial","detail":"Provider declared: Willform (https://willform.ai). Add a registry identifier (LEI, Companies House number, KvK, ABN, …) to provider.legalEntity for full verified-business credit."},{"key":"freshness","label":"Freshness + modern flags","points":5,"max_points":5,"status":"pass","detail":"declares 1 modern capability flag(s) (x402); seen in upstream source within 0d"},{"key":"security","label":"Security declaration","points":2,"max_points":5,"status":"partial","detail":"Declares 2 security scheme(s) but none use PKCE or mTLS."}]},"skills":[{"id":"namespace_manage","name":"Manage Namespaces","description":"Create namespaces for organizing agents. Get details, rename, list or delete namespaces. Billing starts when agents are deployed.","tags":["namespace","manage"],"examples":["Create a new namespace","List my namespaces","Show namespace details","Rename my namespace"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["operation"],"properties":{"operation":{"type":"string","enum":["create","get","list","update","delete"],"description":"Operation to perform"},"namespaceId":{"type":"string","format":"uuid","description":"Required for get, update, delete"},"name":{"type":"string","description":"Namespace display name — required for create"}}}},{"id":"credits_manage","name":"Manage Credits","description":"Check credit balance, get deposit addresses, and verify on-chain deposits.","tags":["credits","billing","balance","deposit"],"examples":["Check my balance","How many credits do I have?","Get deposit address for USDC","Verify my deposit transaction"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["operation"],"properties":{"operation":{"type":"string","enum":["balance","deposit_address","verify_deposit"],"description":"Operation to perform"},"chainId":{"type":"number","description":"Chain ID for deposit address (e.g., 8453 for Base) — used with deposit_address"},"txHash":{"type":"string","description":"On-chain transaction hash — required for verify_deposit"},"tokenSymbol":{"type":"string","enum":["USDC","USDT"],"description":"Token symbol (default USDC) — used with verify_deposit"}}}},{"id":"agent_manage","name":"Namespace Agent","description":"Interact with the per-namespace Willy AI agent. Invoke tools, send chat messages, check agent status, or recover a failed agent.","tags":["agent","willy","ai","mcp","recover"],"examples":["Check agent status for my namespace","Ask the agent to list running pods","Invoke agent tool to check namespace usage","Recover my failed agent"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["namespaceId","operation"],"properties":{"namespaceId":{"type":"string","format":"uuid","description":"Namespace whose agent to interact with"},"operation":{"type":"string","enum":["status","invoke","chat","recover"],"description":"Operation to perform"},"tool":{"type":"string","description":"Willy agent tool name — required for invoke"},"params":{"type":"object","description":"Tool parameters — used with invoke"},"message":{"type":"string","description":"Natural language message — required for chat"}}}},{"id":"ask_willy","name":"Ask Willy","description":"Get guidance on platform usage, pricing, available operations, and troubleshooting.","tags":["help","guide","cs","faq","willy"],"examples":["How do I deploy a PostgreSQL database?","What are the pricing rates?","postgres 배포하려면 어떻게 해?"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"Question or topic to get guidance on"}}}},{"id":"agent_register_identity","name":"Register Agent Identity","description":"Temporarily unavailable while managed-agent identity storage migrates to agent_instances. Use agent_identity_status to check current availability instead of attempting registration.","tags":["erc8004","identity","registry","onchain"],"examples":["Check whether ERC-8004 identity registration is currently available","Ask if agent identity writes are still paused during migration"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["agentName","namespaceName"],"properties":{"agentName":{"type":"string","description":"Name of the agent to register"},"namespaceName":{"type":"string","description":"Name of the namespace containing the agent"},"capabilities":{"type":"array","items":{"type":"string"},"description":"Optional capability tags (e.g., ['deploy', 'manage'])"}}}},{"id":"agent_identity_status","name":"Agent Identity Status","description":"Check whether managed-agent ERC-8004 identity operations are currently available, and when available return registration status, agent ID, endpoint URL, and capabilities.","tags":["erc8004","identity","status"],"examples":["Is my agent registered on ERC-8004?","Get the on-chain agent ID for agent 'my-agent'"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["agentName","namespaceName"],"properties":{"agentName":{"type":"string","description":"Name of the agent to check"},"namespaceName":{"type":"string","description":"Name of the namespace containing the agent"}}}},{"id":"agent_identity_update","name":"Update Agent Identity","description":"Temporarily unavailable while managed-agent identity storage migrates to agent_instances.","tags":["erc8004","identity","update"],"examples":["Check whether identity updates are available yet","Ask if ERC-8004 capability updates are still paused during migration"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["agentName","namespaceName"],"properties":{"agentName":{"type":"string","description":"Name of the registered agent"},"namespaceName":{"type":"string","description":"Name of the namespace containing the agent"},"capabilities":{"type":"array","items":{"type":"string"},"description":"Updated capability tags (replaces previous list)"},"metadata":{"type":"object","description":"Arbitrary metadata key-value pairs (max 4KB)"}}}},{"id":"agent_deactivate_identity","name":"Deactivate Agent Identity","description":"Temporarily unavailable while managed-agent identity storage migrates to agent_instances.","tags":["erc8004","identity","deactivate"],"examples":["Check whether identity deactivation is available yet","Ask if ERC-8004 deactivation is still paused during migration"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["agentName","namespaceName"],"properties":{"agentName":{"type":"string","description":"Name of the registered agent"},"namespaceName":{"type":"string","description":"Name of the namespace containing the agent"}}}},{"id":"budget_policy_create","name":"Create Budget Policy","description":"Create or update a budget policy for a specific agent within a namespace. Enforces daily spend limits, per-call maximums, and domain allowlists for x402 external API calls.","tags":["budget","x402","policy","spend"],"examples":["Set a $5/day budget for my scraper agent","Limit per-call spend to $0.05 for agent 'default'","Restrict agent to only call api.example.com"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["namespaceName","agentName","dailyLimitUsd","perCallLimitUsd"],"properties":{"namespaceName":{"type":"string","description":"Namespace display name"},"agentName":{"type":"string","description":"Agent identifier within the namespace"},"dailyLimitUsd":{"type":"string","description":"Daily spend limit in USD (e.g., '5.00')"},"perCallLimitUsd":{"type":"string","description":"Maximum spend per single API call in USD"},"allowedDomains":{"type":"array","items":{"type":"string"},"description":"Allowlist of permitted domains"}}}},{"id":"budget_policy_list","name":"List Budget Policies","description":"List budget policies and today's spend for all agents in a namespace. Returns policy configuration and real-time daily spend summary.","tags":["budget","x402","policy","list"],"examples":["Show budget policies for my namespace","How much has each agent spent today?"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["namespaceName"],"properties":{"namespaceName":{"type":"string","description":"Namespace display name"}}}},{"id":"budget_policy_update","name":"Update Budget Policy","description":"Update an existing budget policy. Only provided fields are changed — omit a field to leave it unchanged.","tags":["budget","x402","policy","update"],"examples":["Increase daily budget to $10 for agent 'scraper'","Add api.newsite.com to allowed domains"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["namespaceName","agentName"],"properties":{"namespaceName":{"type":"string","description":"Namespace display name"},"agentName":{"type":"string","description":"Agent identifier whose policy to update"},"dailyLimitUsd":{"type":"string","description":"New daily spend limit in USD"},"perCallLimitUsd":{"type":"string","description":"New per-call maximum in USD"},"allowedDomains":{"type":"array","items":{"type":"string"},"description":"Replace allowlist with this array"}}}},{"id":"budget_policy_delete","name":"Delete Budget Policy","description":"Delete the budget policy for an agent. The agent falls back to platform default limits ($1.00/day, $0.10/call) after deletion.","tags":["budget","x402","policy","delete"],"examples":["Remove budget policy for agent 'old-scraper'","Reset agent budget to defaults"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["namespaceName","agentName"],"properties":{"namespaceName":{"type":"string","description":"Namespace display name"},"agentName":{"type":"string","description":"Agent identifier whose policy to delete"}}}},{"id":"x402_proxy_call","name":"x402 Proxy Call","description":"Make an outbound HTTP request through the BudgetGuard x402 proxy. Enforces budget policies and handles x402 payment negotiation. If the target returns 402 (payment required), the proxy returns the payment terms. Successful paid calls are deducted from the namespace balance.","tags":["x402","proxy","payment","http","budget"],"examples":["Call https://api.example.com/data through the x402 proxy","POST to a paid API endpoint with budget enforcement"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["namespaceName","agentName","targetUrl"],"properties":{"namespaceName":{"type":"string","description":"Namespace display name"},"agentName":{"type":"string","description":"Agent identifier used for budget enforcement"},"targetUrl":{"type":"string","description":"Full URL of the external API to call"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"],"description":"HTTP method (default GET)"},"body":{"type":"string","description":"Request body as a string (for POST/PUT/PATCH)"},"headers":{"type":"object","description":"Additional request headers"}}}},{"id":"x402_transactions","name":"x402 Transaction History","description":"List x402 external payment transactions for a namespace. Shows settled, pending, and failed calls with amounts, target domains, and timestamps. Use this to audit spending and verify payment outcomes.","tags":["x402","transactions","audit","history"],"examples":["Show recent x402 transactions for my namespace","Audit x402 spending history"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["namespaceName"],"properties":{"namespaceName":{"type":"string","description":"Namespace display name"},"limit":{"type":"number","description":"Number of transactions to return (default 50, max 200)"},"offset":{"type":"number","description":"Pagination offset (default 0)"}}}},{"id":"agent_configure","name":"Configure Managed Agents","description":"Create, configure, and delete managed AI agents. Supports full CRUD lifecycle: create a named agent with an optional persona and tool pack, retrieve details, update metadata, and delete permanently. Deletion is irreversible — stops the VM and removes all secrets. Use agent_lifecycle to deploy or stop the VM after creation or updates.","tags":["agent","manage","configure","crud"],"examples":["Create an agent named 'SRE Bot' with an on-call persona","List all my managed AI agents","Get details for agent ID abc123","Update agent persona to focus on security reviews","Delete agent abc123 permanently"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["operation"],"properties":{"operation":{"type":"string","enum":["create","list","get","update","delete"],"description":"Operation to perform"},"agentId":{"type":"string","format":"uuid","description":"Required for get, update, delete"},"name":{"type":"string","description":"Agent display name — required for create"},"persona":{"type":"string","description":"Optional persona/system prompt for the agent"},"toolPackId":{"type":"string","format":"uuid","description":"Optional tool pack UUID to assign"},"presetId":{"type":"string","description":"Persona preset ID (sre, cs, sales, product, custom) — used with create"}}}},{"id":"agent_lifecycle","name":"Deploy and Undeploy Agents","description":"Deploy a managed agent as a VM or stop a running VM. Deploy provisions the VM and transitions status to 'running'. Undeploy stops the VM but preserves the DB record and config for future re-deployment. Check credits_balance before deploying.","tags":["agent","deploy","undeploy","vm","lifecycle"],"examples":["Deploy agent abc123 as a VM","Stop the running VM for agent abc123","Re-deploy agent after updating its persona"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["operation","agentId"],"properties":{"operation":{"type":"string","enum":["deploy","undeploy"],"description":"deploy to start VM, undeploy to stop VM"},"agentId":{"type":"string","format":"uuid","description":"Agent to deploy or undeploy"}}}},{"id":"toolpack_list","name":"List Tool Packs","description":"List available tool packs for managed AI agents. Returns both built-in platform packs and any custom packs with their names, descriptions, and included tool arrays.","tags":["toolpack","agent","tools","catalog"],"examples":["What tool packs are available for agents?","List built-in tool packs","Show tool pack options before creating an agent"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{}}},{"id":"agent_design","name":"Design Agent (Chat)","description":"Design an AI agent through multi-turn conversation. Send messages to guide the design flow.","tags":["agent","design","chat","create"],"examples":["I want to design a new AI agent","Create a coding assistant agent"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Your message to the design assistant"},"sessionId":{"type":"string","description":"Session ID to continue an existing conversation"}}}},{"id":"agent_knowledge","name":"Agent Knowledge Management","description":"Upload, list, remove, and search documents in the agent's knowledge base (vector RAG)","tags":["agent","knowledge","rag"],"examples":["Upload a document titled 'API Guide' to agent abc","Search agent abc's knowledge for 'authentication'","List all documents for agent abc"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["action","agentId"],"properties":{"action":{"type":"string","enum":["upload","list","remove","search"],"description":"Action to perform on the knowledge base"},"agentId":{"type":"string","format":"uuid","description":"Agent whose knowledge base to manage"},"name":{"type":"string","description":"Document name — required for upload"},"content":{"type":"string","description":"Document content (markdown) — required for upload"},"sourceType":{"type":"string","description":"Optional source type tag (e.g., 'manual', 'url')"},"documentId":{"type":"string","format":"uuid","description":"Document ID — required for remove"},"query":{"type":"string","description":"Search query string — required for search"},"topK":{"type":"number","description":"Number of results to return for search (default 5, max 50)"}}}},{"id":"agent_self_improve","name":"Agent Self-Improvement","description":"Propose tool/memory improvements, list pending proposals, and approve/reject them. Approved proposals are applied via the outbox reconciler (config update + VM restart).","tags":["agent","self-improvement","proposal"],"examples":["Propose a new tool 'fetch_weather' for agent abc","List pending proposals for agent abc","Approve proposal xyz for agent abc"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","required":["action","agentId"],"properties":{"action":{"type":"string","enum":["propose_tool","propose_memory","list_proposals","approve_proposal","reject_proposal"],"description":"Self-improvement action to perform"},"agentId":{"type":"string","format":"uuid","description":"Agent to manage improvements for"},"title":{"type":"string","description":"Proposal title — required for propose_tool/propose_memory"},"rationale":{"type":"string","description":"Why this improvement is needed"},"diff":{"type":"object","description":"JSON diff describing the proposed change"},"proposalId":{"type":"string","description":"Proposal ID — required for approve/reject"},"status":{"type":"string","enum":["pending","testing","ready","approved","applied","rejected"],"description":"Filter proposals by status (for list_proposals)"}}}}],"provenance":[{"source":"github_code","first_seen":"2026-05-14T13:14:46.336671+00:00"},{"source":"recrawl_hot","first_seen":"2026-05-14T16:01:13.003235+00:00"}],"recent_probes":[{"fetched_at":"2026-05-22T08:30:02.009587+00:00","ok":false,"status_code":530,"error":"HTTP 530","elapsed_ms":null,"live_responds":null},{"fetched_at":"2026-05-20T23:54:11.335100+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":648,"live_responds":false},{"fetched_at":"2026-05-14T20:45:44.894925+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":6976,"live_responds":false},{"fetched_at":"2026-05-14T20:31:27.718017+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":1503,"live_responds":false},{"fetched_at":"2026-05-14T20:13:44.378568+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":862,"live_responds":false},{"fetched_at":"2026-05-14T19:50:06.107842+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":656,"live_responds":false},{"fetched_at":"2026-05-14T19:39:36.937399+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":650,"live_responds":false},{"fetched_at":"2026-05-14T19:27:50.032703+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":816,"live_responds":false},{"fetched_at":"2026-05-14T18:49:15.020585+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":1410,"live_responds":false},{"fetched_at":"2026-05-14T16:01:13.003235+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":1631,"live_responds":false}],"catalog_attestation":null,"verification_history":[],"signatures":[{"protected":"eyJhbGciOiJFUzI1NiIsImprdSI6Imh0dHBzOi8vYWdlbnN0cnkuY29tLy53ZWxsLWtub3duL2p3a3MuanNvbiIsImtpZCI6ImFnZW50ZmluZGVyLWVzMjU2LTEiLCJ0eXAiOiJKT1NFIn0","signature":"Eb8nhF7IFV1mz84HLLiqOUKA55zMqxwKPI6cPWet8MspbaFPomsveJ-sQ34uerQ8-ksHJVd-SPN4WD1cP00lBg"}]}