Matchmaking Intelligence Platform · research & design reference
Every design decision below traces to a named paper, standard, or spec section — and to the file that implements it. Nothing here is retrofitted: the platform’s spec cited its research foundations before a line of code existed.
The build follows two layers of grounding. Tier A is the platform’s own stated research foundations — written into docs/concept/Matchmaking_Intelligence_Platform_Revision_5.md §19 as design principles, each already citing sources, before implementation began. Tier B is the algorithm level: the specific published method or standard each running module actually follows.
Grounding is not the same as completeness. CLAUDE.md scopes this build to Level 1 matching, capacity, and a deterministic decision layer — explicitly excluding learned ranking and graph methods. Where a cited principle points toward something out of that scope, it is marked deferred below rather than quietly skipped or overclaimed.
Every feature in this platform is backed by a specific published paper or standard — not a guess or a hunch. The tables below name the paper, name the file that implements it, and say plainly whether that feature is actually built, only partly built, or deliberately left for later.
CLAUDE.md, not built
Thirteen of the eighteen design principles in spec §19 map to a concrete piece of this build. Citation keys jump to the full reference below.
| Principle | Grounded in | Status |
|---|---|---|
Two-sided reciprocal markets§19.2
Both sides have to want the match — a great candidate who doesn’t want what’s on offer isn’t actually a good match.
engine/scoring/directional.py — a→b and b→a scored separately, combined by harmonic mean
|
R1R2R3 | implemented |
Reciprocity must be directional§19.16
What A needs from B differs from what B needs from A, so each direction is checked on its own before the two are combined.
engine/scoring/directional.py — needs→capabilities and preferences→opportunity compared separately, never symmetric similarity alone
|
R3 | implemented |
Rank, don’t just classify§19.3
The goal is ordering candidates best-to-worst for a specific ask — not just sorting them into “good” and “bad” piles.
every response returns ordered candidates, but via a deterministic weighted score + MMR — not a learned ranker. learned: null on every response, per hard rule 1.
|
R4 | deferred |
Beyond accuracy: diversity & serendipity§19.4–19.5
A list that’s technically accurate but shows five near-identical candidates isn’t actually useful, so the system deliberately mixes in variety.
engine/rerank/mmr.py — λ=0.7 default, 0.5 under the “exploratory” strategy control
|
R5R6R7 | implemented |
Guard exposure / popularity feedback loops§19.6
If the same few entities get shown over and over, they start looking “popular” just because they were shown a lot, not because they’re better. The system caps how often anyone gets shown.
engine/capacity/, evals/evals/exposure.py — exposure counters (30/entity/7d), congestion discount, top-5%-share report
|
R8 | implemented |
| Model multiple stakeholders§19.7 A match affects more than the person asking for it — the person recommended, the project owner, and the platform all have a stake. capacity/exclusion logic weighs both sides of a match; no separate multi-stakeholder optimization objective is computed | R9 | partial |
Constraint / preference / intent / strategy / presentation taxonomy§19.9
“Must have X” means something different from “prefer X,” which is different from “show me more options.” The system treats each kind of instruction differently instead of lumping them together.
shared/mip_shared/policy_validation.py — precedence app > project > user, tighten-only; preferences rerank, never silently filter
|
R10 | implemented |
| Separate compatibility, feasibility, outcome§19.10 Being a great fit on paper, actually being available right now, and being likely to succeed are three different questions — kept as three different answers, not blended into one number. base score, capacity exclusion, and (absent) outcome probability kept as distinct fields across the base/adjusted/delivered snapshots | — | implemented |
| Scores are not calibrated probabilities§19.11 A score of 82 doesn’t mean “an 82% chance of success” — it just means this candidate ranks above one scored 75. satisfied by omission — no probability head exists; responses expose ordinal scores only | R6 | implemented |
Explanation, counterfactuals, controllability§19.12
Every result comes with a plain reason it ranked where it did, and what would need to change for it to rank higher.
engine/explain/ — template explanations + counterfactuals, capped at 2 per result
|
R10R14 | implemented |
Graph augments, doesn’t replace§19.15
Looking at who’s connected to whom could add a useful signal later — but it’s not built yet, and it’s meant to add to this approach, not replace it.
explicitly out of scope — CLAUDE.md hard rule 1: no Levels 2–4 or graph
|
R11 | deferred |
| De-identification limits in small populations§19.17 In a small market, even “anonymous” details can accidentally point to one real person (“the only robotics founder in town”). Removing names alone isn’t automatically enough. tokenization + vault encryption implemented; explicit k-anonymity thresholding of quasi-identifiers for a released analytics corpus is not yet built | R13 | partial |
Evidence provenance & uncertainty as first-class§19.18
The system tracks not just what it knows about someone, but how sure it is and where that information came from.
engine/scoring/confidence.py — evidence confidence value carried per result, distinct from compatibility
|
R6R10 | implemented |
Where the code is a faithful implementation of the cited method, that’s stated plainly. Where it follows the same problem framing with a simpler mechanism, that’s stated too.
| Technique | Reference |
|---|---|
Diversity reranking (MMR)
After ranking by relevance, the list gets reshuffled slightly so it doesn’t show five near-duplicates in a row.
engine/rerank/mmr.py — direct implementation of the original formula: λ·sim(d,q) − (1−λ)·max sim(d, selected)
|
I1 |
Weighted hybrid base score
The final score blends two things — how semantically similar two profiles are, and how much they seem to want the same kind of relationship — in a fixed, adjustable ratio.
engine/scoring/directional.py §5.2 — w_sem·semantic + w_rec·reciprocal, a “weighted hybridization” in Burke’s taxonomy
|
I5 |
Directional reciprocal aggregation
Two one-way scores — does A want what B offers, and does B want what A offers — are combined so a lopsided match pulls the final score down, instead of a strong one-sided score hiding a weak other side.
engine/scoring/directional.py — harmonic mean of a→b, b→a
|
R3 |
Sentence embeddings
Turns each text profile into a list of numbers that captures its meaning, so “similar meaning” becomes something a computer can measure.
worker/app/embeddings.py — pinned bge-small-en-v1.5 (I2); descends from the siamese bi-encoder paradigm SBERT established (I4, lineage)
|
I2I4 |
Approximate nearest-neighbor retrieval
Instead of comparing a candidate against every profile in the database, an index quickly finds the ~100 most likely matches first.
engine/scoring/db.py — pgvector index backing the top-100 candidate set, the HNSW graph-search family
|
I3 |
Deterministic pseudonymization
Turns a name into a fixed, non-reversible code — the same person always gets the same code, but the code alone can’t be turned back into the name.
gateway tokenizer — per-tenant entity_token (ENT_<12 hex>), keyed and deterministic
|
I6 |
Exposure / position fairness
Being shown near the top of a list isn’t free — it uses up a limited “exposure budget,” so the same top candidates aren’t shown to everyone forever.
engine/capacity/ — same problem framing as I8, a simpler mechanism (fixed budget + rotation, not an LP-based optimizer)
|
I8 |
Rank-agreement evaluation
Compares the system’s ranking to a human expert’s ranking of the same candidates, and produces one number for how closely they agree.
evals/evals/agreement.py — Kendall’s τ via scipy.stats.kendalltau, engine ranking vs. blind expert panel
|
I7 |
Deterministic, non-learned decision layer
The ranking math never calls an AI model — it’s fixed arithmetic every time, so identical inputs always produce the identical output and it can be audited line by line.
CLAUDE.md hard rule 4 — “no LLM calls inside scoring, ranking, policy application, explanation, or counterfactuals”
|
I9 |
Not academic papers, but the specific legal and technical standards the privacy design is built against.
pgcrypto implements for the per-tenant identity vault. Plainly: the lockbox format the real names are stored in.R1–R14 are reproduced verbatim from the platform spec’s own §21. I1–I9 are added here, at the implementation level, and independently verified. Each entry carries a plain-language gloss below the formal citation.
Matchmaking_Intelligence_Platform_Revision_5.md §21bge-small-en-v1.5, the one this platform uses to turn text profiles into comparable vectors.