Skip to content

RBAC + Teams

Roles

user < viewer < agent < supervisor < admin < owner. Every role has a numeric rank; Role.can(required) succeeds when the caller's rank is at least as high.

/role list                    # every assignment, grouped by role
/role grant <uid> <role> [teams]
/role revoke <uid>
/role me                      # your resolved role

ADMIN_IDS in env seeds everyone there as role=admin on first boot.

Teams

/team list
/team create <slug> <name>
/team rename <slug> <new>
/team delete <slug>
/team tz <slug> <IANA_tz>
/team members <slug>
/team addmember <slug> <uid>
/team removemember <slug> <uid>

Queue routing

Teams carry declarative queue_rules:

QueueRule(match={"tag": "vip"}, weight=300)
QueueRule(match={"priority": "urgent"}, weight=200)
QueueRule(match={}, weight=10)          # catch-all

The engine picks the team whose highest-matching rule has the greatest weight. Ties break by declaration order. Unknown match keys fail-closed.

Agents' queues

/queue        # open tickets in any team you're a member of
/mytickets    # tickets assigned directly to you