Skip to content

v0.15.0

Choose a tag to compare

@tomtom87 tomtom87 released this 01 Oct 05:35
· 104 commits to main since this release

This release closes the gaps ClawHub's security audit of the portage-buy skill found, hardens the opt-in decision check, and adds a live one-store search and two read-only skills.

  • Security: a checkout mismatch always stops the purchase. buy used to stop on a checkout that didn't match the request (item dropped, another quantity, another unit price) only under PORTAGE_ABORT_ON_CHECKOUT_MISMATCH, so a real --yes run could pay for the wrong checkout and report purchased. Every mismatch on a real run now ends in checkout_mismatch before the payment token, policy and completion. There is no opt-out: that variable is deprecated and ignored.
    • Extra lines count. A priced line nobody asked for (an upsell, "shipping protection", a second copy, or something already in a WebMCP store's cart) is a mismatch. A line that costs nothing is allowed. A checkout in another currency than the catalog's price is a mismatch too.
    • WebMCP hand-offs too. A mismatched cart on a Shopify-style page stops before proceed_to_checkout and before autofill, with the store's /cart page as checkout_url.
    • Quotes. A --quote run's cap now applies before every WebMCP hand-off, and a quote with no total refuses (quote_changed) instead of buying uncapped.
    • A --dry-run keeps its dry_run outcome and now carries checkout_mismatch: true when a real run would stop.
  • portage-cli 0.12.0.
    • Decision check hardened. The state sent to the backend (Jev) is built field by field from an allowlist: the request, the approved quote, and the checkout's lines, totals, discounts and shipping option. Never the payment token, the address, the buyer's name, phone or email, links, discount codes or environment values. The question compares the checkout against the approved quote.
    • Runs before every WebMCP hand-off, preset or not, after the quote cap and the mismatch stop. A hold reports low_confidence with the /cart page as checkout_url, and nothing is handed to the checkout. No backend enabled: unchanged.
    • portage find --store URL --query Q [--max-price N]. Searches one store's catalogue live, skipping the search backends and retailer sources. It is what the skills use to re-check an index hit before quoting a price or stock.
    • Keeps portage-ucp ~> 0.11.
  • portage-ucp-decision 0.1.2. A backend answer that isn't a probability (below 0, above 1, NaN, Infinity) now raises BackendError, so the purchase is held. Before, an answer above 1 cleared any threshold. Install it with gem install portage-ucp-decision if you use the check.
  • buy plugin 0.10.0.
    • New shop-research skill, for questions with no purchase in mind: what something costs, where to get it, whether it's in stock, whether Portage can buy from a store, what you ordered. It runs only read-only commands and never invents store details.
    • buy has narrower triggers. Its description covers shopping, buying and ordering on your behalf, not general questions about prices or products, and points lookups to shop-research. Each OpenClaw env var says you set it yourself and the agent never reads or prints it.
    • Describes the hardened checks: the mismatch stop, the allowlisted decision check, and find --store re-checks. Those need portage-cli 0.12.0, and the older-install fallbacks stay. The minimum portage-cli stays 0.9.0.
  • shop-via-ucp and the new browse-via-ucp skill. shop-via-ucp is now for completing a purchase and gains a guardrail: never pay for a checkout that differs from what you approved. The new read-only browse-via-ucp reads a store's manifest and searches its catalogue, and hands over to shop-via-ucp to buy.

No other gem changed. The docs-only notes in portage-ucp-client and portage-ucp-webmcp stay unreleased. The ClawHub listing is published separately, at buy 0.10.0.