What if memory was not something added beside the system, but something created by the system’s own path of action?
I keep coming back to the idea that AI memory may be framed in the wrong place. Most systems treat memory as something adjacent to the model: a vector store, a conversation history, a document index, a saved fact, a larger context window. Those things can be useful, but they are not quite the same as experience.
Experience is not just information that was stored. Experience is information that has been tested by action. A system tries something, follows a path, reaches a result, and that result is accepted, rejected, corrected, repeated, avoided, reinforced or made more precise. Over time, the useful parts of that path become more stable. The weak parts become visible. The repeated corrections become pressure for the structure to change.
This is the thesis I want to explore: memory should not live only in a storage layer beside the runtime. In a more useful AI system, memory should also live in the action chain itself. The path a request takes through the system, the nodes it touches, the contracts it satisfies, the uncertainty it exposes, and the traces it leaves behind become part of the system’s intelligence.
The filesystem as a logic tree
One possible way to think about this is through the filesystem. Not as a proposed standard, and not because folders are magical, but because a filesystem already gives us a visible topology. It has a root. It has branches. It has local boundaries. It has containment. It has a physical structure that can be inspected.
In this architecture, the filesystem tree becomes more than storage. It becomes a logic tree. The root is the main harness that controls the flow of state through the system. It owns routing, contracts, snapshots, telemetry, versioning, update gates and recovery paths. Below it, each folder becomes a bounded node responsible for a specific kind of transformation.
A node is not a general-purpose agent. It is a narrow functional unit. It receives a specific input state, transforms what it can meaningfully process, and returns a specific output state. The deeper a request travels through the tree, the more specialised the handling becomes. At the top, the runtime may only know the broad shape of the request. As the packet moves through branches, each layer resolves more of the state.
The intelligence is not located in one place. It is distributed across the path. That path, repeated over time, becomes practical memory.
A packet moving through bounded nodes
The unit of work in this architecture is a flat state packet. The packet does not need to be clever. It needs to be explicit. It carries the task, the current payload, the context available at that point, any evidence attached to the state, the current confidence, the current status, and the trace of what has happened so far.
Each node receives the packet through an explicit contract. It should not reach freely into distant folders or silently import logic from unrelated parts of the tree. Hidden coupling makes the apparent structure misleading. Communication should happen through the runtime, through an API or message-bus style contract. A node should know what it is allowed to receive, what it is allowed to emit, and what transformation it is responsible for.
That restriction is important because it makes experience traceable. If a packet passes through several nodes and the output fails, the system can inspect the path. It can see where confidence dropped, where the contract was stretched, where an oracle was called, where a fallback was used, where the packet changed shape, and where a later correction attached to the result. Without that structure, memory becomes vague. With that structure, memory becomes causal.
Experience as reverse propagation
There is a kind of backpropagation in this idea, but not in the strict neural-network sense. No mathematical gradient is being pushed through model weights after every request. The more useful comparison is reverse propagation of experience through the execution tree.
A packet travels forward through the runtime and reaches a result. That result produces evidence about the path that created it. If the result was strong, the path gains confidence. If the result failed, the weak part of the path becomes visible. If a correction was made, that correction can be attached to the node, contract, context, oracle call or transformation that likely caused the issue.
Over time, the system begins to build a history of its own behaviour. It learns which paths are reliable for which input states. It learns which nodes are too broad. It learns which constants are weak. It learns where deterministic code is missing. It learns where a small oracle is being asked too much. It learns where the shape of the contract is wrong.
This is the main memory mechanism. The memory is not simply “this fact was stored before”. The memory is “this kind of state moved through this path, failed at this point, was corrected in this way, and now the path has changed”. That is learned action.
Short memory, long memory and graph memory
There are still different kinds of memory in this system, but they serve different purposes. The short-term memory is local and practical. It lives in constants, recent traces, local context, rolling metrics and small adjustments around a node. It helps the node behave better without turning every request into a large prompt or a broad retrieval problem.
The longer-term memory comes from accumulated traces, accepted outputs, rejected outputs, corrections, tests, model decisions, contract changes and version history. This becomes the evidence base for future evolution. It is not just stored context; it is the historical record of what the runtime tried and what happened.
A semantic graph can support this, but it should not be confused with the core action memory. The graph is useful for context that is not directly required to fulfil the current transformation. It can store entities, documents, relationships, runtime logs, evidence, historical decisions, failure patterns and broader structural knowledge. The action chain is the core memory of the system. The graph is the wider context around that memory.
That distinction matters. If the graph becomes the main mechanism, the system risks drifting back into retrieval-heavy memory. If the action chain remains the main mechanism, the system learns through use. The graph then becomes a supporting structure that helps explain, enrich and reuse what the action chain has already discovered.
Why boundedness matters
For this kind of architecture to work, every layer needs limits. A node should not grow indefinitely. A file should not become an unbounded pile of special cases. A folder should not absorb every neighbouring responsibility. A prompt should not expand forever. A local oracle should not become a hidden general-purpose reasoning engine. A contract should not keep widening until it accepts almost anything.
The limits are not arbitrary. They create evolutionary pressure. A node can evolve inward for a while. Its deterministic logic can improve. Its constants can become sharper. Its local context can become better tuned. Its oracle question can become narrower. Its output contract can become more stable.
Eventually, the node may reach a point where adding more internal logic would make it worse. At that point, the right move is not to keep expanding the node. The system should evolve outward. A wrapper may be added. A child node may be created. A sibling node may handle a separate branch of the state. A preprocessing layer may prepare the packet before it reaches the completed node. A postprocessing layer may improve confidence after the node has returned its result.
A node becomes intelligent by becoming bounded enough to be reliable. Once it is reliable, further learning should not destroy that reliability. It should build around it.
Deterministic code before model growth
The order of evolution also matters. A failed output should not immediately imply a larger model, a longer prompt or specialist training. The first question should be whether the deterministic structure around the state is good enough.
Maybe the code is wrong. Maybe the packet contract is unclear. Maybe the output schema is too loose. Maybe the constants are weak. Maybe the node is too broad. Maybe the wrong branch handled the packet. Maybe the oracle was asked an overly broad question. Maybe the runtime does not yet have enough examples to justify model specialisation.
The conservative path is to improve code first, then contracts, then constants and local context, then oracle prompts and model selection. Specialist training should come late, after the system has accumulated enough high-quality operational history. Training without experience is mostly speculation. The runtime needs to earn its dataset through use.
The model should not be trained on vague ambition. It should be trained on the system’s own history of bounded transformations.
Oracles as narrow uncertainty resolvers
The oracle is still useful, but it should not own the whole task. Inside this architecture, an oracle is used when deterministic logic reaches a fuzzy state. The runtime should already know what it is uncertain about before the oracle is called.
That uncertainty should be shaped into a narrow question. The oracle should not be asked to analyse the entire system, rewrite the whole branch, or decide the full outcome of a broad request. It should be asked to resolve a specific ambiguity that the surrounding code can validate.
This allows smaller models to be useful earlier. A small generic oracle may not be capable of broad reasoning across a whole workflow, but it may be useful for a constrained local decision if the input is structured and the output options are limited. As the node evolves, the oracle path can change. The system may start with a small generic oracle, improve the surrounding context, move to a larger generic oracle only when justified, and eventually train a specialist model only when the trace history is rich enough.
The direction should be towards less uncertainty, not more dependence. If the same oracle decision appears repeatedly, that pattern should be promoted into deterministic logic, constants, tests, context adjustments, contract changes or training data.
Constants as local context
In this architecture, context should not be treated as a long conversation. The system should not rely on a large prompt remembering everything. Context should be local, explicit and structured. Constants belong beside the code that uses them. They should be flat where possible, easy to inspect, easy to diff and easy for both deterministic code and small models to consume.
This makes context part of the evolvable structure. A constant can change because a trace showed repeated failure. A threshold can shift because a node became too strict or too loose. A local dictionary can improve because a pattern appeared often enough. A prompt fragment can become smaller because deterministic code absorbed part of the decision.
The important point is that context is not a vague memory cloud. It is a controlled part of the node. Just like code, it has limits. If context grows too large, that is a signal. The node may be doing too much, the contract may be wrong, or the oracle may be compensating for missing structure. The system learns not only by adding context, but by discovering when context should be replaced by structure.
When experience becomes training data
Specialist model training is the late-stage form of this memory. By the time training becomes useful, the system should already have a rich history of input states, output states, traces, corrections, failures, accepted results, rejected results, oracle decisions, contracts, tests and version changes.
That history is much more valuable than a generic document set because it contains action. It shows not only what the system saw, but what it did, how it failed, how it was corrected, and what eventually became reliable.
A specialist model trained from that history would not simply be memorising facts. It would be absorbing a bounded transformation that has already been explored by the runtime. Even then, the model should not erase the harness. The harness still provides contracts, validation, traceability, thresholds and controlled evolution. The model may become a better local oracle. It may reduce the need for some surrounding logic. It may make the node more compact. But the action chain still matters because it is the source of future memory.
The model becomes a compressed expression of experience. The runtime remains the structure that creates new experience.
A self-healing system, carefully bounded
This leads to a careful version of self-healing. Not uncontrolled mutation. Not code silently rewriting itself. Not a runtime drifting away from its original shape.
A bounded self-healing system would detect pressure through traces. A repeated failure crosses a threshold. A node becomes too heavy. A contract produces too many ambiguous states. An oracle path becomes too frequent. A context file grows beyond its useful size. A branch becomes unreliable for a class of packets.
When that happens, the system should snapshot the current state, lock the affected branch, create a proposal, run tests, compare against historical traces, and only promote a change if it improves the bounded behaviour without damaging what already works. That is the difference between evolution and chaos.
The runtime can change, but it changes through evidence. The tree can grow, but it grows through pressure. A node can specialise, but only because the previous path showed why specialisation was needed. Every change remains attached to the history that caused it.
The semantic graph as secondary memory
The semantic graph still has a strong place in this architecture. It is useful for storing context that does not need to be directly present inside the action chain. It can preserve wider relationships between documents, entities, traces, failures, patches, contracts, tests, outputs and model versions. It can help the runtime find similar past states, recover supporting evidence, discover repeated patterns and prepare future training sets.
But the graph should support the action chain, not replace it. The main intelligence comes from the system repeatedly transforming state through bounded paths. The graph makes those transformations easier to understand and reuse. It provides the wider map, but the actual learning pressure comes from the packet moving through the tree.
That separation keeps the architecture grounded. The graph stores wider memory. The tree performs learned action. Together, they form a system where context and execution can reinforce each other without collapsing into one unstructured memory layer.
A quieter AI OS thesis
This is not a manifesto for a finished architecture. It is a thesis about where memory might belong.
Instead of treating memory as a separate database beside an AI model, the system can treat memory as something created by action. A request moves through a tree. Each layer transforms the state. Each transformation leaves a trace. Each trace becomes evidence. Each correction becomes pressure. Each repeated success becomes a stable path. Each stable path becomes part of the system’s intelligence.
The filesystem tree is only one possible shape for this. Its value is that it makes boundaries visible. It encourages local responsibility. It makes growth inspectable. It turns architecture into something that can be constrained, measured and evolved.
The deeper idea is that intelligence does not have to live only inside model weights. Some of it can live in the path. Some of it can live in the contracts. Some of it can live in constants. Some of it can live in tests. Some of it can live in traces. Some of it can eventually be compressed into specialist models.
A useful AI runtime may therefore be less like a chatbot with memory attached, and more like a structured system that remembers by doing: a logic tree that learns through trial and error, a harness that turns repeated action into process memory, and a bounded runtime where every successful path, failed path and corrected path becomes part of the intelligence of the system.