Buy vs. build: The stack behind a fleet-wide code maintenance platform
Alex Bit
Most enterprise software maintenance is categorized by why the work matters: security, compliance, modernization, reliability, performance, developer velocity.
That is a useful taxonomy for leadership. It is the wrong one for the people who have to do the work.
A React migration can be security, lifecycle, performance, and developer velocity at the same time. Replacing an abandoned dependency can improve security, bundle size, reliability, and maintainability together. The driver says why a change matters. It says almost nothing about the machinery required to find, change, verify, and roll that change out.
For platform teams responsible for thousands of repositories, those are two different lenses: drivers for prioritization, and categories for execution.
The type of change determines the machinery, even when one opportunity serves several goals.
The work itself falls into seven categories:
SEVEN CATEGORIES
01
Dependencies
Third-party libraries, frameworks, and SDKs
React 18 → 19 / patch a CVE / replace an abandoned package
02
Runtimes & Toolchains
What builds and runs the code
Node 18 → 24 / Java 8 → 21 / webpack → Vite
03
Infrastructure & Delivery
Where software runs and how it ships
Kubernetes APIs / Terraform providers / Docker images, CI
04
Code Health
Quality and maintainability inside application code
Dead code / stale flags / floating promises / CommonJS → ESM
05
Architecture & Internal Platforms
Cross-module structure and internal platform adoption
Design systems / internal SDK migrations / module boundaries
06
Tests & Operability
The systems that verify and explain production software
CODEOWNERS / branch protection / signing / stale repos
These categories are operationally distinct in a way the drivers are not. Dependency maintenance needs package metadata, lockfiles, vulnerability feeds, and API migrations. Infrastructure maintenance needs YAML, HCL, containers, cloud resources, and deployment validation. Architecture work needs a model of symbols, modules, services, repositories, and teams.
The same maintenance opportunity can serve several business goals, but the machinery required to execute it is mostly determined by the type of change.
Every category needs the same stack, and at fleet scale the hard parts are prioritization and coordination.
Across those categories, the projects we see keep depending on the same building blocks.
Understand the fleet: inventory and ownership, parsing, a code graph, knowledge feeds, and runtime signals. Decide what matters: detection and prioritization. Act on it: transformation, verification, and orchestration.
EXECUTION
Whoever does the work
Humans
Cursor
Claude Code
Codex
Devin
Any agent
MAINTENANCE LAYER
Shared context and guardrails for every agent
03
Actsafely
Transformation
Make the change, via codemods or agents
Verification
Establish confidence that the change is correct
Orchestration
Batch, sequence and roll out across repos and teams
02
Decidewhat matters
Detection
Turn raw understanding into concrete maintenance opportunities
Repositories, service catalog, scanners, CI, observability, work tracking
Finding 50,000 issues is not useful if a platform team still has to decide by hand what deserves attention.
Changing one repository is a coding problem. Changing 2,000 repositories owned by 150 teams is a distributed systems and organizational coordination problem.
The missing infrastructure marries a cross-language, dependency-aware code graph with the systems of record you already have.
Building a maintenance platform does not mean rebuilding every piece of this stack.
Most large organizations already have systems of record for ownership, vulnerabilities, observability, CI, and work tracking. Those systems should stay.
The missing piece is the layer that connects them.
A scanner can find a vulnerable dependency. That finding does not say whether the vulnerable API is reachable, who owns the affected repositories, what a safe upgrade looks like, or how the change should roll out. Remediation needs context, a transformation, verification, ownership, and orchestration.
EXAMPLE: A VULNERABLE DEPENDENCY
From finding to fleet-wide resolution
SCANNER
01Scanner finds CVE
EXISTING TOOLDetection
MAINTENANCE CONTROL PLANE: DETECTION TO RESOLUTION
02Determine reachability
PRIMITIVECode graph
03Find affected repos
PRIMITIVEInventory + Parsing
04Map ownership
PRIMITIVEInventory & ownership
05Determine target version
PRIMITIVEKnowledge feeds
06Generate code changes
PRIMITIVETransformation
07Verify
PRIMITIVEVerification
08Roll out
PRIMITIVEOrchestration
09Track completion
PRIMITIVEOrchestration
EXAMPLE: A VULNERABLE DEPENDENCY
From finding to fleet-wide resolution
SCANNER
01Scanner finds CVE
EXISTING TOOLDetection
MAINTENANCE CONTROL PLANE: DETECTION TO RESOLUTION
02Determine reachability
PRIMITIVECode graph
03Find affected repos
PRIMITIVEInventory + Parsing
04Map ownership
PRIMITIVEInventory & ownership
05Determine target version
PRIMITIVEKnowledge feeds
06Generate code changes
PRIMITIVETransformation
07Verify
PRIMITIVEVerification
08Roll out
PRIMITIVEOrchestration
09Track completion
PRIMITIVEOrchestration
Categories require different machinery. That machinery converges on the same primitives. The sources of truth already exist. The missing abstraction is a maintenance control plane: shared context and orchestration across the scanners, CI systems, catalogs, and agents an organization already runs.
Each class of maintenance reaches its own level of autonomy, and mixed levels are healthy.
Autonomy is not one organization-wide slider. It is a matrix across classes of maintenance.
A patch upgrade of a well-understood package is a different problem from a framework major version. Removing a stale feature flag is a different problem from decomposing a monolith.
AUTONOMY
L0
We don't detect the opportunity
L1
We can observe it
L2
The system knows this matters
L3
The system has a reliable remediation plan
L4
The system executes the remediation
L5
The system verifies and merges it
AUTONOMY
L0
We don't detect the opportunity
L1
We can observe it
L2
The system knows this matters
L3
The system has a reliable remediation plan
L4
The system executes the remediation
L5
The system verifies and merges it
At L5, that class of maintenance has effectively become invisible.
An organization might be L5 for patch dependency upgrades, L4 for feature-flag cleanup, L3 for major framework migrations, and L2 for architectural modernization. That is not a failure of autonomy. It is what a healthy system looks like.
EXAMPLE: ONE ORGANIZATION’S AUTONOMY LEVELS
Autonomy is a matrix, not a slider
CATEGORY
L0
Not detected
L1
Observe
L2
Prioritize
L3
Know the fix
L4
Produce the change
L5
Auto-merge
Dependencies
L5
Runtimes & Toolchains
L3
Infrastructure & Delivery
L3
Code Health
L4
Architecture & Internal Platforms
L2
Tests & Operability
L1
Repo & Access Posture
L4
L0We don’t detect the opportunity
L1We can observe it
L2The system knows this matters
L3The system has a reliable remediation plan
L4The system executes the remediation
L5The system verifies and merges it
DependenciesL5
Runtimes & ToolchainsL3
Infrastructure & DeliveryL3
Code HealthL4
Architecture & Internal PlatformsL2
Tests & OperabilityL1
Repo & Access PostureL4
Each class of change earns autonomy on its own schedule.
EXAMPLE: ONE ORGANIZATION’S AUTONOMY LEVELS
Autonomy is a matrix, not a slider
CATEGORY
L0
Not detected
L1
Observe
L2
Prioritize
L3
Know the fix
L4
Produce the change
L5
Auto-merge
Dependencies
L5
Runtimes & Toolchains
L3
Infrastructure & Delivery
L3
Code Health
L4
Architecture & Internal Platforms
L2
Tests & Operability
L1
Repo & Access Posture
L4
L0We don’t detect the opportunity
L1We can observe it
L2The system knows this matters
L3The system has a reliable remediation plan
L4The system executes the remediation
L5The system verifies and merges it
DependenciesL5
Runtimes & ToolchainsL3
Infrastructure & DeliveryL3
Code HealthL4
Architecture & Internal PlatformsL2
Tests & OperabilityL1
Repo & Access PostureL4
Each class of change earns autonomy on its own schedule.
Maintenance runs continuously, and people spend their time on the exceptions.
If these pieces work, the experience becomes much simpler than the infrastructure underneath it.
That last stage is what we mean by making maintenance invisible.
Not that maintenance stops. It happens continuously, and people spend their time on the exceptions.
Dependencies remain current. Deprecated APIs disappear before deadlines. Internal platforms get adopted. Known anti-patterns stop spreading. Security findings get remediated. Repositories stay inside organizational standards.
The engineering organization stops needing large periodic cleanup programs to make those things happen.
MAKING MAINTENANCE INVISIBLE
Connect → See → Prioritize → Automate → Forget
01Connect
Code
Service catalog
Scanners
CI
Observability
Work tracking
Code plus the systems you already use as sources of truth.
02See
currentbehindat risk
A fleet-level map of where every team is behind.
03Prioritize
#1Reachable CVE in a shared library
#2Runtime nearing end of life
#3Deprecated cloud API
#4Stale feature flags
Ranked by urgency, blast radius, effort and ownership.
04Automate
POLICY
Patch upgradesauto-merge
Flag cleanupPR
Framework majorscampaign
Architecturehuman-led
Policies decide what merges, what becomes a PR, and what stays human-led.
05Forget
Patch upgrade · 312 reposmerged
GitHub Actions pinnedmerged
Stale flags removedmerged
Deprecated API replacedmerged
CODEOWNERS updatedmerged
1 exception → ownerreview
Routine changes flow quietly. Humans handle the exceptions.
MAKING MAINTENANCE INVISIBLE
Connect → See → Prioritize → Automate → Forget
01Connect
Code
Service catalog
Scanners
CI
Observability
Work tracking
Code plus the systems you already use as sources of truth.
02See
currentbehindat risk
A fleet-level map of where every team is behind.
03Prioritize
#1Reachable CVE in a shared library
#2Runtime nearing end of life
#3Deprecated cloud API
#4Stale feature flags
Ranked by urgency, blast radius, effort and ownership.
04Automate
POLICY
Patch upgradesauto-merge
Flag cleanupPR
Framework majorscampaign
Architecturehuman-led
Policies decide what merges, what becomes a PR, and what stays human-led.
05Forget
Patch upgrade · 312 reposmerged
GitHub Actions pinnedmerged
Stale flags removedmerged
Deprecated API replacedmerged
CODEOWNERS updatedmerged
1 exception → ownerreview
Routine changes flow quietly. Humans handle the exceptions.
Codemod is the agent-agnostic control plane that makes maintenance a continuous infrastructure function.
This framework is also how we are building Codemod.
Grep and Insights understand the fleet. Campaigns and Automations carry out the change. Codemod Agent and MCP are the interfaces for doing that work, whether the actor is a person or another agent. Integrations keep the existing sources of truth in place. Parsing, the code graph, and the transformation engine are the core underneath.
Enterprise maintenance infrastructure is not a codemod runner. It is not a scanner. It is not an agent connected to GitHub. And it is not a dashboard full of technical debt.
Software maintenance becomes a continuous infrastructure function rather than a recurring engineering project. Codemod's role is the agent-agnostic control plane that makes that possible.