No retailer pays to rank higher.
Every other AU comparison engine sorts by what advertisers pay. We don’t. This page shows the exact three-stage sort we ship — product match, offer cheapest-first, and alternatives ranking (ADR-0007: pure-cheapest default with an opt-in trust slider) — the inputs, and which inputs we never read at rank-time. Source lives in apps/web/src/lib/search/run-search.ts, apps/web/src/lib/alternatives/, and the hybrid_search SQL migration.
When a query comes in, the matcher computes a hybrid_score per candidate product using four signals — three text-based (token overlap, trigram, brand similarity) and one semantic (embedding distance). The top-N candidates by hybrid_score become the result list, in score order.
Within each matched product, offers are sorted cheapest total ascending where total_aud = price + shipping. The cheapest in-stock offer becomes best_offer. No retailer-specific weighting; no commission-aware re-rank; no “preferred partner” bypass.
When an agent calls the find_alternatives MCP tool, we evaluate candidate offers against a baseline product and return ranked alternatives. The ranking is governed by ADR-0007: a user-selectable trust slider that defaults to pure cheapest delivered total. The caller controls the trade-off; we never apply it silently.
- Default (
trust_weight=0): sort by delivered total ascending. Two retailers with identical delivered totals tie — no thumb on the scale. This is the model that ships and the model every passive caller gets. - Opt-in (
trust_weight ∈ (0,1]): blend in a merchanttrust_score(rating + delivery accuracy + dispute rate + tenure). Attrust_weight=1ranking is fully reliability-weighted; in between is a linear blend. The formula and the per-candidate inputs are returned in the response so the caller can audit the trade-off. - Hard floors before ranking: every candidate must meet-or-exceed every declared baseline spec (IP67 ≠ IP69; we never silently downgrade). Undeclared candidate specs disqualify. Delivered total includes shipping + cross-border VAT differential (the Hungarian-27% / German-19% gap that bare list prices hide).
- List price only. Vouchers, promo codes, and loyalty pricing are neverread. They’re user-specific and irrelevant to apples-to-apples comparison.
Phase-14.7 disclosure: the trust columns (rating_score, delivery_accuracy_pct, dispute_rate_pct, account_tenure_start) are NULL by default in today’s catalogue. Until they populate, raising trust_weight above 0 reduces every candidate to the neutral default of 0.5 — i.e. it currently tie-breaks at random rather than meaningfully discriminating. We’re shipping the slider as API surface first; the consumer-facing UI on /search waits until the underlying data is real.
- The code is in plain sight. Apart from the SQL migration, every rank decision is in TypeScript at the paths above —
apps/web/src/lib/search/run-search.tsfor search,apps/web/src/lib/alternatives/for the alternatives engine. - The match_confidence field is exposed. Every response includes the four sub-scores (token_overlap, trgm, brand_sim, embedding distance) so an agent can audit why a result ranked where it did.
- The catalogue is read-only at rank time. Commission rates are stored in a separate table not joined into the RPC’s query plan. There is no syntactic path for commission % to influence ranking.
- find_alternatives is honest about what it skips. Every candidate that fails the meets-or-beats floor is returned in the
skipped[]array with a per-candidate reason — spec downgrade, no shipping to buyer country, undeclared spec, list-price too high, etc. You see what didn’t qualify and why; we never silently drop honest losses to make the “cheapest” pick look better. - trust_weight is the caller’s knob, not ours. Default is 0 (pure cheapest). When the caller raises it above 0, the disclosed formula and per-candidate trust_score breakdown ship in the response. No background re-ranking; no “experimental defaults”.
- The MCP wire shows everything. Agents see prices, shipping, VAT differentials, trust factors, and the sort order directly. If we cheated, the agent would surface the inconsistency.
GS_BASE=https://gridscoot.vercel.app python3 scripts/test-protocol/02-recall.py. Today: 54/54 (100%) recall · 17/17 brand-explicit accuracy.