Inputs in, ranked fits out.

The audit takes two inputs - fourteen nights of biometric signal and twelve quiz answers - and produces a ranked list of up to five mattresses with a confidence number on each. Every audit reports its own per-phase wall clock at the top of your results - the dwell you see on the analysis screen is review time, not compute time. Same inputs, same audit, every time.

No machine learning, no opaque ranking. Just a weighted fit between your sleep spec and each mattress's spec, plus a confidence model that tells you how constrained the answer is.

Eight dimensions.

Both you and every mattress in the catalogue are described by the same eight-dimensional spec. Each dimension is normalised to a 0–1 scale, except firmness (1–10) and height (cm). Matching is a weighted L2 fit across these eight features; categorical attributes (sleep position support, build, materials, price band) filter the catalogue before the fit runs.

dimensionunityour valueweight
thermal0–1 (cooler→warmer)0.780.18
firmness1–106.50.16
pressure relief0–10.820.15
motion isolation0–10.740.12
edge support0–10.610.08
response0–1 (slow→fast)0.690.08
heightcm280.05
zoning0–10.710.05

Construction details (latex/foam/coil percentages), trial & warranty terms, and durability proxies sit alongside the vector as categorical metadata - they inform governance and tie-breakers but don't enter the fit distance. Full catalog.json for the catalogue side; per-user vector lives only in the audit session.

Parse → weight → score → rank.

  1. 01 · parse
    ~1,200 ~30
    wearable events → numbers

    Fourteen nights aggregate into one biometric profile: median RHR, HRV reserve, skin-temperature delta, stage ratios, latency, wake count.

  2. 02 · weight
    30 + 12 findings
    profile + quiz answers

    Each finding ("elevated overnight skin-temperature delta") bumps one or more spec-vector weights up or down.

  3. 03 · score
    32 fit scores
    SKUs, weighted L2 fit

    Categorical attributes filter the catalogue first; the fit runs on what survives.

  4. 04 · rank
    top 5 · governed
    shown on your audit

    Ties break on price-per-fit-point and trial generosity, two variants max per brand, near-duplicates suppressed.

// fit score for SKU i, lower distance = better fit
fit = 1 − √( Σd wd · (ud − si,d)² )

How constrained is the answer?

Confidence is a separate number from fit score. It answers a different question: given the data we have, how tightly does it constrain the recommendation? Three multiplicative factors:

confidence = data_volume · signal_agreement · completeness
Confidence by nights of wearable signalwith wearablequiz-only

nights of wearable signal · data_volume with the other two factors held clean. Bands are display thresholds on the final confidence number.

  • signal_agreement - starts at 1.0. Each unresolved disagreement between a biometric signal and a quiz answer pulls it down by 0.20 (floor 0.40); each converged finding adds 0.04, capped at +0.15.
  • completeness - each missing high-leverage quiz field (sleep position, build, budget, partner) multiplies the score by 0.85.

The curve is data_volume with the other two factors held clean. Quiz-only audits fall back to 0.5 × completeness, the flat line: a complete quiz with no wearable lands at ~0.50, an incomplete quiz below it.

Same inputs, same audit.

The engine is deterministic. No randomness, no A/B-tested rankings, no personalised weights that drift over time. If you re-run the audit with the same fourteen nights and the same quiz answers, you'll get the same five mattresses in the same order with the same confidence.

That's deliberate. The point of the audit is to be inspectable - you can open any rank's "why this" panel and trace the recommendation back to specific findings and weights.

document
Engine v0.4.1 · catalogue 32 SKUs · AU only

Updated as the catalogue expands. Currently Melbourne, Sydney, Byron Bay, Adelaide brands. Brisbane + Perth in progress.