Outbound and inbound. This page is the inbound one.
Two people answer it
You are one of them. The other is whoever builds a workflow with your node in it, and they know something you cannot. You set the floor, innode.yaml. It is compulsory on every node. Not because most need
protecting (most do not), but because a node that says nothing is indistinguishable from a
node nobody thought about, and a reviewer cannot tell those apart.
There are three shapes. Each one is described first, then written.
1. Adds nothing, and this is almost every node. The run arrived through a trigger, the
trigger already decided who was let in, and your node runs as that person. It does not
mean public.
node.yaml
node.yaml
node.yaml
requiredis always written out. Leaving it off is a lint error rather than a default, because a node saying nothing is what this block exists to stop.- A role with
required: falseis a lint error. A role lives on a token, so demanding one while waiving the token can never be satisfied. It would read as protected on the acceptance screen and admit everyone at run time. - A manifest that reaches the executor with no
authblock at all is treated asrequired: true. The platformβs default is deny.
Per box. The same node type legitimately faces staff on one workflow and customers on
another, and only the person building that workflow knows which.
Why a role usually belongs to them, not you
finance:approve is a claim one deploymentβs identity provider mints. If your node is
published and someone installs it in their universe, you have no idea what roles their
Auth0 or Cognito issues. Name one in your manifest and it fails for everybody else.
So: name a role in node.yaml only for a claim the platform defines (workflow:author,
marketplace:publish). Anything about someoneβs business belongs in the config field, set
by the person who knows their own role names.
The whole rule
The stricter of the two always wins, and neither can loosen the other. Turning the
builderβs toggle off does not unlock a node you marked
required: true. If both name a
role, the caller needs both.
There is no setting anywhere that widens a run. role with required: false in a manifest
is a lint error rather than a promise that could never be kept.
Letting anonymous visitors in at all is a decision about a workflow, not a node, so it is
a separate toggle on the trigger.
Roles read as noun then verb
finance:approve. payments:refund. crm:write.
Two words say what the role is actually for. admin does not, and two packages that both
invent one never mean the same thing by it.
One role per node. If a node seems to need two, it is usually two nodes.
The claim is matched against the callerβs roles and permissions. Both are noun:verb
claims off the same token, so you do not have to know which list your identity provider put
a string in.
What you actually write
node.yaml gets the floor. config.yaml gets the two builder fields, and they are the same
in every node, so copy them:
config.yaml
ui:order too, at the end, after your own fields. They are settings about
access rather than about the job, so they belong last.
Lint checks all of it: both fields present, the right types, the toggle rendering as a
toggle, the role box hidden until the toggle is on, and both defaulting to off. A node that
gated by default would break every workflow already using it.
Where it is enforced
On a trigger, at the door, before anything runs. Whether an anonymous visitor gets through that door is the Canvas toggle above. Anywhere else, as the node starts, against the identity the run already carries, and before any call is built. A refused run costs no vendor request and has no side effect. That includes a node reached over a service edge. It is the easy one to forget: such a node fires no connectors of its own, so it reads as an internal detail of whatever called it. It still runs your calls with your credentials, so it is gated like anything else.A missing role is loud
The node fails and names the claim it wanted. It does not quietly skip its work, and it does not carry on with a blank where the person should have been. That is worth choosing on purpose. A node that no-ops when identity is absent looks fine in testing and does nothing in production, and nobody finds out for a week.Identity in your templates
An authenticated run gives your manifest the person:api/run.yaml
user.id, user.email and user.name are available.
The token itself never reaches your manifest. You get to know who the caller is. You do not
get to hold the thing that proves it, because a manifest that could read it could also send
it somewhere.
What a reviewer sees
Requirements appear on the acceptance screen next to the hosts your node calls and the credentials it needs. A node that starts demanding a role, or starts reading identity, is a change worth seeing before it goes live.Next: Config Schema

