Actuation-Scope-Registered Control Loops
Have every long-lived automated loop declare, in a registry all loops share, the resources it may actuate and the indicator it optimises, so overlapping actuation scope is detectable before any loop runs.
Problem
When two loops can write the same resource, one loop's corrective action is the next loop's disturbance. Neither loop is faulty and neither raises an error: each observes a deviation it was built to correct, corrects it, and is undone by the other, so the contested parameter oscillates and the indicators every loop was built to protect all degrade together. The conflict is invisible to per-loop monitoring, which is the only monitoring anyone owns. It also resists diagnosis after the fact: with several objectives active at once the same symptom drifts across several indicators, and attributing a degradation to the right one is a separate inference problem rather than a lookup. Central arbitration of every action would remove the conflict by construction, but it is impractical at scale when the control period is short and the loops are many.
Solution
Give every loop a declaration and put the declarations in one place. The declaration names the loop, the resources it is permitted to actuate, the indicator it optimises, and its priority relative to other loops; it is written during preparation, before the loop is commissioned, and it is versioned like any other artefact. Commissioning then becomes a check rather than a hope: intersect the candidate loop's declared write set with the write set of every loop already registered. An empty intersection admits the loop unchanged. A non-empty intersection is a conflict found on paper, and it is settled before either loop starts — by a time-bounded lease over the contested resource, by replacing the two local objectives with a shared reward so the loops cooperate over that resource instead of each chasing a local optimum, or by a declared priority that says which loop yields. Two loops may still share a resource, but never on the terms each would have chosen alone. At runtime a monitor compares observed writes against the declaration and rejects or flags an actuation outside the declared scope, which is what keeps the registry honest as loops are retuned. The declaration is also the diagnostic index: when an indicator degrades, the set of loops that can write the implicated resource is a lookup rather than an investigation.
When to use
- Two or more long-lived automated loops act on the same plant and were specified by different teams, vendors or procurement cycles.
- A loop can write a resource that another loop also treats as its own control handle.
- Conflicts show up as degraded indicators rather than as errors, so no loop's own monitoring reports a fault.
- The plant has no commissioned arbitration layer, such as a selector network or override hierarchy, that already decides which loop wins a contested handle.
- Central arbitration of every action is impractical because the control period is short or the number of loops is large.
Open the full interactive page →
Diagram, neighbourhood map, code examples, related patterns and full provenance.