Decisions
Ask the questions that teach the model the most
Questions aren't random. For each person I pick the ones expected to shrink the uncertainty in their match scores the most, weighted by how much they care about each dimension. Every answer is a Kalman-style update to a Gaussian belief, which keeps it cheap and keeps every number explainable to the person it describes.
- Adaptive questions reach the same accuracy with about half the questions, 12 instead of ~24.measured · README.md
- Each user is a Gaussian belief over 8 dimensions, for who they are and who they want, and each answer is a Kalman-style update, so every number can be explained.design · README.md
Share the attention fairly
If everyone just sees their own top three, popular profiles end up in dozens of lists and a lot of people get nothing. Daily matches are assigned with greedy b-matching instead: a match is shown to both people and nobody gets more than three a day. It costs a little like rate, and I think that trade is worth it.
- Daily matches are assigned with greedy b-matching, which drops exposure inequality from a Gini of 0.46 to 0.02 for about 4 points of like rate.measured · README.md
Prove it before anyone signs up
There were no users, so I built a simulator first: people with hidden traits, answers with noise, and a random chemistry term no questionnaire could ever capture. The engine never sees the ground truth, and the simulator measures how close it gets. It also showed me where learning from likes helps and where it doesn't.
- With the full 96-question bank, rank correlation reaches 0.718 by day 21, which is 94% of an oracle that knows everyone's true traits.measured · README.md
- Learning from likes and passes barely matters when people answer honestly (0.718 vs 0.720), but when stated preferences are noisy it lifts accuracy from 0.65 to 0.69 by day 28.measured · README.md
Keep two languages honest
The belief update runs in TypeScript in the API and in Python in the nightly job. The Python side exports the question bank and recorded answer sequences with their expected results, and the API tests replay them, so the math can't quietly drift between the two.
- The belief update exists in both Python and TypeScript, and the API tests replay fixtures exported by the Python side so the two cannot drift apart.design · README.md