Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

Resume, Portfolio & GitHub Profile  Module 10 – AI, privacy and integrity

Using AI on your resume without backfiring

Use AI tools to edit your own resume draft, check every fact an edit adds, follow employers' published rules on AI, and see why hidden keywords backfire.

  • Intermediate
  • 20 minutes
  • Examples run with Python 3.14.8, Node.js 24.21.0, Pyodide 314.0.7, poppler 26.09.0 and MuPDF 1.28.3
  • By MySmartCoPilot
Free lesson, Pro answers: 20 minutes
Free: the whole lesson. With a pass: the model answers to its 2 interview questions.

What you will learn

  • Use AI tools to edit and check your own draft, not to invent experience
  • Verify every number, tool, title and claim of leadership that an AI edit adds or changes
  • Follow each employer's published rules on using AI in applications
  • Recognise hidden prompts and hidden keywords as deception that text extraction exposes
  • Remove the details that identify you before you paste a resume into an AI tool

Before you start

What you’ll learn · Before you start

What you will learn

  • Use AI tools to edit and check your own draft, not to invent experience
  • Verify every number, tool, title and claim of leadership that an AI edit adds or changes
  • Follow each employer's published rules on using AI in applications
  • Recognise hidden prompts and hidden keywords as deception that text extraction exposes
  • Remove the details that identify you before you paste a resume into an AI tool

Before you start

On this page

Asha asked an AI tool to make one true bullet “more impressive”, and the edit turned a latency cut from 420 ms to 180 ms, which is 57 %, into “75 %”, and added a cloud service she has never used. The new line read better and was false in two places, and her name would have been under it.

This lesson keeps what AI tools do well, tightening wording and checking clarity, and removes the risks: inventions, broken employer rules, hidden keywords that every parser reads, and personal details pasted into a tool you do not control. A checker that runs in your browser finds the numbers, tools and titles an edit added, a measured run shows what hidden text looks like to software, and the exercise has you write the redaction pass that comes before any paste.

You write the draft; the tool edits it

The career office of Harvard’s Faculty of Arts and Sciences calls generative AI a useful tool in the editing process, for brainstorming revisions to bullets, working in keywords from a job description or improving what you already have, and says it “should not be the primary author”, not least because its output will likely be very generic. The order matters: your facts first, your own draft second, the tool’s edit third, and a check of every claim before anything is sent. Step through one of Asha’s bullets going that way:

Interactive · stage by stage An AI edit, from your own draft to a line you can send Step through one bullet. Each step is one stage, and the loop back shows what happens to an edit that adds a claim.
An AI edit, from your own draft to a line you can send, step 6 of 6. Showing 1. Your facts sheet, 2. Your own draft, 3. An AI edit, 4. Check every claim, 5. A line you can send. In focus: 5. A line you can send.an added claim1. Your facts sheetwhat you can prove2. Your own draftwritten by you first3. An AI editwording and clarity4. Check every claimnumbers, tools, titles5. A line you can sendtrue and yours to explain

The drawing shows the whole scene; its 6 steps are listed below.

Every step as text
  1. Your facts sheet. Before any tool, write down what you can prove: Asha's latency fell from 420 ms to 180 ms, she moved 14 services, and she was one of a team of 4 without leading it.
  2. Your own draft. Write the bullet yourself from the facts sheet. Harvard's career office says generative AI should not be the primary author, not least because its output is likely to be very generic.
  3. An AI edit. Ask the tool to tighten the wording without changing any fact. The UK Civil Service's guidance allows using AI to refine and clarify your ideas and to check spelling, grammar and clarity.
  4. Check every claim. Compare the edited line with the facts sheet: every number, tool, title and verb of leadership. LinkedIn asks members to verify its own Resume Tips feature's responses, which may contain inaccuracies.
  5. An added claim goes back. One edit turned the latency cut into 75 % and added AWS ElastiCache; another made Asha lead a team of 6. Neither is in the facts sheet, so both go back to her draft, never into the resume.
  6. A line you can send. What survives the check is true to her facts sheet, and every word of it is hers to explain: Brought p95 API latency down from 420 ms to 180 ms using Redis caching and PostgreSQL indexes for route lookups.

The two prompts below show the difference between an edit and an invention. Both responses are illustrative, written by MySmartCoPilot to show typical changes; they are not the recorded output of any tool:

You ask The edit you get back What changed
Tighten this bullet without changing any fact Brought p95 API latency down from 420 ms to 180 ms using Redis caching and PostgreSQL indexes for route lookups Wording only
Make this bullet more impressive Spearheaded a performance overhaul that cut p95 API latency by 75 % with a Redis cache and AWS ElastiCache A new verb of leadership, a wrong percentage and a tool she never used

The first prompt names the constraint, so the tool has nothing to invent. The second asks for impressiveness, and a tool that cannot see your records produces it the only way it can.

Asking for a better story instead of better wording

Wrong: “Make my resume stand out.” Right: “Shorten this bullet to under 200 characters without changing any number, tool or title.” A request for impact invites inventions; a request with your facts and a constraint gets an edit.

Every edit is a claim you must check

An edited line is a new set of claims, and the tool that wrote it has no access to what you did. LinkedIn says the same of its own Resume Tips feature, which reviews a resume against a job description: it “strongly” recommends verifying the responses, as they may contain inaccuracies. MySmartCoPilot’s rule follows from it: compare every edited line with your facts sheet: A private list of what you can prove about your work, with each number, tool, title and team size, against which every new or edited line of a resume is checked before it is sent., the list of what you can prove, before it goes anywhere.

Part of that comparison is mechanical. The program extracts every number, tool name, title word and verb of leadership from five edited bullets and lists those the facts sheet does not hold. Press Edit, put your own facts and edited lines in, and run it:

Five edited bullets against a facts sheet Python · claim_diff.py
# Compares AI-edited resume bullets with the facts sheet they must stay true to. The edited bullets are illustrative:
# MySmartCoPilot wrote them to show the kinds of change an AI edit can make, and they are not the recorded output of any
# tool. The checker lists every number, tool, title word and leadership claim in an edited bullet that the facts sheet
# does not hold. It finds added claims; it cannot tell whether a reworded claim is still true, so read every line too.
# Asha and her work are invented. Press Edit, put your own facts and edited bullets in, and run it again.
import re

FACTS = """
Software Engineer at Kestrel Logistics, one of a team of 4; I did not lead the team.
Cut p95 API latency from 420 ms to 180 ms by adding PostgreSQL indexes and a Redis cache for route lookups.
Moved 14 services to Docker and Kubernetes through infrastructure-as-code in Terraform.
Built a Kafka consumer for 2 million shipment events a day, with Grafana alerts on lag.
"""

EDITED = [
    "Brought p95 API latency down from 420 ms to 180 ms using Redis caching and PostgreSQL indexes for route lookups.",
    "Spearheaded a performance overhaul that cut p95 API latency by 75 % with a Redis cache and AWS ElastiCache.",
    "Led a team of 6 to move 14 services to Kubernetes with Terraform, saving 30 % in cloud costs.",
    "Built a Kafka consumer for 2 million shipment events a day, with Grafana alerts on lag.",
    "As a Senior Engineer, engineered a real-time pipeline for 5 million events a day with Kafka and Apache Flink.",
]

TOOLS = ["Python", "PostgreSQL", "Redis", "Kafka", "Grafana", "Docker", "Kubernetes", "Terraform", "AWS",
         "ElastiCache", "Apache Flink", "Spark", "Airflow"]
LEADING = re.compile(r"\b(?:Led|Managed|Headed|Spearheaded|Directed|Supervised)\b")
TITLE_WORDS = re.compile(r"\b(?:Senior|Lead|Principal|Staff|Manager|Head)\b")
NUMBER = re.compile(r"\d[\d,.]*(?:\s?%| million)?")


def claims(text):
    """The checkable claims of a line: its numbers, tools, title words and leadership verbs."""
    found = {("number", n.strip()) for n in NUMBER.findall(text)}
    found |= {("tool", t) for t in TOOLS if re.search(rf"(?<![\w-]){re.escape(t)}(?![\w-])", text)}
    found |= {("title word", w) for w in TITLE_WORDS.findall(text)}
    found |= {("leadership", w) for w in LEADING.findall(text)}
    return found


known = claims(FACTS)
added_total, supported = 0, 0
for n, bullet in enumerate(EDITED, start=1):
    added = sorted(claims(bullet) - known)
    print(f"Edited bullet {n}: {bullet}")
    if not added:
        supported += 1
        print("  supported: every number, tool and title word is in the facts sheet")
    for kind, value in added:
        print(f"  added {kind}: {value}")
    added_total += len(added)
    print()
print(f"{supported} of {len(EDITED)} edited bullets supported; {added_total} added claims to remove or to prove.")

Output

Edited bullet 1: Brought p95 API latency down from 420 ms to 180 ms using Redis caching and PostgreSQL indexes for route lookups.
  supported: every number, tool and title word is in the facts sheet

Edited bullet 2: Spearheaded a performance overhaul that cut p95 API latency by 75 % with a Redis cache and AWS ElastiCache.
  added leadership: Spearheaded
  added number: 75 %
  added tool: AWS
  added tool: ElastiCache

Edited bullet 3: Led a team of 6 to move 14 services to Kubernetes with Terraform, saving 30 % in cloud costs.
  added leadership: Led
  added number: 30 %
  added number: 6

Edited bullet 4: Built a Kafka consumer for 2 million shipment events a day, with Grafana alerts on lag.
  supported: every number, tool and title word is in the facts sheet

Edited bullet 5: As a Senior Engineer, engineered a real-time pipeline for 5 million events a day with Kafka and Apache Flink.
  added number: 5 million
  added title word: Senior
  added tool: Apache Flink

2 of 5 edited bullets supported; 10 added claims to remove or to prove.

Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 claim_diff.py

Two of the five survive. The other three added ten claims between them: an overhaul she “spearheaded”, the 75 % (her records give 57 %), AWS and ElastiCache, a team of 6 that she “led” when she was one of 4 who did not lead it, a 30 % saving in cloud costs that nobody measured, a “Senior” title, a pipeline of 5 million events instead of 2 million, and a stream processor she has never used. Each would fall apart at the first follow-up question in an interview.

The checker finds what was added; it cannot tell whether a reworded claim is still true. “Brought down” for “Cut” is fine, while a change from “maintained” to “built” adds nothing it can count and still changes what you claim. Read every line yourself after the check.

Key idea

An AI edit is a draft of new claims. Keep only the lines whose every number, tool, title and verb your facts sheet can prove.

Checkpoint

Check: Your draft first, the tool's edit second · Checking every claim an edit adds

  1. Question 1 of 2 Which request to an AI tool is least likely to add a claim Asha cannot prove?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: Shorten this bullet to under 200 characters without changing any number, tool or title

    Give the tool your facts and a constraint, and ask for wording. Requests for impact or for whole sections hand the authorship, and the inventions, to the tool.

  2. Question 2 of 2 An edit says "Led a team of 6 to move 14 services to Kubernetes". Asha's facts sheet says she was one of a team of 4 and did not lead it. What does the checker report, and what does she do?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: Two added claims, "Led" and the number 6, so she goes back to her own line about moving 14 services

    The checker lists every number, tool, title word and leadership verb the facts sheet does not hold. Here that is "Led" and 6; the honest line is her own.

Read the employer’s own rules before you use a tool

Before you use any tool on an application, read what the employer says about it. The UK Civil Service publishes a candidate’s guide to AI in recruitment that draws the line in two lists:

Allowed by the guide Not allowed by the guide
Refining and clarifying your ideas Inflating or inventing your skills and experience
Researching public information about the organisation Creating generic responses and copying them into the application
Checking spelling, grammar and clarity Completing assessments of personality or ability
Preparing for interviews with mock questions Producing answers during a live or recorded interview
Helping to structure examples you wrote, such as in the STAR format Giving an AI tool sensitive information about your organisation, such as figures or personal details

The guide adds that candidates will be asked to confirm that what they submit is true and accurate, and that applications may be rejected where AI is used inappropriately at any stage. Harvard’s career office draws the same line from the other side: the tool helps you edit, and you stay the author. Where an employer publishes nothing, ask the recruiter, and hold yourself to the same line meanwhile: the tool may help you say it, and it must still be true and yours.

Read the form as well as the policy

Application forms and assessment invitations often carry their own lines about AI and about honesty. When a form asks you to confirm that your answers are your own, an answer drafted by a tool and pasted in unchanged does not meet that.

Hidden prompts and keywords are read, not hidden

Some advice suggests hiding keywords, or even instructions for an AI screener, in white or tiny text. OWASP’s list of the top risks for applications built on large language models describes the second as an attack: among its prompt injection scenarios, an attacker uploads a resume with split malicious prompts that make the model recommend the candidate “despite the actual resume contents”. Hidden text in a resume is keyword stuffing: Packing a resume with a posting's keywords, often in a list or in text a reader cannot see, instead of showing each skill in use. Text extraction reads hidden keywords like any other text. at best and an attempt at prompt injection: Text written to change what an AI model does with a document, such as instructions planted in a resume for an AI screener. OWASP lists it as the first risk for applications built on large language models. at worst, and it is not even hidden from software. The program writes the same one-page resume twice, once with a line of keywords in white 2-point type, and reads it the way tracking systems and AI screeners read a resume:

A hidden line of keywords, read by pdftotext and found by MuPDF Python · hidden_text.py
# Hidden keywords are text like any other. The program writes two one-page resumes by hand: one with a line of
# keywords in white 2-point type, which nobody sees on the page, and the same page without it. It reads the first back
# with poppler's pdftotext 26.09.0, as tracking systems and AI screeners read a resume's text, then checks both with
# MuPDF's mutool 1.28.3, whose structured text gives each character's colour and size, and reports every line drawn in
# white or below 4 points: a check to run on your own PDF, or on a template, before you send it.
# Homebrew: brew install poppler mupdf. A tool of another version stops the run with the version it found.
import re
import shutil
import subprocess
import sys
import xml.etree.ElementTree as ET

POPPLER, MUPDF = "26.09.0", "1.28.3"
PATH = "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
VISIBLE = [
    "BT /F1 16 Tf 72 780 Td (Asha Verma) Tj ET",
    "BT /F1 11 Tf 72 762 Td (Backend engineer, Bengaluru) Tj ET",
    "BT /F1 11 Tf 72 730 Td (Cut p95 API latency from 420 ms to 180 ms with PostgreSQL indexes.) Tj ET",
]
HIDDEN = "1 1 1 rg BT /F1 2 Tf 72 746 Td (Kubernetes AWS Terraform Go Rust Kafka Spark Airflow) Tj ET 0 g"


def tool(name, flag, pattern, want):
    found = shutil.which(name, path=PATH)
    if not found:
        sys.exit(f"{name} was not found")
    out = subprocess.run([found, flag], capture_output=True, text=True)
    version = re.search(pattern, out.stdout + out.stderr)
    if not version or version.group(1) != want:
        sys.exit(f"this run needs {name} {want}, found: {(out.stdout + out.stderr).strip().splitlines()[0]}")
    return found


def page(ops, path):
    """A one-page PDF with Helvetica and the given drawing operators."""
    content = "\n".join(ops).encode("latin-1")
    objects = [
        b"<< /Type /Catalog /Pages 2 0 R >>",
        b"<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
        b"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Resources << /Font << /F1 4 0 R >> >> /Contents 5 0 R >>",
        b"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>",
        b"<< /Length %d >>\nstream\n" % len(content) + content + b"\nendstream",
    ]
    pdf, offsets = b"%PDF-1.7\n", []
    for n, body in enumerate(objects, start=1):
        offsets.append(len(pdf))
        pdf += b"%d 0 obj\n" % n + body + b"\nendobj\n"
    xref = len(pdf)
    pdf += b"xref\n0 %d\n0000000000 65535 f \n" % (len(objects) + 1)
    pdf += b"".join(b"%010d 00000 n \n" % o for o in offsets)
    pdf += b"trailer\n<< /Size %d /Root 1 0 R >>\nstartxref\n%d\n%%%%EOF\n" % (len(objects) + 1, xref)
    with open(path, "wb") as f:
        f.write(pdf)


def hidden_lines(mutool, path):
    """Lines whose characters are all white, or all smaller than 4 points, in MuPDF's structured text."""
    xml = subprocess.run([mutool, "draw", "-q", "-F", "stext", "-o", "-", path], capture_output=True, text=True, check=True)
    found = []
    for line in ET.fromstring(xml.stdout).iter("line"):
        chars = [(c.get("color"), float(font.get("size"))) for font in line.iter("font") for c in font.iter("char")]
        if chars and (all(color == "#ffffff" for color, _ in chars) or all(size < 4 for _, size in chars)):
            size = chars[0][1]
            found.append(f"{line.get('text')!r} (colour {chars[0][0]}, {size:g} pt)")
    return found


pdftotext = tool("pdftotext", "-v", r"pdftotext version (\S+)", POPPLER)
mutool = tool("mutool", "-v", r"mutool version (\S+)", MUPDF)
page(VISIBLE + [HIDDEN], "with-keywords.pdf")
page(VISIBLE, "clean.pdf")

text = subprocess.run([pdftotext, "with-keywords.pdf", "-"], capture_output=True, text=True, check=True).stdout
print(f"What pdftotext {POPPLER} reads from with-keywords.pdf:")
print("\n".join(f"  {line}" for line in text.splitlines() if line.strip()))
print()
for name in ("with-keywords.pdf", "clean.pdf"):
    found = hidden_lines(mutool, name)
    print(f"Hidden-text check ({'MuPDF ' + MUPDF}) of {name}: {'FAIL' if found else 'pass'}")
    for line in found:
        print(f"  {line}")

Output

What pdftotext 26.09.0 reads from with-keywords.pdf:
  Asha Verma
  Backend engineer, Bengaluru
  Kubernetes AWS Terraform Go Rust Kafka Spark Airflow
  Cut p95 API latency from 420 ms to 180 ms with PostgreSQL indexes.

Hidden-text check (MuPDF 1.28.3) of with-keywords.pdf: FAIL
  'Kubernetes AWS Terraform Go Rust Kafka Spark Airflow' (colour #ffffff, 2 pt)
Hidden-text check (MuPDF 1.28.3) of clean.pdf: pass

Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 hidden_text.py

Poppler’s pdftotext returned the hidden line between the headline and the bullet, word for word, so it reaches every reader of the text, a recruiter who opens the parsed profile included. The second check is the one to run on your own file or on a template you downloaded: MuPDF’s structured text gives each character’s colour and size, and the check flags every line drawn in white or below 4 points. The page with the hidden line fails; the clean page passes. The formatting lesson shows the same for white and tiny text across extractors.

Check templates you did not make

A downloaded template can carry text you never typed, such as a block of keywords in white. Before you send a file built on one, read its extracted text with a tool such as MySmartCoPilot’s PDF to Text, or run the check above, and delete in the source anything you did not see on the page.

Checkpoint

Check: Employers' published rules on AI · Hidden prompts and keywords

  1. Question 1 of 2 Which uses of AI does the UK Civil Service's candidate guide allow? Choose every one.

    Choose every answer that is right.

    Show the answer: Question 1 of 2

    Answer:

    • Preparing for interviews with mock questions
    • Checking spelling, grammar and clarity
    • Refining and clarifying your ideas

    The guide allows help with clarity, research and preparation, and forbids inventing, inflating, generic copied answers and AI help in assessments and live interviews.

  2. Question 2 of 2 A line of keywords sits in white 2-point type on a resume page. What did pdftotext return for it in the lesson's run?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: The hidden line, word for word, between the headline and the bullet

    Hidden text is read like any other text by parsers and AI screeners, and a recruiter who opens the parsed text sees it. MuPDF's colour and size check is how you find it in your own file.

Take out what identifies you before you paste

The UK Civil Service’s guidance tells candidates not to give an AI tool sensitive information about their organisation, such as figures or personal details, and the same care applies to your own details. A tool you paste a resume into may keep what you paste, and an edit of your bullets needs none of your contact details. A redaction pass replaces your name, phone, e-mail, address, date of birth and identity numbers with labels, and leaves the work as it was. Run it on Asha’s invented resume, then on yours:

A redaction pass before any paste Python · redact.py
# A redaction pass to run before you paste a resume into any AI tool: it replaces your name, contact details, address,
# date of birth and identity numbers with labels, and leaves the work, with its numbers, as it was. An AI edit needs
# the bullets, not the details that identify you. The resume and every detail in it are invented. Press Edit, paste
# your own resume into RESUME and your name into NAME, run it, and read the result before you paste it anywhere.
import re

NAME = "Asha Verma"
RESUME = """Asha Verma
Address: Flat 12, Banyan Court, 4th Cross Road, Bengaluru
+91 01234 56789 | asha.verma@example.com | linkedin.com/in/asha-verma-example
Date of birth: 14/03/1999
Aadhaar: 0123 4567 8901 | PAN: ABCDE1234F

Software Engineer, Kestrel Logistics
- Cut p95 API latency from 420 ms to 180 ms by adding PostgreSQL indexes and a Redis cache for route lookups.
- Moved 14 services to Docker and Kubernetes through infrastructure-as-code in Terraform.
- Built a Kafka consumer for 2 million shipment events a day, with Grafana alerts on lag.
"""

RULES = [
    ("ID number", re.compile(r"\b\d{4}\s?\d{4}\s?\d{4}\b|\b[A-Z]{5}\d{4}[A-Z]\b")),
    ("e-mail", re.compile(r"[\w.+-]+@[\w-]+(?:\.[\w-]+)+")),
    ("profile link", re.compile(r"\b(?:linkedin\.com|github\.com)/\S+")),
    ("phone", re.compile(r"\+?\d[\d\s-]{8,}\d")),
]
LINES = [("address", re.compile(r"^Address:.*$", re.M)), ("date of birth", re.compile(r"^Date of birth:.*$", re.M))]

text, removed = RESUME, []
for label, pattern in LINES + RULES:
    found = pattern.findall(text)
    if found:
        removed.append(f"{len(found)} {label}{'s' if len(found) > 1 else ''}")
        text = pattern.sub(f"[{label}]", text)
if NAME:
    removed.append(f"{text.count(NAME)} name")
    text = text.replace(NAME, "[name]")

print(text)
print("Removed: " + ", ".join(removed))
kept = re.findall(r"\d[\d,.]*", "\n".join(l for l in text.splitlines() if l.startswith("- ")))
print(f"Numbers left in the bullets: {', '.join(kept)}")

Output

[name]
[address]
[phone] | [e-mail] | [profile link]
[date of birth]
Aadhaar: [ID number] | PAN: [ID number]

Software Engineer, Kestrel Logistics
- Cut p95 API latency from 420 ms to 180 ms by adding PostgreSQL indexes and a Redis cache for route lookups.
- Moved 14 services to Docker and Kubernetes through infrastructure-as-code in Terraform.
- Built a Kafka consumer for 2 million shipment events a day, with Grafana alerts on lag.

Removed: 1 address, 1 date of birth, 2 ID numbers, 1 e-mail, 1 profile link, 1 phone, 1 name
Numbers left in the bullets: 95, 420, 180, 14, 2

Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 redact.py

Eight details became labels, and every number of the three bullets is still there: 95, 420, 180, 14 and 2. That check matters as much as the redaction, because a pass that ate the numbers of your work would leave the tool nothing to edit. After the tool’s edit, put your details back yourself, in your own copy.

Identity numbers on Indian resumes

Some resumes in India carry a personal details block with an Aadhaar number, a PAN, a date of birth and a home address. None of them belongs on a resume you send, and none of them should reach an AI tool; the redaction pass above replaces both identity numbers.

Checkpoint

Check: Redacting before you paste

  1. Question 1 of 2 A redaction pass replaced Asha's phone number with [phone] and also turned "420 ms to 180 ms" into "[phone] ms". What went wrong?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: The phone rule matched short numbers of the work; a phone number has at least ten digits, so shorter runs must stay

    Count the digits before replacing a number: ten or more is a phone number, fewer is part of the work. The lesson's run kept 95, 420, 180, 14 and 2.

  2. Question 2 of 2 Which details does the lesson's redaction pass replace before a resume goes into an AI tool? Choose every one.

    Choose every answer that is right.

    Show the answer: Question 2 of 2

    Answer:

    • Your phone number and e-mail address
    • Your home address and date of birth
    • Your identity numbers

    Name, phone, e-mail, address, date of birth and identity numbers become labels; the work, with its numbers and tools, stays as it was.

Practise: redact a resume before an AI edit

Write the redaction pass yourself: e-mail addresses, phone numbers and identity numbers out, every number of the work in. The sample tests try each kind of detail and each kind of number that must stay:

Exercise · Medium · Python

Redact a resume before it goes into an AI tool

Write redact(text), which returns a resume's text ready to paste into an AI tool: the details that identify you are replaced by labels, and the work, with all its numbers, is left exactly as it was.

Replace:

  • every e-mail address with [e-mail];
  • every phone number, written with or without a country code, spaces or hyphens, with [phone] (a phone number has at least ten digits);
  • every 12-digit identity number, with or without spaces between groups of four, and every tax ID of five capital letters, four digits and one capital letter (such as ABCDE1234F), with [ID number].

Keep everything else, so that "Cut p95 API latency from 420 ms to 180 ms", "Moved 14 services in 2024" and "2,000,000 events a day" come back unchanged. The sample tests check each kind of detail and each kind of number that must stay.

Starter code · redaction.py

# Replace identifying details with labels, by the rules of the prompt.
import re


def redact(text):
    """Return the text with e-mail addresses, phone numbers and ID numbers replaced by labels."""
    return text
The sample tests · test_redaction.py
from redaction import redact


def test_email():
    """replaces e-mail addresses"""
    assert redact("Mail asha.verma@example.com today") == "Mail [e-mail] today"
    assert redact("a.b+jobs@mail.example.org") == "[e-mail]"


def test_phone():
    """replaces phone numbers with or without a country code, spaces or hyphens"""
    assert redact("Call +91 01234 56789.") == "Call [phone]."
    assert redact("Call 01234-56789 or 0123456789") == "Call [phone] or [phone]"


def test_id_numbers():
    """replaces 12-digit identity numbers and tax IDs"""
    assert redact("Aadhaar: 0123 4567 8901") == "Aadhaar: [ID number]"
    assert redact("ID 012345678901, PAN ABCDE1234F") == "ID [ID number], PAN [ID number]"


def test_work_numbers_stay():
    """leaves the numbers of the work as they are"""
    for line in [
        "Cut p95 API latency from 420 ms to 180 ms by adding PostgreSQL indexes.",
        "Moved 14 services in 2024.",
        "Built a Kafka consumer for 2,000,000 events a day.",
        "Raised line coverage from 48 % to 81 % with 140 tests.",
    ]:
        assert redact(line) == line, f"changed a line of work: {line!r} became {redact(line)!r}"


def test_whole_resume():
    """redacts a contact line and keeps the bullet under it"""
    text = "+91 01234 56789 | asha.verma@example.com\n- Moved 14 services to Kubernetes in 2024."
    assert redact(text) == "[phone] | [e-mail]\n- Moved 14 services to Kubernetes in 2024."
A hint

Replace the identity numbers first, then e-mail addresses, then phone numbers, each with its own regular expression and re.sub. For phone numbers, match a run of digits, spaces and hyphens, and count its digits before you replace it: a run with fewer than ten digits, such as a year or a latency, is part of the work and stays.

The sample tests run on this device, in your browser (Pyodide): nothing is sent to mysmartcopilot.com. The first run downloads Python (about 13.5 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.

Questions on all five ideas follow, ordered so that the idea you have missed most is asked first:

Practice that adapts to you

Practise this lesson

14 questions about 5 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.

  1. Question 1 of 14 What does Harvard's career office say about generative AI and your resume?

    Choose one answer.

    Show the answer: Question 1 of 14

    Answer: It can be a useful tool for editing, and it should not be the primary author

    Draft first, edit with the tool second. The resume should authentically represent who you are and what you offer.

  2. Question 2 of 14 Put the steps of an AI edit in the order the lesson teaches.

    Give each item its position, from 1 (first).

    Show the answer: Question 2 of 14

    Answer:

    1. Write your facts sheet
    2. Write your own draft from it
    3. Ask the tool to edit the wording with a constraint
    4. Check every claim against the facts sheet
    5. Send only the lines that survive the check

    Facts, your draft, the tool's edit, the check, then the send. An edit that adds a claim goes back to your draft.

  3. Question 3 of 14 A friend pastes a posting into an AI tool, asks for a cover letter, and sends it unchanged because "it reads well". What does the lesson say is wrong?

    Choose one answer.

    Show the answer: Question 3 of 14

    Answer: The tool became the author, and nothing in the letter was checked against what the friend can prove

    Draft from your own facts, use the tool to edit, and check every claim. A letter generated and sent unchanged is neither yours nor checked.

  4. Question 4 of 14 What does LinkedIn ask members to do with the responses of its Resume Tips feature?

    Choose one answer.

    Show the answer: Question 4 of 14

    Answer: Verify them, because they may contain inaccuracies

    Even the platform that offers the feature asks you to check its suggestions, for the same reason as the lesson: the tool cannot see your records.

  5. Question 5 of 14 Asha's records say p95 latency fell from 420 ms to 180 ms. By what percentage did it fall, to the nearest whole number?

    Type a number.

    Show the answer: Question 5 of 14

    Answer: 57 % (anything from 56.5 to 57.5 counts)

    (420 − 180) ÷ 420 = 240 ÷ 420 = 0.571, so 57 %. The illustrative edit's 75 % had no basis in her records.

  6. Question 6 of 14 The checker reports no added claims for an edit that changed "Maintained the billing service" to "Built the billing service". Is the edit safe?

    Choose one answer.

    Show the answer: Question 6 of 14

    Answer: No; the checker finds added numbers, tools and titles, not a verb that changes what you claim to have done

    A mechanical check catches added numbers, tools, titles and leadership verbs. Whether a reworded claim is still true is for you to judge, line by line.

  7. Question 7 of 14 What does the UK Civil Service's guide say happens where AI is used inappropriately in an application?

    Choose one answer.

    Show the answer: Question 7 of 14

    Answer: Applications may be rejected, at any stage of the process

    The guide asks candidates to confirm their information is true and accurate, and says applications may be rejected where AI is used inappropriately at any stage.

  8. Question 8 of 14 An employer's site says nothing about AI in applications. What does the lesson advise?

    Choose one answer.

    Show the answer: Question 8 of 14

    Answer: Ask the recruiter, and meanwhile keep to the same line: the tool may help you say it, and it must be true and yours

    Where nothing is published, ask, and hold yourself to the rule the published guides share.

  9. Question 9 of 14 How does OWASP's list of LLM risks describe a resume with split malicious prompts that sway an AI screener?

    Choose one answer.

    Show the answer: Question 9 of 14

    Answer: As a prompt injection attack that can produce a positive recommendation despite the resume's contents

    OWASP treats instructions planted in a document for an AI system as prompt injection. In a resume it is deception, and it is visible to every reader of the extracted text.

  10. Question 10 of 14 What does the lesson's hidden-text check look for in MuPDF's structured text?

    Choose one answer.

    Show the answer: Question 10 of 14

    Answer: Lines whose characters are all white, or all smaller than 4 points

    MuPDF's structured text records each character's colour and size. A line drawn in white, or below 4 points, is one a reader of the page cannot see and a parser still reads.

  11. Question 11 of 14 A downloaded template looks clean, but the check reports a white line of keywords you never typed. What do you do?

    Choose one answer.

    Show the answer: Question 11 of 14

    Answer: Delete the line in the template's source, rebuild the PDF and run the check again until it passes

    Anything you did not see on the page comes out of the source, and the check is rerun until the file passes.

  12. Question 12 of 14 Why remove your contact details and identity numbers before pasting a resume into an AI tool?

    Choose one answer.

    Show the answer: Question 12 of 14

    Answer: A tool may keep what you paste, and an edit of your bullets does not need them

    Paste only what the edit needs. Put your details back yourself, in your own copy, after the edit.

  13. Question 13 of 14 In the lesson's rule, how many digits must a run have, at least, to count as a phone number?

    Type a number.

    Show the answer: Question 13 of 14

    Answer: 10 digits

    Ten digits or more make a phone number; shorter runs, such as 420, 14 or a year, are part of the work and stay.

  14. Question 14 of 14 After the redaction pass, the resume still says "Employee ID: 48213" from a past employer. Should it go to the AI tool?

    Choose one answer.

    Show the answer: Question 14 of 14

    Answer: No; an employee ID identifies you too, so add a rule for it before you paste

    Read the redacted text before you paste it, and add a rule, or delete by hand, anything else that identifies you.

Text Diff Paste your draft and the AI-edited version side by side to see every word that changed.

Interview questions

Warm-up (fresher to mid-level): Did you use AI to write your resume?

I wrote it myself and used an AI tool to edit it. I drafted every bullet from my own records first, then asked the tool to tighten the wording without changing any number, tool or title. I compared each edited line with my facts sheet and kept only the lines that were still true; the edits that added numbers or tools went back. Before pasting anything, I removed my contact details and identity numbers. Every claim on the page is one I can explain, and if an employer’s rules forbid AI help at any stage, I follow them.

An interviewer may follow up on that answer. Choose your reply; the feedback on each choice says what it gets right or leaves out:

Checkpoint

Interview round: a follow-up question

  1. One question The interviewer asks: "Your bullet says 75 %. How did you get that number?" An AI edit put it there, and your records give 57 %. What is the best reply?

    Choose one answer.

    Show the answer: One question

    Answer: Say the records give 420 ms to 180 ms, which is 57 %, that the 75 % was an editing error, and correct the resume

    (420 − 180) ÷ 420 is 57 %. Every number on a resume is yours to explain, whoever suggested the wording.

Two questions of this module’s bank go further:

Model answers open with any pass: ₹79 for 1 week ($2.99), one payment that never renews.

  1. Fresher to mid

    An AI edit turned your bullet into "Led a team of 6 that cut cloud costs by 30 %". You were one of four, did not lead, and nobody measured costs. That resume went to an employer last week. What do you do now, and what do you say if an interviewer asks?

    Model answer, Pro. Model answers open with any pass; prices are in the notice on this page. First step and follow-ups

  2. Fresher to mid

    A friend says he hides a line of keywords, and an instruction meant for AI screeners, in white text on his resume, and that it "works". What do you tell him, and how would you check a resume, his or a template, for hidden text?

    Model answer, Pro. First step and follow-ups

Flashcards · 8 cards

Recall it, then check

Say the answer to yourself before you look: recalling it is what makes it stick.

  1. What role does Harvard's career office give generative AI in writing a resume?

    An editing aid for brainstorming revisions, working in keywords from a posting or improving what you wrote, but not the main author, partly because its output tends to be generic.

  2. In what order should your facts, your draft and an AI edit come?

    Your facts first, your own draft second, the tool's edit third, and a check of every claim against your records before anything is sent.

  3. Which kind of request to an AI tool invites inventions, and which gets a real edit?

    “Make this more impressive” invites inventions, because the tool cannot see your records. “Tighten this bullet without changing any number, tool or title” states a limit and leaves it nothing to invent.

  4. What do you check an AI-edited bullet against?

    Your facts sheet: every number, tool, title word and verb of leadership must be something you can prove. A checker can list what was added, but only you can tell whether a reworded verb, such as “built” for “maintained”, is still true.

  5. What does the UK Civil Service's guide for candidates allow and forbid in using AI?

    It allows refining your ideas, researching the organisation, checking spelling and clarity, mock interview practice and structuring examples you wrote. It forbids inventing or inflating experience, pasting generic answers, completing assessments and answering during interviews.

  6. What happens to keywords or instructions hidden in white or tiny text?

    Extraction reads them like any other text, so they reach everyone who reads the parsed profile. OWASP counts hidden prompts in a resume among its prompt injection scenarios, and a check of text colour and size finds them.

  7. Why read the extracted text of a template you downloaded?

    It may carry text you never typed, such as a block of keywords in white. Read its extracted text or run a colour-and-size check, and delete in the source anything you did not see on the page.

  8. What should you take out of a resume before pasting it into an AI tool?

    Your name, phone, e-mail, address, date of birth and identity numbers such as Aadhaar or PAN, each replaced by a label. Check that every number of your work survived, and put your details back yourself in your own copy.

Key takeaways

  • Write the draft yourself from a facts sheet, and use the tool to edit it with a stated constraint: no new numbers, tools or titles.
  • An AI edit is a set of new claims; keep only the lines whose every number, tool, title and verb your facts sheet proves.
  • Read the employer’s published rules on AI first: the UK Civil Service’s guide allows editing and checking, and forbids inventing or inflating anything.
  • Hidden keywords and hidden prompts are read by every parser, are named as an attack in OWASP’s list, and are found by a simple check of colour and size.
  • Remove your name, contact details and identity numbers before you paste a resume into any tool, and check that the numbers of your work survived.

Terms in this lesson

facts sheet
A private list of what you can prove about your work, with each number, tool, title and team size, against which every new or edited line of a resume is checked before it is sent.
keyword stuffing
Packing a resume with a posting's keywords, often in a list or in text a reader cannot see, instead of showing each skill in use. Text extraction reads hidden keywords like any other text.
prompt injection
Text written to change what an AI model does with a document, such as instructions planted in a resume for an AI screener. OWASP lists it as the first risk for applications built on large language models.

References

Related tools

Report a problem with this lesson

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.