Scoring rubric
Every rule the community policy scores, with its weight, what it reads, when it passes and the fix. Engine 0.11.0.
Engine 0.11.0, policy ats-v2+7c1a4fd7, 35 rules. This page is built from
policyRubric(DEFAULT_POLICY) when the docs are built, so it always matches the installed engine.
Call policyRubric(policy) yourself to get the same table for a policy of your own.
- Score. Each rule that applies can lose its weight. The readiness score is the share of the applicable weight kept, 0–100. A rule whose evidence is absent (page geometry for pasted text, a posting for the copied-posting check) is left out of both the report and the score.
- Deductions. Integrity rules (
−n pts) come off the finished score in points and are never part of the weighing: an honest resume scores exactly as if they did not exist. - Determinism. The same input, reference date (
now), engine version and policy fingerprint always give the same report. Every report carriesengine.versionandengine.policy. - Writing rules read English only. For a resume in another language they drop out instead of judging it on English words.
See Scoring and the rubric for how the score is put together.
Integrity
6 rules, up to 115 points deducted in all.
| Rule | Severity | Reads | Weight | Passes when | Fix |
|---|---|---|---|---|---|
ats-v2.integrity.promptInjection | error | injectionPhrases | −30 pts | No instructions aimed at an AI screener. | Remove it. Recruiters and screening tools treat instructions to an AI as manipulation, and many reject the application on sight. |
ats-v2.integrity.hiddenText | error | hiddenTextChars | −30 pts | No hidden text. | Remove hidden text. White or tiny text and text behind an image is read by the ATS and treated as keyword stuffing once a recruiter sees it. |
ats-v2.integrity.copiedPosting | error | copiedPostingRatio | −25 pts | The resume is not a copy of the posting. | Describe your own experience. A pasted posting is caught the moment a recruiter reads the resume. |
ats-v2.integrity.invisibleCharacters | warning | invisibleCharacters | −10 pts | No invisible characters. | Remove zero-width and other invisible characters; retype any word they split. |
ats-v2.integrity.homoglyphs | warning | homoglyphWords | −10 pts | No look-alike letters from other alphabets. | Retype those words: they look right but no search matches them. |
ats-v2.integrity.keywordStuffing | warning | stuffedTerms | −10 pts | No keyword stuffing. | Name each skill where you used it. Repetition does not raise a match score in a modern ATS, and recruiters read it as stuffing. |
Parsing
5 rules, 68 points of weight.
| Rule | Severity | Reads | Weight | Passes when | Fix |
|---|---|---|---|---|---|
ats-v2.parse.text | error | at least 50 words | 20 | Recovered {n} words of text. | Save the resume as a text-based PDF rather than a scan or an image. |
ats-v2.parse.imageOnly | error | imageOnlyPages | 15 | Every page has a text layer. | Export the resume as a text PDF rather than scanning it or saving it as an image. |
ats-v2.parse.roles | error | rolesDetected | 15 | {n} roles were recovered from the work history. | Give each job a line with the title, the employer, and a date range. |
ats-v2.parse.roleCompleteness | warning | roleCompleteness | 10 | {pct}% of recovered roles have a title, an employer and a start date. | Make sure every job lists a title, an employer, and a date range. |
ats-v2.parse.contact | warning | contactCompleteness | 8 | {pct}% of the expected contact fields were recovered. | Include a name, an email address, and a phone number as plain text. |
Contact & links
3 rules, 20 points of weight.
| Rule | Severity | Reads | Weight | Passes when | Fix |
|---|---|---|---|---|---|
ats-v2.contact.email | error | a pattern, in the document | 12 | An email address was found. | Add an email address at the top of the first page, as plain text in the body rather than in a page header. |
ats-v2.contact.position | warning | contact details in the first 25% | 6 | Contact details appear near the top of the document. | Put the email address and phone number at the top of the first page, in the body of the document rather than in a page header, which many ATS parsers skip. |
ats-v2.privacy.dateOfBirth | info | dateOfBirthStated | 2 | No date of birth is stated. | Leave your date of birth off unless the country you are applying in expects it. |
Structure
3 rules, 28 points of weight.
| Rule | Severity | Reads | Weight | Passes when | Fix |
|---|---|---|---|---|---|
ats-v2.structure.experience | error | a experience heading | 12 | An experience section heading was found. | Add a heading reading 'Experience' above the work history. |
ats-v2.structure.education | warning | a education heading | 8 | An education section heading was found. | Add a heading reading 'Education' above the qualifications. |
ats-v2.structure.skills | warning | a skills heading | 8 | A skills section heading was found. | Add a heading reading 'Skills' above the skills list. |
Evidence
5 rules, 29 points of weight.
| Rule | Severity | Reads | Weight | Passes when | Fix |
|---|---|---|---|---|---|
ats-v2.content.metrics | warning | metricsRatio | 10 | {pct}% of content lines carry a number. | Quantify outcomes: amounts, percentages, timeframes, headcounts. |
ats-v2.content.verbs | warning | actionVerbRatio | 8 | {pct}% of bullets name an action you took. | Make each bullet say what you did, with an action word ("Led", "Built", "Cut"), rather than what the job was. |
ats-v2.content.buzzwords | info | buzzwordCount | 5 | Little filler language. | Replace filler phrases with a specific thing you did. |
ats-v2.content.timeline | info | timelineIssues | 3 | The dates in the work history are consistent. | Check the dates: a role cannot start after today, and an end date left off makes jobs overlap. |
ats-v2.content.skillEvidence | info | unsupportedSkills | 3 | Most listed skills are backed by the work they were used in. | Name each key skill in the role or project where you used it, not only in the list. |
Format risk
5 rules, 45 points of weight.
| Rule | Severity | Reads | Weight | Passes when | Fix |
|---|---|---|---|---|---|
ats-v2.format.length | warning | wordCount | 10 | The resume is {n} words, a reasonable length. | Keep the resume between about 200 and 1,500 words: one or two pages. |
ats-v2.format.letterSpacing | warning | letterSpacedLines | 8 | Headings extract as whole words. | Remove the letter spacing (tracking) from section headings so they extract as words. |
ats-v2.format.columns | error | columnRatio | 15 | The document reads as a single column. | Use a single-column layout; columns extract in a scrambled order. |
ats-v2.format.tables | warning | tableCount | 10 | No ruled tables were found. | Replace tables with plain paragraphs and bullets. |
ats-v2.format.photo | info | imageCount | 2 | No photo was found. | Leave the photo off unless the country you are applying in expects one. |
Writing
8 rules, 12 points of weight.
| Rule | Severity | Reads | Weight | Passes when | Fix |
|---|---|---|---|---|---|
ats-v2.writing.firstPerson | info | firstPersonLines (en only) | 2 | No bullet speaks in the first person. | Leave out "I", "my" and "we": open each bullet with what you did ("Led the payments team"). |
ats-v2.writing.passiveVoice | info | passiveVoiceRatio (en only) | 2 | Most bullets are in the active voice. | Say who acted: "Rebuilt the payments service in Go", not "The payments service was rebuilt". |
ats-v2.writing.weakOpeners | warning | weakOpeners (en only) | 2 | Bullets open with an action rather than a duty. | Replace "Responsible for", "Worked on" and the like with the verb for what you did, and say what came of it. |
ats-v2.writing.tense | info | tenseMismatches (en only) | 2 | Past roles are written in the past tense. | Write roles you have left in the past tense ("Led", not "Lead"). The role you hold now can use either. |
ats-v2.writing.bulletLength | info | longBullets (en only) | 1 | No bullet runs past two lines. | Keep each bullet to one or two lines, one action and its result; split a longer one in two. |
ats-v2.writing.bulletsPerRole | info | bulletsPerRole (en only) | 1 | Each role has a readable number of bullets. | Give each role two to eight bullets: enough to show what you did, few enough to read. |
ats-v2.writing.repeatedOpeners | info | repeatedOpeners (en only) | 1 | Bullets in a row open with different words. | Vary the opening verbs, so each bullet reads as its own result rather than one duty repeated. |
ats-v2.writing.dateFormats | info | dateFormats (en only) | 1 | Role dates are written one way throughout. | Write every date the same way, such as "Jan 2020 – Mar 2023". |