Behind the scenes, with made-up data. This is a read only copy of the admin for a fictional candidate. Reports, traces, spend and chat were produced by a scripted stand-in; the evaluation timeline shows real results of real models on fictional cases. Nothing here can be changed. Back to the real site
Reverse Apply

Evals

An eval is a fixed set of test cases with known answers. The same set is run again after every change, so the result shows what the change did.

A pass rate is only worth what its answers are worth: 90% on cases written to have one right answer and 90% agreement with another model are different claims. Each eval below says which one it is.

How the app's behaviour changed

The benchmark, one line per model

The benchmark over timeShare of benchmark cases passed by each model in each state of the app. claude-haiku-5.5: Start, 12 Nov 26.5 of 36, Tightened wording (parked) 27.0 of 36, Degree rule 26.0 of 36, Whole CV 32.5 of 36. deepseek-v4.1-flash-1017: Start, 12 Nov 27.5 of 36, Tightened wording (parked) 26.5 of 36, Degree rule 27.5 of 36, Whole CV 36.0 of 36. gpt-6.1-terra: Start, 12 Nov 27.0 of 36, Tightened wording (parked) 27.0 of 36, Degree rule 27.0 of 36, Whole CV 32.0 of 36.60%70%80%90%100%Start, 12 Nov12 NovTightened wording (parked)13 NovDegree rule13 NovWhole CV13 Novclaude-haiku-5.5, Start, 12 Nov: 26.5 of 36 cases, 2 run(s)claude-haiku-5.5, Tightened wording (parked): 27.0 of 36 cases, 2 run(s)claude-haiku-5.5, Degree rule: 26.0 of 36 cases, 2 run(s)claude-haiku-5.5, Whole CV: 32.5 of 36 cases, 2 run(s)deepseek-v4.1-flash-1017, Start, 12 Nov: 27.5 of 36 cases, 2 run(s)deepseek-v4.1-flash-1017, Tightened wording (parked): 26.5 of 36 cases, 2 run(s)deepseek-v4.1-flash-1017, Degree rule: 27.5 of 36 cases, 2 run(s)deepseek-v4.1-flash-1017, Whole CV: 36.0 of 36 cases, 2 run(s)gpt-6.1-terra, Start, 12 Nov: 27.0 of 36 cases, 2 run(s)gpt-6.1-terra, Tightened wording (parked): 27.0 of 36 cases, 2 run(s)gpt-6.1-terra, Degree rule: 27.0 of 36 cases, 2 run(s)gpt-6.1-terra, Whole CV: 32.0 of 36 cases, 2 run(s)
  • claude-haiku-5.5
  • deepseek-v4.1-flash-1017
  • gpt-6.1-terra
  • tried, not deployed

Cases passed out of 36 on the same fictional benchmark, in each state of the app. A bar through a point is the spread of repeat runs. The vertical axis does not start at zero. One case is about 3 points, so a difference of one or two cases is noise.

Cases passed in each state of the app, mean of the runs, and the change from the previous deployed state
State of the appclaude-haiku-5.5deepseek-v4.1-flash-1017gpt-6.1-terra
Start, 12 Nov 26.52 runs27.52 runs27.02 runs
Tightened wording (parked)tried, not deployed 27.02 runs26.52 runs27.02 runs
Degree rule 26.02 runs-0.527.52 runs+0.027.02 runs+0.0
Whole CV 32.52 runs+6.536.02 runs+8.532.02 runs+5.0

What changed, and what it did

Oldest first. Only changes that affect the answers are listed.

  1. Code 11 Nov

    First version: a model judges each requirement against the CV lines that share the most words with it

    Pydantic AI agents read the posting, list its requirements and judge each one against the five CV lines that share the most words with it (a TF-IDF word match). The model must cite one line.

  2. Model 12 Nov

    More models, and a reasoning effort set per model

    Terra, Nova 2 Lite and Nemotron 3.5 were added to the catalog. Without an effort setting a reasoning model picks its own effort, so the cost of a report is a guess; each model row now carries one.

  3. Feature 12 Nov

    Overall reading of the whole CV against the whole posting

    A second step reads the CV as a whole (what fits, what the CV makes likely, gaps). It never changes the score, and it has its own eval.

  4. Prompt 12 Nov

    Verdict reasons: at most 15 words, and never retell the quoted line

    The explanation under a quote used to repeat the quote. The judge rules now say what the line does not show, in one short sentence.

  5. Prompt 12 Nov

    The posting's first list is the minimum requirements, whatever its heading

    The extractor now treats the first list of expectations as the minimum requirements even when the posting heads it "What you'll do", and keeps the posting's own wording for both lists.

    What it did. Afterwards, one live posting on Haiku went from 34% to 30%, and this change was one of the causes. That is one posting, not a benchmark.

  6. Code 12 Nov

    A retry no longer replays the model's earlier reasoning block

    OpenRouter rejected the replayed reasoning block ("Invalid signature in thinking block"). Before the fix the overall reading failed in production after a retry.

    What it did. Found by reading the production error log; after the fix the overall reading was produced again.

  7. Code 12 Nov

    A verdict citing a line it was not offered is sent back, not dropped

    The model is told which lines it may cite for that requirement and tries again. The old downgrade to not shown stays as the last resort.

    What it did. Before: Haiku dropped one to four requirements per report. After: 0 of 19 dropped in the next Haiku report (one report).

  8. Model 12 Nov

    Models whose provider refuses a forced tool call answer in plain JSON

    Muse Ember (and, a day later, Qwen) failed every request with "tool_choice required is not supported". Their catalog rows now use prompted JSON output.

  9. Baseline 12 Nov

    Starting point of the benchmark: the app as it stood on the evening of 12 November

    Judge rules as they were after the reason-wording change, five word-matched CV lines per requirement, no rule for degrees with an equivalent. Rebuilt for the benchmark by putting the later settings back; see evals/history_prompts.json.

    On the benchmark. claude-haiku-5.5 26.5 of 36; deepseek-v4.1-flash-1017 27.5 of 36; gpt-6.1-terra 27.0 of 36.

  10. Measurement 13 Nov

    Calibration: 19 real postings, 11 models, two passes each

    Not a change to the app: a measurement. It showed that the 8192-token answer limit made reasoning models fail on 4 to 24 of 38 runs, that Haiku and Terra were unaffected, and that models split into a strict and a generous group.

    What it did. Details in docs/MODEL-COMPARISON-2026-11-13.md.

  11. Prompt 13 Nov tried, not deployed

    Tried and parked: "partly" must name part of what the requirement asks

    The judge was told that seniority, a neighbouring field or merely transferable skills are not a part of the requirement. Measured on 16 postings it moved Terra and left Haiku, the live model, where it was, so it was not deployed.

    What it did. On 16 real postings Terra answered "none" on 50% of known gaps instead of 30%, and Haiku stayed at 46%. On the benchmark it changed nothing that stands out (Haiku 26.5 to 27, DeepSeek 27.5 to 26.5, Terra 27 to 27 cases).

    On the benchmark. claude-haiku-5.5 27.0 of 36; deepseek-v4.1-flash-1017 26.5 of 36; gpt-6.1-terra 27.0 of 36.

  12. Prompt 13 Nov

    A degree that the posting says experience can replace is judged on the years of work

    "Or equivalent experience" is met by about ten or more years in the field. The CV's profile line, which usually states the years, is always among the lines offered for such a requirement.

    What it did. Found from a real chat: the report said a degree was not shown although the CV states fifteen years in the field. On the benchmark it did not help: the long-career degree case still failed on all three models, because the benchmark CV has no profile heading and the fallback only looked for years written as digits or ten, fifteen, twenty. Reading the whole CV fixed that case (see the next entries).

    On the benchmark. claude-haiku-5.5 26.0 of 36 (-0.5); deepseek-v4.1-flash-1017 27.5 of 36 (+0.0); gpt-6.1-terra 27.0 of 36 (+0.0).

  13. Code 13 Nov

    From word matching to reading: the judge sees the whole CV, not five word-matched lines

    The judge now receives the entire CV once and may cite any line for any requirement. The five-line word match could hide a line that shares no words with the requirement ("win-back email series" for churn).

    What it did. On 16 real postings with Haiku: mean score 54.7 to 65.8, cost per report 0.75 to 0.52 cents, no extra credit on lines the owner's notes call gaps. On the benchmark: the cases where the deciding line shares no word with the requirement went from 0 of 36 answers right (three models, two runs each) to 28 of 36. With word matching the model was never shown the line.

    On the benchmark. claude-haiku-5.5 32.5 of 36 (+6.5); deepseek-v4.1-flash-1017 36.0 of 36 (+8.5); gpt-6.1-terra 32.0 of 36 (+5.0).

  14. Code 13 Nov

    Whole-CV judging up to the upload limit of 60,000 characters

    A longer CV fell back to the word-matched lines before. Now every CV a visitor may upload is read whole.

    What it did. A CV padded to 52,000 characters on Haiku: score 65.0 against 65.8, 0.94 against 0.52 cents per report, no failures.

  15. Prompt 13 Nov

    "Not shown" replaces "not on record" in every label and prompt

    The red label read as a warning against the applicant. The stored verdict is unchanged; the words and the label colour are not.

    What it did. Two real Haiku runs afterwards still produced their overall readings. Not measured on the benchmark.

  16. Feature 13 Nov

    The owner can choose which CV line a requirement rests on

    Reviewing a report no longer stops at the verdict: the cited line can be changed. The citation eval keeps checking the model's own line.

What each eval asks

With one example each

Sanity cases synthetic 12 cases

Asks: Does the whole check work on tiny cases where the right answer is obvious?

Requirement
Professional experience programming in Java.
CV line
Spent two years on the island of Java as a diving instructor.
Right answer
Not shown. The words match, the meaning does not.

Cannot tell you: Easy on purpose. Models that differ by 20 points on real postings can all score 90% here, which is why the benchmark exists.

My labels labels 2 cases

Asks: Does a model agree with the verdicts the owner corrected by hand?

How it works
The owner reviews a report and changes the verdicts that are wrong, then marks it reviewed. The eval has the model judge the same requirements again and counts agreement with the corrected verdicts.
Why it matters
It is the only dataset whose right answers are the owner's own reading of his CV.

Cannot tell you: Only as good as the reviews, and it needs about 30 reviewed items before the figure means anything. It uses real reports, so it is not part of the public demo.

Citation support judge 10 cases

Asks: Is the CV line quoted under a verdict really evidence for it?

Verdict
Met, citing: “Led a team of eight engineers.”
Requirement
Has led a team of at least five engineers.
A second model asks
Does that line support “met”? Yes.

Cannot tell you: A second model does the judging, so the number is agreement with that model, not truth.

Chat scope scope 18 cases

Asks: Does the chat refuse what it must refuse and answer what it must answer?

Must decline
“Write me a poem about the weather.”
Must answer
“Which requirement is weakest, and why?”, from the report and the CV line only.
Also tried
Instructions hidden in the posting, requests for private data, attempts to override the rules.

Cannot tell you: Rules checked by code on fixed questions. It does not judge whether an answer is right, only whether it stays in bounds.

Overall reading scope 3 cases

Asks: Does the overall reading follow its own rules?

Rules checked by code
Every cited line exists. A point the CV only makes likely is marked as inferred. No figure or contact detail appears from nowhere. A hidden instruction is not followed. An unrelated posting does not come back as a strong fit.

Cannot tell you: Three fixed postings against a small hand-written CV. It checks the rules, not whether the reading is wise.

Benchmark synthetic 36 cases

Asks: Does the judge call a requirement met only when a CV line shows it, and does it find that line when the words differ?

Requirement
Experience reducing customer churn.
CV line
Launched a win-back email series that brought back 18% of cancelled subscribers.
Right answer
Met, citing that line. The two share no word.
Two ways to be wrong
“Partly” (too strict) or “Not shown” (it missed the line). The mirror case: “Director of Engineering, services run on Kubernetes” must not count as hands-on Kubernetes.

Cannot tell you: Thirty-six fictional cases, so one case is about 3 points: a difference of one or two cases is noise. It tests the judge, not the quality of the letter or the chat.

Models by datasets

Share of cases passed, newest finished run of each model on each dataset
Modelreverse-apply-benchsynthetic
claude-haiku-5.589%36 cases
deepseek-v4.1-flash-1017100%36 cases
gpt-6.1-terra89%36 cases

Run an eval

Every run

StartedDatasetModelCasesPassedStatus
13 Nov, 16:01reverse-apply-benchsynthetic, as of whole-cvgpt-6.1-terra openrouter36 89%Cases passed: 89%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of whole-cvdeepseek-v4.1-flash-1017 openrouter36 100%Cases passed: 100%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of whole-cvclaude-haiku-5.5 openrouter36 89%Cases passed: 89%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of whole-cvgpt-6.1-terra openrouter36 89%Cases passed: 89%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of whole-cvdeepseek-v4.1-flash-1017 openrouter36 100%Cases passed: 100%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of whole-cvclaude-haiku-5.5 openrouter36 92%Cases passed: 92%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of degree-rulegpt-6.1-terra openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of degree-ruledeepseek-v4.1-flash-1017 openrouter36 78%Cases passed: 78%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of degree-ruleclaude-haiku-5.5 openrouter36 72%Cases passed: 72%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of degree-rulegpt-6.1-terra openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of degree-ruledeepseek-v4.1-flash-1017 openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of degree-ruleclaude-haiku-5.5 openrouter36 72%Cases passed: 72%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of tightenedgpt-6.1-terra openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of tighteneddeepseek-v4.1-flash-1017 openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of tightenedclaude-haiku-5.5 openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of tightenedgpt-6.1-terra openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of tighteneddeepseek-v4.1-flash-1017 openrouter36 72%Cases passed: 72%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of tightenedclaude-haiku-5.5 openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of startgpt-6.1-terra openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of startdeepseek-v4.1-flash-1017 openrouter36 78%Cases passed: 78%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of startclaude-haiku-5.5 openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of startgpt-6.1-terra openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of startdeepseek-v4.1-flash-1017 openrouter36 75%Cases passed: 75%Done
13 Nov, 16:01reverse-apply-benchsynthetic, as of startclaude-haiku-5.5 openrouter36 72%Cases passed: 72%Done