JOURNAL / SOFTWARE ENGINEERING

Code should survive
the next change.

A patch can pass its tests and still make the next change harder. To understand AI-assisted engineering, evaluate the code that accumulates across iterations—not only the first working result.

Hands typing on a laptop displaying programming code, viewed from above.CODE / MAINTENANCE / SYMPLOKA
A PASSING TEST IS ONE CHECKPOINT

The next requirement inherits today’s design.

Software grows through changes. Every useful patch should leave the next decision easier to understand, test, and make.

01 / CORRECTNESS IS A CHECKPOINT

Tests show what passed under the cases they cover.

A passing suite is useful evidence: the current change satisfied a defined set of checks. It cannot show that the checks cover every important behavior, or that the design will adapt cleanly when the requirements change.

A patch can keep today’s outputs correct while adding duplicated branches, concentrating decisions in one difficult function, or making a later feature depend on a fragile special case. Those are maintenance questions. They need their own review.

That is why reviewing the actual diff ↗ and testing an agent against real tasks ↗ answer different questions—and both matter.

02 / EVALUATE THE NEXT CHANGE

Let the code carry its own history forward.

Many coding benchmarks ask an agent to solve a task against one fixed specification. This measures an important capability, but it does not directly test what happens when the same implementation must absorb a new requirement.

SlopCodeBench ↗ takes an iterative approach: an agent builds a solution, then receives later requirements and extends its own earlier work. The public v1.0 page lists 36 problems and 196 checkpoints. Its black-box tasks leave architecture decisions to the agent, then measure correctness alongside code-quality signals.

The benchmark asks a sharper question than “did the code pass?”: can the implementation keep working as the problem grows, and what structural shape does it take along the way?

It is still a controlled task suite, not a study of every production team. Read its results as evidence about a defined failure mode, and test whether that failure appears in your own repository and workflow.

For a complementary view of repairing existing repositories against reported issues, see the original SWE-bench paper ↗. The benchmarks examine different tasks; neither score should be treated as a universal rating of an agent.

03 / READ QUALITY METRICS CAREFULLY

Use each signal for the behavior it can actually see.

CorrectnessDid the requested behavior work, and did prior behavior keep passing?
Structural erosionDoes complexity collect in a few already-difficult functions instead of staying understandable across the codebase?
VerbosityDid repeated or unnecessary code expand the implementation without adding useful behavior?
Review effortCould another engineer follow the change and reproduce the checks without reconstructing the agent’s assumptions?

These are signals, not a substitute for engineering judgment. A low complexity score does not prove a design is right. A longer implementation may be warranted when it makes behavior safer or clearer. Ask what the code does, what future change it serves, and whether the evidence supports that choice.

Benchmarks also have versions, task selection, harnesses, and test design. Compare like with like: record the agent, harness, prompt, environment, task-set release, and scoring rule alongside a result. The benchmark’s open-source runner and documentation ↗ explain how its tasks and metrics are constructed.

04 / REVIEW THE TRAJECTORY

Inspect what repeated work is doing to the project.

  1. Keep the starting point. Record the repository revision, requirement, and baseline checks before the agent edits.
  2. Make the change legible. Ask for a bounded patch, a short plan for broad work, and a report of files, tests, and unresolved assumptions.
  3. Verify behavior. Run focused tests and the project checks that matter; add regression cases for behavior that must stay intact.
  4. Read the diff. Look for unrelated edits, duplicated logic, widened permissions, generated artifacts, and changes whose purpose is unclear.
  5. Revisit after the next requirement. Check whether the design still supports new behavior or whether each addition requires another workaround.

Automated execution also needs an appropriate boundary. OpenAI’s description of running coding agents at work distinguishes sandbox limits from approval rules and calls out action logs as part of understanding what happened. The exact controls depend on the tool and environment; the principle is to grant only the access the task needs and keep consequential actions visible.

OpenAI: running Codex safely ↗
05 / TRACK THE COST THAT MATTERS

Measure accepted work, not generated volume.

Track how often the change meets its acceptance criteria, how much human review and repair it takes, whether regressions recur, and whether the next extension stays straightforward. Keep model and harness costs alongside that record. A quick first patch can become expensive if each follow-up needs more context, more repair, or a larger review.

These observations do not need to become another leaderboard. A small, repeatable record of real tasks can reveal whether an agent fits a project’s codebase and standards better than a score from a different environment.

For the wider system costs around computation, memory, infrastructure, and people’s time, read the cost of intelligence ↗.

RESEARCH & PRIMARY MATERIALOrlanski et al., SlopCodeBench: Benchmarking How Coding Agents Degrade Over Long-Horizon Iterative Tasks ↗SlopCodeBench v1.0: current task-set overview and results ↗SlopCodeBench source code and evaluation documentation ↗Jimenez et al., SWE-bench: Can Language Models Resolve Real-World GitHub Issues? ↗OpenAI, Running Codex safely at OpenAI ↗