# What Kind of Data Does the Hiring-Agent Store? A Complete Technical Breakdown

> Discover what data the interviewstreet hiring-agent stores: JSON resume caches, GitHub data, and CSV evaluation scores. A complete technical breakdown of the repository.

- Repository: [HackerRank/hiring-agent](https://github.com/interviewstreet/hiring-agent)
- Tags: deep-dive
- Published: 2026-07-12

---

**The interviewstreet/hiring-agent pipeline stores structured resume extracts as JSON caches, GitHub profile data as separate JSON files, and final evaluation scores as CSV rows, while processing raw PDFs only in memory.**

The hiring-agent repository by InterviewStreet automates technical candidate evaluation by processing resume PDFs and enriching them with GitHub activity signals. If you are investigating what kind of data does hiring-agent store during this pipeline, the system persists three distinct categories of artifacts: parsed resume structures, cached API responses, and fairness-aware scoring results. These storage mechanisms enable fast repeatable runs and auditability while minimizing redundant LLM and GitHub API calls.


## Resume Data Artifacts: From PDF to Structured JSON


### Raw PDF Conversion to Markdown

The data pipeline begins in [`pymupdf_rag.py`](https://github.com/interviewstreet/hiring-agent/blob/main/pymupdf_rag.py), which reads PDF pages using PyMuPDF and converts them to a Markdown-style text representation. This raw content remains in memory to serve as the basis for section parsing, but the system does not persist the original PDF or its raw text extract to disk.


### Structured JSONResume Objects

The [`pdf.py`](https://github.com/interviewstreet/hiring-agent/blob/main/pdf.py) module invokes an LLM for each resume section and assembles a `JSONResume` object defined in [`models.py`](https://github.com/interviewstreet/hiring-agent/blob/main/models.py). When `DEVELOPMENT_MODE=True`, the system serializes this structured data to `cache/resumecache_<basename>.json` as implemented in [`score.py`](https://github.com/interviewstreet/hiring-agent/blob/main/score.py) (lines 215-260). This caching strategy allows reuse of extraction results without reprocessing the PDF through expensive LLM calls.

```python

# 1️⃣ Save extracted resume JSON to cache

cache_filename = f"cache/resumecache_{os.path.basename(pdf_path).replace('.pdf', '')}.json"
if DEVELOPMENT_MODE:
    os.makedirs(os.path.dirname(cache_filename), exist_ok=True)
    Path(cache_filename).write_text(json.dumps(resume_dict, indent=2))

```


## GitHub Profile and Repository Caching

The [`github.py`](https://github.com/interviewstreet/hiring-agent/blob/main/github.py) module extracts candidate usernames and fetches user profiles and repositories via the GitHub API. To limit API usage and speed up repeated evaluations, responses are cached as JSON in `cache/githubcache_<basename>.json` (or `cache/gh_githubcache_… .json`) when `DEVELOPMENT_MODE=True`, as defined in [`github.py`](https://github.com/interviewstreet/hiring-agent/blob/main/github.py) (lines 18-40).

```python

# 2️⃣ Cache GitHub API responses

def _create_cache_filename(api_url: str, params: dict = None) -> str:
    # builds a deterministic filename under the cache directory

    …
cache_filename = _create_cache_filename(api_url, params)
if DEVELOPMENT_MODE and os.path.exists(cache_filename):
    cached_data = json.loads(Path(cache_filename).read_text(encoding="utf-8"))
else:
    # fetch from GitHub, then cache

    Path(cache_filename).write_text(json.dumps(data, indent=2))

```


## Evaluation Scores and Evidence Storage

The [`evaluator.py`](https://github.com/interviewstreet/hiring-agent/blob/main/evaluator.py) module runs a fairness-aware scoring routine, producing category scores, bonus points, deductions, and explanatory evidence. According to [`score.py`](https://github.com/interviewstreet/hiring-agent/blob/main/score.py) (lines 295-320), the system appends these results as a row to `resume_evaluations.csv` when operating in development mode, generating both human-readable reports and machine-readable data for further analysis.

```python

# 3️⃣ Append evaluation results to CSV (development mode)

if DEVELOPMENT_MODE:
    csv_path = "resume_evaluations.csv"
    header = ["candidate", "open_source", "self_projects", "production", "technical_skills", "bonus", "deductions"]
    write_header = not os.path.exists(csv_path)
    with open(csv_path, "a", newline="") as f:
        writer = csv.writer(f)
        if write_header:
            writer.writerow(header)
        writer.writerow([candidate_name, *scores, bonus, deductions])

```


## Intermediate Data Models and Validation

While [`transform.py`](https://github.com/interviewstreet/hiring-agent/blob/main/transform.py) normalizes loose LLM JSON into the strict JSON-Resume format and [`models.py`](https://github.com/interviewstreet/hiring-agent/blob/main/models.py) holds Pydantic schemas for data structures, these intermediate artifacts remain as in-memory objects only. They influence the final JSON and CSV outputs and enforce data consistency across the pipeline, but they are not persisted to disk independently.


## Summary

- **Structured resume data** is stored as JSON files in the `cache/` directory, specifically `resumecache_<basename>.json`, enabling reuse of expensive LLM extraction results.
- **GitHub API responses** are cached as separate JSON files to avoid rate limiting and accelerate repeated candidate evaluations.
- **Final evaluation scores** are appended to `resume_evaluations.csv` for auditability and downstream analysis.
- **Raw PDF content** is processed in memory only and never persisted to disk, ensuring the system retains only extracted insights and quantitative scores.


## Frequently Asked Questions


### Where does hiring-agent store cached resume data?

The system stores cached resume data in `cache/resumecache_<basename>.json` files within the project root, generated by the logic in [`score.py`](https://github.com/interviewstreet/hiring-agent/blob/main/score.py) (lines 215-260) when `DEVELOPMENT_MODE` is enabled. These JSON files contain the complete structured representation of the parsed resume sections, allowing the pipeline to skip LLM processing on subsequent runs.


### What format does the hiring-agent use for GitHub data storage?

GitHub profile and repository data are stored as JSON files in the `cache/` directory, typically named `githubcache_<basename>.json` or [`gh_githubcache_...json`](https://github.com/interviewstreet/hiring-agent/blob/main/gh_githubcache_...json). The [`github.py`](https://github.com/interviewstreet/hiring-agent/blob/main/github.py) module (lines 18-40) implements this caching strategy to store raw API responses and avoid redundant network requests during repeated evaluations of the same candidate.


### How does the system persist final evaluation results?

Final evaluation results are persisted as rows in a CSV file named `resume_evaluations.csv`. According to [`score.py`](https://github.com/interviewstreet/hiring-agent/blob/main/score.py) lines 295-320, the system appends candidate scores, bonus points, and deductions to this file during development mode, creating a machine-readable audit trail of all fairness-aware scoring decisions suitable for further HR analysis.


### Does hiring-agent store the original PDF files?

No, the hiring-agent does not persist the original PDF files to disk. The [`pymupdf_rag.py`](https://github.com/interviewstreet/hiring-agent/blob/main/pymupdf_rag.py) module converts PDFs to Markdown-like text in memory only, and the pipeline works with extracted structured data from that point forward. Only the processed JSON extracts, cached GitHub data, and evaluation CSV scores are stored persistently.