🧬 The Result: Software That Can Evolve
Change becomes a revision — not a rewrite.
The purpose of the Averos architecture is not simply to generate an application once.
It is to establish a system in which an application can be described, validated, compared, planned, executed, and evolved repeatedly.
That makes the complete pipeline an evolution pipeline, not merely a generation pipeline.
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
A["`**Intent**`"]:::process
B[/"`**Manifest**`"/]:::artifact
C["`**Validate**`"]:::process
D["`**Semantic Diff**`"]:::process
E[/"`**Plan**`"/]:::artifact
F[["`**Execute**`"]]:::engine
G(["`**Application**`"]):::boundary
H["`**New Desired State**`"]:::success
A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
G -->|evolves| H
H -->|Next cycle| B
The important property is not that Averos can generate an application.
It is that the same application can become the input to the next controlled change.
The application therefore does not have to be treated as a disposable output of a generation process.
It becomes a system with a persistent, structured model that can be evolved over time.
From change request to application change
Consider a simple evolution:
Add
priorityto tasks.
The desired change is represented in the application manifest.
The Averos pipeline then determines how that desired state differs from the current application state and what must be done to realize the difference.
Conceptually:
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
A["`**Add priority to tasks**`"]:::process
B[/"`**Manifest revision**`"/]:::artifact
C["`**Validated desired state**`"]:::process
D["`**Semantic diff**`"]:::process
E[/"`**Execution plan**`"/]:::artifact
F[["`**Execution adapter**`"]]:::engine
G(["`**Updated application**`"]):::boundary
A --> B
B --> C
C --> D
D -->|Task.priority added| E
E -->|Add Task.priority| F
F --> G
The important point is that the system is reasoning about the application change, rather than treating the entire application as something that must be generated again.
A small semantic change can therefore produce a correspondingly small execution plan.
For example:
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
A(["`**Current application**`"]):::boundary
B[/"`**Manifest revision**`"/]:::artifact
C["`**Semantic Diff**`"]:::process
D["`**Task.priority added**`"]:::process
E["`**Required operation**`"]:::process
F[["`**Execution**`"]]:::engine
A --> C
B --> C
C --> D
D --> E
E --> F
This is the architectural consequence of having a structured application manifest, semantic diffing, dependency-aware orchestration, and controlled execution.
The objective is not to regenerate the application. It is to determine and apply the changes required to reach the desired state.
Evolution rather than regeneration
Traditional code generation is often naturally expressed as:
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
A[/"`**Input**`"/]:::artifact
B["`**Generate**`"]:::process
C(["`**Output**`"]):::boundary
A --> B
B --> C
Averos is designed around a different lifecycle:
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
A(["`**Current State**`"]):::boundary
B[/"`**Desired State**`"/]:::artifact
C["`**Semantic Difference**`"]:::process
D["`**Required Operations**`"]:::process
E[/"`**Execution Plan**`"/]:::artifact
F[["`**Controlled Execution**`"]]:::engine
G["`**New Application State**`"]:::success
A --> C
B --> C
C --> D
D --> E
E --> F
F --> G
The distinction is important.
The application is not merely the output of the previous run.
Its established state becomes the baseline for the next evolution.
This enables a repeated lifecycle:
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
subgraph IterationA ["Cycle 1: Initial Bootstrap"]
A[/"`**Desired State A**`"/]:::artifact
E1[["`**Execute**`"]]:::engine
S1["`**Application State A**`"]:::success
A --> E1
E1 --> S1
end
subgraph IterationB ["Cycle 2: First Evolution"]
B[/"`**Desired State B**`"/]:::artifact
D1["`**Semantic Diff**`"]:::process
E2[["`**Execute**`"]]:::engine
S2["`**Application State B**`"]:::success
S1 -->|Baseline| D1
B --> D1
D1 --> E2
E2 --> S2
end
subgraph IterationC ["Cycle 3: Continuous Evolution"]
C[/"`**Desired State C**`"/]:::artifact
D2["`**Semantic Diff**`"]:::process
Next(["`**...**`"]):::boundary
S2 -->|Baseline| D2
C --> D2
D2 --> Next
end
Each iteration can be reasoned about independently while remaining connected to the application’s persisted state.
This is what makes the model suitable for applications that are expected to change continuously rather than be generated once and discarded.
A governed evolution loop
The same architecture also provides a natural boundary for AI-driven development.
When an AI agent is involved, the agent does not need to operate directly on the application’s files.
Instead, it can participate in the same governed lifecycle:
%%{init: {"flowchart": {"subGraphTitleMargin": {"top": 10, "bottom": 15}}}}%%
flowchart TD
classDef ai fill:#ede7f6,stroke:#512da8,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef gate fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
subgraph Proposal["1. AI Proposal Domain"]
AI[["`**AI Agent**`"]]:::ai
M[/"`**Application Manifest**`"/]:::artifact
end
subgraph Verification["2. Engine Verification Domain"]
V["`**Validation**`"]:::process
D["`**Semantic Diff**`"]:::process
P[/"`**Execution Plan**`"/]:::artifact
end
subgraph Governance["3. Human Governance Domain"]
G{"`**Approval Gate**`"}:::gate
end
subgraph ExecutionDomain["4. Execution Domain"]
E[["`**Execute**`"]]:::engine
A(["`**Application State**`"]):::success
end
AI -->|Proposes intent| M
M --> V
V --> D
D --> P
P --> G
G -->|Approved| E
E --> A
The important distinction is between proposal and execution.
An AI agent can propose a change.
The Averos engine can validate the resulting manifest.
Orchestration can determine the semantic difference and construct the execution plan.
A human or governing process can inspect or approve that plan.
Only then does execution modify the application.
The agent proposes. The engine validates and plans. You control what executes.
MCP-driven evolution
When an AI agent interacts with Averos through @averos/mcp, this lifecycle can be exposed as an explicit sequence of governed tool calls.
Conceptually:
flowchart TD
classDef mcp fill:#ede7f6,stroke:#512da8,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef gate fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
subgraph ProposalPhase ["1. Proposal Phase"]
T1["`**update_ir**`"]:::mcp
end
subgraph ValidationPhase ["2. Verification Phase"]
T2["`**validate_ir**`"]:::mcp
T3["`**build_execution_plan**`"]:::mcp
end
subgraph GovernancePhase ["3. Governance Phase"]
T4{"`**approve_plan**`"}:::gate
end
subgraph ExecutionPhase ["4. Execution Phase"]
T5[["`**execute_plan**`"]]:::engine
App(["`**Updated Application**`"]):::success
end
T1 -->|propose manifest change| T2
T2 -->|validate desired state| T3
T3 -->|"compute semantic diff & resolve dependencies"| T4
T4 -->|execution gate passed| T5
T5 -->|apply approved operations| App
Each step has a distinct responsibility.
The agent is not silently editing arbitrary files and then asking whether the result looks correct.
Instead, the agent participates in the same structured lifecycle used by the rest of the system.
This makes the interaction observable, inspectable, and governable.
The exact authorization policy can vary by environment, but the architectural boundary remains the same:
proposal does not imply execution.
The application as an evolving system
This leads to a different way of thinking about generated software.
A generated application is often treated as a final artifact:
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef legacy fill:#ffebee,stroke:#c62828,stroke-width:2px,color:#1d1d1f,font-weight:bold
subgraph OneShot ["Traditional One-Shot Generation (Fragile)"]
A[/"`**Specification**`"/]:::artifact
B["`**Generator**`"]:::legacy
C(["`**Application**`"]):::process
D["`**Done**`"]:::boundary
A --> B
B --> C
C --> D
end
Averos treats the application as an evolving system:
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
subgraph EvolutionLoop ["Continuous Application Lifecycle"]
A[/"`**Desired Application State**`"/]:::artifact
V["`**Validate**`"]:::process
O[["`**Orchestrate**`"]]:::engine
E[["`**Execute**`"]]:::engine
S["`**Application State**`"]:::success
N[/"`**New Desired State**`"/]:::artifact
A --> V
V --> O
O --> E
E --> S
S -->|evolves| N
N -->|Feeds next iteration| V
end
The application can therefore be:
- described;
- validated;
- versioned;
- compared;
- planned;
- executed;
- inspected;
- changed;
- and evolved again.
That is the central consequence of the architecture.
Averos is not only a system for creating software. It is a system for managing the controlled evolution of software.
The result
The result is not simply a generated codebase.
It is a repeatable mechanism for moving an application from one well-defined state to another.
flowchart TD
classDef boundary fill:#1d1d1f,stroke:#1d1d1f,stroke-width:2px,color:#ffffff,font-weight:bold
classDef artifact fill:#ffffff,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef process fill:#f5f5f7,stroke:#86868b,stroke-width:1.5px,color:#1d1d1f
classDef engine fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#1d1d1f,font-weight:bold
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1d1d1f,font-weight:bold
subgraph CorePipeline ["State Transition Pipeline"]
M[/"`**Manifest**`"/]:::artifact
V["`**Valid State**`"]:::process
D["`**Semantic Difference**`"]:::process
P[/"`**Execution Plan**`"/]:::artifact
E[["`**Controlled Execution**`"]]:::engine
S["`**New Application State**`"]:::success
N(["`**Next Evolution**`"]):::boundary
M -->|1. Validation establishes admissibility| V
V -->|2. Orchestration determines transition| D
D -->|3. Resolves operations| P
P -->|4. Adapter executes with checkpoints & events| E
E -->|5. Persists baseline| S
S -->|6. Continuous loop| N
N -->|Feeds next manifest update| M
end
The manifest provides the durable representation of intent.
Validation establishes that the desired state is admissible.
Orchestration determines the transition.
Execution applies it through an adapter.
Checkpoints make execution recoverable.
Events make execution observable.
State persistence provides the baseline for the next change.
Together, these layers turn application generation into application evolution.
The goal is not to generate software once. The goal is to make software that can evolve.