The problem
Ditto tells certain users they are guaranteed a match, and that promise is a big part of the product. The matcher was delivering on it 37% of the time.
Nothing was broken. The matcher is a weighted Gale–Shapley pass with Edmonds' Blossom handling the general non-bipartite case, and it was doing what it was told: maximize total weight across the graph. A guaranteed user with an awkward preference profile is an expensive edge. Dropping them frees up enough weight elsewhere that the round scores better overall. The algorithm was optimizing a number nobody had promised to anyone.
Matching is zero-sum in a way ranking isn't. Every person you match is a person somebody else can't have. "Prioritize these users" always costs something, so the only real question is how much, and whether that price is worth paying.
Why the obvious fix doesn't work
The first thing anyone suggests is to sort guaranteed users to the front and match them greedily. That fails right away. Greedy assignment on a matching problem causes exactly the failure mode matching algorithms were invented to prevent: early picks take partners that later, better pairs needed, and overall quality falls apart. You can get to 100% coverage that way and give everyone a bad match.
Blossom is also not a sort you can attach a rule to. It computes a maximum-weight matching over the entire graph at once, augmenting along alternating paths and contracting odd cycles. There's no parameter for "and definitely include this person." Any priority has to be expressed in the only thing the algorithm reads, which is edge weights.
What I built
Three priority tiers, applied as structured weight adjustments rather than hard constraints.
Tiers instead of a single guaranteed/not-guaranteed flag, because two states force you to treat very different users identically and leave the optimizer no room to make sensible trades at the margin.
Weights instead of constraints, because a hard constraint can make a round infeasible or force a genuinely bad pairing just to satisfy the rule. A weighted preference pushes the solver toward covering high-tier users while still letting it decline when the alternative would be worse for everyone involved. The matcher keeps all its original guarantees.
Any priority scheme spends match volume to buy coverage. I treated the exchange rate as the deliverable. Not "did coverage go up," but how much volume each point of coverage cost. Coverage rose 50 points and total matches fell 2.5. That ratio is what got it shipped.
Results
A 50-point swing in whether the product keeps its main promise, for a 2.5% haircut on volume. Presenting it as a trade rather than as a win is what turned it from a debate into a decision.