A stable system has to know when its state changes

Software system evolving through three states under continuous observation
Categories: Website evolution

A system can change constantly and still remain stable.

Its configuration can evolve, contents can change, or even components can be replaced. Maybe new operations can be introduced too. What matters is not that the system remains in exactly the same state, but that consequential changes remain within its awareness.

That distinction becomes harder to maintain as systems become more extensible.

An important state may have a primary operation designed to change it, while other supported paths can eventually reach the same state through a different operation. The protection around the primary operation may continue working exactly as designed while the state changes somewhere outside that protection.

This is not necessarily a failure of the protection itself. It can be a limitation of what the protection currently knows to protect. We encountered this while examining how protection behaves inside WordPress. A protected operation could remain protected while a related piece of system state could still be changed through another administrative path. Later, when software was able to choose operations from a simple instruction, the significance of that distinction became harder to ignore.

The question was no longer only whether an operation was protected, but whether the system could remain aware of consequential changes to its state, regardless of which supported path produced them.

That leads to a broader question about stability: What does it take for a changing system to remain aware enough to protect the state it is becoming?

Stability does not mean standing still

When we talk about keeping a system stable, it is easy to imagine that stability means preserving a particular state. That is rarely how a living system works.

A system may need to change its configuration, replace a component, update its content, or move from one valid state to another. Those changes are not necessarily signs of instability. They are part of the system continuing to operate.

The concern begins when a consequential change can happen without the system remaining aware of what changed, how it changed, or whether the resulting state is still within the boundaries that are meant to protect it.

This makes stability less about preventing change and more about maintaining awareness through change. A stable system can therefore move from one state to another without losing its ability to understand and protect what matters. Its state is allowed to evolve, but consequential transitions do not simply disappear from the system's awareness.

That difference becomes important when protection is introduced. Protection does not exist to prevent every state transition. It exists to place deliberate boundaries around changes that matter. As the system evolves, those boundaries may need to evolve with it. The question is therefore not whether the state changed. It is whether the system remained aware enough to protect the state as it changed.

Protection starts with the operation

When a system has an operation whose purpose is to produce a consequential change, that operation is a natural place for protection to begin.

It gives the system a clear point at which to ask whether the change should be allowed to happen. The operation already represents an intended piece of work, so protecting it does not require the system to understand every possible way its internal state might eventually change.

This is an important starting point. Protection does not need to begin by treating the entire internal system as something that must be guarded. It can begin with the operations that matter and the consequences they are capable of producing.

That also makes the protection easier to reason about. If an operation is responsible for changing a protected part of the system, placing a boundary around that operation gives us a defined point where the system can intervene, allow the change, or record what happened.

This is the approach we took with ClientGuard.

When we identified an operation whose consequences mattered, we protected the operation itself rather than attempting to place a boundary around every internal mechanism that might be related to it. That does not mean the operation is the only thing worth examining. It gives us the place from which to begin.

The same state can have another path

Protecting the primary operation gives us a clear boundary, but it does not necessarily tell us every way the resulting state can be changed. A system can have one operation that represents the intended work while exposing another supported path that reaches part of the same state.

We encountered this while examining theme switching in WordPress. The normal theme-switching operation is switch_theme(). Protecting that operation gives us a clear place to control an intentional theme switch. But the active theme is also represented by state held in the "stylesheet" and "template" options. In the Network Admin site settings, that state can be changed by updating those options directly, without going through "switch_theme()".

The important discovery was that protecting the primary operation did not mean every supported way of changing the related state was protected. The two paths are not necessarily equivalent operations. "switch_theme()" performs its own work around a theme change, while directly changing an option reaches the underlying state through a different mechanism.

Yet the resulting state can still matter to the system.

This distinction is easy to miss when protection is designed around the operation rather than the state it ultimately affects. The primary operation remains a sensible first boundary. But once another supported path can alter consequential state, that path becomes part of the protection surface that needs to be understood.

That does not mean every internal mechanism now needs its own guard. It simply means that protecting an operation is the beginning of understanding what can happen to the state that operation is meant to change. Now, we can observe, intervene, or deliberately bypass actions with a clearer awareness of what is happening.

The internal system is more exposed than it appears

A system can look relatively simple from the outside while being much more exposed internally. One may see a settings page, a button, or a form that represents a particular action. Behind it, the system may have APIs, components, hooks, administrative interfaces, and other supported mechanisms that can participate in the same work.

That internal surface becomes especially important when software can act on behalf of a person.

We saw this clearly while testing an AI-integrated component in WordPress. The instruction given to the software was simple, but the component was free to determine how it would accomplish the requested work. In one case, it reached the plugin installation mechanism without encountering the specific capability checks we had expected around that operation.

The normal permission layer had not stopped working. The component had simply reached the operation through a path that the protection model had not anticipated. This changes how we need to think about internal protection.

A person interacting with a UI may be constrained by the paths that UI exposes. Software acting on the person's behalf may have a much larger operational surface available to it. The difference can remain invisible until the software chooses a different way to accomplish the same intention.

That does not make every internal API a threat, nor does it mean every possible path needs its own protection. It means that the more software is allowed to act inside a system, the less we can rely on the assumption that the visible path is the only path that matters.

Protection therefore has to account for the fact that the system's internal surface can be larger than the surface we normally see.

When protection is on, but the state still changes

A protection system can be active while a consequential change still occurs outside what it protects. At first, that can look like a contradiction. If protection was enabled, and the state was supposed to remain protected, how did the change happen?

The answer can be found by separating the protection itself from the boundary around it.

If Sentinel records that protection was on when a state changed, that does not automatically mean the protection mechanism failed. It can tell us something more specific: the change happened through a path that was outside the protection currently being applied. That distinction matters.

A protection system cannot protect what it does not know it needs to protect. When an alternate supported path changes the same consequential state, observation gives us a way to identify that gap without pretending the original protection was ineffective.

This is where logging becomes more than a record of events. The observation tells us what the system knew, when protection was active, and what happened within the part of the system being observed. When something changes outside that boundary, the event can reveal that the protection surface does not yet cover every supported path to that state.

That does not necessarily mean the new path should immediately be blocked. Sometimes the right response is to understand the path first, determine whether the resulting state needs protection, and then decide whether the boundary should be extended. In other cases, a deliberate bypass may be appropriate and should remain visible as such.

The important part is that the system does not have to guess. It can observe the difference between a protected operation, an alternate path, and a resulting state change. That awareness gives protection somewhere to evolve from.

Protection has its limits

Once we start looking for alternate paths to consequential state, it is tempting to keep going. A system can contain many operations, many state fields, and many ways of reaching them. An extensible system can make that surface even larger. If every possible internal mutation became a protection target, the protection itself could become difficult to understand and maintain.

That can't be the goal. Protection needs a deliberate scope. The primary operation should be protected first when it represents an important piece of work. If another supported user-facing path can materially change the same protected state, that path deserves examination as well. But this does not mean that every internal mechanism must immediately become another protection boundary.

The difference is particularly important for systems with large configuration surfaces. An option may be changed through many internal operations without every one of those operations representing an important user-facing action. Treating all of them identically would make the protection model larger without necessarily making the system safer.

This is why observation matters alongside intervention. A newly discovered path can first be understood. We can determine what state it changes, who can reach it, what authority is involved, and what consequences follow. From there, the system can decide whether the path should be protected, observed, deliberately bypassed, or left outside the protection boundary.

The boundary does not need to extend to every possible internal mutation. It needs to cover the consequential changes that the system intentionally exposes through its supported operational surface. There will always be a deeper layer where software can manipulate its own state directly. That is a different boundary, and it is not where this model needs to begin.

The goal is to protect against accidental changes whether they are initiated by a real human or by an automated system.

Staying aware through change

A stable system does not need to remain unchanged. It needs to remain aware of the changes that matter.

Protection can begin with the operation that represents important work. As the system evolves, other supported paths may reveal themselves. Some actions may need protection, while some may need observation. Similarly, some activities may be deliberately allowed to bypass active protection.

What matters is that these decisions remain visible to the system. This is especially important as software becomes more capable of acting on behalf of people. The person may express an intention, while the software determines how that intention becomes an operation. The more paths a system can take, the less useful it becomes to assume that the expected path is the only one that matters.

A stable system therefore does not have to know every possible path in advance. It needs enough awareness to recognize consequential changes, understand where its protection applies, and extend that protection when the supported surface demands it.

That is what keeps stability from becoming stillness. The state can change. The system can evolve. New operations can appear, and software can take paths we did not anticipate. As long as the system remains aware enough to protect what matters, change does not have to become instability.


Related posts

Software protection boundary around an operation reached by multiple paths
08 Oct 2026
Software protection has to survive the unexpected path

Software protection should remain meaningful when software takes an unexpected path. Learn why protecting the operation can matter more than the route.

A protected software system surrounded by layered boundaries and safeguards
08 Oct 2026
When software protection depends on the wrong assumption

Software protection can fail when trusted activity produces unintended consequences. Explore why permissions alone may not be enough.

Man viewing an architectural model representing a growing system
15 Sep 2026
Growing systems begin protecting themselves

Explore how growing websites reorganize internally as responsibilities, governance, architecture, and guardrails evolve.

← Back to blog