OptionalActingCompanies the caller is acting for — LIST-capable. Renders inside
Col IN ({{ActingCompanyIDs}}) as a sorted, per-element-validated,
quoted and escaped list; an empty or absent set resolves the whole
filter to (1=0) (match nothing), same as any unresolved token.
OptionalActingOrganization / tenant the caller is acting on behalf of (GUID, scalar forever).
OptionalActingPerson / contact the caller is acting on behalf of (GUID, scalar forever).
OptionalActingOpaque per-integration scope value (bounded identifier, scalar forever).
Per-request acting context for an API-key session, carried on UserInfo. Consumed by API-key-scoped RLS filters via the
{{Acting*}}tokens in RowLevelSecurityFilterInfo.MarkupFilterText.TRUST BOUNDARY: these values MUST be derived server-side from an authenticated identity. The engine binds what it is given and cannot validate provenance — never populate from a client-supplied header, argument, or GraphQL variable, and never expose via a resolver. A client-settable acting context is a total bypass of API-key row filtering.
Cardinality is a one-way door, decided per token at registration: the three scalar tokens are scalar forever (moving to a set later changes the token's shape and breaks every filter authored against it), and ActingCompanyIDs is list-capable from day one for exactly that reason.