{"service":"wever-agent-handoff-checks-v1","category":"Agent Handoffs","family":"Agent Handoffs","page":"https://weverlabs.com/agent-handoffs/","tools":{"wever_handoff-record-check":{"path":"/api/handoff-record-check","kind":"check","receipt_type":"wever.handoff-record-check.v1","schema":{"type":"object","additionalProperties":false,"required":["handoffs"],"properties":{"handoffs":{"type":"array","minItems":0,"maxItems":1000,"items":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The handoff record id."},"task":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The task handed over."},"from":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"Who sent it."},"to":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"Who received it."},"at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"When the handoff happened."},"state":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"Where the task stood when it was handed over, such as draft quote ready, awaiting approval."},"constraints":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"The constraints it travels under, such as a deadline, a budget or a limit."},"recorded_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"When the record was written."}}},"description":"Each recorded task handoff."},"observed":{"type":"array","minItems":0,"maxItems":1000,"items":{"type":"object","additionalProperties":false,"required":["task"],"properties":{"task":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The task that moved."},"from":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"to":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"}}},"description":"Task moves seen in other logs, such as a tracker, a queue or message logs, to find handoffs with no record."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["handoffs","coverage","unrecorded","gaps","fixes"],"verdicts":["handoffs_are_rumors","record_gaps","records_unverified","handoffs_recorded"]},"wever_handoff-acceptance-check":{"path":"/api/handoff-acceptance-check","kind":"check","receipt_type":"wever.handoff-acceptance-check.v1","schema":{"type":"object","additionalProperties":false,"required":["routes"],"properties":{"routes":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The route, such as planner to booker."},"from":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The sending agent."},"to":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The receiving agent."},"acceptance":{"enum":["explicit","delivery_only","none"],"description":"How the receiver confirms it has taken the task: an explicit acceptance, only a delivery receipt from the transport, or nothing."},"sender_releases":{"enum":["on_acceptance","on_send"],"description":"When the sender lets go of the task: on the receiver’s acceptance or as soon as it sends."},"acceptance_window":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"How long the sender waits for acceptance before it acts, such as 5 minutes."},"acceptance_recorded":{"type":"boolean","description":"Each acceptance is written to a record the owner can read."}}},"description":"Each sender-to-receiver route in the handoff flow."},"transfers":{"type":"array","minItems":0,"maxItems":1000,"items":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"route":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The route it took, by name."},"sent_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"accepted_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"released_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"When the sender let go of the task."}}},"description":"Handoffs made on these routes, with when each was sent, accepted and released."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["routes","transfers","findings","fixes"],"verdicts":["work_can_drop","acceptance_gaps","acceptance_unverified","held_until_accepted"]},"wever_context-transfer-check":{"path":"/api/context-transfer-check","kind":"check","receipt_type":"wever.context-transfer-check.v1","schema":{"type":"object","additionalProperties":false,"required":["fields"],"properties":{"format":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The handoff format, such as the task envelope the planner sends."},"fields":{"type":"array","minItems":0,"maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The field, such as objective."},"carries":{"enum":["goal","state","decisions","limits","open_questions","other"],"description":"The part of the context it carries: the goal, the current state, the decisions already made, the limits the task runs under, the open questions or something else."},"required":{"type":"boolean","description":"The format refuses a handoff without this field."}}},"description":"Each field the format carries."},"receiver_fills":{"type":"array","minItems":0,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["element","how"],"properties":{"element":{"enum":["goal","state","decisions","limits","open_questions"],"description":"The part of the context."},"how":{"enum":["asks_sender","reads_record","reconstructs","assumes"],"description":"How the receiver gets it when the format does not carry it: asks the sender, reads a shared record, reconstructs it from history or assumes it."}}},"description":"How the receiving agent fills each part the format leaves out."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["elements","travels","left_to_receiver","findings","fixes"],"verdicts":["receiver_guesses","transfer_gaps","transfer_unverified","context_travels"]},"wever_receiver-identity-check":{"path":"/api/receiver-identity-check","kind":"check","receipt_type":"wever.receiver-identity-check.v1","schema":{"type":"object","additionalProperties":false,"required":["routes"],"properties":{"registry":{"type":"array","minItems":0,"maxItems":200,"items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The agent’s registered name."},"record":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"Its registry record, such as an agent id."},"endpoints":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"Its registered endpoints."}}},"description":"The registered agents, each with its record and endpoints."},"routes":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["name","receiver"],"properties":{"name":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The route, such as planner to booker."},"receiver":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The agent the sender means to hand the task to."},"addressed_by":{"enum":["registered_name","fixed_endpoint","discovery","reply_to","any_responder"],"description":"How the sender reaches the receiver: its registered name resolved through the registry, a fixed endpoint, discovery, the reply-to address in a message, or whichever endpoint answers."},"endpoint":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The address the task goes to."},"verified_by":{"type":"array","minItems":0,"maxItems":4,"items":{"enum":["registry_record","signature","credential","mutual_tls"]},"description":"How the receiver’s identity is checked: against its registry record, by its signature, by its credential or by mutual TLS."},"verified_when":{"enum":["before_transfer","after_transfer","never"],"description":"When the check runs: before the task moves, after, or never."},"on_mismatch":{"enum":["refuse","warn","proceed"],"description":"What the sender does when the receiver does not match its record."}}},"description":"Each handoff route with how its receiver is addressed and verified."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["routes","registry","findings","fixes"],"verdicts":["any_endpoint_receives","identity_gaps","identity_unverified","receiver_verified"]},"wever_handoff-failure-check":{"path":"/api/handoff-failure-check","kind":"check","receipt_type":"wever.handoff-failure-check.v1","schema":{"type":"object","additionalProperties":false,"required":["routes"],"properties":{"routes":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The route, such as planner to booker."},"from":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The sending agent."},"to":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The receiving agent."},"on_refusal":{"enum":["returns_to_sender","moves_to_fallback","escalates","retries","dropped"],"description":"Where the task goes when the receiver refuses it."},"on_failure":{"enum":["returns_to_sender","moves_to_fallback","escalates","retries","dropped"],"description":"Where the task goes when the receiver fails mid-task."},"on_silence":{"enum":["returns_to_sender","moves_to_fallback","escalates","retries","dropped"],"description":"Where the task goes when the receiver goes quiet."},"silence_after":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"How long without word counts as silence, such as 15 minutes."},"fallback":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The named fallback the task moves to."},"escalate_to":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"Who an escalation goes to."},"escalate_to_kind":{"enum":["named_person","role","channel","agent"]},"defined_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"When this path was written down."},"first_failure_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"When a receiver on this route first refused, failed or went quiet."}}},"description":"Each handoff route with where the task goes when the receiver refuses, fails or goes quiet."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["routes","paths","findings","fixes"],"verdicts":["no_road_back","failure_path_gaps","failure_path_unverified","road_back_defined"]},"wever_chain-of-custody-check":{"path":"/api/chain-of-custody-check","kind":"check","receipt_type":"wever.chain-of-custody-check.v1","schema":{"type":"object","additionalProperties":false,"required":["task","hops"],"properties":{"task":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The task."},"hops":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","additionalProperties":false,"required":["holder"],"properties":{"holder":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The agent or person holding the task at this step."},"received_from":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"received_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"released_to":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"released_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"changed":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"What this holder changed, such as revised the itinerary."},"evidence":{"enum":["record","self_report","memory"],"description":"Where this step comes from: a record written at the time, the holder’s own report, or someone’s memory."}}},"description":"Each step in order, from the first holder to the last."},"current_holder":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"Where the task sits now, as the owner or the system states it."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["hops","trace","current","findings","fixes"],"verdicts":["custody_unreconstructable","custody_gaps","custody_unverified","custody_traced"]},"wever_fleet-roster-check":{"path":"/api/fleet-roster-check","kind":"check","receipt_type":"wever.fleet-roster-check.v1","schema":{"type":"object","additionalProperties":false,"required":["lists"],"properties":{"as_of":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The date the roster is read at."},"lists":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The list, such as the platform team sheet."},"authoritative":{"type":"boolean","description":"The organisation names this list as its one roster of agents."},"keeper":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"Who keeps the list."},"updated":{"enum":["on_change","scheduled","ad_hoc","never"],"description":"How the list is kept current: on each change, on a schedule, now and then, or never."},"last_updated":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"agents":{"type":"array","minItems":0,"maxItems":500,"items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The agent, by the name the organisation uses."},"owner":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The person who owns the agent."}}},"description":"The agents the list names."}}},"description":"Each list of agents the organisation keeps."},"changes":{"type":"array","minItems":0,"maxItems":1000,"items":{"type":"object","additionalProperties":false,"required":["agent","change"],"properties":{"agent":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"change":{"enum":["added","changed","retired"],"description":"The agent was added, changed or retired."},"at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"reflected_at":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"When the roster showed the change."}}},"description":"Agents added, changed or retired, with when the roster showed each."},"update_window":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"How soon a change should reach the roster, such as 2 days."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["lists","roster","changes","findings","fixes"],"verdicts":["fleet_known_anecdotally","roster_gaps","roster_unverified","single_current_roster"]},"wever_handoff-scope-check":{"path":"/api/handoff-scope-check","kind":"check","receipt_type":"wever.handoff-scope-check.v1","schema":{"type":"object","additionalProperties":false,"required":["delegations"],"properties":{"sender":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The sending agent."},"sender_access":{"type":"object","additionalProperties":false,"required":[],"properties":{"tools":{"type":"array","minItems":0,"maxItems":100,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"Tools the sender can call, by name."},"data":{"type":"array","minItems":0,"maxItems":100,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"Data sets the sender can reach, by name."},"spend":{"anyOf":[{"type":"number","minimum":0,"maximum":1000000000000000},{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"}],"description":"The most the sender may spend, such as 200 USDC."}}},"delegations":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["task"],"properties":{"task":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The task handed over."},"receiver":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","description":"The agent it goes to."},"needs":{"type":"object","additionalProperties":false,"required":[],"properties":{"tools":{"type":"array","minItems":0,"maxItems":100,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"Tools the task needs, by name."},"data":{"type":"array","minItems":0,"maxItems":100,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"Data sets the task needs, by name."},"spend":{"anyOf":[{"type":"number","minimum":0,"maximum":1000000000000000},{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"}],"description":"The most the task needs to spend, such as 200 USDC."}}},"grant":{"type":"object","additionalProperties":false,"required":[],"properties":{"tools":{"type":"array","minItems":0,"maxItems":100,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"Tools the receiver gets, by name."},"data":{"type":"array","minItems":0,"maxItems":100,"items":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"description":"Data sets the receiver gets, by name."},"spend":{"anyOf":[{"type":"number","minimum":0,"maximum":1000000000000000},{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"}],"description":"The most the receiver may spend."},"via":{"enum":["scoped_grant","receiver_own","shared_credential","sender_credential"],"description":"How the access reaches the receiver: a grant made for the task, the receiver’s own standing access, a credential several agents share, or the sender’s own credential."},"ends":{"enum":["task_end","fixed_expiry","never"],"description":"When the receiver’s access ends: with the task, at a fixed time, or never."},"can_redelegate":{"type":"boolean","description":"The receiver can pass the access on to another agent."}}}}},"description":"Each task handed to another agent, with what it needs and what the receiver gets."},"label":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"Optional name recorded in the report."}}},"reads":"material in the call","elements":["delegations","excess","findings","fixes"],"verdicts":["sender_access_travels","scope_gaps","scope_unverified","scoped_to_task"]}},"free_tools":{"endpoint":"https://weverlabs.com/mcp-free","output":"unsigned; the final line names the main /mcp tools","tools":{"wever_handoff-snapshot":{"reads":"one task’s handoff state as supplied","returns":"the task, its current holder and its state, as one plain record"},"wever_fleet-roster-sample":{"samples":"wever_fleet-roster-check","reads":"up to 5 agent lists of up to 50 agents each","returns":"whether a single roster exists, whether each agent names an owner, and the count"}}},"limits":{"all_supplied_text":"512 KB per call","report":"1 MB","max_request_bytes":3211264,"handoffs":1000,"observed":1000,"constraints":20,"routes":100,"transfers":1000,"fields":50,"registry":200,"endpoints":20,"hops":200,"lists":20,"agents":500,"changes":1000,"delegations":50,"names":100},"material":"Each tool reads only the material in the call: a system’s task handoff records with task moves seen in other logs, a handoff flow with its acceptance and failure paths, a handoff format with how the receiver fills what it leaves out, a handoff addressing setup with the registry behind it, one task’s steps through several agents, an organisation’s lists of agents with the changes to its fleet, or a delegation setup with what each task needs and what each receiver gets. Every status, match and verdict is decided from that material; the report makes no network request or fetch, calls no provider, reads no chain, hands off no task and grants no access, and moves no money, writes nothing outside the report, contacts no agent or counterparty and changes no configuration.","basis":"This report reads only the handoff records, routes, formats, addresses, failure paths, custody steps, rosters and delegations in the material in the call, and decides every status, match and verdict from them.","related":{"job_handoff_pack":"wever_job-handoff-pack","agent_to_agent_handoff_pack":"wever_agent-to-agent-handoff-pack","handover":"wever_handover-check","result_validation":"wever_result-validation-check","deliverable":"wever_deliverable-check","context_sharing":"wever_context-sharing-check","agent_identity":"wever_agent-identity-check","agent_registry":"wever_agent-registry-check","delegated_identity":"wever_delegated-identity-check","breach_path":"wever_breach-path-check","incident_ownership":"wever_incident-ownership-check","approval_chain":"wever_approval-chain-check","incident_evidence":"wever_incident-evidence-check","discovery_coverage":"wever_discovery-coverage-check","read_only_scope":"wever_read-only-scope-check","authority_scope":"wever_authority-scope-check"},"pricing":{"network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","pricesAtomic":{"/api/handoff-record-check":"100000","/api/handoff-acceptance-check":"100000","/api/context-transfer-check":"100000","/api/receiver-identity-check":"100000","/api/handoff-failure-check":"100000","/api/chain-of-custody-check":"100000","/api/fleet-roster-check":"100000","/api/handoff-scope-check":"100000"},"x402Version":2,"scheme":"exact","freeTier":{"calls":10,"windowDays":30,"scope":"all_paid_endpoints","walletProofMaxAgeSeconds":300}},"wallet_proof":"Sign the exact JSON arguments and the tool route with X-Wever-Wallet-Proof. Retry an unchanged payment or wallet-proof request to recover its stored report.","signing":{"issuer":"https://weverlabs.com/api/agent-handoffs-contract","key_id":"wever-trust-20261001","public_jwk":{"crv":"Ed25519","x":"PG6bYTJfqh-Y7YEMzxNVhMsFkrO1XnX7djPUvNi9g_U","kty":"OKP"},"algorithm":"Ed25519","receipt_types":{"handoff-record-check":"wever.handoff-record-check.v1","handoff-acceptance-check":"wever.handoff-acceptance-check.v1","context-transfer-check":"wever.context-transfer-check.v1","receiver-identity-check":"wever.receiver-identity-check.v1","handoff-failure-check":"wever.handoff-failure-check.v1","chain-of-custody-check":"wever.chain-of-custody-check.v1","fleet-roster-check":"wever.fleet-roster-check.v1","handoff-scope-check":"wever.handoff-scope-check.v1"},"jwt_type":"wever-agent-handoffs+jwt","digest":"SHA-256 of UTF-8 JSON.stringify(report), preserving returned property order. Verify the JWS signature and the report_sha256 and subject_sha256 claims."}}