# The Agent Harness Ate My Workflow
> A year ago I kept a 6,000-line migration coherent with a hand-maintained progress file. Most of that scaffolding now ships inside the agent CLIs. Here is what the harness absorbed, and the part it still cannot.
Published: 2026-07-21
Tags: Agents, Developer Tools
Canonical: https://alexmlewis.com/writing/the-agent-harness-ate-my-workflow
---
A year ago I wrote about
[keeping a 6,000-line Python-to-TypeScript migration coherent](/writing/staying-sane-on-a-6-000-line-refactor-with-claude-code)
with a markdown file. The pattern was simple: I owned the plan, the model executed small steps
against it, and the current state lived in a `ConversionProgress.md` I re-injected at the start of
every session. It worked. I finished the migration over a weekend without the drift and rework that
had killed earlier attempts.

Most of that scaffolding is now a product feature.

I want to be precise about the timeline, because it's humbling. Some of what I was maintaining by
hand already existed when I published. Claude Code had `CLAUDE.md` auto-loading and session resume
before my post went up, and I was mostly working around features I hadn't adopted. The rest arrived
within months: hooks in July 2025, custom subagents that same summer, checkpoints and rewind in the
2.0 release that September. The loop I described as "checkpointed execution" is literally a slash
command now. I predicted my scaffolding was the durable part, and it lasted about a quarter.

I also wasn't the only one who landed on the pattern. Progress files, todo.md loops, plan
recitation. Half the industry converged on some version of external state for agents around the
same time, which is exactly why the harness vendors built it in. That's not a knock on the pattern.
Convergent workarounds are how missing product features get discovered.

## What the harness absorbed

The mapping from my hand-rolled 2025 workflow to today's built-ins:

- **The progress file itself** → persistent task lists. The agent tracks its own plan, the tasks
  survive a crash, and a resumed session picks them back up.
- **Re-injecting the plan every session** → auto-compaction and session resume. Both existed in
  mid-2025 and both got dramatically better. Compaction is near-instant now and resume actually
  restores working state instead of a lossy transcript.
- **"Don't mark it done until tests pass"** → hooks. You can wire a check that blocks the agent
  from declaring completion until the test suite is green. My checkpoint discipline, enforced by
  the tool instead of by me remembering.
- **Small steps to limit blast radius** → checkpoints and rewind. A bad step is an undo away
  instead of a git archaeology session.
- **Manual context injection** → project memory as a cross-tool convention. `CLAUDE.md`,
  `AGENTS.md`, auto-memory directories. Every serious agent CLI now loads project context without
  being asked.

This is real progress and I'm glad the manual versions are dead. Nobody should be pasting a
markdown file into a prompt in 2026.

## What didn't transfer

Everything the harness absorbed was state: where the plan lives, what's done, what's next. What it
didn't absorb is ownership of "done."

Hooks are the sharpest way to see the boundary. A hook that blocks completion until tests pass is a
verification gate shipped as a feature, and that much genuinely transferred. But the hook runs
whatever check you gave it. I've had an agent mark a task complete with a green suite because the
tests it wrote exercised the wrong behavior: the gate fired, the gate passed, and the gate was
checking the wrong thing. The harness can enforce your definition of done. It cannot supply one.

An agent grading its own step-completion is an unchecked judge. That's the same problem I wrote
about in [ground-truthing LLM judges](/writing/ground-truthing-llm-judges) - a plausible-looking
verdict from a model with the same blind spots that produced the work. The fix is the same too:
the standard of "done" has to come from outside the loop that's being graded.

There's a quieter version of this that took me longer to notice. The hand-maintained file had a
side effect I didn't value at the time: I *read* it. Every session started with me re-reading the
plan, which meant I re-anchored to the goal as often as the model did. Built-in task lists and
compaction summaries are state the human rarely looks at. The state management got better and my
visibility into it got worse. Drift didn't disappear, it just stopped being something I'd
naturally catch. A compacted plan is the model's summary of the plan, and intent is exactly the
kind of detail summaries drop. I now keep one human-owned document per long-running project anyway. The
agent doesn't need it. I do.

## The steelman

The obvious pushback: plenty of people run agents overnight on a one-paragraph prompt and wake up
to working code. No decomposition, no progress artifact, fine results. Maybe judgment is getting
commoditized too, just a release or two behind state.

I think the honest answer is that it works when "done" is machine-checkable. Ports, migrations,
making a red suite green, upgrading a dependency: the verification is crisp, so the agent can
self-serve its own feedback and the human plan adds little. Where I still see long runs go sideways
is work with a fuzzy definition of done: the agent produces something plausible, every local check
passes, and it's two days before anyone notices it solved an adjacent problem. So the real frontier
is the set of work where done is checkable, and expanding that set is an eval problem, which makes
it our problem more than the model's.

## The takeaway

I was wrong once already about where the human/harness boundary sits, so treat this as a position
I'll keep updating. But a year of running these tools daily has moved my confidence in one direction:
the harnesses commoditized state management, and they haven't touched accountability. Somebody
still decides what the gates check, owns the decomposition that makes "done" checkable, and reads
the plan often enough to notice drift. Today that somebody is you.