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.
| dimension | unit | your value | weight |
|---|---|---|---|
| thermal | 0–1 (cooler→warmer) | 0.78 | 0.18 |
| firmness | 1–10 | 6.5 | 0.16 |
| pressure relief | 0–1 | 0.82 | 0.15 |
| motion isolation | 0–1 | 0.74 | 0.12 |
| edge support | 0–1 | 0.61 | 0.08 |
| response | 0–1 (slow→fast) | 0.69 | 0.08 |
| height | cm | 28 | 0.05 |
| zoning | 0–1 | 0.71 | 0.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.
- 01 · parse~1,200 → ~30wearable events → numbers
Fourteen nights aggregate into one biometric profile: median RHR, HRV reserve, skin-temperature delta, stage ratios, latency, wake count.
- 02 · weight30 + 12 → findingsprofile + quiz answers
Each finding ("elevated overnight skin-temperature delta") bumps one or more spec-vector weights up or down.
- 03 · score32 → fit scoresSKUs, weighted L2 fit
Categorical attributes filter the catalogue first; the fit runs on what survives.
- 04 · ranktop 5 · governedshown on your audit
Ties break on price-per-fit-point and trial generosity, two variants max per brand, near-duplicates suppressed.
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:
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.
Updated as the catalogue expands. Currently Melbourne, Sydney, Byron Bay, Adelaide brands. Brisbane + Perth in progress.