# The grading rubric

What `scripts/grade_resume.py` measures, where each convention comes from, and
how much confidence it deserves. Read this before changing a weight.

## The honest framing

Every threshold here is a **convention**, not a measured optimum. Careers
services and recruiter guidance converge on these numbers, but almost none of
them come from controlled studies with published effect sizes. The most-cited
number in the whole field — "recruiters spend 7.4 seconds on a resume" — comes
from a [single 2018 study of 30 recruiters](https://www.theladders.com/static/images/basicSite/pdfs/TheLadders-EyeTracking-StudyC2.pdf)
and is [openly contested](https://spectacletalentpartners.com/is-the-6-second-resume-scan-a-myth/).

So the tool is built to be *useful without being authoritative*: every deduction
names the exact line it came from and the convention it applied, so a
disagreeing user can see precisely what was judged and overrule it. A score with
a visible derivation is a checklist. A score without one is a horoscope.

Confidence ratings below:

- **High** — near-universal agreement across independent sources, and the check
  is objective (the text either contains a number or it does not).
- **Medium** — broad agreement on direction, arbitrary threshold.
- **Low** — plausible, contested, or prone to false positives. Weighted lightly.

---

## 1. Quantified impact — 22 points · confidence High

**Convention:** at least half of experience bullets should carry a number,
percentage or currency amount.

The direction is the least controversial advice in the field: an achievement
with a magnitude beats one without. [Yale's careers office](https://ocs.yale.edu/resources/writing-impactful-resume-bullets/)
frames the bullet itself as "Accomplished [X] as measured by [Y] by doing [Z]" —
measurement is structural, not decorative. The **50% threshold** specifically is
a widely repeated rule of thumb ([Resume Worded](https://resumeworded.com/how-to-quantify-resume-key-advice),
[Hiration](https://www.hiration.com/blog/resume-critique-rubric-career-centers-higher-ed/)),
not a measured optimum — hence Medium confidence on the number even though the
principle is High.

Deduction scales with the shortfall rather than being all-or-nothing, so a
resume at 40% loses a little and one at 0% loses everything.

**Detection:** a percentage, a currency symbol followed by a digit, a
multiplier (`3x`), a magnitude suffix (`40k`), or any bare number. Deliberately
generous — a false negative here is worse than a false positive, because the
tool is telling you to go look at a line, not deleting it.

## 2. Strong openings — 18 points · confidence High

**Convention:** experience bullets open with a concrete verb, not a duty phrase.

"Responsible for the billing system" describes an assignment. "Rebuilt the
billing system, cutting settlement time from 4 hours to 12 minutes" describes a
contribution. Every source consulted agrees, and the [phrases flagged](https://www.monster.com/career-advice/article/resume-buzzwords-0417)
— *responsible for*, *helped with*, *assisted with*, *involved in*, *duties
included* — recur across all of them.

**Section-scoped, and this matters.** Only experience bullets are judged.
A summary line is allowed to be a noun phrase ("Platform engineer with nine
years…") and an education entry is a credential, not an achievement. An earlier
version of this tool applied the rule everywhere and confidently marked a
correct summary and a correct degree line as defects. Scoping is not a nicety;
without it the tool is wrong on well-written resumes.

Present tense is accepted — it is correct for a role you currently hold.

## 3. Verb variety — 12 points · confidence Medium

**Convention:** openers should not repeat heavily; roughly 10–12 distinct verbs
across a one-page resume.

Widely advised, no hard evidence. The underlying point is real: six bullets all
starting "Developed" make six different pieces of work read as one. Weighted
below quantification because the threshold is soft and a legitimately
repetitive role exists.

## 4. Bullet length — 12 points · confidence Medium

**Convention:** roughly 12–32 words. Flagged under 10 or over 40.

Guidance clusters at [15–30 words / one to two lines](https://hireflow.net/blog/best-bullet-point-length-for-resume-real-guidance).
The mechanism is skimming: a 60-word bullet is a paragraph wearing a bullet's
clothes, and the achievement inside it is invisible at a glance. A very short
bullet is usually a duty with the result missing.

Education entries are exempt — a degree line is *supposed* to be short.

## 5. Clean language — 16 points · confidence High for clichés, Medium for pronouns

**Convention:** no self-descriptive clichés, no first person.

The cliché list is the intersection of several published lists
([Monster](https://www.monster.com/career-advice/article/resume-buzzwords-0417),
[Novoresume](https://novoresume.com/career-blog/resume-buzzwords-to-avoid),
[Korn Ferry](https://www.kornferry.com/insights/this-week-in-leadership/5-cliches-to-keep-off-your-resume)):
*team player*, *hard worker*, *detail-oriented*, *results-driven*,
*self-starter*, *go-getter*, *think outside the box*, and friends. The reasoning
is sound and mechanical: these assert a trait rather than evidencing it, and
because nearly every applicant writes them they cannot differentiate anyone.

Dropping the first person is a formatting convention with less behind it, so it
costs fewer points.

## 6. Structure and completeness — 20 points · confidence High

Objective presence checks: a reachable email and phone, the four expected
sections, a date range on every role, a title under every role header.

**The most valuable single check in the tool lives here.** A role header is only
recognised when it carries a date range. Without one, the parser cannot
distinguish it from a bullet, so the company and job title get swept into the
bullet list — and the *formatted document comes out wrong*, with the employer
rendered as a bullet point. That is a silent, disqualifying defect, and it is
one edit to fix. It is reported with an 8-point deduction and an explicit
explanation.

---

## Job match — scored separately, never blended

When a job posting is supplied, the tool reports keyword coverage as its **own
score**. It is deliberately not folded into the resume score: "well written" and
"matches this specific posting" are different questions, and averaging them
produces a number that answers neither.

**Why keyword coverage at all.** Applicant tracking systems weight the overlap
between posting and resume, with terms in the experience section counting for
more than elsewhere ([Jobscan](https://www.jobscan.co/blog/top-resume-keywords-boost-resume/)).
Published guidance puts a workable target around 75% coverage.

**Extraction is prominence-based, not frequency-based.** Ranking a job posting
by raw word frequency surfaces *looking*, *ideally*, *comfortable* — a posting
is mostly ordinary English. Two cheap signals do far better:

- a word capitalised somewhere other than a line or sentence start is almost
  always a technology or proper noun — Kubernetes, Terraform, Istio, Bazel
- a two-word phrase that recurs is usually a real concept — *continuous
  integration*, *incident response*, *feature flags*

Everything else must appear more than once to qualify. On a real platform-
engineering posting this cut the term list from 40 mostly-noise words to 21
almost entirely meaningful ones.

**Two things it will not do.** It will not tell you that `K8s` and `Kubernetes`
are the same thing — matching is literal, and the report says so where the user
will read it. And it flags terms used **eight or more times** as possible
stuffing, because modern systems penalise unnatural keyword density rather than
rewarding it ([Workday's 2026 change](https://www.uppl.ai/ats-resume-keywords)
specifically flags it). Advice that only ever says "add more keywords" is advice
that eventually gets someone filtered out.

The report tells users to add only terms they can honestly back up, in the
bullet where they actually did the thing.

---

## Deliberately not measured

**Employment gaps.** Technically easy — parse the dates, subtract. Excluded on
purpose. Flagging gaps encodes a penalty against career breaks, illness, caring
responsibilities and layoffs, and a tool has no business quietly applying that
on a user's behalf under the banner of objectivity. This is a values decision,
not an oversight, and it is stated in the script's own docstring so it cannot be
removed by accident.

**Anything inferring demographics** — name origin, graduation year as an age
proxy, photographs. Out of scope permanently.

**Tense consistency.** Sounds checkable; it is not. Convention disagrees with
itself about current roles, and a naive check produces constant false positives
on legitimate resumes.

**Total page count.** The formatter already reports it, and "too long" depends
entirely on seniority and field. See `resume-notes.md` §5.

**Whether the writing is *good*.** The tool checks structural properties that
correlate with good bullets. It cannot tell whether an achievement is impressive
or whether a claim is true. Nothing that reads text can, and a score that
implied otherwise would be lying.
