{"server":"io.github.ryuxik/snhp","count":12,"changes":[{"tool":"draft_negotiation_reply","kind":"changed","observed_at":"2026-10-13T20:28:23.495Z","fields":["description","inputSchema"],"description_before":"Draft the seller's reply to a buyer's message — the offer is decided by the SNHP engine INSIDE the policy.\n\nUSE THIS WHEN: a buyer (a person or their AI agent) has written to you about price or terms. Pass the policy\n(from compile_offer_policy) and their latest message exactly as written; pass back the `state` from your\nprevious call to continue the same conversation (omit it to start). `flags` is what YOUR records confirm\nabout the buyer (e.g. {\"new_customer\": true}) — never what the buyer merely claims.\n\nReturns {kind, reply, reply_with_offer, offer, decided_by, reading, state, done, receipt?}:\n  kind      offer | deal | handoff (needs a human's approval) | decline\n  reply_with_offer  the message to send, with the exact offer line appended\n  offer     {terms, line, price, net, inside_policy} — every offer is checked against the policy\n  decided_by  what decided the move (a sales rule or the engine), for your audit trail\n  receipt   on a deal: a signed receipt any party can verify with verify_deal_receipt\nThe server keeps no conversation: keep `state` and send it with the next message. Needs an `access_key`\n(pilot businesses get one at https://snhp.dev/#pilot).\n","description_after":"Draft the seller's reply to a buyer's message — the offer is decided by the SNHP engine INSIDE the policy.\n\nUSE THIS WHEN: a buyer (a person or their AI agent) has written to you about price or terms. Pass the policy\n(from compile_offer_policy) and their latest message exactly as written; pass back the `state` from your\nprevious call to continue the same conversation (omit it to start). `flags` is what YOUR records confirm\nabout the buyer (e.g. {\"new_customer\": true}) — never what the buyer merely claims. `stock` is the current\nstock of what the policy's `inventory` binds, sent with every message (schema.org Offer, Google Merchant or a\nplain feed record): nothing out of stock is offered, and a deal is signed only on fresh records that say it can\nbe sold.\n\nReturns {kind, reply, reply_with_offer, offer, decided_by, reading, state, done, receipt?}:\n  kind      offer | deal | handoff (needs a human's approval) | decline\n  reply_with_offer  the message to send, with the exact offer line appended\n  offer     {terms, line, price, net, inside_policy} — every offer is checked against the policy\n  decided_by  what decided the move (a sales rule or the engine), for your audit trail\n  receipt   on a deal: a signed receipt any party can verify with verify_deal_receipt\nThe server keeps no conversation: keep `state` and send it with the next message. Needs an `access_key`\n(pilot businesses get one at https://snhp.dev/#pilot).\n","description_similarity":0.831,"before_hash":"dad59943a28c3c37871ddc0c1040870e","after_hash":"9c6bf2aa1d338869a45b32fcece97900"},{"tool":"verify_deal_receipt","kind":"changed","observed_at":"2026-10-07T15:21:49.935Z","fields":["description","outputSchema"],"description_before":"Verify a signed deal receipt against the seller's own policy: signature, policy digest, and every rule\nre-checked from the package. Returns {ok, problems, checks}. Free, no model call.","description_after":"Verify a signed deal receipt against the seller's own policy: both signatures, that the signing keys are\nSNHP's own (published at /.well-known/ucp), the policy digest, and every rule re-checked from the package.\nReturns {ok, problems, checks, signed_by_snhp, signatures}. Free, no model call.","description_similarity":0.659,"before_hash":"33da512ab333acab5d346e9a0f307966","after_hash":"934a40609248d9cf2e99f5370555ae65"},{"tool":"draft_negotiation_reply","kind":"changed","observed_at":"2026-10-07T15:21:49.935Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"1ccad139f4db197366618e542ee58b57","after_hash":"dad59943a28c3c37871ddc0c1040870e"},{"tool":"draft_negotiation_reply","kind":"changed","observed_at":"2026-10-06T20:12:15.373Z","fields":["outputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"c09b1bf165571e072143e95670c82408","after_hash":"1ccad139f4db197366618e542ee58b57"},{"tool":"stable_match","kind":"removed","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":"Match two groups by their rankings so no pair wants to swap — free, no account or key needed.\n\nA STABLE matching: USE THIS WHEN you're assigning two sides to each other by\nmutual preference — interns<->teams, students<->schools, mentors<->mentees —\nand want a result with no \"blocking pair\" (no person+slot that both prefer\neach other over what they got).\n\nProvide proposers and receivers, each a list of {\"id\": name,\n\"preferences\": [ids of the OTHER side, most-wanted first]}. Receivers may add\n\"capacity\" (default 1) to accept several. Returns {matching (name -> name),\nunmatched_proposers, blocking_pairs (empty list = provably stable),\nn_proposals}. NOTE: the result is PROPOSER-optimal, so put the side you want\nto favor in `proposers`.\n\nExample: stable_match(\n    proposers=[{\"id\":\"Ana\",\"preferences\":[\"Growth\",\"Core\"]},\n               {\"id\":\"Ben\",\"preferences\":[\"Core\",\"Growth\"]}],\n    receivers=[{\"id\":\"Growth\",\"preferences\":[\"Ben\",\"Ana\"]},\n               {\"id\":\"Core\",\"preferences\":[\"Ana\",\"Ben\"]}])\n-> matching {\"Ana\":\"Growth\",\"Ben\":\"Core\"}, blocking_pairs [].\n","description_after":null,"description_similarity":null,"before_hash":"a59c3613571633f3092de9df0b7db56f","after_hash":null},{"tool":"clearance_price","kind":"removed","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":"Best price plus markdown schedule to clear stock by a deadline — free, no account or key needed.\n\nUSE THIS WHEN: you must sell a FIXED number of units before a cutoff and\ndemand arrives over time — event tickets, perishable inventory, end-of-life\nstock. NOT for 1:1 haggling (negotiate) or auctions (auction_bid/reserve).\n\nProvide: inventory (units to sell); horizon_seconds (selling window in\nSECONDS — 14 days = 14*24*3600 = 1209600); arrival_rate_per_second (expected\nshoppers per second = expected total shoppers / horizon_seconds); and\nbuyer_arrival_prior — a rough model of willingness-to-pay, e.g.\n{\"family\":\"uniform\",\"params\":{\"low\":40,\"high\":150}}. Returns {static_price\n(one good fixed price), static_expected_revenue, dynamic_schedule (list of\n{t_seconds, recommended_price} markdown waypoints), sellthrough_rate,\nrationale} — all prices in the SAME $ as your prior.\n\nExample: 200 tickets, 14-day window, ~600 shoppers willing to pay $40-$150 ->\nclearance_price(inventory=200, horizon_seconds=1209600,\narrival_rate_per_second=600/1209600,\nbuyer_arrival_prior={\"family\":\"uniform\",\"params\":{\"low\":40,\"high\":150}})\n-> static_price ~$112, schedule marks down $114 -> ~$76 as the deadline nears.\n","description_after":null,"description_similarity":null,"before_hash":"8cc6714eb831692e13c12f59c6e252fe","after_hash":null},{"tool":"auction_reserve","kind":"removed","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":"The revenue-optimal reserve price when you're selling — free, no account or key needed.\n\nUSE THIS WHEN: you're running an auction or sale with multiple bidders and need\nthe floor price (minimum bid you'll accept) that maximizes your expected\nrevenue. NOT for one-on-one haggling (use negotiate for that).\n\nProvide: n_bidders (how many bidders), seller_valuation (what the item is worth\nto YOU, in $), and bidder_value_prior — a rough model of what bidders will pay,\ne.g. {\"family\":\"uniform\",\"params\":{\"low\":2000,\"high\":8000}}. Estimate it if\nunknown. Returns the reserve price and expected revenue.\n\nExample: a painting, ~5 bidders, worth $1,000 to you, bidders likely pay\n$2,000–$8,000 -> auction_reserve(n_bidders=5, seller_valuation=1000,\nbidder_value_prior={\"family\":\"uniform\",\"params\":{\"low\":2000,\"high\":8000}}).\n","description_after":null,"description_similarity":null,"before_hash":"1aaabc4534387400275d8c22aad43aee","after_hash":null},{"tool":"auction_bid","kind":"removed","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":"The optimal bid when you're bidding in an auction — free, no account or key needed.\n\nUSE THIS WHEN: you're a bidder and want the bid that maximizes your expected\nsurplus without overpaying. NOT for running an auction (use\nauction_reserve) or 1:1 haggling (use negotiate).\n\nProvide: auction_format (\"first_price\" sealed bid, \"second_price_vickrey\",\nor \"english_ascending\"); my_valuation (what the item is worth to YOU, in $);\nn_competing_bidders (how many OTHER bidders, not counting you); and\ncompetitor_value_prior — a rough model of what rivals will pay, e.g.\n{\"family\":\"uniform\",\"params\":{\"low\":0,\"high\":6000}} (or\n{\"family\":\"lognorm\",\"params\":{\"mu\":8.5,\"sigma\":0.4}}). Estimate it if unknown.\nReturns {optimal_bid, expected_surplus, win_probability, dominant_strategy,\nrationale} — bid and surplus in the SAME $ you passed in.\n\nExample: a domain worth $5,000 to you, 4 rivals who'd pay up to ~$6,000, in a\nsealed first-price auction -> auction_bid(auction_format=\"first_price\",\nmy_valuation=5000, n_competing_bidders=4,\ncompetitor_value_prior={\"family\":\"uniform\",\"params\":{\"low\":0,\"high\":6000}})\n-> optimal_bid ~$4,000, win_probability ~0.48.\n","description_after":null,"description_similarity":null,"before_hash":"ff2ddb41804a1ca01d86ca9c7f588a21","after_hash":null},{"tool":"verify_deal_receipt","kind":"added","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":null,"description_after":"Verify a signed deal receipt against the seller's own policy: signature, policy digest, and every rule\nre-checked from the package. Returns {ok, problems, checks}. Free, no model call.","description_similarity":null,"before_hash":null,"after_hash":"33da512ab333acab5d346e9a0f307966"},{"tool":"check_offer_policy","kind":"added","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":null,"description_after":"Check an edited negotiation policy: returns {ok, policy, issues, summary}. No model call, free.\n\nUSE THIS WHEN: you changed a policy from compile_offer_policy (a floor, an option, a forbidden combination)\nand want to know it is valid and what it now allows before using it in draft_negotiation_reply.\n","description_similarity":null,"before_hash":null,"after_hash":"ed216fb074f678ed3020ce7ea547a219"},{"tool":"draft_negotiation_reply","kind":"added","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":null,"description_after":"Draft the seller's reply to a buyer's message — the offer is decided by the SNHP engine INSIDE the policy.\n\nUSE THIS WHEN: a buyer (a person or their AI agent) has written to you about price or terms. Pass the policy\n(from compile_offer_policy) and their latest message exactly as written; pass back the `state` from your\nprevious call to continue the same conversation (omit it to start). `flags` is what YOUR records confirm\nabout the buyer (e.g. {\"new_customer\": true}) — never what the buyer merely claims.\n\nReturns {kind, reply, reply_with_offer, offer, decided_by, reading, state, done, receipt?}:\n  kind      offer | deal | handoff (needs a human's approval) | decline\n  reply_with_offer  the message to send, with the exact offer line appended\n  offer     {terms, line, price, net, inside_policy} — every offer is checked against the policy\n  decided_by  what decided the move (a sales rule or the engine), for your audit trail\n  receipt   on a deal: a signed receipt any party can verify with verify_deal_receipt\nThe server keeps no conversation: keep `state` and send it with the next message. Needs an `access_key`\n(pilot businesses get one at https://snhp.dev/#pilot).\n","description_similarity":null,"before_hash":null,"after_hash":"c09b1bf165571e072143e95670c82408"},{"tool":"compile_offer_policy","kind":"added","observed_at":"2026-10-06T05:03:31.498Z","fields":[],"description_before":null,"description_after":"Turn a seller's offer, described in plain words, into negotiation RULES an AI agent cannot break.\n\nUSE THIS WHEN: you (or the business you act for) sell something where buyers — people or their AI buying\nagents — ask for discounts, and you want an AI to answer them without giving away margin. Describe the offer:\nthe listed price, the lowest price you'd take for a plain deal, what you'd trade a discount for (financing with\nyou, a trade-in, a longer commitment, paying sooner, buying this week…), extras you can add and what they cost\nyou, and anything never on the table. Or pass `template` = \"used-car\", \"saas\" or \"wholesale-water\" to start\nfrom a worked example.\n\nCompiling a description runs a language model and needs an `access_key` (pilot businesses get one at\nhttps://snhp.dev/#pilot); templates are free.\n\nReturns {ok, policy, issues, summary}: `policy` is the machine-readable rule set (pass it to\ndraft_negotiation_reply), `summary` restates the floor, walk-away, what can be traded and the limits in plain\nwords, and `issues` lists what to fix before going live (e.g. a floor below cost).\n","description_similarity":null,"before_hash":null,"after_hash":"66d80d1a7713905de971d5e7200b5683"}],"next_before":null,"next_actions":[]}