
Recommenders learn from feedback. Ours cannot use most of it.
A film recommender improves because millions of People rate films, and a bad recommendation costs someone two hours. A Practitioner recommender has neither property. The feedback is sparse, it arrives slowly, and a bad recommendation can cost a Person their willingness to try Therapy again.
So the design question is not which model to use. It is which signal you are willing to learn from, because that choice decides what the system quietly optimises for over years.
The signals we ruled out, and why
- Session content. The richest signal available, and the one we will never touch. What a Person says in a Session is the reason the Session is private. A system that improves by reading it has already broken the thing it is trying to serve.
- Star ratings. Asking someone to rate a Therapist a week in confuses two different things: whether the Practitioner is good, and whether the hour was comfortable. Good Therapy is frequently uncomfortable. Optimising for a five-star hour selects for Practitioners who avoid the hard conversation.
- Engagement. Time in app, messages sent, features touched. In consumer software these proxy for value. In Care they proxy for distress. A system rewarded for engagement learns to keep People in the product, and the goal here is the opposite: a Person who needed us and no longer does is the success case.
- Practitioner outcomes as a ranking input. Ranking Clinicians on symptom improvement sounds rigorous and creates a brutal incentive: avoid the hardest Clients. Any metric that punishes taking on severe cases will, given time, produce a Network that does not.
What we chose
The Person came back for a second Session with the same Practitioner.
That is nearly the whole signal. It is crude, it is delayed, it is a single bit of information per match, and it is the only one that is honest. Nobody books a second Session with someone they could not talk to. It requires no rating, no survey and nothing from inside the room. It is behaviour, not opinion, and it points at the thing the research says actually predicts whether Therapy works: whether an alliance formed.
We pair it with one more bit that costs nothing: whether the Person switched, and whether the switch stuck. A Person who leaves one Practitioner and stays with the next tells us something specific about the first match that no rating would have surfaced politely.
What that choice costs
It is worth being explicit that this is not a free lunch. Learning from return visits means the system learns slowly, needs volume before it is confident, and is blind to the Person who quietly gives up without telling anyone. It also risks learning convenience: a Practitioner who is cheap and available will collect second Sessions for reasons that have nothing to do with fit, which is why price, schedule and Cover are applied as hard filters before ranking rather than as things the model gets to weigh.
We accept the slower system. A matching engine that learns quickly from the wrong signal ends up confidently wrong at scale, and in this field confidently wrong is not a bug report, it is someone deciding Therapy is not for them.
How the learning is kept away from the Person
The signal is stored decoupled from identity and aggregated before it informs anything. Nothing about an individual's Care history is used to rank Practitioners for anyone else. The unit the system learns from is the shape of a match, language, focus, format, context, and whether that shape held, never the Person who was in it.
We designed it this way before we had a single match to learn from, which is the only time such a decision is cheap. Once the data exists, the temptation to mine it arrives with it.
Iris narrows and explains. A Person always chooses, and switching is two taps. This post is a companion to how the ranking itself works.


