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.
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:
The drawing shows the whole scene; its 6 steps are listed below.
Every step as text
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
# 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
Runs on this device, in your browser. The first run downloads Python (about 13.5 MB), which is kept for the next runs.
Your run, in this browser
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
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:
# 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
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 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
Runs on this device, in your browser. The first run downloads Python (about 13.5 MB), which is kept for the next runs.
Your run, in this browser
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
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.
Results of the sample tests
| Test | Result | Details |
|---|
What your code printed
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.
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
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.
-
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?
Flashcards · 8 cards
Recall it, then check
Say the answer to yourself before you look: recalling it is what makes it stick.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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
- Harvard College Guide to Creating a Strong Resume (Harvard FAS Mignone Center for Career Success)
- A candidate's guide to artificial intelligence (AI) in recruitment (Civil Service Careers, UK Government)
- Resume tips (LinkedIn Help)
- LLM01:2025 Prompt Injection (OWASP Gen AI Security Project)
- Poppler (freedesktop.org)
- mutool draw (Artifex Software (MuPDF))
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress