Your codebase is your agent’s context. When that codebase is full of deprecated APIs and outdated frameworks, agents reproduce them as fast as they write code. Patrick Vuong and Bryan Friedman show how agents paired with deterministic recipes and compiler-accurate code context can modernize code across an entire estate.
The challenge
Agents write code faster than ever, but a lot of developer tooling still assumes a single repository. The IDE opens one project, a pull request targets one repo, and CI runs one build. Scaling an agent across an estate means one session per repository, a screen full of terminals, costs that climb with every repo, and results that can differ from session to session.
Any estate-wide change has to establish where the code is affected and how to change each of those repositories when no two are alike. An agent working alone does both by reading files repo by repo. That costs time and tokens, and it still cannot guarantee the agent found every repository or changed each one the same way.
What we covered
Outdated in, outdated out. Agents copy the patterns they find, so a codebase full of deprecated APIs and old framework versions becomes the template for every new line an agent writes. Technical debt now accumulates faster than teams can pay it down. Modernization used to be justified by maintainability and developer productivity. Bryan argues it is now a measure of AI readiness, because a modern codebase is what lets agents write effective code.
Size the blast radius before changing anything. Every estate-wide change starts by finding the affected code. Patrick showed a Moderne Platform organization of about 1,600 repositories with heavy Spring usage. A Spring Boot 4.1 change campaign identified roughly 1,100 that needed the upgrade and kicked off a dry run against them. A security campaign across about 1,900 repositories showed the diff for each repo along with the reason for the change. An agent working alone gets the same answer by grepping, reading files, and following imports one repository at a time.
Recipes run the same way on every repository. OpenRewrite recipes are unit-tested programs that run against a Lossless Semantic Tree built for each repository. The LST is a compiler-accurate model of the code. It keeps the formatting an AST throws away and adds what neither text nor an AST has: types, dependencies, language version, and build tool. That is why one recipe produces the same result across repositories that are all structurally different. Patrick walked through the steps inside a Spring Boot migration recipe, the same sequence an agent would otherwise have to reconstruct correctly on every repository, every time.
Let the agent write and run the recipe. The agent selects an existing recipe or writes a new one, runs it across the estate, and verifies the result. Recipes give agents a clear target, a defined before and after backed by unit tests, which makes it harder for them to edit a failing test instead of the code. Edge cases found across many repositories feed back into the recipe. Recipes that have run against code from large financial institutions and digital natives like Uber are hardened enough that teams don’t have to review every change individually.
One prompt, many repositories. Bryan ran the Moderne CLI with an agent against an organization of five legacy Java repositories and asked it to upgrade them to Java 25. The agent found the Java 25 migration recipe, applied it on local branches, and pulled each repo’s verification commands from the LST, whether the project used Maven or Gradle. A test run exposed a case the recipe missed, and the agent fixed it with a second recipe that bumps a plugin version. It committed all five upgrades and confirmed that the remaining failing tests also failed on the original code. All of the edits were applied within about a minute and a half.
Give the agent context it doesn’t have to rebuild. Trigrep runs symbol-aware search against the indexed LST in a single call, replacing the grep-and-read loops agents fall into. Patrick revisited Log4Shell, where the slow part was finding affected code. He searched for logger usage across roughly 200,000 Maven packages in the Code Genome Project in 536 milliseconds. Prethink generates data tables on code smells, complexity, test coverage, and test gaps, shown across 138 repositories in the demo. Teams commit those tables to their repos, and some customers load them into a data warehouse. In one run, an agent cross-referenced complexity against test gaps on its own to find the riskiest code, which led the team to build that visualization.
Also covered
- Bring your own agent and your own goal. Bryan noted the workflow is not tied to one task or one stack. The same approach applies to securing repositories, running an impact analysis, or working in Python with Claude Code.
- How organizations scope the work. In the Moderne Platform, an organization is any set of repositories you define, grouped by business unit, application type, or however your teams divide the estate. Moderne’s public instance holds about 50,000 open source repositories.
- Where this is heading. The team is starting to explore multiple agents working through one deterministic layer. Each agent takes part of an estate, they share what they learn, and together they improve the recipes with every run.