Working Paper · September 2026

The Maintenance Machine

Self-improving software for small business
Abstract. Code generation is cheap. A small business can now have custom software that repairs and adapts itself from user feedback after initial delivery. The binding constraint is refusing changes: deciding which feedback carries authority, what evidence a change requires, who verifies it, and who pays to maintain it. We propose an architecture and a small first implementation designed to test the economics before anyone builds a platform.

1The problem

Small businesses run software built for someone else. A dispatcher sorts her job queue by hand every morning because her shop's workflow will never make the vendor's roadmap. Generative tooling can close this gap: capture what the software does wrong for her, change it, deploy the change.

The risk: when a change costs nothing to produce, an agent rewarded for shipping will ship. Twenty accepted changes later, the dispatcher has software nobody understands. The system must prove it knows when not to change things. Judgment is the product.

2Three lanes of change

"Self-improving" covers three different promises. Each change must name its lane before code generation starts.

The triager writes a falsifiable problem statement before any builder sees the request. Without this step, feature requests get processed as defects. "No change needed" and "use the existing setting" count as successful resolutions and get recorded like deployments.

3Evidence standards

Complaint counts are a bad input. Three complaints may be one incident repeated in a group chat. The employee who runs the workflow three hundred times a week may never complain. Each request needs an evidence record: who hit the problem, in what role, on which version, how often the opportunity occurs, and who holds authority over the behavior.

Post-deployment, silence proves nothing. Complaints also stop when users abandon the flow or rebuild the workaround in a spreadsheet. Sample sizes make this worse. If a bug hits 10% of attempts, ten clean attempts after a fix still leave a 35% chance the bug remains.

Track three claims separately: the recorded failure passes replay; the change ran safely in observed cases; business outcomes improved. The first two never imply the third. Each claim can sit at Unknown indefinitely. For most small deployments the honest result is "preference implemented and exercised" with the outcome claim left at Unknown.

4Verification structure

A constraints file the agent can read is not a constraint. The agent can change a caller's assumptions and leave the protected module untouched, or change the code and its test together. Independence must be structural.

Deployment rules: the complaining user is a reproduction partner, not a canary. She may be the only payroll operator. Canary units follow state boundaries: a draft, a job, a tenant. Code rollback does not undo an email or a duplicate purchase order, so activation requires a recovery plan covering persisted state and external effects. No plan, no autonomous activation.

5The economics of restraint

A weekly change quota fails. Agents fill unused slots, bundle features to evade counting, and resubmit rejected work next Monday. Rationing delays overbuild without discouraging it.

A maintenance ledger changes the incentive. Each accepted customization consumes the customer's support capacity until retired or absorbed into shared behavior. Capacity does not reset. Proposals state benefit, verification cost, new supported states, and upgrade obligations as ranges. Retiring a redundant customization releases capacity. Shrinking a diff earns nothing.

The customer sees the ledger in a weekly digest: what users reported, what changed, what it cost, what was declined and why, what remains Unknown. Do not score the digest on refusals. Rejection counts are as gameable as deployment counts. Traceability earns trust, including the line "resolved with an existing setting."

6Own the fork, maintain the manifest

A thousand diverging codebases is a known failure mode. The underlying problem is obligations, not version control. A thousand forks are survivable. A thousand open-ended upgrade promises are not. Split the artifact along the promise:

A customer who diverges past the manifest keeps full ownership. Autonomous maintenance pauses at the boundary with an explicit notice. Re-entry requires fresh compatibility evidence, not a manifest edited to match whatever exists. Ownership and serviceability become separate promises, which removes the unfunded support guarantee that sinks most "own your software" offers. A bespoke fork stays available, with its future verification costs priced at admission.

7Minimum viable implementation

The anti-overbuild system must not itself be overbuilt. Build two things before serving any customer:

Ledger, evidence records, and manifest tooling start as fixed-field prose inside the change records: identities, denominators, minutes spent, reuse disposition. Customer two cannot reconstruct these from customer one's summary, so capture them at the time of work. Convert prose to software only when a second customer demonstrates repetition.

Customer one is a test, not a demo. Serve one real preference, then measure what was reusable for customer two. If each small variation requires full bespoke verification, the cheap-maintenance premise fails for that surface. Learning this costs weeks, not a platform.

8Open question

One question survived the full dialogue: the price of assurance. Every mechanism above adds verification, observation, recovery planning, and carried obligations to the cost of a change. Nobody knows whether the total fits an SMB monthly price. The first implementation exists to produce that number.

Our expectation: the number works for narrow surfaces first. Presentation, ordering, notification, routing. A system that demonstrates restraint on small promises is the only kind that should be trusted with large ones.