bladebutcher/redrob-ranker
<div align="center">
Redrob Intelligent Candidate Discovery & Ranking
A multi-signal ranking system that finds the best Senior AI Engineers from 100,000 candidates in 25 seconds
     
Live Demo | Submission CSV | Methodology
</div>
The Problem
Given 100,000 candidate profiles with rich structured data (skills, career history, behavioral signals, education), rank the top 100 best fits for a Senior AI Engineer — Founding Team position at a product company.
The catch: the dataset contains honeypot profiles (impossible candidates designed to fool naive rankers), keyword stuffers (non-technical people listing AI skills), and consulting-only careers that look impressive on paper but don't match the founding-team requirement.
Naive keyword matching is explicitly the wrong answer. The JD says so.
Results at a Glance
Top 5 candidates:
Every candidate in the top 10 is a genuine AI/ML engineer at a product company, in the 5-9 year experience sweet spot, with production ML evidence in their career descriptions.
How It Works
4-Stage Pipeline
┌─────────────────────────────────────┐
│ 100,000 candidates │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
Stage 0 │ Honeypot Detection (6 rules) │──── 67 impossible
│ date arithmetic, skill impossibility │ profiles flagged
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
Stage 1 │ Coarse Filter │──── 59,211 eliminated
│ title + description + experience │ (non-tech, <2yr exp)
└──────────────┬──────────────────────┘
│ 40,789 candidates
┌──────────────▼──────────────────────┐
Stage 2 │ Multi-Signal Scoring │
│ 8 weighted dimensions per candidate │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
Stage 3 │ Rank + Reasoning Generation │──── submission.csv
│ sort, tiebreak, per-candidate text │ (top 100)
└─────────────────────────────────────┘8 Scoring Dimensions
The Key Insight: Career Descriptions > Listed Skills
The JD warns that keyword matching is a trap. Our career trajectory scorer is the key differentiator:
Candidate A: "Senior AI Engineer" at TCS
→ Skills list: PyTorch, TensorFlow, BERT, FAISS, RAG
→ Career descriptions: "managed client deliverables", "requirement gathering", "stakeholder management"
→ Result: HIGH title score, but ZERO production ML evidence → consulting penalty → ranked LOW
Candidate B: "Software Engineer" at Razorpay
→ Skills list: Python, PyTorch
→ Career descriptions: "built recommendation pipeline serving 2M daily users",
"deployed embedding model with p99 < 50ms", "A/B tested ranking algorithm"
→ Result: MODERATE title score, but STRONG production ML evidence → ranked HIGHThis is why embeddings fail here — they see Candidate A's keyword list and rank them high. We read what they actually did.
Detailed Scoring Breakdown
Honeypot Detection
Six rules catch impossible profiles before scoring begins:
Result: 67 honeypots detected, 0 in top 100.
Trust Multiplier
Not all skill claims are equal:
This single mechanism eliminates most keyword stuffers from the top rankings.
Anti-Pattern Detection
Behavioral Signals
All 23 Redrob platform signals are used across 18 weighted components:
Reasoning Examples
Every candidate gets a specific, fact-based reasoning string. No templates, no hallucination — each claim traces to actual profile fields.
Strong candidate (Rank #1):
Senior AI Engineer at Netflix with 7.8yr exp. based in Vizag, Andhra Pradesh. 3/3 roles in ML/AI; ML leadership experience; startup/early-stage background; skills: LoRA, Learning to Rank, Weaviate, PEFT; 76% recruiter response rate.
Strong candidate (Rank #6, now with concern flag):
Senior NLP Engineer at Mad Street Den with 8.0yr exp. based in Vizag, Andhra Pradesh. 3/3 roles in ML/AI; ML leadership experience; startup/early-stage background; skills: Reinforcement Learning, Weaviate, LoRA, LLMs. Concerns: low recruiter response rate (16%).
31 out of 100 candidates include honest concern flags — the system doesn't hide gaps.
Quick Start
Requirements
- Python 3.10+
- No GPU, no internet, no API keys
Install & Run
# Install (only pyyaml + tqdm)
pip install -r requirements.txt
# Rank 100K candidates
python rank.py --candidates ./candidates.jsonl --out ./submission.csv
# Validate output format
python validate_submission.py submission.csv
# Run tests
python -m pytest tests/ -v
# Launch sandbox UI
python app.pyDocker (for reproducibility testing)
docker build -t redrob-ranker .
docker run --rm -v $(pwd):/data redrob-ranker \
python rank.py --candidates /data/candidates.jsonl --out /data/submission.csvPerformance
Project Structure
redrob-ranker/
├── rank.py # CLI entry point — orchestrates the 4-stage pipeline
├── config.py # All weights, thresholds, and tunable parameters
│
├── pipeline/
│ ├── loader.py # Streaming JSONL reader (memory-efficient)
│ ├── honeypot.py # Stage 0: 6-rule impossible profile detection
│ ├── coarse_filter.py # Stage 1: fast elimination (100K → 40K)
│ ├── scorer.py # Stage 2: composite scoring orchestrator
│ ├── ranker.py # Stage 3: final ranking + reasoning generation
│ └── features/
│ ├── title_alignment.py # 70+ titles scored + headline boost
│ ├── skills_match.py # 178 skills, 3 tiers, trust multiplier + assessments
│ ├── career_trajectory.py # THE differentiator — description analysis for ML work
│ ├── experience_fit.py # Bell curve centered at 7yr
│ ├── location_score.py # India tier-based (Pune/Noida > Bangalore > Tier-2)
│ ├── education_score.py # Field relevance + institution + certifications
│ ├── behavioral_signals.py # 18 components from 23/23 Redrob signals
│ └── anti_patterns.py # 4 detectors: stuffer, consulting, chaser, cv-only
│
├── jd/
│ ├── requirements.py # Structured JD representation
│ └── taxonomy.py # Title hierarchy, skill taxonomy, company classification
│
├── app.py # Gradio sandbox (live on HuggingFace Spaces)
├── tests/test_pipeline.py # 10 tests covering all pipeline components
├── analysis/
│ ├── explore_data.py # Dataset distribution analysis
│ └── inspect_top100.py # Top 100 quality validation
├── validate_submission.py # Official submission format validator
├── submission.csv # Final output: 100 ranked candidates with reasoning
├── submission_metadata.yaml # Hackathon metadata
├── sample_candidates.json # 50 sample candidates for sandbox/testing
├── requirements.txt # Minimal: pyyaml + tqdm
└── LICENSE~1,900 lines of hand-crafted scoring logic across 15 modules.
Design Decisions
Why rule-based over embeddings/LLMs?
The JD explicitly says keyword matching is the wrong approach. Embeddings are sophisticated keyword matching. We built something that understands context.
Why these weights?
- Title + Skills + Career = 60% — what someone is and what they've done dominates
- Career Trajectory at 20% — same weight as skills, because doing ML work matters as much as listing ML skills
- Behavioral at 10% — availability is a real constraint; a perfect candidate with 0% response rate is useless
- Anti-Pattern at 7% — not a score, but a penalty. Catches the candidates that look good on surface but fail deeper inspection
- Education at 5% — matters least for a senior role; career speaks louder than degrees
Key taxonomy numbers
AI Tools Declaration
No candidate data was fed to any LLM. The ranking system uses zero AI inference — it's purely rule-based scoring with hand-crafted features derived from deep JD analysis.
Testing
$ python -m pytest tests/ -v
tests/test_pipeline.py::test_honeypot_detection PASSED
tests/test_pipeline.py::test_coarse_filter PASSED
tests/test_pipeline.py::test_title_scoring PASSED
tests/test_pipeline.py::test_experience_fit PASSED
tests/test_pipeline.py::test_full_pipeline PASSED
tests/test_pipeline.py::test_tiebreak_correctness PASSED
tests/test_pipeline.py::test_anti_pattern_consulting_only PASSED
tests/test_pipeline.py::test_anti_pattern_keyword_stuffer PASSED
tests/test_pipeline.py::test_career_trajectory_leadership_bonus PASSED
tests/test_pipeline.py::test_reasoning_has_content PASSED
10 passed in 0.74s<div align="center">
Built for the India Runs Hackathon 2026 | Track 1: Data & AI Challenge
Team Umbrella.co | Priyanshu
</div>
