Reconciliation is no longer mysterious.
Desired state, reported reality, corrective action, and repetition already form the contract.
A workload disappears. Another appears. The reconciliation promise explains what must remain true, but a promise cannot observe, decide, or act.
Who stays awake after the command has ended?
Conveyor belts move, robotic arms assemble, and finished goods leave the warehouse. The machinery looks automatic only because the workers behind its decisions are easy to overlook.
A workload disappeared. Another appeared. A desired count changed. More work arrived. Convenient language hides the actor.
Observation, comparison, creation, and deletion are actions. A contract specifies the destination; a participant must continuously perform the journey.
A contract defines what must happen. It never lays a brick.
Some participant must remain on duty while administrators sleep, after commands end, and after individual processes restart. The simplest answer is one central worker responsible for everything.
So let us build that central brain and allow reality to test it.
Large systems rarely survive by making one participant understand everything. They survive by making every responsibility small enough to name, reason about, and change independently.
One log, one deployment, one place for every decision. For a small system, that economy is real.
Ownership means the invariant a component promises to protect, not merely the actions it happens to perform.
Independent problems deserve independent solutions because they change for independent reasons.
Build one long-running process. Let every change flow in, every decision flow out, and every correction begin in the same place.
A missing workload is observed and replaced.
A new desired count produces the missing work.
Drift is corrected without a human reissuing a command.
It works. There is one executable to deploy, one set of logs to inspect, and one obvious home for each new feature. Early success proves that centralization is a sensible beginning.
It does not prove that one responsibility boundary can absorb an unknown future.
One new rule. One additional module. One more special case. The cluster remains healthy while the design quietly accumulates knowledge.
Nothing fails on a dashboard. The cost appears in broader reviews, larger regression suites, synchronized releases, and engineers learning unrelated domains before making local changes.
The system is not becoming computationally overloaded. It is becoming over-responsible.
The platform grows outward. The architecture grows inward.
The software continues working. Each incident breaks a different assumption about whether one decision-maker can remain the home of every future invariant.
Stop growing the brain.
Add another worker.
Protect only the requested population.
Protect only movement toward a requested version.
Protect only the completion invariant.
Protect only the relevant availability decision.
Growth changes direction. Capabilities expand by adding participants; no existing participant must absorb the new rules.
That does not make the architecture fully decentralized. Decision-making is distributed, while the source of shared truth remains central and unresolved. Simultaneous writes and duplicate active copies also remain unresolved.
Decides whether the desired number of replicas exists.
Decides whether a rollout should continue.
Decides whether work has completed successfully.
Protects the invariant for ordered, stateful workloads.
A Controller is defined by the invariant it protects, not merely by the resource it observes.
A Controller preserves one invariant through bounded, independent, repeated action.
State one condition of correctness the worker promises to preserve.
Use the best available report without claiming perfect present knowledge.
Compare desired state with the report relevant to this invariant.
Compute the corrective action necessary to reduce the difference.
Do not absorb diagnosis, policy, or decisions that belong to another invariant.
Unrelated Controllers should not need to change together.
Return to observation for as long as the invariant exists.
"Observe reality" is useful shorthand, not a claim of global present knowledge. A Controller reads reports assembled from messages that took time to arrive. Observation is delayed and partial.
This companion does not explain efficient observation, authoritative shared storage, simultaneous-write arbitration, or how one active copy is chosen. Those are later mysteries, not hidden implementation details.
Large systems are built from many small owners with defensible boundaries. Complexity is not eliminated. It is distributed so that each part can remain understandable.
When one team protects one or two invariants, one process has fewer moving parts to deploy, monitor, and understand.
When many invariants must evolve and fail independently across teams, narrow owners reduce coupling and blast radius.
Many small processes are individually easier to understand but collectively harder to operate than one big one. The architecture accepts more deployments, more monitoring, and more places where failure can originate in exchange for responsibilities that change and fail independently.
The commands are not the lesson. Predict how one responsibility boundary answers two changes, then identify who converges the resulting Pods.
Does each one repeatedly ask whether anything changed?
What happens when ten observers become hundreds?
How much work is spent receiving the answer "no"?
Could change announce itself instead?
Dividing responsibility creates more observers. In one observation round, 10 independently polling controllers make 10 requests; 500 make 500 requests. This comparison says nothing about how often a round occurs or what policy schedules it. It only exposes the order-of-magnitude pressure on the shared control plane.
The invariant that should remain true.
The worker reads the state relevant to its responsibility.
The worker decides whether its invariant is satisfied.
The worker reduces drift, then returns to observation.