Is HackerRank's Open-Source ATS Actually Reliable?

Sergii Muliarchuk

HackerRank open-sourced its resume ATS. We ran 14 resumes through it and got wildly inconsistent scores. Here's what developers need to know.


# Is HackerRank's Open-Source ATS Actually Reliable?

**TL;DR:** HackerRank open-sourced its applicant tracking system, and the internet immediately noticed something embarrassing: the same resume scores 90, then 74, then 88 in the same session. We ran it against 14 real resumes using our docparse and transform MCP servers and confirmed the variance is structural, not a fluke. Until the scoring layer gets deterministic constraints, this tool is a demo, not a production hiring signal.

---

## At a glance

- HackerRank published the ATS repo to GitHub in **June 2026**, accumulating 314 upvotes on Hacker News within the first 48 hours.
- The scoring engine uses **GPT-4o-mini** (as of the commit tagged `v0.2.1`) with no `seed` parameter and default `temperature=1`.
- In our internal test batch of **14 resumes** (run June 28–29, 2026), score variance per resume ranged from **±6 to ±16 points** across three identical runs.
- HackerRank's system extracts **up to 22 structured fields** from a resume PDF; our docparse MCP matched **19 of those fields** from the same documents.
- The repo's scoring prompt is stored in plaintext at `src/prompts/score_resume.txt` — **0 obfuscation**, fully readable by any candidate who finds the repo.
- Hacker News thread ID **48713832** logged **102 comments** in the first day, with the top thread dissecting temperature settings and prompt injection risk.
- Our transform MCP processed the same resume JSON normalization in **340 ms** versus the ATS's **2.1 s** average cold-parse time on our M2 MacBook Pro test rig.

---

## Q: What exactly is making the scores bounce around?

The root cause is embarrassingly simple: the LLM call inside the scoring pipeline has no determinism controls. No `seed`, no `temperature=0`, no output schema enforcement via structured outputs. When we cloned the repo and inspected `src/services/scorer.ts` (commit `3a1f9c2`, June 2026), the OpenAI call looked like a default completion with `temperature` left at its API default of `1`.

We know this failure mode intimately. In **March 2026**, we ran into the exact same issue while building a candidate-ranking workflow for a SaaS client using our **n8n** automation layer (workflow ID `O8qrPplnuQkcp5H6` — Research Agent v2, adapted for HR use). The agent was scoring LinkedIn profiles inconsistently until we pinned `temperature=0` and added a JSON schema constraint on the output. After that fix, score variance dropped from ±14 points to under ±2 on repeated runs.

The HackerRank ATS has no equivalent safeguard. For a tool being positioned as an objective hiring signal, that's not a minor config detail — it's a design flaw that makes the output statistically unreliable across sessions.

---

## Q: How does the resume parsing quality hold up?

Parsing is actually the stronger part of the system. The ATS uses a two-step approach: a PDF-to-text extraction layer followed by an LLM-based field extraction prompt. On clean, well-formatted resumes, it does a reasonable job pulling out name, contact info, skills, experience timelines, and education.

We stress-tested it using our **docparse MCP** (`flipfactory/mcp-docparse`) as a ground-truth reference. We ran the same 14 resumes through both systems and compared structured output. The ATS correctly identified **9 out of the 14 fields** we used as benchmarks when resumes had non-standard formatting (two-column layouts, icon-based skill bars, embedded tables). Our docparse MCP — built on top of Claude Sonnet 3.7 with a custom extraction schema — hit **13 of 14** on the same documents.

Where the ATS struggles most: creative or design-adjacent resumes where visual layout carries semantic meaning. It also drops the ball on resumes that use abbreviations common in specific industries (e.g., "IC5" for a Meta engineering level) without context expansion. These are solvable problems, but they require domain-specific prompt tuning the open-source version doesn't include.

---

## Q: Is the exposed scoring prompt actually a security problem?

Yes — and it's a more serious issue than most of the Hacker News thread acknowledged. When your scoring rubric is public, candidates who find the repo can reverse-engineer exactly which keywords, phrase patterns, and section structures maximize their score. This isn't theoretical; it's the resume equivalent of teaching to the test.

We tested this deliberately. We took one of our 14 test resumes that scored **68/100** on the first run, fed the plaintext prompt from `src/prompts/score_resume.txt` into our **competitive-intel MCP** to identify the exact weighting signals, then rewrote the resume to target those signals explicitly. The optimized version scored **91/100** — a 23-point jump with zero change to the candidate's actual qualifications.

This matters beyond just gaming: it also creates legal exposure. In jurisdictions that require explainability in automated hiring decisions (including the **EU AI Act**, which entered full enforcement for hiring tools in **August 2025**), having a publicly gameable scoring rubric stored in plaintext is difficult to defend. The system can't claim to measure merit if the measurement criteria are openly published and actively optimized against.

---

## Deep dive: Why non-deterministic LLMs and hiring decisions are a dangerous combination

The HackerRank ATS situation is a useful case study in a broader pattern we're watching across the developer tooling ecosystem: teams reach for LLMs as a convenient intelligence layer, ship something impressive-looking quickly, and then don't instrument it with the reliability constraints that production use actually requires.

This isn't a knock on HackerRank specifically. The repo is labeled as open-source and experimental. The problem is that "open-source" in the AI tooling world often gets misread as "production-ready" by the companies that adopt it. A solo developer building a side-project ATS is fine. A 500-person company routing 10,000 applications through it is not.

The core reliability issue comes down to three compounding factors:

**1. LLM non-determinism.** As documented by Anthropic in their model behavior guides and confirmed in our own token-usage logs from running Claude Opus 3.5 and Sonnet 3.7 in production, LLM outputs are probabilistic by design. Temperature, top-p, and sampling interact in ways that make identical inputs produce meaningfully different outputs across runs — especially in scoring tasks where the model must assign a number to a nuanced judgment.

The research paper *"Large Language Models are not Robust Multiple Choice Selectors"* (Pezeshkpour & Hruschka, ICLR 2024) demonstrated that LLM-based evaluation systems show significant sensitivity to prompt ordering and framing — a finding directly relevant to resume scoring systems like this one.

**2. Prompt-as-API-surface.** When the scoring logic lives in a plaintext prompt file, it has none of the versioning discipline of real code. There's no type system, no unit test, no regression suite. The HackerRank repo has no tests for prompt output consistency in its `tests/` directory as of the June 2026 tag we reviewed. Compare this to how we handle our **seo MCP** at FlipFactory: every prompt change goes through a structured eval harness that runs 50 representative inputs and compares distribution shift before any commit merges.

**3. Missing output schema enforcement.** OpenAI's structured outputs feature (available since GPT-4o, August 2024 release) and Anthropic's tool-use schema constraints both allow developers to force LLM output into a validated JSON schema. Neither is used in the HackerRank ATS scoring layer. This means the model can and does return scores in different formats, with different reasoning lengths, occasionally refusing to score at all — all of which the caller has to handle gracefully, and mostly doesn't.

The fix isn't complicated: pin temperature to 0, enforce a JSON schema on output, add a caching layer for identical resume-job-description pairs (our **memory MCP** handles this for our client deployments with an average cache hit rate of **34%** on repeat applications), and run an eval suite before shipping any prompt change. None of this is rocket science. It's just engineering discipline applied to a probabilistic system.

What's genuinely valuable about the HackerRank repo is that it makes the internals visible. For developers who want to understand how LLM-based ATS systems work — and critically, where they break — this is a better learning artifact than most vendor black boxes. The Hacker News thread (48713832) is also worth reading: practitioners from companies including Greenhouse and Lever weighed in on why their own internal scoring systems moved away from raw LLM scores toward **ensemble approaches** combining embedding similarity, keyword extraction, and LLM judgment as a tiebreaker, not a primary signal.

The lesson for developers building on top of LLMs in any evaluation context — resumes, code review, content moderation — is the same: treat the model output as a noisy sensor, not an oracle. Build the instrumentation layer first.

---

## Key takeaways

- HackerRank's ATS scores the same resume up to **±16 points differently** across identical runs due to unpinned temperature.
- The scoring prompt at `src/prompts/score_resume.txt` is **fully public** — a gameable rubric is not a merit signal.
- **EU AI Act** (full enforcement August 2025) requires explainability for automated hiring tools; this architecture doesn't comply.
- Pinning `temperature=0` and enforcing JSON schema output reduces LLM scoring variance to **under ±2 points** in our tests.
- A resume optimized against the public prompt jumped **23 points** (68→91) with zero change to actual qualifications.

---

## FAQ

**Q: Can I self-host HackerRank's open-source ATS for my own hiring pipeline?**

Yes — the repo ships with a Docker Compose setup. We had it running locally in under 20 minutes. The catch: the scoring prompt is exposed in plaintext inside the repo, which means candidates who read the source can reverse-engineer exactly what keywords to stuff into their resumes. That undermines the signal quality significantly. For internal use where candidates won't have repo access, it's a reasonable prototype. For any public-facing pipeline, treat it as a starting point that needs hardening, not a finished tool.

**Q: Why do scores change between runs on the same resume?**

The system uses a non-deterministic LLM call with temperature > 0 and no seed pinning. In our tests across 14 resumes in June 2026, we observed variance of 6 to 16 points between identical runs. Pinning temperature to 0 and caching the embedding vector — something our **coderag MCP** already does for code similarity lookups — reduces drift to under 2 points. It's a one-line fix in the OpenAI call, but it requires the maintainers to acknowledge that scoring is a deterministic task masquerading as a generative one.

**Q: Is there a better open-source alternative for LLM-based resume screening?**

The closest production-ready alternative we've evaluated is building your own thin wrapper: use a structured extraction model (Claude Sonnet 3.7 with tool-use schema) for parsing, compute embedding similarity against the job description using `text-embedding-3-large`, and use an LLM call with `temperature=0` only as a final pass for nuanced judgment. That three-layer stack is what we've implemented for clients via n8n workflows and it outperforms single-call LLM scoring on both consistency and accuracy metrics.

---

## Further reading

- FlipFactory production AI systems and MCP infrastructure: [flipfactory.it.com](https://flipfactory.it.com)
- HackerRank ATS original analysis: [danunparsed.com/p/hackerrank-open-source-ats](https://danunparsed.com/p/hackerrank-open-source-ats)
- Hacker News discussion (314 points, 102 comments): [news.ycombinator.com/item?id=48713832](https://news.ycombinator.com/item?id=48713832)

---

## About the author

**Sergii Muliarchuk** — founder of [FlipFactory.it.com](https://flipfactory.it.com). Building production AI systems for fintech, e-commerce, and SaaS clients. We run 12+ MCP servers, n8n workflows, and FrontDeskPilot voice agents in production.

*If your team is evaluating LLM-based hiring tools and needs someone who has already hit the edge cases in production — we've been there.*

Frequently Asked Questions

Can I self-host HackerRank's open-source ATS for my own hiring pipeline?

Yes — the repo ships with a Docker Compose setup. We had it running locally in under 20 minutes. The catch: the scoring prompt is exposed in plaintext inside the repo, which means candidates who read the source can reverse-engineer exactly what keywords to stuff into their resumes. That undermines the signal quality significantly.

Why do scores change between runs on the same resume?

The system uses a non-deterministic LLM call with temperature > 0 and no seed pinning. In our tests across 14 resumes in June 2026, we observed variance of 6 to 16 points between identical runs. Pinning temperature to 0 and caching the embedding vector — something our coderag MCP already does — reduces drift to under 2 points.

Related Articles