Skip to content
Agentmart
Submit a tool

resume-mirror-eval

Bulk-evaluate a folder of resumes against one job description and flag the ones whose wording mirrors the posting closely enough that a human should look…

Skill by SecurityMindedSolutions

IndexedMIT★ 2
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/securitymindedsolutions-resume-mirror-eval

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Bulk-evaluate a folder of resumes against one job description and flag the ones whose wording mirrors the posting closely enough that a human should look before ranking them. Uses TypeSafe's Jev model for calibrated semantic judgments, plain code for every statistic, and optionally the agent itself (or any LLM) for terse review notes. Produces a spreadsheet sorted by mirror score with a "Needs human review" column first. Use this whenever the user wants to screen, score, compare or "check" a batch of resumes/CVs against a JD, asks which applicants look AI-generated or copied from the posting, or wants a resume similarity spreadsheet - even if they do not say "TypeSafe" or "Jev". Research proof of concept; not a hiring decision tool.

Use cases: spreadsheets, ml, research, productivity

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/resume-mirror-eval

What's inside

Skill name
resume-mirror-eval
Description
Bulk-evaluate a folder of resumes against one job description and flag the ones whose wording mirrors the posting closely enough that a human should look before ranking them. Uses TypeSafe's Jev model for calibrated semantic judgments, plain code for every statistic, and optionally the agent itself (or any LLM) for terse review notes. Produces a spreadsheet sorted by mirror score with a "Needs human review" column first. Use this whenever the user wants to screen, score, compare or "check" a batch of resumes/CVs against a JD, asks which applicants look AI-generated or copied from the posting, or wants a resume similarity spreadsheet - even if they do not say "TypeSafe" or "Jev". Research proof of concept; not a hiring decision tool.
License
MIT
Metadata
summary: Scores a batch of resumes against a job description with TypeSafe Jev plus code-side text statistics, flags the ones a human should read, and writes a sortable spreadsheet with evidence bullets
Instructions
269 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts
  • Instructions call the network
  • Instructions read files in your home folder (~/.ssh, ~/.aws…)

Agent Skills spec issues

  • allowed-tools: must be a space-separated string

Files (34)

  • README.md
  • SKILL.md
  • README.md · mock-data/
  • agent-notes.json · mock-data/example-output/
  • results-detail.csv · mock-data/example-output/
  • results.csv · mock-data/example-output/
  • results.json · mock-data/example-output/
  • results.xlsx · mock-data/example-output/
  • job-description.md · mock-data/
  • labels.csv · mock-data/
  • andre_williams.md · mock-data/resumes/
  • arjun_singh.md · mock-data/resumes/
  • dana_whitfield.md · mock-data/resumes/
  • hanna_mueller.md · mock-data/resumes/
  • jordan_harris.md · mock-data/resumes/
  • linh_nguyen.md · mock-data/resumes/
  • marcus_chen.docx · mock-data/resumes/
  • ngozi_okafor.md · mock-data/resumes/
  • petr_ivanov.md · mock-data/resumes/
  • riya_patel.pdf · mock-data/resumes/
  • sofia_garcia.md · mock-data/resumes/
  • soojin_kim.md · mock-data/resumes/
  • tyler_brooks.md · mock-data/resumes/
  • methodology.md · references/
  • analyze.py · scripts/
  • bootstrap.py · scripts/
  • evidence.py · scripts/
  • extract.py · scripts/
  • jev.py · scripts/
  • lexical.py · scripts/
  • llm_notes.py · scripts/
  • questions.py · scripts/
  • report.py · scripts/
  • scoring.py · scripts/

SKILL.md (first lines)

# Resume Mirror Eval

> **Research proof of concept.** This skill measures how closely a resume's
> *wording* tracks a job description. It does not determine whether a person
> used AI and it makes no decision about any candidate. Its output is a list of
> resumes a human should read first; the **Needs human review** column exists
> for exactly that purpose. It is a tool for directing human review, not a
> substitute for it.
>
> Any use must comply with the laws, regulations and policies that apply to
> the user and their applicants; automated tools in hiring are regulated in
> many places, and the user should consult their legal team before running
> this on real applicants. Provided as is, for research and education.
>
> Repeat the short form of this to the user at the end of every run.

## What it does

1. Extracts text from every resume (.pdf, .docx, .txt, .md) in the folders or
   files the user points at.
2. Computes text statistics in code: verbatim 4-word phrase overlap with the
   JD, longest shared word run, whether matched terms appear in the JD's order,
   TF-IDF cosine within the batch, keyword and acronym coverage, and a z-score
   against the rest of the batch.
3. Sends `{job_description, resume}` to TypeSafe's Jev with six typed
   questions in one request per resume (phrasing mirror, requirement echo,
   concrete specifics, generic template, posting-language leak, career
   consistency). Roughly 2,000 tokens and a tenth of a cent per resume; a batch
   of 100 finishes in seconds.
4. Turns Jev's answers into a 0-100 **Mirror score (Jev)**; the statistics
   into **Text match analysis (code)**, template sentences a reviewer can check
   against the two documents; and both into a **Needs human review** flag. Nothing in the output rates the candidate's fit or
   qualifications; the tool judges the file's relationship to the posting only.
5. Writes `results.xlsx` sorted by mirror score: a five-column Results sheet
   (review flag, file, Jev score, text match analysis, AI analysis), a Details sheet with every
   statistic and Jev answer, the JD, and the disclaimer. Also `results.csv`,
   `results-detail.csv` and `results.json`.
6. Optionally adds **AI analysis (agent)**: terse bullets per flagged resume,
   written by you (the agent running this skill) or by an API model. Three
   methods, three columns; none feeds another.

Every question, weight and threshold lives in `scripts/questions.py`. If the
user disagrees with how something scored, that file is where to look first.

## Workflow

`SKILL_DIR` below means the folder containing this SKILL.md.

### 1. Locate the sources and stage them

The script reads local files. Where those files come from is your job. The
user may point you at anything you can reach: a folder, a synced drive, a
connector, an ATS, a URL, an email thread, or text in the conversation. Use
whatever tools you have to fetch the documents, land copies in a temp staging
folder, then run the script on that folder. Do not ask the user to download
things you can download yourself.

| Source | How to stage it |
|---|---|
| Local folder or files | Pass the paths directly; nothing to stage. |
| Synced drive (Google Drive, Dropbox, OneDrive, SharePoint sync) | It is a local path. Pass it directly. |
| Cloud drive via a connector (Google Drive, SharePoint, Box MCP...) | Download each file into the staging folder, keeping the original file name. |
| ATS via an MCP server (Greenhouse, Lever, Ashby, Workable, iCIMS...) | Fetch the requisition's job description to `staging/jd.md` and each application's resume attachment to `staging/resumes/`. Name files `<lastname>_<firstname>_<application_id>.<ext>` and write `staging/manifest.csv` with `file,application_id,candidate,source_url` so those ids appear in the spreadsheet. |
| URL to a posting | Fetch it and save the text as `staging/jd.md`. |
| Pasted text | Save it to `staging/jd.md`. |
| Email or ticket attachments | Save each attachment into `staging/resumes/`. |

The staging folder is a **temp location**, never the user's working directory
or the source folder: use your scratchpad if you have one, otherwise
`$TMPDIR/resume-mirror-eval/<timestamp>/`. The script's own default `--out` is
under the system temp dir for the same reason. Resumes are personal data; the
copies exist only for the run. When the run is done, tell the user where the
staging and output folders are and offer to delete the staged copies (keep the
spreadsheet, or copy it to wherever they asked for it).

Ask for whatever is missing. Two things are required: one job description and
one or more resumes. If a source yields several postings, confirm which one
before pulling resumes.

Never upload resumes anywhere other than the TypeSafe API (and the LLM provider
if the user opts into API notes). Say so if asked.

### 2. Check prerequisites

```bash
python3 --version   # 3.10 or newer; `python` on Windows
test -n "$TYPESAFE_API_KEY" || test -f ~/.config/typesafe/env || echo "need a TypeSafe key"
```

Nothing else. On first run the script creates a private virtual environment
under the system temp directory and installs its two pure-Python dependencies
there (a few seconds); later runs reuse it. If the user has `uv`, `uv run`
works too and skips that step.

The script reads `TYPESAFE_API_KEY` from the environment, or from a line
`TYPESAFE_API_KEY=...` in `~/.config/typesafe/env`. Keys come from
https://console.typesafe.ai/keys. If the user has neither, stop and ask; do
not guess or put a key on the command line.

### 3. Run the analysis

```bash
python3 "$SKILL_DIR/scripts/analyze.py" \
  --jd "$STAGING/jd.md" \
  --resumes "$STAGING/resumes" \
  --out "$STAGING/out" \
  --llm-notes agent
```

Add `--manifest "$STAGING/manifest.csv"` when you staged from an ATS or any
source with ids worth carrying into the sheet; every column but `file` is
copied in after the File column.

`--llm-notes agent` makes the script write `notes-request.json` for the rows it
flagged, so you can write the notes yourself in step 4 without any other API
key. Leave the flag off if the user only wants scores.

Other flags: `--llm-top N` (annotate only the top N by score), `--labels
labels.csv` (score the run against known `human` / `ai_tailored` labels, for

From SecurityMindedSolutions/ai-skills, MIT.

More from SecurityMindedSolutions/ai-skills

Signals

Stars
2
Forks
0
Open issues
0
Last commit (this folder)
Sep 22, 2026 (1 month ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from SecurityMindedSolutions

Cite this page

resume-mirror-eval skill. Agent Mart. https://agentmart.dev/skills/securitymindedsolutions-resume-mirror-eval (last updated 2026-10-24)