A confound in measuring AI code degradation, and why we deleted every test to fix it. We have been running a long experiment. Take one feature backlog. It is sixty small, ordered changes to a PetClinic REST service. Have an AI agent implement them one checkpoint at a time. Do it into two different codebases. One arm is built the conventional Spring way, with controllers and services. The other is…
Early notes from an experiment that holds the AI fixed and lets the architecture vary. One run each so far. These are my interpretations, not settled results. I have been running an experiment I call PetClinic-Evolve . The idea is simple. Hold the AI coding agent fixed. Make the software architecture the thing that changes. The agent evolves the same application across about sixty accumulating…
I gave a coding agent one task and one directory. It went looking across the whole machine. In doing so it showed me the best thing about how these agents work. It also showed me the most dangerous thing. I run an experiment called PetClinic-Evolve . It holds the AI coding agent fixed . It makes software architecture the thing that varies. It evolves the same application by the different…
The redesigned PetClinic-Evolve experiment has produced its first complete run of each architecture. It is one chain per arm, so it is a first look and not the final verdict. But it already moves the measure that stayed flat for the whole first experiment, and it moves it in the direction the thesis predicts. The setup, in one paragraph Hold the coding agent fixed. Vary the architecture. One agent…
This is a between experiments post. The first PetClinic-Evolve run gave a clear answer on some measures and a flat non answer on others. The flat parts turned out to be the interesting ones. Here is why they came out flat, and how the next experiment is built to force the question. The question PetClinic-Evolve keeps the coding agent fixed and makes the architecture the thing we vary. A Spring…
Methods companion · Measurement reference Spring OfficeFloor Measuring AI-driven code degradation A companion to the results paper. Every metric in the PetClinic-Evolve harness, defined precisely. What it computes, where the number comes from, and what it reads high on. Author Daniel Sagenschneider Draft August 2026 Harness PetClinic-Evolve Companion to "Architecture as the independent variable" 1…
Preprint · Empirical software engineering Spring @RestController OfficeFloor functions Architecture as the independent variable Hold the AI coding agent fixed for 400 sessions. Vary only the architecture it works in. Does the codebase degrade because of the agent? Or because of the shape it is asked to grow? Author Daniel Sagenschneider Draft August 2026 Harness PetClinic-Evolve Agent…
Provisional. These are early numbers from a run in progress. Two Spring chains and one OfficeFloor chain are complete, and a second OfficeFloor chain is still going. Every figure below will be refreshed once more runs land, and the values are likely to move. Read the direction of the findings, not the exact numbers. This is a progress report. It shares early data from a longer running experiment.…
I took the Spring PetClinic REST reference application and built it two ways. One uses conventional Spring @RestController methods. The other uses OfficeFloor endpoints declared in YAML as composed functions. Then I pointed the same AI agent at both. Each got an identical set of eleven prompts. The question is simple. Does declaring endpoints as a wiring of small, named functions give an AI coding…
Last month I wrote about moving OfficeFloor v4 from one graphical file to YAML per endpoint . Spring PetClinic REST was the worked example. The configuration story was right. The code story was not. That conversion gave each endpoint its own YAML file. But behind most of those files sat a single function. It did everything the old controller method did. Validate. Look up. Mutate. Save. Respond. I…
Ask someone who does not write software to describe what happens when they edit an article and press save. You will get something like: find the article change the title tell me it worked Steps each finishing before the next begins. Now open the code that does it: A controller receives a request DTO, validates it, and calls down A service asks a repository for the article, mutates it, saves it,…
In my last post I asked whether AI would keep us stuck in 2020 architectures. I argued that the model has no opinion about which architecture is better. What it has is a confidence gradient, shaped entirely by how well-specified each option is, and so the fix is to make new patterns legible: document them thoroughly enough that an assistant can follow them even though it has never seen ten…
Every time I sit down with an AI coding assistant, I notice the same thing: it is very good at Spring. Annotations, profiles, @Autowired , the whole call-stack-driven dance of beans wiring into beans. AI has seen twenty years of this. It guesses well, even when it has to infer how a profile-specific bean is going to be selected at runtime. This is because it has seen ten thousand examples of…
OfficeFloor has always been about Inversion of Coupling Control : not just injecting objects, but injecting the functions and threading too. For a long time, the way you expressed that wiring was graphical, a single configuration file with boxes and lines showing how your functions connected together. It looked great in a demo. It did not survive contact with a team. The problem with one big…
OfficeFloor is turning it's attention to improving performance now that it's underlying concepts have been defined. OfficeFloor primarily is Inversion of Coupling Control to avoid the OO Matrix . This goes beyond dependency injection to include function/continuation injection and thread injection . In our writings, we've come to understand the fundamental model . However, while some frameworks…
This was a submission to DZone's Computer Science Fare: https://dzone.com/articles/officefloor-going-beyond-dependency-injection So why another Dependency Injection (DI) framework? Because Dependency Injection is only part of the Inversion of (Coupling) Control problem. OfficeFloor provides the complete injection solution. Dependency Injection Problem Dependency Injection on it's own can actually…
This series of articles looks at migrating Spring applications to OfficeFloor. Why? So the first question comes up. Why migrate Spring applications to OfficeFloor ? Spring provides dependency injection to create a graph of objects. Spring, however, provides little management over threading and attempts to model behaviour through object composition. This is where OfficeFloor in it's Inversion of…
This is the final article in the series on looking at Inversion of Coupling Control (IoCC) composition. The previous articles covered: First-Class Procedure type system First-Class Module Code examples This article looks at providing a mathematical model to explain the composition. Just a little disclaimer that I'm not a mathematics boffin. I've a degree in computer science but it did not cover…
This is the third in a series of articles looking at the type system for Inversion of Coupling Control to provide composition. The previous articles covered: First-Class Procedure type system First-Class Module This article will look at taking the theory into practice. It will use the concepts to build an application composing Effects from various Effect libraries. Note that the Effects used is…
This is the second in a series looking at the Inversion of Coupling Control type system for composition. This article discusses a more general Module type system than the previous article's First-Class Procedure Type. Note: some functional programming languages also attempt to define First-Class Modules. The First-Class Modules defined in this article are created from inverted functions .…
This is the first article in a series looking at the Inversion of Coupling Control type system for composition. The series will demonstrate how the resulting type system allows for easy composition. This avoids much of the complexity of Functional / Object-Oriented composition. The resulting type system and it's resulting composition is simple enough even for junior developers to comprehend. This…
OfficeFloor is now available to develop within IntelliJ. While the plugin was originally developed for Eclipse, we have now isolated the functionality into IDE agnostic bundle. This means with a bridging implementation, it is possible to port the OfficeFloor plugin to other IDEs. However, for now we are content with Eclipse and IntelliJ for OfficeFloor development. Though if you would like to see…
Functional programming can be perceived as "hard". Yes, spend time with it and it gets simpler and the benefits make your code definitely better. However, when type errors can start spanning multiple lines, it does suggest the abstract concepts may be "hard" to see clearly. We really need to make it easier for junior developers to assist in functional programming of larger systems. Now as…
Morpheus : I've seen an agent punch holes in designs with only a single dependency. Developers have fought against them with APIs that resulted in nothing but limitations. Yet their strength and their speed are still based in a world that is built on coupling. Because of that, they will never be able to write as simple or as fast code as you can. Neo : What are you trying to tell me, that I can…