How CV Once is tested
The builder makes two kinds of promise: that its checks flag what they say they flag, and that what you export is complete, readable and in order. Both are tested on every build, and the results below are from this build (26 October 2026).
The checks
The checks are plain pattern rules in /static/checks.js. They run in your browser as you type, with no AI and no network, and the same file runs at build time over the test set below and the example CVs. "Issues" are things a recruiter would very likely notice. "Notes" are worth a second look, but are often fine.
| Check | What it looks for |
|---|---|
| Weak opening | A bullet that starts with one of 23 duty phrases ("responsible for", "worked on", "helped with"…), optionally after "was". Only openings: "helped" in the middle of a sentence is fine. The full list. |
| Result without a number | An experience bullet that claims a result (increased, reduced, improved, saved, cut, grew, sales, costs, satisfaction…) with no digit, number word, "doubled"/"halved", or %, £, $, €. |
| Few numbers overall | Four or more experience bullets, fewer than a quarter of them with a number. |
| Long bullet | 30 words or more (note); over 45 (issue). |
| First-person pronoun | I, me, my, we, our, us (lower-case "us" only, so "the US market" passes). An issue in bullets, a note in the summary. |
| Present tense in a past role | A bullet in a role with an end date that starts with a present-tense verb from a list of about 40 ("Manage", "Leads"). |
| Mixed date formats | Month dates written more than one way across the CV ("Mar 2021" and "03/2021"; "Mar" and "March"; seasons); months on some roles and years only on others; more than one word for ongoing roles ("Present" and "Current"). |
| Unreadable date, end before start | A date the parser can't read (see the samples below); an end date before its start date. |
| Gap between roles | More than six months between one role ending and the next starting, after merging overlapping roles. With year-only dates, only a gap of a year or more is reported. Always a note, never an issue. |
| Length for the region, last page nearly empty | The page count measured in your browser against the usual length for the CV's region (US: 1–2 pages, and one page under about ten years' experience; Canada, UK and Ireland: up to 2; continental Europe: up to 3; Australia and New Zealand: up to 4; academic CVs: no limit), and a last page with only a few lines on it. |
| Unusual heading | A section heading that isn't one of the standard names for that section type (99 recognised, such as "Work experience", "Employment history", "Key skills"), or a custom heading that sounds like a slogan ("My journey", "Superpowers"). |
| Photo, personal details | A photo switched on, or date of birth, marital status, nationality, religion or age, on a CV set to the US, Canada, UK and Ireland, or Australia and New Zealand. |
| Two-column layout | A two-column template: a reminder that some older parsers merge columns. |
| Cliché, all capitals, long summary | 37 stock phrases ("team player", "results-driven", "passionate"); text that is mostly capitals; a summary over 80 words. |
| Pasted symbols or table, inconsistent full stops | A line starting with a pasted bullet symbol (the template adds its own); tabs, runs of spaces or | separators from a pasted table; some bullets ending in a full stop and others not. |
| Contact details, entry without a title, role without achievements, too many bullets | No name or email, an email that doesn't look complete, no phone (note); an entry with bullets but no title or organisation; a latest role with no bullets; more than eight bullets on one role. |
Validation of the checks
Every build runs the checks over a labelled test set of 95 cases written for this purpose. Each case says which checks must fire and which must not, including hard cases that look like a match and aren't ("the US market", "Helpdesk lead", "helped" mid-sentence, a negative number that starts with a hyphen, overlapping roles). The build fails if any core case disagrees.
Result: 92 of 92 core cases pass, plus 3 documented known limits that are expected to fail.
| Check | Must fire: caught | Must not fire: stayed quiet |
|---|---|---|
| All capitals | 1 of 1 | 0 of 0 |
| Cliché | 3 of 3 | 2 of 2 |
| Two-column layout | 1 of 1 | 1 of 1 |
| Contact details | 2 of 2 | 1 of 1 |
| Mixed date formats | 5 of 5 | 4 of 4 |
| End before start | 1 of 1 | 0 of 0 |
| Unreadable date | 2 of 2 | 1 of 1 |
| Few numbers overall | 1 of 1 | 1 of 1 |
| Gap between roles | 1 of 1 | 6 of 6 |
| Unusual heading | 4 of 4 | 6 of 6 |
| Length for the region | 3 of 3 | 4 of 4 |
| Long bullet | 1 of 1 | 2 of 2 |
| Result without a number | 4 of 4 | 6 of 6 |
| Personal details | 1 of 1 | 1 of 1 |
| Photo | 1 of 1 | 1 of 1 |
| First-person pronoun | 3 of 3 | 3 of 3 |
| Inconsistent full stops | 1 of 1 | 1 of 1 |
| Last page nearly empty | 1 of 1 | 1 of 1 |
| Long summary | 1 of 1 | 0 of 0 |
| Pasted symbols or table | 2 of 2 | 2 of 2 |
| Present tense in a past role | 1 of 1 | 2 of 2 |
| Weak opening | 10 of 10 | 4 of 4 |
All 95 test cases
| Kind | Input | Must flag | Must not flag | Result |
|---|---|---|---|---|
| bullet | Responsible for managing the front desk and phones | weak-verb | pass | |
| bullet | Was responsible for the weekly payroll run for 40 staff | weak-verb | pass | |
| bullet | Duties included stock rotation and ordering | weak-verb | pass | |
| bullet | Worked on the new booking system | weak-verb | pass | |
| bullet | Helped customers find products | weak-verb | pass | |
| bullet | Assisted with month-end close | weak-verb | pass | |
| bullet | Involved in planning the office move | weak-verb | pass | |
| bullet | Participated in weekly stand-ups | weak-verb | pass | |
| bullet | In charge of opening and closing the store | weak-verb | pass | |
| bullet | Dealt with customer complaints by phone and email | weak-verb | pass | |
| bullet | Led a team of 6 through a system migration with no downtime | weak-verb, no-number, long-bullet | pass | |
| bullet | Supported 30 teachers moving to the new reporting system | weak-verb | pass | |
| bullet | Rebuilt the onboarding checklist, which helped new starters settle faster 'helped' mid-sentence is fine; only openings are flagged | weak-verb | pass | |
| bullet | Helpdesk lead for 200 users across three sites 'Helpdesk' is not 'helped' | weak-verb | pass | |
| bullet | Increased sales by redesigning the window displays | no-number | pass | |
| bullet | Reduced waiting times in the clinic | no-number | pass | |
| bullet | Improved customer satisfaction scores | no-number | pass | |
| bullet | Cut costs by renegotiating supplier contracts | no-number | pass | |
| bullet | Increased sales by 12% by redesigning the window displays | no-number | pass | |
| bullet | Reduced average waiting time from 40 to 25 minutes | no-number | pass | |
| bullet | Doubled newsletter sign-ups by adding a form to checkout 'doubled' is a quantity | no-number | pass | |
| bullet | Saved £18k a year by renegotiating two supplier contracts | no-number | pass | |
| bullet | Wrote the style guide now used by the whole marketing team no result claimed, so no number demanded | no-number | pass | |
| bullets | Ran the front desk · Answered phones · Booked meeting rooms · Ordered stationery · Greeted visitors | few-numbers | pass | |
| bullets | Ran the front desk for 3 floors · Answered about 60 calls a day · Booked meeting rooms · Ordered stationery | few-numbers | pass | |
| bullet | Coordinated the delivery of a new patient records system across four wards, working with IT, ward managers and the training team to schedule sessions for 120 staff over eight weeks | long-bullet | pass | |
| bullet | Ran 12 training sessions for 120 ward staff on the new patient records system | long-bullet | pass | |
| bullet | I reorganised the stockroom, cutting picking time by 20% | pronoun | pass | |
| bullet | Our team cut picking time by 20% | pronoun | pass | |
| bullet | Cut picking time by 20% across the team's two warehouses | pronoun | pass | |
| bullet | Expanded sales into the US market by 15% 'US' is a country, not 'us' | pronoun | pass | |
| summary | I am a nurse with eight years on surgical wards. | pronoun | pass | |
| summary | Staff nurse with eight years on surgical wards and a mentor qualification. | pronoun, cliche | pass | |
| bullet | Manages a rota of 25 staff across two shifts present tense in the ended role | tense | pass | |
| bullet | Manage a rota of 25 staff across two shifts present tense is fine for a current role | tense | pass | |
| bullet | Managed a rota of 25 staff across two shifts | tense | pass | |
| summary | Hard-working team player with a proven track record in retail. | cliche | pass | |
| summary | Highly motivated graduate looking for a role in finance. | cliche | pass | |
| summary | Passionate about great food and better service. | cliche | pass | |
| summary | Retail manager who took a struggling branch from bottom to top three in the region in 18 months. | cliche | pass | |
| summary | EXPERIENCED WAREHOUSE OPERATIVE WITH FORKLIFT LICENCE AND SIX YEARS IN DISTRIBUTION. | caps | pass | |
| summary | Operations lead with six years in warehousing. Ran two sites with 80 staff, cut late deliveries by 18% and moved stock control from paper to SAP without a lost order. Trained 30 supervisors and wrote the safety induction now used across the group. Looking for a regional role where planning and people both matter, ideally in food or pharmaceutical logistics, with a team that wants to measure what it does and keep improving it every quarter. Available from January, happy to relocate within the north of England for the right team. | summary-long | pass | |
| dates | Jan 2022 – Present / Jun 2019 – Dec 2021 | date-format, date-unread, gap | pass | |
| dates | Jan 2022 – Present / 06/2019 – 12/2021 | date-format | pass | |
| dates | January 2022 – Present / Jun 2019 – Dec 2021 full and abbreviated month names | date-format | pass | |
| dates | 2022-01 – Present / 2019-06 – 2021-12 | date-format | pass | |
| dates | Jan 2022 – Present / Jun 2019 – Current 'Present' and 'Current' | date-format | pass | |
| dates | Jan 2022 – Present / 2019 – 2021 months on one role, years on another | date-format | gap | pass |
| dates | May 2022 – Present / Jun 2019 – Dec 2021 'May' is both short and full | date-format | pass | |
| dates | Jan2022 – Present / Jun 2019 – Dec 2021 | date-unread | pass | |
| dates | Jan 2022 – Present / 2019 - 2021 – a range typed into the start field | date-unread | pass | |
| dates | Jan 2022 – Present / Jun 2019 – Mar 2018 | date-order | pass | |
| dates | Jan 2022 – Present / Jun 2019 – Jan 2021 12-month gap | gap | pass | |
| dates | Jan 2022 – Present / Jun 2019 – Aug 2021 4 months is not flagged | gap | pass | |
| dates | Jan 2022 – Present / Jun 2019 – Jun 2021 6 months is not flagged | gap | pass | |
| dates | Jan 2022 – Present / Mar 2018 – Dec 2023 / Jun 2015 – Feb 2018 overlapping roles | gap | pass | |
| dates | 2022 – Present / 2019 – 2021 year-only dates: consecutive years are not a gap | gap | pass | |
| dates | Jan 2022 – Present / Sept 2019 – Dec 2021 'Sept' is an abbreviation | date-format | pass | |
| dates | Jan 2022 – Present / Summer 2019 – Dec 2021 season names are a separate format | date-format | pass | |
| heading | My Journey | heading | pass | |
| heading | Employment History | heading | pass | |
| heading | Professional Experience | heading | pass | |
| heading | Superpowers | heading | pass | |
| heading | Skills & Tools | heading | pass | |
| heading | Personal Statement | heading | pass | |
| heading | Where I studied | heading | pass | |
| heading | Volunteering | heading | pass | |
| heading | Things I Love | heading | pass | |
| heading | Publications | heading | pass | |
| bullet | • Cut picking time by 20% a pasted bullet character | symbol | pass | |
| bullet | Cut picking time by 20% Q3 2021 a pasted table cell | symbol | pass | |
| bullet | Cut picking time by 20% in Q3 2021 | symbol | pass | |
| bullet | -5% shrinkage after the new stock count process a negative number is not a bullet symbol | symbol | pass | |
| bullets | Cut late deliveries by 18% in six months. · Trained 14 new starters · Moved 3 sites to SAP · Ran 40 audits a year. | punctuation | pass | |
| bullets | Cut late deliveries by 18% in six months. · Trained 14 new starters. · Moved 3 sites to SAP. · Ran 40 audits a year. | punctuation | pass | |
| cv | {"settings": {"region": "us", "template": "continental", "photo": true}, "photo": true} | photo | pass | |
| cv | {"settings": {"region": "eu", "template": "continental", "photo": true}, "photo": true} | photo | pass | |
| cv | {"settings": {"region": "uk"}, "details": "Date of birth: 4 May 1990"} | personal | pass | |
| cv | {"settings": {"region": "eu", "template": "continental"}, "details": "Date of birth: 4 May 1990"} expected in some European countries | personal | pass | |
| cv | {"settings": {"region": "uk", "template": "sidebar"}} | columns | pass | |
| cv | {"settings": {"region": "uk", "template": "clarity"}} | columns | pass | |
| cv | {"settings": {"region": "us"}, "pages": 1.0} | length, spill | pass | |
| cv | {"settings": {"region": "us"}, "pages": 2.6} | length | pass | |
| cv | {"settings": {"region": "us"}, "pages": 1.9} two pages with ~6 years: note | length | pass | |
| cv | {"settings": {"region": "uk"}, "pages": 1.9} | length | pass | |
| cv | {"settings": {"region": "uk"}, "pages": 2.1} | spill | pass | |
| cv | {"settings": {"region": "uk"}, "pages": 3.4} | length | pass | |
| cv | {"settings": {"region": "uk", "template": "academic"}, "pages": 6.2} | length | pass | |
| cv | {"settings": {"region": "au"}, "pages": 2.8} | length | pass | |
| cv | {"contact": {"email": ""}} | contact | pass | |
| cv | {"contact": {"email": "sam.example.com"}} | contact | pass | |
| cv | {"contact": {"email": "sam@example.com", "phone": "07700 900123"}} | contact | pass | |
| bullet | Grew the team from scratch 'from scratch' implies no number is possible; the rule can't tell | no-number | pass | |
| bullet | Made coffee for the partners weak, but not on the list: the rules only know listed phrases | weak-verb | pass | |
| summary | Experienced and dependable professional who always goes the extra mile. 'goes the extra mile' isn't in the cliché list | cliche | known limit |
The 10 example CVs are also checked on every build and must have no issue-level findings.
How dates are read
| You type | Read as |
|---|---|
Mar 2021 | 2021, month 3 (format: mon) |
March 2021 | 2021, month 3 (format: month) |
Sept 2019 | 2019, month 9 (format: mon) |
03/2021 | 2021, month 3 (format: mm/yyyy) |
3/2021 | 2021, month 3 (format: m/yyyy) |
2021-03 | 2021, month 3 (format: yyyy-mm) |
03.2021 | 2021, month 3 (format: mm.yyyy) |
2021 | 2021 (format: yyyy) |
Summer 2019 | 2019, month 7 (format: season) |
Present | ongoing ("present") |
Jan2021 | not readable: flagged |
2019 - 2021 | not readable: flagged |
13/2021 | not readable: flagged |
Export tests
Text, Markdown and JSON
For each example CV, every build checks that: exporting to CV Once JSON and importing it again gives an identical CV; every bullet appears in the plain-text export, in the same order as on the page; every bullet appears in the Markdown export; and a round trip through the JSON Resume format keeps the contact details, summary and every bullet.
| Example | JSON round trip | Plain text | Markdown | JSON Resume |
|---|---|---|---|---|
| Accountant | pass | pass | pass | pass |
| Career changer (teacher to UX) | pass | pass | pass | pass |
| Data analyst | pass | pass | pass | pass |
| Graduate engineer | pass | pass | pass | pass |
| Marketing manager | pass | pass | pass | pass |
| Primary teacher | pass | pass | pass | pass |
| Project manager | pass | pass | pass | pass |
| Registered nurse | pass | pass | pass | pass |
| Retail store manager | pass | pass | pass | pass |
| Software engineer | pass | pass | pass | pass |
JSON Resume has no place for some CV Once fields (section titles, hidden entries, template and colour settings, the photo), so use CV Once's own JSON for backups.
PDF: every template on A4 and Letter
Method: each example CV is opened in the builder in headless Chrome (Chrome/124.0.6367.78), switched to each template and paper size, and printed with the same print stylesheet you get when you choose "Save as PDF". Each PDF is then checked with poppler's pdfinfo and pdftotext:
- Page size is exactly A4 (595 × 842 pt) or Letter (612 × 792 pt).
- Selectable text: every line of the CV (name, every heading, title, date and bullet) is found in the extracted text. A scanned or image-only PDF would score zero.
- Reading order: those lines appear in the extracted text in the order they appear in the CV, using
pdftotext's default reading-order mode, which is close to how parsers read a PDF. - Nothing off the page: no word's bounding box (
pdftotext -bbox) falls outside the page or into the printed margin, and, measured in the page itself at the exact printable width, no element is wider than the page. The second test matters because Chrome quietly shrinks an over-wide page to fit when printing, which leaves the PDF tidy but the text smaller than intended.
Reading order is judged block by block: the header and each section must come out of the PDF in order and in one piece, and blocks may not interleave on a page, which is what happens when a parser mixes two columns or lifts a right-aligned date away from its job. A two-column CV that runs onto a second page is read page by page, so a section that breaks across pages may have the side column between its two parts.
Run 2026-10-26: 160 of 160 PDFs pass all four checks (10 CVs × 8 templates × 2 paper sizes).
| Template | Paper | PDFs | Text found | In order | Off page | Pages (range) |
|---|---|---|---|---|---|---|
| Clarity | A4 | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Clarity | Letter | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Ledger | A4 | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Ledger | Letter | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Meridian | A4 | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Meridian | Letter | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Compact | A4 | 10 | 100.0% | 10 of 10 | none | 1 |
| Compact | Letter | 10 | 100.0% | 10 of 10 | none | 1 |
| Sidebar | A4 | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Sidebar | Letter | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Split | A4 | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Split | Letter | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Continental | A4 | 10 | 100.0% | 10 of 10 | none | 2 |
| Continental | Letter | 10 | 100.0% | 10 of 10 | none | 2 |
| Academic | A4 | 10 | 100.0% | 10 of 10 | none | 1–2 |
| Academic | Letter | 10 | 100.0% | 10 of 10 | none | 1–2 |
Negative controls. To show the test can fail, every run also prints deliberately broken versions of one CV, which must be caught: bullets displayed in reverse order (caught), lines that refuse to wrap and run off the page (caught), dates right-aligned on the title line, an earlier CV Once design (caught). The last one is why the templates now keep dates next to the role: in our first tests, pdftotext read some right-aligned dates as a separate column and printed them after the next section.
Fonts: templates use the fonts on your device (Helvetica or Arial for sans-serif, Charter or Georgia for serif, with open-source fallbacks). The test machine used FreeSans and FreeSerif, so page counts on your device may differ slightly; the builder measures the page count in your own browser.
Known limits
Grew the team from scratch
: 'from scratch' implies no number is possible; the rule can't tell.Made coffee for the partners
: weak, but not on the list: the rules only know listed phrases.Experienced and dependable professional who always goes the extra mile.
: 'goes the extra mile' isn't in the cliché list.- The rules have no grammar and no meaning: they can't tell a strong sentence that happens to start with "Helped" from a weak one. They flag patterns; you decide.
- English only, tuned on UK, Irish and North American conventions.
- The page count in the builder is measured in your browser before printing. Different browsers break pages slightly differently, so check the PDF preview before you send.
- A clean result doesn't make a CV good. The checks catch wording; what you achieved is up to you.
Sources and licences
Everything on CV Once is original: the templates, the check rules and word lists, the guides, the example CVs and the illustrations. The example CVs describe fictional people; their employers, schools and numbers are invented. Statements about national conventions are written from general knowledge of hiring practice and marked as conventions, which vary by employer and sector. Named laws (the UK Equality Act 2010, US Title VII, the ADEA and ADA, the EU GDPR) are referred to only in general terms; nothing here is legal advice.
The JSON Resume import and export follow the open JSON Resume schema (MIT licence). Language levels refer to the Council of Europe's Common European Framework of Reference for Languages (CEFR). The site uses no third-party data, scripts, fonts or images.