Overview
The Automated Matchmaker System (AMS) or ranking engine decides what a student sees first. It is deterministic, explainable and deliberately conservative: it would rather show you fewer confident matches than a long list of noise.
The problem it solves
A naive board sorts by date. That rewards whoever posted last, not whoever is relevant. A pure keyword search rewards listings that stuff their titles. Both fail the same student: someone with three skills, one stated interest and no patience.
CareerTruss ranks in two stages. First intent grouping answers a yes/no question: is this listing plausibly the thing you said you want? Then a composite score orders listings inside each group.


Stage 1 — Intent grouping
Group A membership is decided by isStrictRoleMatch, not by a score threshold. That distinction matters: a score-based gate lets a well-paid, freshly-posted, wrong-field listing buy its way into the top of your feed. A strict gate does not.
Exact containment
The listing role contains your preferred role, or your preferred role contains the listing role. "Frontend Developer Intern" matches "Frontend Developer".Role-specific keywords
Each preferred role owns a curated keyword set. "Backend Developer" carriesbackend,api,server,node,django. Generic words like "intern", "developer" and "engineer" are deliberately excluded — they match everything and therefore mean nothing.Everything else falls to Group B
Group B is not hidden. It is ranked below Group A and carries a flat −25 point penalty so irrelevant roles cannot climb on stipend alone.
Why a penalty and not a filter
Stage 2 — The composite score
Scoring is track-aware. Stipend is normalised within a track, because a ₹25,000 software stipend and a ₹6,000 NGO stipend are not comparable numbers and should not be ranked as if they were.
| Signal | Weight | How it is computed |
|---|---|---|
| Skill overlap | highest | Your skills ∩ listing skills, personalised by role-implied skills |
| Role relevance boost | up to 30 | +20 title/keyword match, +15 track alignment, capped at 30 |
| Stipend | up to 30 | Min-max normalised inside the listing's own track |
| Work mode | 5–15 | Remote 15, hybrid 10, on-site 5 |
| Recency | decaying | Newer postings score higher; ~30 days treated as stale |
| Intent penalty | −25 | Applied to every Group B listing |
Adaptive skill threshold
Requiring a fixed 50% skill overlap punishes beginners — the exact users who need recommendations most. The required overlap ratio therefore scales with how many skills you have listed, from roughly 0.2 for a sparse profile up to 0.5 for a rich one.
| Skills on profile | Required overlap | Effect |
|---|---|---|
| 1–2 | ~20% | One shared skill is enough to be considered |
| 3–5 | ~30–40% | Matching tightens as evidence grows |
| 6+ | ~50% | Only genuinely aligned listings qualify |
Role inference
If you never picked a preferred role, the engine deriveseffectiveRoles from your skills using the same track map that powers the career tracks. i.e. React and TypeScript imply frontend; Figma implies design; Tally and financial modelling imply finance. Inference is a fallback, not a substitute — stated intent always wins.
The Profile Gate
Ranking on an empty profile is astrology. If you have fewer than three skills or no stated role, the Profile Gate intercepts you before the feed and asks for the two inputs the engine cannot work without.
Warning
Explainability
Every recommendation carries a "Why this internship?" line built from the same values used to rank it: the specific skills that matched, the role that triggered the match, and whether it is a track-level or title-level alignment. If we cannot explain a placement in one sentence, it does not deserve the placement.
Tip