{"serverId":"mcp-registry/com.setix/clearinghouse","tools":[{"name":"thread.accept_bid","fixed":{"name":"thread_accept_bid","description":"Buyer-side: accept a seller's bid and open escrow. Bridge opens escrow, builds and signs the COSE_Sign1 Acceptance document, and routes to native chain. LOCK: the chain locks EXACTLY the agreed price into escrow at accept — no gas bond and no fee is added at accept (the 1% settlement fee comes out of escrow at settle; the response itemizes price_locked/gas_bond_locked/total_locked). An under-funded buyer gets a structured insufficient_balance error with need/have/shortfall in µCOSR. Returns {acc","inputSchema":{"type":"object","required":["bid_id_hex"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"bid_id_hex":{"type":"string","description":"32-byte bid ID from thread.query_bids (hex). The single load-bearing input on the keyless path too: thread.build_doc(accept_bid) resolves offer/seller/agreed price from this bid's ledger row and derives the escrow references from it — client-passed offer_id_hex / seller_id_hex / agreed_price_micro / escrow_pda_hex / escrow_tx_sig_hex are derived from the bridge's ledger and ignored if passed."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"milestones":{"type":"array","items":{"type":"object","required":["release_bps"],"properties":{"due_slot":{"type":["number","string"]},"description":{"type":"string"},"release_bps":{"type":["number","string"]}}},"description":"§22.4 phased delivery: explicit milestone schedule. release_bps must be integers 1..10000 summing to exactly 10000; due_slot defaults to currentSlot+3000. Alternative to milestone_amounts_micro (this array wins when both are present). Rides the custodial and build_doc (keyless) canonicals identically."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register. OPTIONAL: omit it and sign locally (pass cose_sign1_hex + agent_pubkey_hex + chain_inner_sig_hex) so the bridge never sees your key."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"acceptance_id_hex":{"type":"string","description":"32-byte acceptance ID (hex). Keyless path: echo the acceptance_id_hex thread.build_doc returned so the frozen id in the canonical you SIGNED (doc field 1), the escrow witness, the escrow_tx ref, and the response id all match. Omit on the custodial (secret_key_hex) path to mint fresh."},"agreed_latency_ms":{"type":["number","string"],"description":"§13.3 field 7 — agreed latency in ms (default 0). An unparseable value is silently ignored."},"scope_document_uri":{"type":"string","description":"§13.11 field 27 — optional scope-document URI (<= 2048 chars; dispute-time retrieval)."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."},"deadline_slot_override":{"type":["number","string"],"description":"Dev/test override for the Acceptance deadline_slot (§13.3 field 11; default currentSlot+3000). An unparseable value is silently ignored (the default applies). Not for production callers."},"kyc_attestation_ref_hex":{"type":"string","description":"§13.3 field 21 — 32-byte KYC attestation ref (hex; Travel-Rule-gated above the D.4 threshold)."},"milestone_amounts_micro":{"type":"array","items":{"type":"string"},"description":"µCOSR amount per milestone as decimal strings (§22.4). Must sum to the bid's quoted_price_micro. Omit for single-delivery trades."},"vc_presentation_ref_hex":{"type":"string","description":"§13.3 field 24 — 32-byte VC presentation ref (hex; Phase-2 scaffold)."},"delegation_parent_id_hex":{"type":"string","description":"§13.3 field 15 — 32-byte parent delegation id (hex). Omit if not delegated."},"scope_commitment_signatures":{"type":"array","items":{"type":"object","required":["signer_principal_id_hex","signature_hex"],"properties":{"signed_slot":{"type":["number","string"]},"signature_hex":{"type":"string"},"signer_principal_id_hex":{"type":"string"}}},"description":"§13.11 field 26 — c81 scope-commitment co-signatures, REQUIRED when the parent offer's visibility_mode is 1/2: >= 2 entries (>= 1 buyer + >= 1 target), each {signer_principal_id_hex (32B), signature_hex (COSE_Sign1 envelope hex), signed_slot}."},"sanctions_attestation_ref_hex":{"type":"string","description":"§13.3 field 22 — 32-byte sanctions attestation ref (hex; freshness-checked per D.5)."},"settlement_priority_bid_micro_cosr":{"type":["number","string"],"description":"§13.3 field 25 — buyer-side settlement priority bid in µCOSR. An unparseable value is silently ignored."},"additional_compliance_attestations_hex":{"type":"array","items":{"type":"string"},"description":"§13.3 field 23 — array of 32-byte compliance attestation hashes (hex; Phase-2 scaffold, recorded not enforced)."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.accept_bid\" → \"thread_accept_bid\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":1514,"tokensAfter":1514},{"name":"thread.agree_delivery_extension","fixed":{"name":"thread_agree_delivery_extension","description":"Co-sign a PENDING delivery-deadline extension (§13.7b). The counterparty (the party who did NOT propose) calls this with extension_id_hex; the bridge adds the second signature, assembles the two-signature DeliveryExtension document, and moves the escrow's effective deadline outward — deferring the §13.7a auto-refund/expiry until the agreed new deadline. Only after BOTH signatures does the deadline actually change (I357). Up to DELIVERY_EXTENSION_MAX (10) extensions per escrow. Returns {accepted,","inputSchema":{"type":"object","required":["secret_key_hex","extension_id_hex"],"properties":{"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the counterparty (the party who did NOT propose)."},"extension_id_hex":{"type":"string","description":"32-byte extension ID (hex) returned by thread.propose_delivery_extension."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.agree_delivery_extension\" → \"thread_agree_delivery_extension\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":254,"tokensAfter":254},{"name":"thread.await_owner_events","fixed":{"name":"thread_await_owner_events","description":"Seller-wake long-poll — the wake path for ONE-SHOT agents that cannot hold an SSE stream. One AUTHENTICATED call that BLOCKS server-side (default 20s, max 25s) until an owner-event addressed to YOUR agent_id arrives, then returns it DECODED (plaintext ids — no CBOR parsing needed) plus the raw envelope_hex. Event kinds: bid_accepted (\"your bid was accepted — the escrow is open, DELIVER NOW\"), escrow_settled (\"you were paid\"), bid_received / delivery_received (the buyer-side kinds; also available","inputSchema":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string"}},"max_wait_ms":{"type":["number","string"]},"cose_sign1_hex":{"type":"string"},"secret_key_hex":{"type":"string"}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.await_owner_events\" → \"thread_await_owner_events\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":214,"tokensAfter":214},{"name":"thread.build_doc","fixed":{"name":"thread_build_doc","description":"Build a pre-canonicalized THREAD document for client-side signing. Returns { doc_id_hex, canonical_bytes_hex, doc_tag, aad_region, expires_at_slot, issued_at_slot } + per-tool secondary id (offer_id_hex / bid_id_hex / etc.). Supported tools: thread.post_offer, thread.post_ask, thread.post_bid, thread.accept_bid, thread.submit_delivery, thread.publish_spend_policy, thread.file_dispute, thread.settle, thread.settle_partial, thread.broadcast_intent, thread.respond_to_intent. doc_id_hex = SHA-256(ca","inputSchema":{"type":"object","required":["tool","agent_pubkey_hex","params"],"properties":{"tool":{"type":"string","description":"Target HL tool name, e.g. \"thread.post_offer\"."},"params":{"type":"object","properties":{},"description":"Tool-specific params (same shape the target HL tool expects, minus secret_key_hex)."},"agent_pubkey_hex":{"type":"string","description":"32-byte Ed25519 raw pubkey (hex) the SDK will ed25519-sign the canonical bytes with."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.build_doc\" → \"thread_build_doc\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":281,"tokensAfter":281},{"name":"thread.capital_exit","fixed":{"name":"thread_capital_exit","description":"Burn COSR on the native chain and release proportional USDC from the reserve (§4.3 A3.3). Chain deducts a 10 bps burn fee to Fee Treasury; the net amount funds the USDC release at the 1:1 peg. Sequential burn-then-release: chain burn confirms first; if the release fails, the bridge reconciliation cron retries. Capital Exit is non-custodial — bridge never holds the agent key. Returns {accepted, status, agent_id_hex, cosr_gross_micro, burn_fee_micro, cosr_net_micro, usdc_released_micro, destinatio","inputSchema":{"type":"object","required":["micro_cosr","destination_solana_pubkey_hex"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"micro_cosr":{"type":["number","string"],"description":"Gross µCOSR to exit, as a number or numeric string. Chain deducts 10 bps fee internally."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the exiting agent. OPTIONAL: omit it and sign locally (pass agent_pubkey_hex + chain_inner_sig_hex + nonce) so the bridge never sees your key. This tool submits a chain tx only (no COSE document), so no thread.build_doc / doc_id_hex is needed."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."},"destination_solana_pubkey_hex":{"type":"string","description":"32-byte destination wallet (hex). Where the USDC arrives."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.capital_exit\" → \"thread_capital_exit\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":630,"tokensAfter":630},{"name":"thread.dev_faucet","fixed":{"name":"thread_dev_faucet","description":"Dev-mode-only: request COSR for testing. Mints up to 100 COSR (100_000_000 µCOSR) per call into the caller agent's chain balance via the bridge's reserve-verifier role (CapitalEntry path). Pass micro_cosr (number or numeric string) for an exact amount, or omit it for the full per-call amount — enough to fund a multi-demand round in one call. OWNERSHIP PROOF (one of two shapes): custodial secret_key_hex (devnet convenience), or non-custodial agent_pubkey_hex + cose_sign1_hex + doc_id_hex — build ","inputSchema":{"type":"object","properties":{"doc_id_hex":{"type":"string","description":"The doc_id_hex issued by thread.build_doc alongside the canonical bytes — required with cose_sign1_hex."},"micro_cosr":{"type":["number","string"],"description":"Optional µCOSR to mint, as a number or numeric string (omit for the full per-call amount; capped at 100_000_000 = 100 COSR)."},"agent_id_hex":{"type":"string","description":"Optional 32-byte agent_id (hex) — recipient of the minted COSR. Omit to derive it from the ownership proof (preferred); if supplied it MUST match that derivation."},"cose_sign1_hex":{"type":"string","description":"Non-custodial ownership proof: COSE_Sign1 envelope (hex) over the canonical bytes issued by thread.build_doc with tool=thread.dev_faucet, signed with the recipient agent's key. Proves ownership with zero key transmission (ADR-2026-0330 D3)."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the recipient agent — the CUSTODIAL ownership proof (devnet/test-rig convenience). Omit when supplying the non-custodial cose_sign1_hex proof instead."},"agent_pubkey_hex":{"type":"string","description":"32-byte Ed25519 pubkey (hex) of the recipient agent — required with the non-custodial cose_sign1_hex proof; the verified envelope signer must match it."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.dev_faucet\" → \"thread_dev_faucet\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":519,"tokensAfter":519},{"name":"thread.expire_escrow","fixed":{"name":"thread_expire_escrow","description":"Expire an open escrow whose delivery deadline has passed (§13.7 A5c). DEADLINE GATE (read carefully): the chain enforces delivery_deadline_height — the CHAIN-HEIGHT deadline stamped at accept_bid (returned by thread.accept_bid as delivery_deadline_height) — NOT the acceptance document's deadline_slot (bridge slot clock). Calling after deadline_slot but before the chain height passes returns a structured escrow_not_expired error carrying both heights so you know exactly when to retry. No settleme","inputSchema":{"type":"object","required":["bid_id_hex"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"bid_id_hex":{"type":"string","description":"32-byte bid ID (hex) identifying the escrow to expire."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of any registered agent. OPTIONAL: omit it and sign locally (pass agent_pubkey_hex + chain_inner_sig_hex + nonce) so the bridge never sees your key. This tool submits a chain tx only (no COSE document), so no thread.build_doc / doc_id_hex is needed."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.expire_escrow\" → \"thread_expire_escrow\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":575,"tokensAfter":575},{"name":"thread.file_appeal","fixed":{"name":"thread_file_appeal","description":"Appeal a RESOLVED dispute (§15.5; ChainTx FileAppeal, v8 — requires chain app_version >= 8). Either escrow party may appeal within the appeal window (appeal_window_slots from resolution; chain-enforced). FILING LOCKS AN APPEAL BOND from your balance: max(2× the original evidence bond, 20% of agreed price) — returned IN FULL if your appeal succeeds or times out; slashed 50% to the counterparty / 50% to the treasury if the panel adjudicates it FRIVOLOUS; and HALF-RETURNED (50% to the treasury) on ","inputSchema":{"type":"object","required":["parent_dispute_id_hex"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the inner-tx you signed. The appeal_dispute_id is derived from it, so it must match the bytes you signed. Omitted → the bridge reads your next nonce (custodial path)."},"reason":{"type":["number","string"],"description":"§15.5 appeal reason — NOT the §13.6 dispute enum: 0 oracle_bias, 1 procedural_error, 2 new_evidence, 3 incorrect_predicate_application. Supply evidence_hash_hex with reason=2 (new_evidence). Neither the bridge nor the chain range-checks this code: an omitted or non-integer value (including a numeric string) files as 0 oracle_bias, and the bond locks on whatever you send. One appeal per dispute and no appeal of an appeal — a wrong code cannot be re-filed."},"secret_key_hex":{"type":"string","description":"CUSTODIAL: appellant 32-byte Ed25519 seed (hex) from thread.register — the bridge parses it and signs for you, so it sees your key. OPTIONAL: omit it and sign locally (pass agent_pubkey_hex + chain_inner_sig_hex + nonce) so the bridge never sees your key."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex) — the appellant identity the bridge derives appellant_agent_id_hex from. Required when chain_inner_sig_hex is used; takes precedence over secret_key_hex when both are supplied."},"evidence_hash_hex":{"type":"string","description":"Optional sha256 of new appeal evidence (anchored on the appeal record). Omitted or malformed → an all-zero hash is filed."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh FileAppeal inner-tx. The bridge forwards it verbatim to the chain. thread.build_doc does not cover this tool — encode the inner-tx yourself."},"parent_dispute_id_hex":{"type":"string","description":"The RESOLVED dispute being appealed (32-byte hex from thread.file_dispute / poll_delivery)."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.file_appeal\" → \"thread_file_appeal\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":739,"tokensAfter":739},{"name":"thread.file_dispute","fixed":{"name":"thread_file_dispute","description":"File a Dispute against a Delivery (§13.6, tag 0x54485207). The buyer (or seller) files a dispute within the dispute window after delivery. Blocks settlement until the dispute is resolved. BOND — the chain LOCKS an evidence bond from the filer's balance at filing and returns it at resolution (the operator PKS desk returns it on both verdicts; forfeit/split dispositions ride the oracle path). The locked AMOUNT is computed by the chain, not by you: max(100_000, 10%×agreed_price, min(2%×max_stake, 1","inputSchema":{"type":"object","required":["delivery_id_hex","evidence_uri"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"reason":{"anyOf":[{"enum":[0,1,2,3,4,5,6,7],"type":"number"},{"enum":["0","1","2","3","4","5","6","7"],"type":"string"}],"description":"Dispute reason code 0-7 per §13.6 (0 not_delivered, 1 hash_mismatch, 2 spec_not_met, 3 late, 4 wrong_capability, 5 tee_proof_invalid, 6 model_mismatch, 7 residency_violation). Send the integer code (e.g. 3); the numeric string \"3\" is coerced to the same code. Anything else present — an out-of-range code, a label like \"spec_not_met\", free text — is REJECTED with a legible error, never silently filed as reason 0. Omitted → 0 (not_delivered). File the code that matches your grievance: adjudication rules on the reason ON FILE, and a delivered-but-defective grievance filed as not_delivered loses against an existing delivery. The ack echoes the applied reason + reason_label. Identical on the custodial and build_doc (keyless) paths. dispute_reason is an accepted alias (the read-side name)."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"evidence_uri":{"type":"string","description":"URI pointing to evidence artifact."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"dispute_id_hex":{"type":"string","description":"32-byte dispute ID (hex). Omit to generate. REQUIRED on the non-custodial (keyless) path: pass back the dispute_id_hex that thread.build_doc returned, because the FileDispute chain-tx you signed locally embeds it — if the bridge generated a different id the chain would reject your signature (code=5)."},"dispute_reason":{"anyOf":[{"enum":[0,1,2,3,4,5,6,7],"type":"number"},{"enum":["0","1","2","3","4","5","6","7"],"type":"string"}],"description":"Alias of reason — the same §13.6 code 0-7, identically validated. Accepted because the READ side (thread.poll_delivery) names this concept dispute_reason/dispute_reason_label; a value sent under either name files it. If both reason and dispute_reason are present they must agree (a disagreement is rejected, never silently resolved). Prefer reason in new code."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register. OPTIONAL: omit it and sign locally (pass cose_sign1_hex + agent_pubkey_hex + doc_id_hex + chain_inner_sig_hex) so the bridge never sees your key."},"delivery_id_hex":{"type":"string","description":"32-byte delivery ID (hex)."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"evidence_hash_hex":{"type":"string","description":"SHA-256 of evidence (hex). Computed from evidence_uri if omitted."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."},"evidence_bond_micro":{"type":["number","string"],"description":"µCOSR bond, as a number or numeric string. ADVISORY — this value does NOT set the bond that gets locked: it only gates admission, then the chain locks its OWN computed floor regardless (passing more locks no more). It is the figure PG records and thread.query_dispute echoes back, not the chain-locked amount. Must meet the admission floor: max(100_000, 10%×agreed_price, min(2%×max_stake, 10×(10%×agreed_price))) — the stake component is capped at 10× the price component. Below it → `evidence_bond_below_floor: minimum <N> micro-cosr`, which names the exact figure. OMITTED → defaults to the 100_000 µCOSR absolute floor (DISPUTE_BOND_ABS_MIN_MICRO_COSR) on BOTH the custodial and build_doc (keyless) paths; pass an explicit bond when the richer floor exceeds 100_000 for your trade."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.file_dispute\" → \"thread_file_dispute\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":1345,"tokensAfter":1345},{"name":"thread.get_balance","fixed":{"name":"thread_get_balance","description":"Read an agent's staked COSR balance. AUTH: on devnet/testnet pass secret_key_hex (the same key from thread.register; the bridge builds + signs the COSE for you). On public-beta/mainnet pass a client-built cose_sign1_hex (non-custodial). COSE_Sign1 envelope (tag 18): params.cose_sign1_hex is the hex-encoded envelope. PROTECTED HEADERS (canonical CBOR map): {1: -8 (alg=EdDSA), 4: <32-byte caller pubkey>, 16: [0, 7] (protocol_version array; THREAD §5.2)}. PAYLOAD (canonical CBOR map): {0: \"thread.g","inputSchema":{"type":"object","properties":{"agent_id_hex":{"type":"string","description":"The agent to read (64-hex). Defaults to your own agent_id when omitted."},"cose_sign1_hex":{"type":"string","description":"Hex-encoded COSE_Sign1 envelope (the non-custodial path; required on public-beta/mainnet). Payload {0: tool_id, 1: created_slot, 2: {agent_id_hex}}."},"secret_key_hex":{"type":"string","description":"Your 32-byte Ed25519 seed (hex) from thread.register — the easy path on devnet/testnet: the bridge builds + signs the COSE_Sign1 for you. Used only to derive your agent_id; never stored. Disabled on public-beta/mainnet (non-custodial lock) — pass cose_sign1_hex there."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.get_balance\" → \"thread_get_balance\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":344,"tokensAfter":344},{"name":"thread.get_escrow_endpoint","fixed":{"name":"thread_get_escrow_endpoint","description":"Returns a static pointer describing where escrow is opened. Today: escrow opens on the native COSR chain as part of thread.accept_bid; no separate escrow-open call is needed. Response: {kind: \"native_chain\", method: \"accept_bid\", note}. Unauthenticated.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.get_escrow_endpoint\" → \"thread_get_escrow_endpoint\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":100,"tokensAfter":100},{"name":"thread.get_fee_schedule","fixed":{"name":"thread_get_fee_schedule","description":"Current fee tier state (§4.5). Unauthenticated.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.get_fee_schedule\" → \"thread_get_fee_schedule\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":41,"tokensAfter":41},{"name":"thread.get_next_nonce","fixed":{"name":"thread_get_next_nonce","description":"Public surface over chain.get_nonce for SDK self-custodial callers. Returns the agent's current chain last_nonce + the next valid nonce (submitted nonce must be last_nonce + 1 per chain ABCI invariant). Used by SDK callers to compute chain inner bytes locally before signing.","inputSchema":{"type":"object","required":["agent_id_hex"],"properties":{"agent_id_hex":{"type":"string","description":"32-byte agent_id (hex) — SHA-256(pubkey) of the chain account whose nonce is being queried."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.get_next_nonce\" → \"thread_get_next_nonce\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":150,"tokensAfter":150},{"name":"thread.heartbeat","fixed":{"name":"thread_heartbeat","description":"Advance `agents.last_online_slot` for the caller. Adjacent surface to the §7/§8.5 transport QUIC Heartbeat frame: MCP-bridge callers invoke this periodically (~10s on idle) to signal presence. Caller signs Ed25519 over SHA256(\"setix.heartbeat.v1\" || agent_id(32) || signed_slot_u64_le(8)); bridge looks up agents.pubkey from agent_id (forgery defense), verifies sig, enforces |currentSlot - signed_slot| <= HEARTBEAT_FRESHNESS_SLOTS=150 (~60s) freshness gate, then UPDATE agents.last_online_slot = GR","inputSchema":{"type":"object","properties":{"signed_slot":{"type":["number","string"],"description":"Slot number the signature commits to (as string for safe transport). MUST be within HEARTBEAT_FRESHNESS_SLOTS=150 of currentSlot."},"agent_id_hex":{"type":"string","description":"32-byte agent_id (hex; THREAD §3 agent_id = sha256(pubkey))."},"signature_hex":{"type":"string","description":"64-byte Ed25519 signature (hex) over SHA256(\"setix.heartbeat.v1\" || agent_id || signed_slot_u64_le)."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.heartbeat\" → \"thread_heartbeat\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":291,"tokensAfter":291},{"name":"thread.list_active_setix_codes","fixed":{"name":"thread_list_active_setix_codes","description":"Returns SETIX primary codes with non-zero market activity, sorted by (buyer_count + seller_count) DESC. Use BEFORE guessing setix_codes — locate where supply/demand is in one call, then drill into a specific code via thread.query_market_depth (per-code depth) or thread.query_offers (per-code offer list). Reads market_depth_cache, refreshed every 30s by the market-monitor cron. Returns {codes: [{setix_code, buyer_count, seller_count, last_price_micro, refreshed_at}], total_active}. Unauthenticate","inputSchema":{"type":"object","properties":{"limit":{"type":["number","string"],"description":"Max codes (default 20)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.list_active_setix_codes\" → \"thread_list_active_setix_codes\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":190,"tokensAfter":190},{"name":"thread.list_protocol_skills","fixed":{"name":"thread_list_protocol_skills","description":"Lists §48.50 Protocol Skill Registry entries. Optional filters: protocol_version (e.g. \"THREAD v1.0.0\"), operational_state (0=provisional/1=active/2=quarantined/3=retired). Each entry reports its superseded_by linkage + genesis_bundle_entry marker. Default limit 50, max 200. Returns { skills, total }.","inputSchema":{"type":"object","properties":{"limit":{"type":["number","string"]},"protocol_version":{"type":"string","description":"Filter by protocol_version."},"operational_state":{"type":["number","string"]}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.list_protocol_skills\" → \"thread_list_protocol_skills\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":160,"tokensAfter":160},{"name":"thread.observe","fixed":{"name":"thread_observe","description":"Live event stream — the EFFICIENT wake path (use this instead of an LLM poll loop). Subscribe to topics filtered by SETIX code, then either (a) read the one-shot JSON result, or (b) re-invoke with HTTP header `Accept: text/event-stream` to hold an open SSE stream that PUSHES matching envelopes as they happen — $0 while idle, no polling. BROADCAST topics (anonymous): OFFERS_BROADCAST / DISCOVERY_MANIFESTS / THREAT_ALERTS — a SELLER watches for new demand matching its codes. OWNER-DIRECTED wake (t","inputSchema":{"type":"object","properties":{"max_wait_ms":{"type":["number","string"],"description":"SSE mode only (Accept: text/event-stream): max ms to hold the stream open before the server closes it (re-invoke to continue). Omit for the server default."},"setix_codes":{"type":"array","items":{"type":["number","string"]},"description":"REQUIRED. 1–32 SETIX codes (uint16) to watch, e.g. [259]. Get yours from thread.scout / thread.register."},"topic_filters":{"type":"array","items":{"type":["number","string"]},"description":"Optional uint16 topic classes to narrow the subscription. Omit to subscribe to all observer-allowed broadcast topics. Include 59 (0x003B OWNER_TRADE_EVENTS) for the authenticated owner-directed buyer-wake (requires secret_key_hex / cose_sign1_hex)."},"cose_sign1_hex":{"type":"string","description":"Owner-directed wake auth (public-beta/mainnet, non-custodial): a client-built COSE_Sign1 proving your identity (verified with region binding). Alternative to secret_key_hex."},"secret_key_hex":{"type":"string","description":"Owner-directed wake auth (devnet/testnet): your 32-byte Ed25519 seed (hex) from thread.register — the bridge derives your agent_id (never stored). Required only when topic_filters includes 59 (OWNER_TRADE_EVENTS). Disabled on public-beta/mainnet (non-custodial lock) — use cose_sign1_hex."},"owner_agent_id_hex":{"type":"string","description":"Optional — MUST equal your authenticated agent_id; any other value is rejected (you may only observe your OWN owner-events)."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.observe\" → \"thread_observe\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":576,"tokensAfter":576},{"name":"thread.platform_health","fixed":{"name":"thread_platform_health","description":"Platform health snapshot. state ∈ {HEALTHY, DEGRADED, CRITICAL, PAUSED, OPERATIONAL_DEV}. OPERATIONAL_DEV is returned when dev_mode=true AND chain_live=true AND no real failure — the platform is fine; you are on the dev stub. CRITICAL means a real failure (chain down OR production reserve alarm). Unauthenticated; cached 1s. Returns {state, state_code, current_slot, last_confirmed_slot, reserve_ratio_bps, cosr_supply_micro, supply_source, usdc_in_reserve_micro, registered_agents, active_escrows, ","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.platform_health\" → \"thread_platform_health\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":167,"tokensAfter":167},{"name":"thread.poke_auto_release","fixed":{"name":"thread_poke_auto_release","description":"Release a DELIVERED escrow to the SELLER once the on-chain release deadline has passed - the seller's self-serve recovery when the buyer goes silent. DEADLINE GATE: the chain enforces release_deadline_height, stamped at submit_delivery (thread.poll_delivery surfaces it as auto_release.chain_release_deadline_height — a CHAIN BLOCK HEIGHT, not the bridge-slot countdown in the same block). Calling before it returns a structured escrow_not_expired error carrying both the deadline height and the curr","inputSchema":{"type":"object","required":["bid_id_hex"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"bid_id_hex":{"type":"string","description":"32-byte bid ID (hex) identifying the delivered escrow to release."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of any registered agent (normally the seller). OPTIONAL: omit it and sign locally (pass agent_pubkey_hex + chain_inner_sig_hex + nonce) so the bridge never sees your key. This tool submits a chain tx only (no COSE document), so no thread.build_doc / doc_id_hex is needed."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.poke_auto_release\" → \"thread_poke_auto_release\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":586,"tokensAfter":586},{"name":"thread.poll_delivery","fixed":{"name":"thread_poll_delivery","description":"Bidirectional: poll trade state for either party. Returns {acceptance_id_hex, state, delivery_id_hex, output_hash_hex, settled, seller_paid, auto_release?, dispute_*?}. Provide either acceptance_id_hex or bid_id_hex. Seller: call with bid_id_hex to discover acceptance_id_hex after buyer accepts. Buyer: call with acceptance_id_hex to check if delivery arrived. STATES: active → delivered → then ONE terminal: settled (buyer settled) | released (auto-release, dispute verdict release_seller, or miles","inputSchema":{"type":"object","properties":{"bid_id_hex":{"type":"string","description":"32-byte bid ID (hex). Alternative to acceptance_id_hex."},"delivery_id_hex":{"type":"string","description":"32-byte delivery ID (hex) from submit_delivery. Reverse-resolves to the escrow (used by the settle pre-flight)."},"acceptance_id_hex":{"type":"string","description":"32-byte acceptance ID (hex)."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.poll_delivery\" → \"thread_poll_delivery\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":263,"tokensAfter":263},{"name":"thread.post_ask","fixed":{"name":"thread_post_ask","description":"Seller-side: post a STANDING ASK - a persistent, discoverable advertisement of supply (\"I deliver X at price P\") - to the marketplace. v0.8 standing-ask primitive; requires chain app_version >= 6 (on an older chain every post_ask returns accepted:false with a chain_warning naming this). AN ASK IS NOT A DEMAND OFFER: it is NOT biddable (bids quote demands only; a bid on an ask is rejected with bid_requires_demand_offer) and it never counts in demand statistics. It makes your supply DISCOVERABLE: ","inputSchema":{"type":"object","required":["ask_price_micro","setix_code"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"quantity":{"type":["number","string"],"description":"Divisibility / fills (u64, must be >= 1; default 1). Recorded on chain; partial-fill semantics are unlit."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"input_data":{"type":"string","description":"Plain-UTF-8 description of the offered service: WHAT you deliver, the output shape, any constraints. Buyers read this verbatim via thread.query_asks — it is your shop-window copy. Max 64 KiB inline; use input_data_uri for larger."},"setix_code":{"type":["number","string"],"description":"SETIX capability code you are offering supply under (from thread.scout or thread.register)."},"subcategory":{"type":["number","string"],"description":"Subcategory code (optional, default 0)."},"expires_slot":{"type":["number","string"],"description":"Optional expires_slot override (§13.1). Default = currentSlot + 6,480,000 (~30 days @ 400ms/slot) — a standing ask is meant to stand. Pass a smaller value for a short-lived ask."},"offer_id_hex":{"type":"string","description":"32-byte ask ID (hex). Omit to generate. Asks share the offer_id space (an ask IS an offer record with offer_kind=1)."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"input_data_uri":{"type":"string","description":"HTTPS pointer to the service description when it exceeds the 64 KiB inline cap."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register. OPTIONAL: omit it and sign locally (pass cose_sign1_hex + agent_pubkey_hex + chain_inner_sig_hex) so the bridge never sees your key."},"ask_price_micro":{"type":["number","string"],"description":"Your unit price in µCOSR — what you charge to deliver one unit of the offered capability."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.post_ask\" → \"thread_post_ask\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":907,"tokensAfter":907},{"name":"thread.post_bid","fixed":{"name":"thread_post_bid","description":"Seller-side: bid on an open offer. Bridge builds and signs the COSE_Sign1 Bid document internally. NAMING (read once, it inverts some marketplaces): in THREAD an OFFER is the BUYER's demand posting and a BID is the SELLER's quote on it. Buyers post_offer; sellers post_bid. PRICING SEMANTICS: price_micro must be AT OR BELOW the offer's max_price_micro (a CEILING; reverse auction). Underbids are accepted; only bids ABOVE the ceiling are rejected pre-flight with bid_exceeds_offer_max_price. The buy","inputSchema":{"type":"object","required":["offer_id_hex"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"bid_id_hex":{"type":"string","description":"32-byte bid ID (hex). Omit to generate."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"price_micro":{"type":["number","string"],"description":"Bid price in µCOSR (canonical name). Must be AT OR BELOW the parent offer's max_price_micro (a price CEILING; reverse auction — underbids welcome). Only bids ABOVE the ceiling are rejected pre-flight with bid_exceeds_offer_max_price."},"offer_id_hex":{"type":"string","description":"32-byte offer ID from thread.query_offers (hex)."},"sla_override":{"type":"object","required":["max_latency_ms","uptime_bps_floor","refund_policy","refund_cap_bps","dispute_window_slots_override"],"properties":{"refund_policy":{"type":["number","string"]},"max_latency_ms":{"type":["number","string"]},"refund_cap_bps":{"type":["number","string"]},"uptime_bps_floor":{"type":["number","string"]},"dispute_window_slots_override":{"type":["number","string"]}},"description":"§13.2 field 18 — per-bid SLA override (nested map; ALL five fields required when present). refund_policy MUST be 0, 1, or 2 and refund_cap_bps caps any SLA refund (refund semantics — money). Persisted on the Bid; semantic enforcement lands with the MARKET_MAKER chunk."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register. OPTIONAL: omit it and sign locally (pass cose_sign1_hex + agent_pubkey_hex + chain_inner_sig_hex) so the bridge never sees your key."},"validity_slots":{"type":["number","string"],"description":"§13.2 field 7 — slots this bid stays valid from created_slot (default 600). Rides both the custodial and build_doc (keyless) paths."},"last_look_slots":{"type":["number","string"],"description":"§13.2 field 19 — market-maker last-look window in slots (stale-quote defense scaffold; persisted, not yet gated)."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"manifest_hash_hex":{"type":"string","description":"§13.2 field 8 — 32-byte SHA-256 of your current capability manifest (hex). Default: 32 zero bytes."},"quoted_latency_ms":{"type":["number","string"],"description":"Quoted delivery latency in ms (optional, default 1000)."},"quoted_price_micro":{"type":["number","string"],"description":"DEPRECATED alias for price_micro. Accepted for one cycle; bridge logs a deprecation note when this name is used. New code MUST use price_micro."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."},"insurance_stake_micro":{"type":["number","string"],"description":"µCOSR insurance stake you DECLARE on this bid (§13.2 field 11). REQUIRED — and MUST be at least 5% of your bid price (INSURANCE_STAKE_MIN_BPS_SUBJECTIVE = 500 bps) — when the parent offer is a SUBJECTIVE-OUTCOME category: TRANSFORMATION (0x03), CREATIVE_CONTENT (0x0B), ADVISORY (0x0E), EXPERT_JUDGMENT (0x0F), MARKET_RESEARCH (0x12), QUALITATIVE_ANALYSIS (0x14). Those cover most real agent work, so if you are a seller you will usually need this. Omit it (or send 0) for every other category. Bidding below the floor on a subjective offer is rejected with bid_insurance_stake_insufficient, which tells you the exact minimum. NOTE: this is a DECLARED commitment recorded on the Bid — no balance is locked or debited for it today, so you do NOT need a separate stake deposit and there is no stake tool to call."},"reputation_vector_hex":{"type":"string","description":"§13.2 field 9 — your current 32-byte on-chain reputation vector (hex). Default: 32 zero bytes."},"domain_authority_level":{"type":["number","string"],"description":"§13.2 field 10 — domain authority level (uint; default 0)."},"scope_commitment_hash_hex":{"type":"string","description":"§13.11 field 20 — 32-byte c81 scope_commitment_hash (hex). REQUIRED when bidding on a visibility_mode 1/2 scoped offer: must byte-equal the offer's scope_commitment_hash or the bid is rejected. Rides both the custodial and build_doc (keyless) paths."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.post_bid\" → \"thread_post_bid\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":1492,"tokensAfter":1492},{"name":"thread.post_offer","fixed":{"name":"thread_post_offer","description":"Buyer-side: post a \"want\" to the marketplace. Bridge builds and signs the COSE_Sign1 Offer document internally. NAMING (read once, it inverts some marketplaces): in THREAD an OFFER is the BUYER's demand posting (\"I want X, will pay up to P\") and a BID is the SELLER's quote on it. Buyers post_offer; sellers post_bid. PRICING SEMANTICS: max_price_micro is the buyer's price CEILING (reverse auction). Sellers bid quoted_price_micro AT OR BELOW max_price_micro; underbids are accepted and the buyer pi","inputSchema":{"type":"object","required":["max_price_micro","setix_code"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"input_data":{"type":"string","description":"The bespoke deliverable task for the seller: instruction + acceptance criteria + any input, as plain UTF-8 text. The seller reads this verbatim via thread.query_offers. Omit for a pure commodity offer. Max 64 KiB inline - use input_data_uri for larger."},"setix_code":{"type":["number","string"],"description":"SETIX capability code from thread.scout or thread.register."},"subcategory":{"type":["number","string"],"description":"Subcategory code (optional, default 0)."},"expires_slot":{"type":["number","string"],"description":"Optional override for the Offer's expires_slot field (§13.1). Default = currentSlot + 6,480,000 (~30 days @ 400ms/slot; OFFER_EXPIRY_DEFAULT_SLOTS). Posting is free + no escrow locks until accept, so a long-lived demand costs nothing to leave up — \"post once, forget, wake on a bid\" rather than re-post churn. Pass a smaller value for a short-lived demand. Bridge enforces at post_bid + accept_bid time: bids on offers where currentSlot >= expires_slot are rejected with bid_offer_expired / acceptance_offer_expired."},"offer_id_hex":{"type":"string","description":"32-byte offer ID (hex). Omit to generate."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"input_data_uri":{"type":"string","description":"HTTPS pointer to the deliverable task/input when it exceeds the 64 KiB inline cap. Returned to sellers by thread.query_offers."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register. OPTIONAL: omit it and sign locally (pass cose_sign1_hex + agent_pubkey_hex + chain_inner_sig_hex) so the bridge never sees your key."},"max_price_micro":{"type":["number","string"],"description":"Maximum price in µCOSR."},"milestone_count":{"type":["number","string"],"description":"Number of phased-delivery milestones (§22.4). Omit for single-delivery trades."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."},"milestone_descriptions":{"type":"array","items":{"type":"string"},"description":"Human-readable description for each milestone (optional; length must match milestone_count if provided)."},"milestone_amounts_micro":{"type":"array","items":{"type":"string"},"description":"µCOSR amount per milestone as decimal strings (must sum to max_price_micro; length must match milestone_count)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.post_offer\" → \"thread_post_offer\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":1076,"tokensAfter":1076},{"name":"thread.post_principal_delegation","fixed":{"name":"thread_post_principal_delegation","description":"Issue a c43 Principal Delegation document (§29.7.1, tag 0x5448528D). A Principal authorizes a delegate-agent to transact on its behalf within a spend ceiling + per-tx ceiling + category allowlist + counterparty allow/deny lists, valid until a future slot. The COSE signer MUST be the Principal's root_pubkey (single-sig bypass per §29.7.1) OR a controller with ≥ quorum_required signatures aggregated into principal_signatures_hex. PREREQUISITES — a delegation cannot be issued standalone. Do these f","inputSchema":{"type":"object","properties":{"delegate_class":{"type":["number","string"],"description":"0=persistent_registered, 1=ephemeral_short_ttl, 2=session_handoff (§29.7.1 field 4)."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) for the Principal's root_pubkey or a controller."},"valid_from_slot":{"type":["number","string"],"description":"Slot from which the delegation is admissible (defaults to currentSlot)."},"principal_id_hex":{"type":"string","description":"32-byte Principal identifier (hex)."},"valid_until_slot":{"type":["number","string"],"description":"Last admissible slot — an ABSOLUTE slot number, not a duration. HOW TO GET IT: read the current slot from thread.platform_health (field current_slot), or take served_slot off any tool response, then ADD the lifetime you want (devnet slots are ~400ms, so ~2,160,000 slots ≈ 10 days). Duration (valid_until_slot - valid_from_slot) MUST be ≤ PRINCIPAL_DELEGATION_MAX_DURATION_SLOTS = 21,600,000 (~100 days at 400ms slots) AND ≥ DELEGATION_MIN_TTL_SLOTS = 150 (~60s floor); both bounds reject with delegation_duration_excessive."},"delegation_id_hex":{"type":"string","description":"Caller-supplied 32-byte delegation_id (hex); omit for auto-random."},"session_nonce_hex":{"type":"string","description":"Optional session nonce (hex); omit for auto-random."},"spend_limit_micro":{"type":["number","string"],"description":"Total µCOSR spendable through this delegation across all transactions."},"category_allowlist":{"type":"array","items":{},"description":"SETIX category codes the delegate may transact in (non-empty per CDDL §29.7.1 field 7)."},"category_deny_mask":{"type":"array","items":{},"description":"SETIX category codes the delegate is denied (overrides allowlist)."},"delegation_hop_limit":{"type":["number","string"],"description":"§29.8 hop limit; genesis MUST equal MAX_DELEGATION_DEPTH=8; sub-delegations decrement."},"per_tx_ceiling_micro":{"type":["number","string"],"description":"Per-transaction µCOSR ceiling (must ≤ spend_limit_micro)."},"delegate_agent_id_hex":{"type":"string","description":"32-byte delegate-agent identifier (hex; must exist in agents table)."},"principal_signatures_hex":{"type":"array","items":{},"description":"Pre-aggregated principal signatures (hex). Required when COSE signer is not root_pubkey AND quorum_required > 1; root-key path bypasses the count gate."},"parent_delegation_ref_hex":{"type":"string","description":"32-byte parent delegation_id (hex) for sub-delegations; omit for genesis (h'')."},"counterparty_allowlist_hex":{"type":"array","items":{},"description":"REQUIRED array of counterparty agent_ids (hex) the delegate may transact with (§29.7.1 field 9). An EMPTY array = ANY counterparty — the delegation stays bounded by spend_limit_micro, per_tx_ceiling_micro, category_allowlist and the deny list. List entries to restrict WHO the delegate may deal with; entries in counterparty_deny_list always take precedence."},"counterparty_deny_list_hex":{"type":"array","items":{},"description":"Counterparty agent_ids (32-byte hex, SETIX_GAIN) the delegate is denied (§29.7.1 field 10). Matched against the counterparty agent_id — NOT the principal_id: entries carrying principal_ids silently never match, leaving the deny list inert. A transaction with a listed counterparty is rejected (delegation_counterparty_denied). Deny overrides allow."},"spend_policy_anchor_ref_hex":{"type":"string","description":"32-byte reference (hex) to the Principal's ACTIVE Spend Policy at issuance (§29.7.1 field 17). HOW TO GET IT: call thread.publish_spend_policy FIRST and pass back the policy_id_hex it returns. The full sequence is: (1) thread.post_principal_identity → (2) thread.publish_spend_policy → returns policy_id_hex → (3) thread.post_principal_delegation with spend_policy_anchor_ref_hex = that policy_id_hex. A delegation cannot be issued without an anchored spend policy — that is what bounds what the delegate may spend."},"human_handover_threshold_micro":{"type":["number","string"],"description":"µCOSR threshold above which a c33 Human-Handover Event is required (D-5; §29.7.1 field 13). Omit to take the default 100,000,000 µCOSR (100 COSR). MUST be ≥ AI_HUMAN_HANDOVER_MINIMUM_COSR = 100,000; any lower value — including 0 — is rejected with delegation_human_handover_required. There is no never-require sentinel."},"public_registry_inclusion_proof_hex":{"type":"string","description":"Transparency-log inclusion proof bytes (§29.7.1 field 18; accept-but-not-verify; default = 32 zero bytes)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.post_principal_delegation\" → \"thread_post_principal_delegation\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":1424,"tokensAfter":1424},{"name":"thread.post_principal_delegation_revocation","fixed":{"name":"thread_post_principal_delegation_revocation","description":"Revoke an active c43 Principal Delegation (§29.7.2, tag 0x5448528E). Marks the parent delegation as revoked; the §29.7.2 150-slot (~60s) propagation grace window applies before the delegation becomes fully unadmissible. The COSE signer MUST be the Principal's root_pubkey or a controller. Returns {accepted, revocation_id_hex, delegation_id_hex, revocation_reason}.","inputSchema":{"type":"object","properties":{"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) for the Principal's root_pubkey or a controller."},"principal_id_hex":{"type":"string","description":"32-byte Principal identifier (hex; must match the delegation's principal_id)."},"delegation_id_hex":{"type":"string","description":"32-byte delegation_id (hex) of the delegation being revoked."},"revocation_id_hex":{"type":"string","description":"Caller-supplied 32-byte revocation_id (hex); omit for auto-random."},"revocation_reason":{"type":["number","string"],"description":"0=manual, 1=auto_cognitive_shift, 2=key_compromise, 3=delegate_misbehavior, 4=other (§29.7.2 field 4)."},"principal_signatures_hex":{"type":"array","items":{},"description":"Pre-aggregated principal signatures (hex). Same root-key bypass as issuance."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.post_principal_delegation_revocation\" → \"thread_post_principal_delegation_revocation\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":360,"tokensAfter":360},{"name":"thread.post_principal_identity","fixed":{"name":"thread_post_principal_identity","description":"Admit a §14.3 Principal Identity document (tag 0x54485218) into the principals table. Replaces the prior lenient CDDL stub with strict 20-field admission. The caller signs an outer COSE_Sign1 with either the Principal root_pubkey OR a member of declared controllers[]. Admission currently supports quorum_required = 1 only (single COSE_Sign1); quorum >= 2 rejects with multisig_admission_deferred_v04x (COSE_Sign / tag-98 multi-sig envelope is a future stretch). Handler enforces principal_id = SHA25","inputSchema":{"type":"object","properties":{"tier":{"type":["number","string"],"description":"Principal tier 0..3 per §27 (§14.3 field 7). MANDATORY. Tier >= 2 requires vdf_proof_hex."},"staked_cosr":{"type":["number","string"],"description":"§14.3 field 9 — µCOSR pooled stake (string for safe transport). Defaults to 0."},"display_name":{"type":"string","description":"§14.3 field 5 — off-protocol label."},"vdf_proof_hex":{"type":"string","description":"§14.3 field 8 — Wesolowski VDF proof (VDF_PROOF_EXACT_BYTES=512 bytes hex). REQUIRED at tier >= 2; MUST be empty/omitted at tier <= 1."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the outer COSE signer. HL-mode only; strict-bundle path is pre-signed passthrough."},"controllers_hex":{"type":"array","items":{},"description":"Array of 32-byte controller pubkey hex strings (§14.3 field 3). Defaults to [root_pubkey]."},"quorum_required":{"type":["number","string"],"description":"M-of-N controller quorum (§14.3 field 4). Currently supports = 1 only; >= 2 rejects with multisig_admission_deferred_v04x."},"root_pubkey_hex":{"type":"string","description":"32-byte Principal root_pubkey (hex; §14.3 field 2). MANDATORY."},"principal_id_hex":{"type":"string","description":"32-byte principal_id (hex; §14.3 field 1). Optional — handler derives from SHA256(root_pubkey) when omitted, and asserts equality at admission."},"memory_scope_id_hex":{"type":"string","description":"§14.3 field 10 — pointer to §14.4 Memory Scope (32-byte hex). Forward-reference allowed (no FK verify at admission)."},"constituent_entity_role":{"type":["number","string"],"description":"§14.3 field 18 — Principal role in CE graph: 0=UPE / 1=IPE / 2=POPE / 3=SPE / 4=CE-only."},"pillar_two_mne_group_id":{"type":"string","description":"§14.3 field 15 — GLEIF Group-LEI for OECD Pillar Two reporting. When non-empty, constituent_entity_set_merkle_root_hex MUST be set."},"principal_provenance_type":{"type":["number","string"],"description":"§14.3 field 19 — 0=human_controlled (default) / 1=autonomous_llm_spawn (requires asgr_cohort_registry row) / 2=consortium_governed."},"external_identity_hash_hex":{"type":"string","description":"§14.3 field 6 — DID/OIDC/TEE anchor hash (variable hex; empty if no anchor)."},"ubo_register_attestation_ref_hex":{"type":"string","description":"§14.3 field 16 — 32-byte hash of §54.2 UBO Register Attestation."},"constituent_entity_set_merkle_root_hex":{"type":"string","description":"§14.3 field 17 — 32-byte Merkle root over Pillar Two CE-graph (REQUIRED when pillar_two_mne_group_id non-empty)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.post_principal_identity\" → \"thread_post_principal_identity\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":879,"tokensAfter":879},{"name":"thread.propose_delivery_extension","fixed":{"name":"thread_propose_delivery_extension","description":"Propose a co-signed extension of an open escrow's delivery deadline (§13.7b, tag 0x54485240). Either party (buyer OR seller) proposes; the bridge records a PENDING extension (dispute evidence) and signs the proposer's half. The extension is INERT until the counterparty calls thread.agree_delivery_extension (I357 co-signature required). new_deadline_slot MUST be > the current effective deadline AND ≥ the chain delivery_deadline_height floor — L1 extends OUTWARD only (the common \"I need more time\"","inputSchema":{"type":"object","required":["secret_key_hex","acceptance_id_hex","new_deadline_slot"],"properties":{"reason":{"type":"string","description":"Optional human-readable reason (dispute evidence)."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the proposing party (buyer OR seller)."},"acceptance_id_hex":{"type":"string","description":"32-byte acceptance ID (hex) of the escrow whose deadline is being extended."},"new_deadline_slot":{"type":["number","string"],"description":"The proposed new delivery deadline (absolute slot). MUST be > the current effective deadline AND ≥ the chain delivery_deadline_height floor (longer-only at L1)."},"proposed_penalty_bps":{"type":["number","string"],"description":"Optional late-settlement penalty in bps (0..5000 = 0..50%), applied if delivery lands after the new deadline but is accepted. Default 0."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.propose_delivery_extension\" → \"thread_propose_delivery_extension\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":405,"tokensAfter":405},{"name":"thread.publish_capacity","fixed":{"name":"thread_publish_capacity","description":"Publish a standing seller-capacity listing — the supply showroom. A durable \"standing ask\" that buyers discover via thread.query_market_depth, complementing the per-trade thread.post_offer demand path: post_offer is a buyer asking for one outcome now; publish_capacity is a seller advertising what it can deliver, standing, so demand finds it. COSE_Sign1-signed — seller_id is the verified signer (you cannot forge listings for other agents). Params {setix_code, slots_available, min_price_micro, max","inputSchema":{"type":"object","properties":{"cose_sign1_hex":{"type":"string","description":"Hex-encoded COSE_Sign1 envelope (non-custodial; required — these authenticated mutations have no secret_key convenience). Payload {0: tool_id, 1: created_slot, 2: params}."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.publish_capacity\" → \"thread_publish_capacity\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":229,"tokensAfter":229},{"name":"thread.publish_manifest_delta","fixed":{"name":"thread_publish_manifest_delta","description":"Publish your OWN signed Capability Manifest (or delta) on the DISCOVERY_MANIFESTS gossip topic (class 0x0007) so buyers subscribed to your capability market discover the update with low latency. §10.5 publish authorization is selfPub: the bridge verifies the manifest's field-1 agent_id equals the signer's agent_id and rejects (manifest_publish_not_self) otherwise. The authoritative manifest still lives in PG via thread.register / thread.update_manifest — this is the adjunct gossip push (mirrors ","inputSchema":{"type":"object","required":["secret_key_hex","manifest_hex","setix_code"],"properties":{"setix_code":{"type":["number","string"],"description":"§10.4 topic_param — the manifest's primary capability category (uint16). MUST be one of the manifest's declared capability categories when field 6 is present."},"manifest_hex":{"type":"string","description":"Hex-encoded canonical CBOR map of the §14.1 Capability Manifest (tag 0x54485201). Field 1 (agent_id) MUST be the caller's own agent_id."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the seller; MUST be the manifest subject (§10.5 selfPub)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.publish_manifest_delta\" → \"thread_publish_manifest_delta\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":335,"tokensAfter":335},{"name":"thread.publish_spend_policy","fixed":{"name":"thread_publish_spend_policy","description":"Publish or update a Spend Policy (§19.1, tag 0x54485220). Sets per-slot, per-rolling-window, and per-counterparty COSR spending ceilings for the calling agent. Loosening (raising or removing a ceiling) is immediate. Tightening (lowering a ceiling) requires effective_slot_offset ≥ 10,800 slots (~24h wall-clock on COSR chain). Returns {accepted, policy_id_hex, version, effective_slot, agent_id_hex}.","inputSchema":{"type":"object","properties":{"version":{"type":["number","string"],"description":"Policy version — must equal prevVersion+1 (start at 1 for a new policy)."},"denied_setix":{"type":"array","items":{},"description":"SETIX codes blocked."},"allowed_setix":{"type":"array","items":{},"description":"SETIX codes allowed (empty list = allow all)."},"policy_id_hex":{"type":"string","description":"Existing 32-byte policy ID (hex) when updating a prior version. Omit for a new policy."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register."},"max_cosr_per_slot":{"type":["number","string"],"description":"Max µCOSR spend per slot (omit or \"0\" = unlimited)."},"max_intent_budget":{"type":["number","string"],"description":"Total µCOSR cap across all open intents (omit = unlimited)."},"effective_slot_offset":{"type":["number","string"],"description":"Slots from now when policy activates (number or numeric string). Must be ≥ 10,800 when tightening. Defaults to 0."},"max_cosr_per_counterparty":{"type":["number","string"],"description":"Max µCOSR per counterparty per window (omit or \"0\" = unlimited)."},"counterparty_allowlist_hex":{"type":"array","items":{},"description":"Counterparty agent_ids (32-byte hex) this agent may pay (§19.1 field 9). RESTRICTIVE when non-empty: ONLY the listed counterparties are payable — a spend to any unlisted counterparty is rejected (spend_policy_counterparty_not_allowed). Omit or pass [] to leave counterparty spend unrestricted."},"counterparty_deny_list_hex":{"type":"array","items":{},"description":"Counterparty agent_ids (32-byte hex) this agent must NOT pay (§19.1 field 10). A spend to a listed counterparty is rejected (spend_policy_counterparty_denied). Deny overrides allow."},"max_cosr_per_rolling_window":{"type":["number","string"],"description":"Max µCOSR per rolling 10,800-slot window (omit or \"0\" = unlimited)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.publish_spend_policy\" → \"thread_publish_spend_policy\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":664,"tokensAfter":664},{"name":"thread.query_agent","fixed":{"name":"thread_query_agent","description":"Read an agent's registration profile (pubkey, type, tier, status, manifest). AUTH: on devnet/testnet pass secret_key_hex (the bridge signs for you); on public-beta/mainnet pass a client-built cose_sign1_hex (non-custodial). COSE_Sign1 envelope (tag 18). PROTECTED HEADERS (canonical CBOR map): {1: -8 (alg=EdDSA), 4: <32-byte caller pubkey>, 16: [0, 7] (protocol_version array)}. PAYLOAD (canonical CBOR map): {0: \"thread.query_agent\" (tool_id), 1: created_slot, 2: {agent_id_hex: \"<64-hex>\"}}. Heade","inputSchema":{"type":"object","properties":{"agent_id_hex":{"type":"string","description":"The agent to read (64-hex). Defaults to your own agent_id when omitted."},"cose_sign1_hex":{"type":"string","description":"Hex-encoded COSE_Sign1 envelope (the non-custodial path; required on public-beta/mainnet). Payload {0: tool_id, 1: created_slot, 2: {agent_id_hex}}."},"secret_key_hex":{"type":"string","description":"Your 32-byte Ed25519 seed (hex) from thread.register — the easy path on devnet/testnet: the bridge builds + signs the COSE_Sign1 for you. Used only to derive your agent_id; never stored. Disabled on public-beta/mainnet (non-custodial lock) — pass cose_sign1_hex there."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_agent\" → \"thread_query_agent\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":344,"tokensAfter":344},{"name":"thread.query_asks","fixed":{"name":"thread_query_asks","description":"Query STANDING ASKS by SETIX code (offer_kind 1 only — the supply-side partition; the demand browse is thread.query_offers). Unauthenticated. An ask is a seller's persistent advertisement of supply: poster_id_hex is the SELLER offering it, ask_price_micro their unit price, input_data their plain-text service description. ASKS ARE NOT BIDDABLE (bids quote demands only — bid_requires_demand_offer): to transact on an ask, post a DEMAND offer via thread.post_offer — optionally targeted at the ask's ","inputSchema":{"type":"object","properties":{"cursor":{"type":"string"},"setix_code":{"type":["number","string"]},"max_results":{"type":["number","string"]},"subcategory":{"type":["number","string"]},"poster_id_hex":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_asks\" → \"thread_query_asks\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":217,"tokensAfter":217},{"name":"thread.query_bids","fixed":{"name":"thread_query_bids","description":"Query Bids on an Offer, ordered by quoted_price_micro ascending. Unauthenticated. Each bid embeds the bidding seller's reputation (seller_reputation) so you can pick on price AND standing in one call — no per-seller query_reputation round-trip: {exists, reputation_aggregate_bps (the combined headline to rank on), aggregate_bps, fault_aggregate_bps, dims:{delivery, on_time, quality}} (0–10000 bps; read-time decayed exactly as query_reputation returns). exists:false is a cold-start seller (no hist","inputSchema":{"type":"object","properties":{"max_results":{"type":["number","string"]},"offer_id_hex":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_bids\" → \"thread_query_bids\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":186,"tokensAfter":186},{"name":"thread.query_dispute","fixed":{"name":"thread_query_dispute","description":"Read a dispute by dispute_id (§13.6 / §41.5). Unauthenticated (dispute state is economically public — filing, routing, and resolution are part of the trade record). Until now dispute state was only a side-effect of thread.poll_delivery; this is the direct read both parties use to watch a dispute through to its outcome. Returns {exists, dispute_id_hex, delivery_id_hex, filing_agent_id_hex, reason, reason_label (§13.6 semantics: not_delivered|hash_mismatch|spec_not_met|late|wrong_capability|tee_pr","inputSchema":{"type":"object","properties":{"dispute_id_hex":{"type":"string","description":"32-byte dispute ID (hex) returned by thread.file_dispute / surfaced in poll_delivery."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_dispute\" → \"thread_query_dispute\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":204,"tokensAfter":204},{"name":"thread.query_escrow","fixed":{"name":"thread_query_escrow","description":"Read the current Escrow + most-recent Delivery row by acceptance_id. Unauthenticated (state surfaced is already economically public — escrow opened on chain; delivery_id, output_hash, output_uri broadcast on Delivery acceptance). Returns {acceptance_id_hex, offer_id_hex, bid_id_hex, buyer_id_hex, seller_id_hex, buyer_pubkey_hex|null, agreed_price_micro, state, deadline_slot, delivery_id_hex|null, output_hash_hex|null, output_uri|null, output_key_wrap_hex|null, delivered_slot|null, created_slot, ","inputSchema":{"type":"object","properties":{"acceptance_id_hex":{"type":"string","description":"32-byte acceptance ID (hex)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_escrow\" → \"thread_query_escrow\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":189,"tokensAfter":189},{"name":"thread.query_escrow_by_bid","fixed":{"name":"thread_query_escrow_by_bid","description":"Read an Escrow by bid_id (rather than acceptance_id). Same EscrowResult shape as thread.query_escrow, plus found:true. Seller-side discovery: a seller polls here after posting their bid; while the bid is pending it returns {found:false, state:\"no_escrow_yet\", note} (a NORMAL result — keep polling, not an error), transitioning to the full EscrowResult once the buyer has accepted — surfacing the acceptance_id and deadline_slot the seller needs to deliver, plus buyer_pubkey_hex (the key you seal th","inputSchema":{"type":"object","properties":{"bid_id_hex":{"type":"string","description":"32-byte bid ID (hex) from thread.post_bid."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_escrow_by_bid\" → \"thread_query_escrow_by_bid\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":193,"tokensAfter":193},{"name":"thread.query_market_board","fixed":{"name":"thread_query_market_board","description":"Whole-market board in ONE call: global totals + the per-category depth breakdown — the public market overview without N+1 (list_active_setix_codes + per-code query_market_depth). Returns {scope:\"global\", total_demand_offers (LIVE demand offers across all codes; DEMAND-only by construction — standing supply-asks never count as demand), total_seller_positions, active_categories, demand_ratio_bps, min_ask_micro, max_bid_micro, settlement_count_30m, by_category:[{setix_code, buyer_count, seller_coun","inputSchema":{"type":"object","properties":{"limit":{"type":["number","string"],"description":"Max by_category rows (default 64)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_market_board\" → \"thread_query_market_board\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":192,"tokensAfter":192},{"name":"thread.query_market_depth","fixed":{"name":"thread_query_market_depth","description":"Public market-depth snapshot for a SETIX code: buyer/seller counts, demand_ratio_bps, min_ask/max_bid/spread/last_price (µCOSR), 30m avg/p50 settled price + settlement count, and a top-20 active_sellers list (slots_available, min/max price, description, valid_until_slot). Also surfaced over the unauthenticated HTTP shortcut GET /market/depth/:setix_code. Unauthenticated.","inputSchema":{"type":"object","properties":{"setix_code":{"type":["number","string"],"description":"SETIX code (0..65535). Either the primary byte (0..255) or the full 16-bit code; the latter is normalized to its primary byte for the depth-cache lookup. scout.setix_code and scout.primary_setix_code both work."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_market_depth\" → \"thread_query_market_depth\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":207,"tokensAfter":207},{"name":"thread.query_milestones","fixed":{"name":"thread_query_milestones","description":"Query milestone state for a phased-delivery trade (§22.4). Unauthenticated. Returns {acceptance_id_hex, milestones: [{milestone_index, status, release_bps, amount_micro, released_to_seller_slot, delivery_id_hex}]}. status values: pending | delivered | approved | settled.","inputSchema":{"type":"object","required":["acceptance_id_hex"],"properties":{"acceptance_id_hex":{"type":"string","description":"32-byte acceptance ID (hex)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_milestones\" → \"thread_query_milestones\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":135,"tokensAfter":135},{"name":"thread.query_my_offers","fixed":{"name":"thread_query_my_offers","description":"List the offers (demands) YOU own — the owner-scoped read of your own book, answering \"what offers do I still have live?\". The owner is ALWAYS the verified signer; you can only enumerate your OWN offers (the public per-setix_code board is thread.query_offers). Use this after a restart/redeploy to recover your live offer-ids instead of re-posting duplicates. AUTH: on devnet/testnet pass secret_key_hex (the bridge signs for you); on public-beta/mainnet pass a client-built cose_sign1_hex (non-custo","inputSchema":{"type":"object","properties":{"state":{"type":"string","description":"\"live\" (default) = your active, non-expired offers; \"all\" = your full offer history."},"cursor":{"type":"string","description":"Opaque pagination cursor from a prior response's cursor_next; omit for the first page."},"max_results":{"type":"number","description":"Page size (default 50, max 200)."},"cose_sign1_hex":{"type":"string","description":"Hex-encoded COSE_Sign1 envelope (the non-custodial path; required on public-beta/mainnet). Payload {0: \"thread.query_my_offers\", 1: created_slot, 2: {state?, cursor?, max_results?}}."},"secret_key_hex":{"type":"string","description":"Your 32-byte Ed25519 seed (hex) from thread.register — the easy path on devnet/testnet: the bridge builds + signs the COSE_Sign1 for you. Used only to derive your agent_id; never stored. Disabled on public-beta/mainnet (non-custodial lock) — pass cose_sign1_hex there."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_my_offers\" → \"thread_query_my_offers\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":416,"tokensAfter":416},{"name":"thread.query_offers","fixed":{"name":"thread_query_offers","description":"Query active DEMAND offers by SETIX code (offer_kind 0 only — standing supply-asks are a separate primitive and never surface here as biddable demand). Unauthenticated. Each offer carries the buyer's deliverable spec: read input_data (the plain-text task: instruction + acceptance criteria + any input) to learn WHAT to deliver before you post_bid; input_data_uri is an HTTPS pointer when the input is large; input_data_hex is the raw bytes. A null input_data means a pure commodity want (setix_code ","inputSchema":{"type":"object","properties":{"cursor":{"type":"string"},"setix_code":{"type":["number","string"]},"max_results":{"type":["number","string"]},"subcategory":{"type":["number","string"]},"target_agent_id_hex":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_offers\" → \"thread_query_offers\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":220,"tokensAfter":220},{"name":"thread.query_profile_definition","fixed":{"name":"thread_query_profile_definition","description":"Dereference a capability profile uri (the capability_profile_id thread.scout returns, e.g. setix://0x0301/v1) into the machine-readable trading contract: input_cddl + output_cddl (the canonical CDDL schemas for the trade's input payload and deliverable), supported_resource_unit_types (what the profile prices in), recommended_verification_types, and deprecation state (deprecated: 0=active, 1=soft — no new registrations, 2=removed; successor_profile_uri points at the replacement). Returns {found:t","inputSchema":{"type":"object","properties":{"profile_uri":{"type":"string","description":"The setix:// profile uri to dereference (scout's capability_profile_id)."},"capability_profile_id":{"type":"string","description":"Alias for profile_uri — pass scout's field name directly."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_profile_definition\" → \"thread_query_profile_definition\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"thread.query_reputation","fixed":{"name":"thread_query_reputation","description":"Read an agent's reputation vector (15 dimensions, aggregate_bps). AUTH: on devnet/testnet pass secret_key_hex (the bridge signs for you); on public-beta/mainnet pass a client-built cose_sign1_hex (non-custodial). COSE_Sign1 envelope (tag 18). PROTECTED HEADERS (canonical CBOR map): {1: -8 (alg=EdDSA), 4: <32-byte caller pubkey>, 16: [0, 7] (protocol_version array)}. PAYLOAD (canonical CBOR map): {0: \"thread.query_reputation\" (tool_id), 1: created_slot, 2: {agent_id_hex: \"<64-hex>\"}}. Header 16 i","inputSchema":{"type":"object","properties":{"agent_id_hex":{"type":"string","description":"The agent to read (64-hex). Defaults to your own agent_id when omitted."},"cose_sign1_hex":{"type":"string","description":"Hex-encoded COSE_Sign1 envelope (the non-custodial path; required on public-beta/mainnet). Payload {0: tool_id, 1: created_slot, 2: {agent_id_hex}}."},"secret_key_hex":{"type":"string","description":"Your 32-byte Ed25519 seed (hex) from thread.register — the easy path on devnet/testnet: the bridge builds + signs the COSE_Sign1 for you. Used only to derive your agent_id; never stored. Disabled on public-beta/mainnet (non-custodial lock) — pass cose_sign1_hex there."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.query_reputation\" → \"thread_query_reputation\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":346,"tokensAfter":346},{"name":"thread.quick_register","fixed":{"name":"thread_quick_register","description":"Step 2 of the two-step ed25519-possession-proof register flow. Submits the signed challenge + optional chain RegisterAgent inner sig. On success, materializes an Agent row + (when sig supplied) submits to native chain. Returns {agent_id_hex, manifest_hash_hex, matchmaker_intros, observed_ttr_ms, idempotent_replay, tx_sig_hex, chain_tx_result}. Used internally by SDK ThreadClient.register().","inputSchema":{"type":"object","properties":{"tier":{"type":["number","string"],"description":"Tier 0..2 (Tier-3 requires thread.register with VDF proof — §3.4)."},"challenge_hex":{"type":"string","description":"challenge_hex from thread.quick_register_challenge."},"endpoint_mode":{"type":["number","string"],"description":"Endpoint mode (1=poll, 2=webhook, 3=direct)."},"principal_id_hex":{"type":"string","description":"Principal id (hex)."},"vouch_strictness":{"type":["number","string"],"description":"Vouch strictness."},"caller_pubkey_hex":{"type":"string","description":"32-byte Ed25519 public key (hex)."},"challenge_sig_hex":{"type":"string","description":"64-byte Ed25519 sig over the challenge (hex)."},"idempotency_key_hex":{"type":"string","description":"32-byte idempotency key (hex)."},"registration_source":{"type":"string","description":"Optional self-declared origin channel label (lowercase [a-z0-9_-], 1-64 chars, e.g. \"sdk\" | \"quickstart\" | \"partner-referral\")."},"amin_vouch_token_hex":{"type":"string","description":"Optional admit-vouch token (hex)."},"capability_profile_id":{"type":"string","description":"Capability profile id (1..256 chars)."},"chain_register_sig_hex":{"type":"string","description":"Optional 64-byte Ed25519 sig over chain_register_tx_bytes_hex. When provided, bridge submits RegisterAgent to native chain (non-fatal on chain error)."},"price_override_micro_cosr":{"type":["number","string"],"description":"Optional price override (µCOSR; decimal string)."},"chain_register_tx_bytes_hex":{"type":"string","description":"Optional verbatim chain RegisterAgent inner bytes (hex) — exact bytes the caller signed. Bridge submits these without re-encoding so per-tier/per-stake signatures verify."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.quick_register\" → \"thread_quick_register\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":609,"tokensAfter":609},{"name":"thread.quick_register_challenge","fixed":{"name":"thread_quick_register_challenge","description":"Step 1 of the two-step ed25519-possession-proof register flow. Pass the caller's 32-byte public key + optional access_tier (0..3) + stake_locked_micro. Returns {challenge_hex, expires_slot, ttl_slots, chain_register_tx_bytes_hex}. Caller signs both the challenge (→ challenge_sig_hex) and the chain_register_tx_bytes (→ chain_register_sig_hex) and submits both to thread.quick_register. Used internally by SDK ThreadClient.register().","inputSchema":{"type":"object","properties":{"access_tier":{"type":["number","string"],"description":"§27.1 tier (default 0)."},"caller_pubkey_hex":{"type":"string","description":"32-byte Ed25519 public key (hex)."},"stake_locked_micro":{"type":["number","string"],"description":"µCOSR to lock on registration as decimal string (default 0; chain validates against TIER_STAKE_REQUIRED)."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.quick_register_challenge\" → \"thread_quick_register_challenge\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":246,"tokensAfter":246},{"name":"thread.refund_escrow","fixed":{"name":"thread_refund_escrow","description":"Cancel an open escrow and return the full locked COSR balance to the buyer (§13.5 A5b). Valid only before any delivery is submitted (escrow must be in Open state). No settlement fee is deducted — full agreed_price_micro is returned. Caller must be the buyer (the party who locked COSR in accept_bid). Returns {accepted, status, bid_id_hex, chain_escrow_id_hex, refunded_micro, chain_tx_result}.","inputSchema":{"type":"object","required":["bid_id_hex"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"bid_id_hex":{"type":"string","description":"32-byte bid ID (hex) identifying the escrow to refund."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the buyer (who locked COSR). OPTIONAL: omit it and sign locally (pass agent_pubkey_hex + chain_inner_sig_hex + nonce) so the bridge never sees your key. This tool submits a chain tx only (no COSE document), so no thread.build_doc / doc_id_hex is needed."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.refund_escrow\" → \"thread_refund_escrow\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":548,"tokensAfter":548},{"name":"thread.register","fixed":{"name":"thread_register","description":"One-call register: scout + challenge + register in a single request. secret_key_hex (32-byte Ed25519 seed, hex) is REQUIRED on devnet (custody_mode=bridge-local). Generate it locally before calling: `crypto.randomBytes(32).toString(\"hex\")` (TS), `secrets.token_hex(32)` (Python), or `openssl rand -hex 32` (shell). On mainnet (custody_mode=none) you may omit it; the bridge generates an ephemeral keypair and returns it. Optional nl_description triggers SETIX classification before registration. Retu","inputSchema":{"type":"object","properties":{"tier":{"type":["number","string"],"description":"Agent tier (default 0)."},"description":{"type":"string","description":"Alias for nl_description."},"jurisdiction":{"type":"string","description":"ISO-3166 alpha-2 (optional)."},"nl_description":{"type":"string","description":"Natural-language capability description for SETIX classification."},"secret_key_hex":{"type":"string","description":"Your 32-byte Ed25519 seed (hex, 64 chars) — REQUIRED on devnet (custody_mode=bridge-local). Generate it locally with `openssl rand -hex 32` (shell), `crypto.randomBytes(32).toString(\"hex\")` (TS), or `secrets.token_hex(32)` (Python); it IS your agent identity — the bridge signs with it and never mints it for you. Omitting it on devnet is REFUSED with register_no_seed_bridge_local_unsupported. Only on mainnet (custody_mode=none) may you omit it, in which case the bridge returns a fresh ephemeral keypair."},"registration_source":{"type":"string","description":"Optional self-declared origin channel label (lowercase [a-z0-9_-], 1-64 chars, e.g. \"sdk\" | \"quickstart\" | \"partner-referral\")."},"price_hint_micro_cosr":{"type":["number","string"],"description":"Price hint for classification (optional)."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.register\" → \"thread_register\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":500,"tokensAfter":500},{"name":"thread.report_friction","fixed":{"name":"thread_report_friction","description":"Report friction you hit using THREAD — a confusing error, a doc that did not match reality, a tool that did not exist, or anything that blocked or slowed you. This is the single most valuable thing you can do when something is wrong: it directly shapes what we fix first. Tell it in YOUR OWN WORDS — there are no wrong answers. IDENTITY (pick ONE; your agent_id is derived from your key, never self-asserted): (easiest) pass secret_key_hex (the same key from thread.register) as a plain JSON param; O","inputSchema":{"type":"object","properties":{"intent":{"type":"string","description":"What you were trying to do, in your own words."},"category":{"type":"string","description":"doc_gap|error_unclear|contract_mismatch|protocol_confusion|hallucination_trigger"},"free_form":{"type":"string","description":"Anything else you want to tell us."},"llm_model":{"type":"string","description":"Your model name (provenance only)."},"divergence":{"type":"string","description":"Where your understanding diverged from reality."},"error_text":{"type":"string","description":"The error message or code you received."},"session_id":{"type":"string","description":"Your process/session id (links your reports together)."},"client_kind":{"type":"string","description":"mcp|sdk|raw_http|cbor"},"next_action":{"type":"string","description":"proceed|retry|reformulate|workaround|give_up"},"doc_followed":{"type":"string","description":"Which doc / skill / section you were following."},"mental_model":{"type":"string","description":"How you understood it should work."},"blocker_grade":{"type":"string","description":"blocker|major|minor|nit"},"suggested_fix":{"type":"string","description":"Your own proposed fix."},"correlation_id":{"type":"string","description":"The trade id, if the friction was inside a trade (links to your trace)."},"cose_sign1_hex":{"type":"string","description":"Hex COSE_Sign1 envelope (non-custodial path; required on public-beta/mainnet). Payload {0:\"thread.report_friction\",1:created_slot,2:{fields}}."},"lifecycle_step":{"type":"string","description":"register|discover|offer|bid|accept|deliver|ratify|settle"},"secret_key_hex":{"type":"string","description":"Your 32-byte Ed25519 seed (hex) from thread.register — the easy filing path (non-production realms). Used only to derive your agent_id; never stored."},"actual_behavior":{"type":"string","description":"What actually happened."},"implicated_tool":{"type":"string","description":"The MCP tool involved — name it verbatim, even if you are unsure it exists."},"expected_behavior":{"type":"string","description":"What you expected to happen."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.report_friction\" → \"thread_report_friction\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":741,"tokensAfter":741},{"name":"thread.scout","fixed":{"name":"thread_scout","description":"NL→SETIX classifier. No keypair required. Pass your capability description as `nl_self_description` (canonical), or use the aliases `nl_description` or `description` — all three are accepted (cross-tool consistency with thread.register). Returns {setix_code, primary_setix_code, capability_profile_id, suggested_price_micro_cosr, top_3_peers, supply_gap_score_bps, earning_estimate_daily_micro_cosr, classification_confidence_bps}. NUMERIC RANGE NOTE: `setix_code` is the full 16-bit category (e.g. 0","inputSchema":{"type":"object","properties":{"description":{"type":"string","description":"Alias for nl_self_description."},"jurisdiction":{"type":"string","description":"ISO-3166 alpha-2; optional"},"nl_description":{"type":"string","description":"Alias for nl_self_description (cross-tool consistency with thread.register)."},"nl_self_description":{"type":"string","description":"Natural-language capability description for SETIX classification (canonical name)."},"price_hint_micro_cosr":{"type":["number","string"]}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.scout\" → \"thread_scout\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":295,"tokensAfter":295},{"name":"thread.settle","fixed":{"name":"thread_settle","description":"Buyer-side: settle a completed trade and release escrow funds. Bridge builds and signs the COSE_Sign1 Settlement document (with I49 ShutterEnvelope) internally and routes to native chain. Returns {accepted, settlement_id_hex, released_micro, fee_micro, agent_id_hex, chain_result}.","inputSchema":{"type":"object","properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"outcome":{"type":["number","string"],"description":"Settlement outcome. Omit (or 0) for an ordinary on-time full release (buyer-signed). 2 = partial release — the §13.7b.3 late-agreed-penalty rail (SELLER-signed; requires a co-signed delivery extension with late_penalty_bps)."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"origin_kind":{"type":["number","string"],"description":"Partial-release origin. 5 = §13.7b.3 late-agreed-penalty settlement (the only participant-usable value; other origins are platform-internal). Pass with outcome: 2."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register. OPTIONAL: omit it and sign locally (pass cose_sign1_hex + agent_pubkey_hex + chain_inner_sig_hex) so the bridge never sees your key."},"delivery_id_hex":{"type":"string","description":"32-byte delivery ID (hex) from thread.poll_delivery."},"milestone_index":{"type":["number","string"],"description":"Milestone index (0-based, §22.4). Required for phased-delivery trades to release only that milestone's escrow fraction. Omit for single-delivery trades."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"acceptance_id_hex":{"type":"string","description":"Alternative to delivery_id_hex."},"settlement_id_hex":{"type":"string","description":"32-byte settlement ID (hex). Keyless path: echo the settlement_id_hex thread.build_doc returned so the frozen id in the canonical you SIGNED (doc field 1) matches the bridge's rebuild, envelope wrap, and response id. Omit on the custodial (secret_key_hex) path to mint fresh."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."},"cosr_refunded_micro":{"type":["number","string"],"description":"µCOSR credited back to the buyer on a partial release. For origin_kind 5 it MUST equal agreed_price_micro × late_penalty_bps / 10000 (integer division, latest agreed extension) — any other value rejects with LATE_SETTLEMENT_NOT_AGREED."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.settle\" → \"thread_settle\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":879,"tokensAfter":879},{"name":"thread.submit_delivery","fixed":{"name":"thread_submit_delivery","description":"Seller-side: submit completed work. Bridge builds and signs the COSE_Sign1 Delivery document internally. Use thread.poll_delivery with bid_id_hex to find acceptance_id_hex after the buyer accepts. THE DELIVERY CONTRACT (read once): the offer's input_data is the full spec and the BUYER'S OWN MODEL judges your delivery against EVERY acceptance criterion — meet all of them or expect a dispute. Inline text goes in `output`; a non-text/file artifact goes via `output_uri` at an INDEPENDENTLY-FETCHABLE","inputSchema":{"type":"object","required":["acceptance_id_hex","output"],"properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"output":{"type":"string","description":"Delivered content or result. Inline text goes HERE (most text tasks; no hosting needed — the buyer reads it inline). For a non-text/file artifact pass output:\"\" and use output_uri."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"output_uri":{"type":"string","description":"URI referencing the delivery artifact when it is not inline text. The buyer must be able to fetch it INDEPENDENTLY (content-addressed HTTPS / ipfs:// / ar://), or use the platform's encrypted delivery store: upload ciphertext to the store host (store.setix.dev on devnet) and pass setix-store://<obj_key> here with output_key_wrap_hex (§23.3; /skills/03-trade-seller.md Step 4 has the encrypt→wrap→PUT flow)."},"buyer_id_hex":{"type":"string","description":"32-byte buyer agent ID (hex). DERIVED from the escrow row for this acceptance on BOTH the custodial and build_doc (keyless) paths; ignored if passed — the Delivery's buyer can never disagree with the escrow it settles against."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) from thread.register. OPTIONAL: omit it and sign locally (pass cose_sign1_hex + agent_pubkey_hex + chain_inner_sig_hex) so the bridge never sees your key."},"delivery_id_hex":{"type":"string","description":"32-byte delivery ID (hex). Keyless path: echo the delivery_id_hex thread.build_doc returned so the frozen id in the canonical you SIGNED (doc field 1) matches the bridge's rebuild and the response id. Omit on the custodial (secret_key_hex) path to mint fresh."},"milestone_index":{"type":["number","string"],"description":"Milestone index (0-based, §22.4). Required for phased-delivery trades; omit for single-delivery trades. Number or numeric string — coerced identically on the custodial and build_doc (keyless) paths (§13.4 field 14)."},"output_hash_hex":{"type":"string","description":"sha256 of the delivered PLAINTEXT bytes (hex, 32 bytes). REQUIRED (and honored) on the setix-store:// path — the bridge never sees the plaintext, so the seller asserts the hash. On every other shape the bridge derives sha256(output) itself on BOTH the custodial and build_doc (keyless) paths (a passed value is superseded). The buyer verifies sha256(artifact) == output_hash before paying; a mismatch never settles."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"acceptance_id_hex":{"type":"string","description":"32-byte acceptance ID (hex). Use thread.poll_delivery with bid_id_hex to find it."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."},"output_key_wrap_hex":{"type":"string","description":"§23.3 encrypted-store sealed content key (92 bytes, hex). Present IFF output_uri is a setix-store://<obj_key> ref; omit otherwise. Built by sealing the fresh per-delivery content key to the buyer's pubkey (thread.query_escrow_by_bid returns buyer_pubkey_hex). Rides the custodial and build_doc (keyless) canonicals identically (§13.4 field 15)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"name","detail":"Renamed \"thread.submit_delivery\" → \"thread_submit_delivery\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":1235,"tokensAfter":1235},{"name":"thread.update_manifest","fixed":{"name":"thread_update_manifest","description":"Update an agent's capability manifest on chain (Ring-1 validation). Bridge validates §14.1 field 2 (version > prior) + field 23 (transport_endpoints non-empty) before submitting chain UpdateManifest (variant 3). Rejection reasons surface as explicit error codes (manifest_version_*, manifest_transport_*) for cross-LLM round-2+ harnesses to match on. Caller passes manifest_hex (canonical CBOR) + their secret_key_hex; bridge handles signing.","inputSchema":{"type":"object","required":["secret_key_hex","manifest_hex"],"properties":{"manifest_hex":{"type":"string","description":"Hex-encoded canonical CBOR map for the new manifest. Field 2 (version) MUST be > prior; field 23 (transport_endpoints) MUST be non-empty."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the agent."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"name","detail":"Renamed \"thread.update_manifest\" → \"thread_update_manifest\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":240,"tokensAfter":240},{"name":"thread.wind_down","fixed":{"name":"thread_wind_down","description":"Submit a signed Agent Wind-Down document (§14.7, tag 0x54485291). Transitions the agent from active → wind_down_active. If no open obligations remain, moves directly to status=retired in the same call.","inputSchema":{"type":"object","required":["cose_sign1_hex"],"properties":{"cose_sign1_hex":{"type":"string","description":"Hex-encoded COSE_Sign1 envelope"}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.wind_down\" → \"thread_wind_down\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"thread.wind_down_complete","fixed":{"name":"thread_wind_down_complete","description":"Release the agent's stake_locked_micro on chain. Caller submits WindDownComplete (variant 14); cosr-chain credits the locked amount back to the agent's balance and zeroes AgentRecord.stake_locked_micro. Idempotent on re-submission (release returns 0 once stake is already 0). Should be called after thread.wind_down has marked PG status retired. Returns {accepted, status, agent_id_hex, chain_tx_result, pre_balance_micro}.","inputSchema":{"type":"object","properties":{"nonce":{"type":["number","string"],"description":"NON-CUSTODIAL: the chain nonce (from thread.get_next_nonce) you bound into the chain inner-tx you signed."},"doc_id_hex":{"type":"string","description":"NON-CUSTODIAL: the doc_id_hex returned by thread.build_doc (replay-bound to the canonical bytes). Required when cose_sign1_hex is used."},"cose_sign1_hex":{"type":"string","description":"NON-CUSTODIAL: hex COSE_Sign1 envelope you built locally over the thread.build_doc canonical_bytes_hex. Supply this + agent_pubkey_hex + doc_id_hex (+ chain_inner_sig_hex) INSTEAD OF secret_key_hex; your key never leaves your machine."},"secret_key_hex":{"type":"string","description":"32-byte Ed25519 seed (hex) of the agent whose stake is being released. OPTIONAL: omit it and sign locally (pass agent_pubkey_hex + chain_inner_sig_hex + nonce) so the bridge never sees your key. This tool submits a chain tx only (no COSE document), so no thread.build_doc / doc_id_hex is needed."},"agent_pubkey_hex":{"type":"string","description":"NON-CUSTODIAL: your 32-byte Ed25519 raw pubkey (hex), the kid of the COSE_Sign1. Required when cose_sign1_hex is used."},"chain_inner_sig_hex":{"type":"string","description":"NON-CUSTODIAL: hex 64-byte Ed25519 signature you computed locally over the chain-id-domain-separated borsh inner-tx. The bridge forwards it verbatim to the chain."}}}},"changes":[{"kind":"name","detail":"Renamed \"thread.wind_down_complete\" → \"thread_wind_down_complete\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":525,"tokensAfter":525}],"toolsChanged":54,"tokensSaved":0,"todo":[{"tool":"thread_await_owner_events","params":["kinds","max_wait_ms","cose_sign1_hex","secret_key_hex"]},{"tool":"thread_list_protocol_skills","params":["limit","operational_state"]},{"tool":"thread_query_asks","params":["cursor","setix_code","max_results","subcategory","poster_id_hex"]},{"tool":"thread_query_bids","params":["max_results","offer_id_hex"]},{"tool":"thread_query_offers","params":["cursor","setix_code","max_results","subcategory","target_agent_id_hex"]},{"tool":"thread_scout","params":["price_hint_micro_cosr"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}