ReferenceControlArcConceptsControl Authority

Control Authority

How Arc resolves conflicts when multiple writers target the same channels

When multiple writers target the same channel — two Arc programs, an Arc program and a Python script, or an Arc program and a schematic control — authority determines whose values take effect. Without it, writers would overwrite each other unpredictably.

Declaring Authority

The authority keyword sets a program’s authority level. Place it before any func, sequence, or flow declarations:

authority 200

sequence main {
    stage pressurize {
        1 -> press_vlv_cmd,
        ox_pt_1 > 500 => next
    }
    stage complete {
        0 -> press_vlv_cmd
    }
}

start_cmd => main

Authority values range from 0 to 255. Higher values take precedence over lower ones.

For different channels, use the grouped form:

authority (200 press_vlv_cmd 100 vent_vlv_cmd 150)

This sets a default of 200, then overrides press_vlv_cmd to 100 and vent_vlv_cmd to 150.

See the syntax reference for the full authority declaration grammar.

Default Authority

When omitted, authority defaults to 255 — the maximum. This means a program without an explicit declaration has the highest possible priority and cannot be overridden by any other writer.

Starting at 255 works for simple cases with a single writer, but prevents escalation and manual override in multi-writer setups. Choosing a lower value like 200 leaves room for emergency overrides and operator intervention.

Changing Authority at Runtime

Use set_authority inside stages to change authority during execution:

authority 100

sequence main {
    stage monitor {
        sensor -> filter{} -> output,
        sensor > THRESHOLD => escalate
    }

    stage escalate {
        set_authority{value=200},
        1 -> press_vlv_cmd,
        wait{duration=5s} => done
    }

    stage done {
        0 -> press_vlv_cmd
    }
}

start_cmd => main

Authority changes are flushed before channel writes in the same execution cycle, so set_authority and channel writes can safely coexist in the same stage.

How Multiple Writers Interact

The authority system follows three rules:

Higher authority wins. A writer at authority 200 takes precedence over one at 100. The lower-authority writer’s values are silently dropped for that channel.

Equal authority: first in wins. When two writers have the same authority, the one that acquired the channel first keeps control. The second writer’s values are dropped.

Auto-resume on release. When a higher-authority writer releases a channel (by stopping or lowering its authority), the next highest writer automatically regains effective control. No restart or re-acquisition is needed.

These rules apply uniformly across all writer types — Arc programs, Python scripts, and schematic controls all participate in the same authority system.

Emergency Escalation

A common pattern is starting at moderate authority and escalating when an emergency is detected:

authority 100

sequence main {
    stage normal {
        sensor -> controller{} -> output,
        emergency_condition => emergency
    }

    stage emergency {
        set_authority{value=255},
        0 -> press_vlv_cmd,
        1 -> vent_vlv_cmd
    }
}

start_cmd => main

At authority 100, the program runs alongside other writers. When the emergency stage activates, it jumps to 255 and overrides everything — including other Arc programs, Python scripts, and schematic controls.

If you start at 255, you have no room to escalate. Starting lower preserves this capability.

Releasing Control

Setting authority to 0 gives a program the lowest possible priority. Any other writer takes precedence:

authority 200

sequence main {
    stage active {
        1 -> press_vlv_cmd,
        done_condition => yield
    }

    stage yield {
        set_authority{value=0},
        0 -> press_vlv_cmd
    }
}

start_cmd => main

This is useful when two Arc programs coordinate over the same channels. A high-priority program lowers its authority when it finishes, allowing a lower-priority program to resume without restarting.

Setting authority to 0 does not disconnect the writer. The program still holds the channel — it just has the lowest possible priority. Empty stages also do not lower authority; the writer keeps its current authority as long as the program is running. You must explicitly call set_authority{value=0} to yield.