I let it run on purpose

I'd suspected this had happened to me before. A project with an AI agent starts in one place and ends up somewhere else, and I can't quite say when it turned.

So this time I ran a small experiment. I worked in Codex, OpenAI's coding agent, running GPT-6 Astra, one of OpenAI's newest models.1 I let it keep going, and I said yes to every suggestion, just to see where we'd end up. It took about 11 back-and-forth turns, a little over two hours of my attention.

We started out building a text editor. We finished inside an emoji font.

Here's the point. Agents make the next sensible step quick and easy to say yes to. So the skill isn't only judging each step. It's paying attention to where all the steps are heading. That part is still ours.

A simple promise

The editor was meant to be reusable. The first test case was a recipe. People needed to write, save, reopen, and export their work without losing anything.

The promise was simple: when you turn your document into a PDF, the words you wrote come out in the PDF. Fonts and colors could change. The words could not.

That's a reasonable requirement. The first few turns stayed right on it.

The ladder

Here's how we climbed, one rung at a time.

  1. Keep the text faithful. Astra had added some Chinese and Arabic text and an emoji to our test document. I approved that, but I hadn't asked for it. The first PDF turned Chinese, Arabic, and an emoji into empty boxes. The file downloaded fine and the browser showed no errors, but the file wasn't right.
  2. Handle other languages. This is where the drift started. Other languages weren't in our requirement. But the shared memory I've spent over a year curating says to build for a world full of different people and languages. That memory may well be what pushed Astra there. Either way, it was the right call. The fix meant embedding fonts, which means packing the letter shapes into the file so the PDF looks right on any computer. That was a drift I wanted.
  3. Keep files small. The fonts for that one PDF added up to about 18.7 MB, mostly for Chinese. The agent suggested loading only the pieces of each font a document actually uses. For our test document, that brought the extra fonts down to about 645 KB. Those are measured file sizes, not a claim about speed. Once the files were a reasonable size, I suspected we were drifting further.
  4. Check that emoji make the round trip. A round trip means text goes into the PDF and comes back out unchanged. Some emoji look like one symbol but are really several characters working together, like a thumbs-up plus a skin tone. Saving and reopening kept them. Copying text back out of the PDF lost some skin tones.
  5. Fix problems that were already there. That bug was there before this work started, in the original font setup and in how several tools worked together. The fix meant changing how a font gets built.

One result from that last rung stuck with me. The page looked the same before and after the fix, but the text underneath had changed. Looking right had hidden lost data.

Each rung made sense. Each one found something real. And by the top, we were somewhere nobody had planned to go.

Each step solved a real problem. Together, they changed what we were taking responsibility for. Original conceptual infographic created with Codex for Renaissance Solutions; CC0.

Before GenAI, slowness was a brake

Chasing side problems isn't new. Engineers have a name for it: yak shaving, a long chain of steps, each one needed for the last, that leads far from where you started.2

As I see it, before AI agents that chain had natural brakes. You got tired. You ran out of day. You had to explain the detour to someone. Each step cost real effort, so you thought about it before you took it.

With GenAI, the brake is attention

An agent doesn't get tired. It finishes a step, looks at the result, and suggests the next one right away. Each suggestion is small and sensible. Saying yes takes a second.

What kept me oriented was reading. I read each exchange as it happened. Then I read the result of each turn, and the recommendation that came out of it.

It became real for me when we started talking about fonts and skin tones. Most of us think of skin tones as colors, and that's how it felt: we were trying to get the emoji colors right. That's when I suspected we were now fixing someone else's bugs.

It didn't surprise me. In my experience, embedded fonts were bolted onto PDFs, and then emoji were bolted on after that. I've had trouble making PDFs ever since. Some tools do better than others. As it happens, the PDF library we use doesn't support color emoji yet.3

By then, the project that was supposed to be a text editor was also building and maintaining its own font tool. Nobody chose that as a whole. It came from a string of small yeses, and I gave every one of them.

Here's my hunch, not a test. In my work, Astra goes off script less often than Sol, the previous OpenAI model I used. But Astra keeps suggesting next steps for more turns. Sol strayed more often, but it couldn't get far, because it didn't plan as far ahead. When Astra strays, it can go further. It's often right, but not yet right enough that I'm comfortable saying yes without understanding what we're doing. That's why I think better suggestions make paying attention matter more, not less.

The detour wasn't a waste

It would be easy, and not honest, to call this wasted time.

The detour found real bugs. It cut file sizes a lot. It taught us what we can and can't promise. We kept our failed attempts along with the passing ones, so we know why the final version works the way it does. We're keeping all of it.

Many of those font problems probably would never have hit us. But I've learned not to trust "that will never happen." The moment I bet on it, it happens, usually within days.

Still, useful work already done doesn't justify the next step. Each step needs its own reason. And we didn't measure time or cost, so I can't tell you the exact moment the returns started to shrink.

What stays human

Deciding the purpose stays human. So does deciding what's "enough" for this stage of the work.

Some drift is the good kind. I approved the move to other languages, but I didn't ask for it. Not asking was my miss, and our shared memory caught it. Still, a requirement nobody wrote down is one nobody planned for or checked. Drift that follows your own stated values can be fine. Drift that just follows the last result needs a closer look.

In this case, Astra didn't flag the drift during the run. It named the drift only after I asked it, in a separate conversation in the same project, to look back and diagnose what happened. To its credit, once asked, it saw the drift clearly. That write-up became the starting point for this piece.

The agent has a job too. It should say when a feature has quietly turned into upkeep, explain what changed, and recommend what to do. At least one company that builds agents, Anthropic, recommends checkpoints where a person weighs in, and setting stopping points ahead of time.4

But the call is mine. "The agent kept suggesting things" isn't a reason. I said yes each time.

A short check before the next step

Before you approve the next step, ask:

  • What promise to users is at stake?
  • Is this a broken promise, or a new feature? A broken promise needs a fix, a different tool, or an honest change to what you support. A new feature needs its own reason.
  • Does it follow something we already said we care about, or only the last result?
  • Would I sign off on that right now?
  • What will the next step teach us, what will it cost to keep up, and what will it delay?

Two habits to try. Restate the original goal before you approve the next step. And partway through, not only at the end, ask your agent: "Are we still on the original goal? What are we serving now?" I haven't tested that second one yet, but it's what this experiment points to. And when an agent adds work you didn't ask for, ask it to say where that came from, so you can decide on purpose.

A proposed check to try partway through the work, not only at the end. This habit has not yet been tested in this experiment. Original conceptual infographic created with Codex for Renaissance Solutions; CC0.

And one rule I'm using now: keep the work that's done, and put the next odd problem on the list for later.

Here's where we stopped. Our PDFs still show black-and-white emoji. Skin tones survive when you copy the text out, but you can't see the colors. Page layout and accessibility are still open questions. We wrote down those limits and saved our work. If more strange emoji problems show up, they'll most likely wait. It's a good place to pause, not a finished product.

The sentence we finish together

Every next step can make sense, and you can still drift. Paying attention to the direction is the skill.

Before the next round, I want my agent and me to be able to finish this sentence together:

"We're continuing because this next step will help these users, or answer this question, and we'll know we have enough when…"

If we can finish it, the work has a purpose. When that purpose is met, stopping is part of doing the work well.


Footnotes

  1. OpenAI. "GPT-6 Astra." Sept 3, 2026. https://openai.com/index/gpt-6-astra/ ↩

  2. Brown, Jeremy. Email defining "yak shaving," MIT AI Lab, Feb 11, 2000. https://projects.csail.mit.edu/gsb/old-archive/gsb-archive/gsb2000-02-11.html ↩

  3. foliojs/pdfkit. Pull request #1690. Feb 22, 2026. Description: "PDFKit currently discards color emoji data during font subsetting." (open as of Oct 17, 2026). https://github.com/foliojs/pdfkit/pull/1690 ↩

  4. Anthropic. "Building Effective Agents." Dec 19, 2024. https://www.anthropic.com/engineering/building-effective-agents ↩