Manager override
An exception action shows to everyone and runs only for a badge that holds the manager role; anyone else is refused and keeps their badge.
The situation
Sometimes a bag has no readable label and must be added by hand. Associates should see that the option exists, but only a manager may use it, and the record should say which manager did.
The recipe
Give the choice roles and the copy a person without the role sees:
{ "label": "Add without scan", "verb": "resolve", "roles": ["manager"], "refuse": "A manager's badge is needed to add a bag without its scan.", "params": { "resolverPayload": { "outcome": "added-by-manager" } } }The same control exists on a roster entry inside a form:
"x-lt-actions": [ { "label": "Key in (manager)", "fill": { "payload": { "source": "key-in" }, "enterCode": true }, "roles": ["manager"], "refuse": "A manager's badge is needed to key a box in." }]A station without a manager’s badge sees the choice withheld and is asked for one. The manager walks over, badges, and the choice runs as the manager.
The guarantee
A badge without the role is refused with the refuse copy, and the badge is not spent. A role limit is an act control layered on RBAC: the manager must also be allowed to write the row. Roster actions run on the server, which re-reads the action from the row’s pinned form schema and checks roles against the person acting. See Scan codes.
Related patterns
The physical world
A badge attributes, never grants
A badge scan mints a short-lived acting grant; every act then runs as the badged person under their own live RBAC.
Forms and configuration
Roster: check off who arrived
A roster lists every member a container expects, marks each waiting, in or flagged, and holds the rest of the form until all are accounted for.
The physical world
Facts above, choices below
One lifelong code serves many intents: the station states what is true about the row and offers the actions that fit.
