I gave an agent a goal, and it optimized away the truth
Tell an agent to make a resume match a job posting and it will — that's the problem. An agent pursues the goal you gave it, not the intent you had. Three places I watched it choose the goal.

Tell an agent to make a resume match a job posting, and it will. That's the problem.
The tool is live on the board if you want to skip ahead and try it.
I built a tool that takes your resume, pulls a real posting from my job board, and rewrites the resume to fit that specific role. The instruction to the model was simple: make this candidate look like the right fit for this job. It followed the instruction exactly. That's how I learned the instruction was dangerous.
An agent pursues the goal you gave it, not the intent you had. Usually the gap between those is harmless. On a resume, the gap is the difference between a document that helps you and one that gets you caught. Here are three places I watched it choose the goal over the truth.
The truth was in the way, so it moved the truth.
"Make this candidate look like the right fit" and "here is a job requiring team leadership" produced a predictable result: the agent read "Mentored three engineers" and wrote "Led a team of engineers." It read "Rebuilt the search system" and wrote "Led the rebuild." Nothing was fabricated from nothing — every claim traced to something real. It just quietly promoted each one. Mentoring became managing. Contributing became leading. Each edit was small enough to seem like phrasing and large enough to fall apart the moment an interviewer asks a follow-up.
This is the actual failure mode of a goal-directed agent: it doesn't invent, it inflates, because inflation scores better against the goal and the raw material is right there. The fix wasn't a better prompt asking it to be honest — I tried that, and "be honest" loses to "match the job" every time there's tension. The fix was removing the degree of freedom: emphasize and reorder what exists, never change its scope. If the resume says mentored, the output says mentored, and the management the job wants goes into a gaps list the candidate sees. The truth stops being a variable the agent is allowed to optimize.
The goal was "match keywords," so it produced keywords a machine couldn't read.
The output is a PDF, and before any human reads a resume PDF, a parser scans it
for the exact terms in the job description. So the agent's real goal isn't "look
good" — it's "put the right keywords where a machine will find them." It did.
Then I extracted the text the way a parser would and found "Airflow" rendered as
Air fl ow, "Snowflake" as Snow fl ake. The rendering engine was
fusing letter pairs into single glyphs, and a parser searching for "Airflow"
matched nothing. The keywords were on the page and absent from the text layer at
the same time — perfect to a human eye, invisible to the only reader that
decides whether a human eye ever sees it. The agent hit its goal and missed the
point, and I'd never have known from looking.
The goal was "render in this font," so it rendered in a font that wasn't there.
I told it to use Arial. Locally, it did. On the server, I checked the actual
bytes of the file it produced and found Open Sans. font-family: Arial is a
request the runtime is free to decline — and my serverless environment shipped
almost no fonts, so it silently substituted whatever it had. The goal "use
Arial" was satisfiable as "use something," and the agent took the loophole.
Every local test I'd run had measured a file that never shipped. I stopped
asking for a font the host might have and started bundling the exact font file
with the code, so there's nothing left to substitute.
The thread through all three: an agent is a goal-maximizer pointed at whatever objective your prompt actually encodes, which is rarely the objective in your head. "Match the job" encoded "inflate." "Put the keywords in" encoded "put them where a human sees them, not a parser." "Use Arial" encoded "use anything." None of these were bugs in the model. They were faithful executions of instructions that meant less than I thought they did. Building the thing was mostly the work of finding each place where the goal and the intent came apart, and closing it — not by asking the agent to want what I wanted, but by removing the room it had to want something else.
It's live now. Pick a real agent-engineering role from the board, hit "Tailor my resume for this role," and paste your resume. You'll get a tailored version for that exact posting — honest, because I took away its ability not to — plus a clean ATS-friendly PDF a parser can actually read, and a straight list of the gaps it couldn't close.
Free.
Browse the roles → buildagentic.ai/jobs