[{"data":1,"prerenderedAt":295},["ShallowReactive",2],{"navigation":3,"\u002Fcore-concepts\u002Fcustom-roles":134,"\u002Fcore-concepts\u002Fcustom-roles-surround":290},[4,16,38,80,112,129],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Get started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-rocket",{"title":12,"path":13,"stem":14,"icon":15},"Your first station run","\u002Fgetting-started\u002Ffirst-run","1.getting-started\u002F2.first-run","i-lucide-play",{"title":17,"path":18,"stem":19,"children":20,"icon":22},"Core concepts","\u002Fcore-concepts","2.core-concepts\u002F1.index",[21,23,28,33],{"title":17,"path":18,"stem":19,"icon":22},"i-lucide-boxes",{"title":24,"path":25,"stem":26,"icon":27},"Projects and access","\u002Fcore-concepts\u002Fprojects-and-access","2.core-concepts\u002F2.projects-and-access","i-lucide-users",{"title":29,"path":30,"stem":31,"icon":32},"Roles and permissions","\u002Fcore-concepts\u002Froles-and-permissions","2.core-concepts\u002F3.roles-and-permissions","i-lucide-shield-check",{"title":34,"path":35,"stem":36,"icon":37},"Custom roles","\u002Fcore-concepts\u002Fcustom-roles","2.core-concepts\u002F4.custom-roles","i-lucide-user-cog",{"title":39,"path":40,"stem":41,"children":42,"icon":44},"Station runtime","\u002Fstation-runtime","3.station-runtime\u002F1.index",[43,45,50,55,60,65,70,75],{"title":39,"path":40,"stem":41,"icon":44},"i-lucide-circuit-board",{"title":46,"path":47,"stem":48,"icon":49},"Configure a station","\u002Fstation-runtime\u002Fconfiguration","3.station-runtime\u002F2.configuration","i-lucide-file-code-2",{"title":51,"path":52,"stem":53,"icon":54},"Custom stages","\u002Fstation-runtime\u002Fcustom-stages","3.station-runtime\u002F3.custom-stages","i-lucide-puzzle",{"title":56,"path":57,"stem":58,"icon":59},"Credentials and secrets","\u002Fstation-runtime\u002Fcredentials-and-secrets","3.station-runtime\u002F4.credentials-and-secrets","i-lucide-key-round",{"title":61,"path":62,"stem":63,"icon":64},"Multiple lanes","\u002Fstation-runtime\u002Fmultiple-lanes","3.station-runtime\u002F5.multiple-lanes","i-lucide-git-branch",{"title":66,"path":67,"stem":68,"icon":69},"Capture DUT values","\u002Fstation-runtime\u002Fcaptured-values","3.station-runtime\u002F6.captured-values","i-lucide-list-checks",{"title":71,"path":72,"stem":73,"icon":74},"Validate configuration","\u002Fstation-runtime\u002Fvalidation","3.station-runtime\u002F7.validation","i-lucide-file-check-2",{"title":76,"path":77,"stem":78,"icon":79},"Upgrade a station","\u002Fstation-runtime\u002Fupgrading","3.station-runtime\u002F8.upgrading","i-lucide-package-check",{"title":81,"path":82,"stem":83,"children":84,"icon":86},"Production workflows","\u002Fproduction-workflows","4.production-workflows\u002F1.index",[85,87,92,97,102,107],{"title":81,"path":82,"stem":83,"icon":86},"i-lucide-factory",{"title":88,"path":89,"stem":90,"icon":91},"Applications and firmware","\u002Fproduction-workflows\u002Ffirmware-images","4.production-workflows\u002F2.firmware-images","i-lucide-cpu",{"title":93,"path":94,"stem":95,"icon":96},"DUT records and IDs","\u002Fproduction-workflows\u002Fdut-records-and-ids","4.production-workflows\u002F3.dut-records-and-ids","i-lucide-scan-barcode",{"title":98,"path":99,"stem":100,"icon":101},"Results and logs","\u002Fproduction-workflows\u002Fresults-and-logs","4.production-workflows\u002F4.results-and-logs","i-lucide-chart-no-axes-combined",{"title":103,"path":104,"stem":105,"icon":106},"Operator kiosk","\u002Fproduction-workflows\u002Foperator-kiosk","4.production-workflows\u002F5.operator-kiosk","i-lucide-monitor",{"title":108,"path":109,"stem":110,"icon":111},"DUT capture history","\u002Fproduction-workflows\u002Fdut-capture-history","4.production-workflows\u002F6.dut-capture-history","i-lucide-history",{"title":113,"path":114,"stem":115,"children":116,"icon":118},"Reference","\u002Freference","5.reference\u002F1.index",[117,119,124],{"title":113,"path":114,"stem":115,"icon":118},"i-lucide-book-open",{"title":120,"path":121,"stem":122,"icon":123},"API access","\u002Freference\u002Fapi-access","5.reference\u002F2.api-access","i-lucide-braces",{"title":125,"path":126,"stem":127,"icon":128},"Troubleshooting","\u002Freference\u002Ftroubleshooting","5.reference\u002F3.troubleshooting","i-lucide-life-buoy",{"title":130,"path":131,"stem":132,"icon":133},"Changelog","\u002Fchangelog","6.changelog","i-lucide-scroll-text",{"id":135,"title":34,"body":136,"description":283,"extension":284,"links":285,"meta":286,"navigation":287,"path":35,"seo":288,"stem":36,"__hash__":289},"docs\u002F2.core-concepts\u002F4.custom-roles.md",{"type":137,"value":138,"toc":275},"minimark",[139,148,153,221,224,231,234,237,241,251,254,258,265,268],[140,141,142,143,147],"p",{},"Custom roles let an organisation define access that differs from the built-in Admin, Operator, and Viewer roles. Organisation owners and admins manage definitions in ",[144,145,146],"strong",{},"Identity → Roles",". A definition belongs to that organisation and can be assigned to multiple members.",[149,150,152],"h2",{"id":151},"create-a-role","Create a role",[154,155,156,167,178,193,200,207],"ol",{},[157,158,159,160,162,163,166],"li",{},"Open ",[144,161,146],{}," and select ",[144,164,165],{},"Create role",".",[157,168,169,170,173,174,166],{},"Enter a ",[144,171,172],{},"Role name",", such as ",[175,176,177],"code",{},"Test supervisor",[157,179,180,181,184,185,188,189,192],{},"Choose ",[144,182,183],{},"Project"," or ",[144,186,187],{},"Station"," under ",[144,190,191],{},"Scope",". Project roles apply to a project and its stations; station roles apply to one station.",[157,194,195,196,199],{},"Optionally choose ",[144,197,198],{},"Start from an existing role"," to copy its permissions.",[157,201,202,203,206],{},"Select the explicit permissions the role needs. Use ",[144,204,205],{},"Filter permissions"," to find a resource or action.",[157,208,209,210,212,213,216,217,220],{},"Select ",[144,211,165],{},", then assign it through ",[144,214,215],{},"Team",", ",[144,218,219],{},"Project access"," in project settings, or an invitation.",[140,222,223],{},"For example, start from a project Viewer template and add run start\u002Fabort permissions for a supervisor who should operate tests without editing firmware or granting team access. Review the permission list before saving; a role name alone does not grant any actions.",[140,225,226],{},[227,228],"img",{"alt":229,"src":230},"Create role dialog for Test supervisor, starting from Viewer and adding runs:start and runs:abort permissions","\u002Fimages\u002Fproduct\u002F19-custom-role.png",[140,232,233],{},"This screenshot shows an unsaved example in the demo workspace. Its eight permissions include the six from Viewer plus run start and abort.",[140,235,236],{},"A project role cannot grant organisation management. A station role cannot grant project management. Machine-only station runtime permissions are unavailable to human custom roles. Grant managers can only assign, replace, or remove grants within their own effective authority.",[149,238,240],{"id":239},"edit-a-shared-definition","Edit a shared definition",[140,242,209,243,246,247,250],{},[144,244,245],{},"Edit"," beside the role, change its name or permissions, and select ",[144,248,249],{},"Save changes",". The change affects every member assigned to that definition, including their personal API key access limits and live station events. Permissions from their other applicable grants still combine with it.",[140,252,253],{},"The scope cannot change after creation. Create a separate definition if you need a station version of a project role. Built-in roles are read only. Names must be unique within a scope, ignoring case and surrounding whitespace, and cannot reuse a built-in role name.",[149,255,257],{"id":256},"retire-a-role","Retire a role",[140,259,260,261,264],{},"Reassign its grants and resolve pending invitations that reference it, then select ",[144,262,263],{},"Delete",". HTF blocks deletion while grants or unresolved invitations still use the definition.",[140,266,267],{},"If a role is no longer available when an invitation is accepted, the invitation needs administrator review. HTF does not silently replace it with a built-in role.",[140,269,270,271,274],{},"See ",[272,273,29],"a",{"href":30}," for the built-in access choices and how grants combine.",{"title":276,"searchDepth":277,"depth":278,"links":279},"",1,2,[280,281,282],{"id":151,"depth":278,"text":152},{"id":239,"depth":278,"text":240},{"id":256,"depth":278,"text":257},"Define a reusable permission set for a project or an individual station.","md",null,{},{"icon":37},{"title":34,"description":283},"jbev_7ubg2vYRU1bMxWm3gRdh37wXFtZ-UjZYKqD8UA",[291,293],{"title":29,"path":30,"stem":31,"description":292,"icon":32,"children":-1},"Choose project and station access for administrators, operators, and viewers.",{"title":39,"path":40,"stem":41,"description":294,"icon":44,"children":-1},"Build and operate a Python test station.",1791170922914]