[{"data":1,"prerenderedAt":2473},["ShallowReactive",2],{"navigation":3,"/guides/runner-management":879,"/guides/runner-management-surround":2468},[4,22,45,115,156,187,214,235,264,295,318,361,389,418,436,470,491,534,548,571,632,670,693,757,850],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Introduction","/introduction","01.introduction/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"What is Orkestia?","i-lucide-sparkles",{"title":13,"path":14,"stem":15,"icon":16},"Core Philosophy","/introduction/core-philosophy","01.introduction/2.core-philosophy","i-lucide-shield-check",{"title":18,"path":19,"stem":20,"icon":21},"Key Benefits","/introduction/key-benefits","01.introduction/3.key-benefits","i-lucide-trophy",{"title":23,"path":24,"stem":25,"children":26,"icon":29},"Getting Started","/getting-started","02.getting-started/1.index",[27,30,35,40],{"title":28,"path":24,"stem":25,"icon":29},"Quick Start","i-lucide-rocket",{"title":31,"path":32,"stem":33,"icon":34},"Architecture Overview","/getting-started/architecture-overview","02.getting-started/2.architecture-overview","i-lucide-layout-dashboard",{"title":36,"path":37,"stem":38,"icon":39},"Concepts at a Glance","/getting-started/concepts","02.getting-started/3.concepts","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Connect an AI Assistant","/getting-started/connect-an-ai-assistant","02.getting-started/4.connect-an-ai-assistant","i-lucide-bot",{"title":46,"path":47,"stem":48,"children":49,"icon":51},"Core Concepts","/concepts","03.concepts/01.index",[50,52,57,62,67,71,76,81,86,91,96,100,105,110],{"title":46,"path":47,"stem":48,"icon":51},"i-lucide-book-open",{"title":53,"path":54,"stem":55,"icon":56},"Workflows","/concepts/workflows","03.concepts/02.workflows","i-lucide-workflow",{"title":58,"path":59,"stem":60,"icon":61},"DGI — Dialog Generative Interface","/concepts/dgi","03.concepts/03.dgi","i-lucide-brain",{"title":63,"path":64,"stem":65,"icon":66},"Staff & AI Workforce Governance","/concepts/staff-governance","03.concepts/04.staff-governance","i-lucide-users-round",{"title":68,"path":69,"stem":70,"icon":44},"Agents — the execution substrate","/concepts/agents-platform","03.concepts/05.agents-platform",{"title":72,"path":73,"stem":74,"icon":75},"Runners & Execution Environments","/concepts/runners","03.concepts/06.runners","i-lucide-server-cog",{"title":77,"path":78,"stem":79,"icon":80},"Lumen Observability","/concepts/lumen","03.concepts/07.lumen","i-lucide-activity",{"title":82,"path":83,"stem":84,"icon":85},"Identity & Multi-Tenancy","/concepts/identity-multi-tenancy","03.concepts/08.identity-multi-tenancy","i-lucide-users",{"title":87,"path":88,"stem":89,"icon":90},"Billing, Pricing & Seats","/concepts/billing-and-seats","03.concepts/09.billing-and-seats","i-lucide-credit-card",{"title":92,"path":93,"stem":94,"icon":95},"App Data","/concepts/appdata","03.concepts/10.appdata","i-lucide-database",{"title":97,"path":98,"stem":99,"icon":61},"Engram","/concepts/engram","03.concepts/11.engram",{"title":101,"path":102,"stem":103,"icon":104},"DevKit","/concepts/devkit","03.concepts/12.devkit","i-lucide-terminal",{"title":106,"path":107,"stem":108,"icon":109},"App Host","/concepts/app-host","03.concepts/13.app-host","i-lucide-globe",{"title":111,"path":112,"stem":113,"icon":114},"Agent Exchange","/concepts/agent-exchange","03.concepts/14.agent-exchange","i-lucide-landmark",{"title":116,"path":117,"stem":118,"children":119,"icon":121},"Guides","/guides","04.guides/1.index",[120,122,127,132,137,142,147,151],{"title":116,"path":117,"stem":118,"icon":121},"i-lucide-compass",{"title":123,"path":124,"stem":125,"icon":126},"Building with DGI","/guides/building-with-dgi","04.guides/2.building-with-dgi","i-lucide-brain-circuit",{"title":128,"path":129,"stem":130,"icon":131},"Creating & Exposing Virtual Workflows","/guides/virtual-workflows","04.guides/4.virtual-workflows","i-lucide-blocks",{"title":133,"path":134,"stem":135,"icon":136},"Runner Management & Provisioning","/guides/runner-management","04.guides/5.runner-management","i-lucide-server",{"title":138,"path":139,"stem":140,"icon":141},"Security & Compliance","/guides/security-and-compliance","04.guides/7.security-and-compliance","i-lucide-shield",{"title":143,"path":144,"stem":145,"icon":146},"Tickets & Software Delivery","/guides/tickets-and-software-delivery","04.guides/8.tickets-and-software-delivery","i-lucide-ticket",{"title":148,"path":149,"stem":150},"Orkestia for AI-driven cloud infrastructure automation","/guides/cloud-automation-alternatives","04.guides/9.cloud-automation-alternatives",{"title":152,"path":153,"stem":154,"icon":155},"Typed decisions with TypeSafe","/guides/typed-decisions-with-typesafe","04.guides/9.typed-decisions-with-typesafe","i-lucide-git-branch",{"title":157,"path":158,"stem":159,"children":160,"icon":162},"Reference","/reference","05.reference/1.index",[161,163,168,173,177,182],{"title":157,"path":158,"stem":159,"icon":162},"i-lucide-library",{"title":164,"path":165,"stem":166,"icon":167},"Workflow Types & Registry","/reference/workflow-types-registry","05.reference/2.workflow-types-registry","i-lucide-list-tree",{"title":169,"path":170,"stem":171,"icon":172},"MCP Integration","/reference/mcp-integration","05.reference/3.mcp-integration","i-lucide-plug-zap",{"title":174,"path":175,"stem":176,"icon":104},"API & Tooling","/reference/api-tooling","05.reference/4.api-tooling",{"title":178,"path":179,"stem":180,"icon":181},"Integrations Catalog","/reference/integrations-catalog","05.reference/6.integrations-catalog","i-lucide-plug",{"title":183,"path":184,"stem":185,"icon":186},"Platform Services","/reference/platform-services","05.reference/7.platform-services","i-lucide-boxes",{"title":188,"path":189,"stem":190,"children":191,"icon":193},"Advanced Topics","/advanced","06.advanced/1.index",[192,194,199,204,209],{"title":188,"path":189,"stem":190,"icon":193},"i-lucide-flask-conical",{"title":195,"path":196,"stem":197,"icon":198},"Hybrid AI + Deterministic Execution","/advanced/hybrid-execution-model","06.advanced/2.hybrid-execution-model","i-lucide-git-merge",{"title":200,"path":201,"stem":202,"icon":203},"Drift Detection & Self-Healing","/advanced/drift-detection-self-healing","06.advanced/3.drift-detection-self-healing","i-lucide-heart-pulse",{"title":205,"path":206,"stem":207,"icon":208},"Governance & Approvals","/advanced/governance-and-approvals","06.advanced/4.governance-and-approvals","i-lucide-scale",{"title":210,"path":211,"stem":212,"icon":213},"Cost & Performance Optimization","/advanced/cost-and-performance","06.advanced/5.cost-and-performance","i-lucide-zap",{"title":215,"path":216,"stem":217,"children":218,"icon":220},"Operations","/operations","07.operations/1.index",[219,221,225,230],{"title":215,"path":216,"stem":217,"icon":220},"i-lucide-settings-2",{"title":222,"path":223,"stem":224,"icon":186},"Deployment Models","/operations/deployment-models","07.operations/2.deployment-models",{"title":226,"path":227,"stem":228,"icon":229},"Monitoring & Debugging","/operations/monitoring-and-debugging","07.operations/3.monitoring-and-debugging","i-lucide-bug",{"title":231,"path":232,"stem":233,"icon":234},"Best Practices","/operations/best-practices","07.operations/4.best-practices","i-lucide-check-check",{"title":236,"path":237,"stem":238,"children":239,"icon":241},"AWS Connections","/aws-connections","08.aws-connections/1.index",[240,242,245,250,255,260],{"title":236,"path":237,"stem":238,"icon":241},"i-simple-icons-amazonaws",{"title":23,"path":243,"stem":244,"icon":29},"/aws-connections/getting-started","08.aws-connections/2.getting-started",{"title":246,"path":247,"stem":248,"icon":249},"Setup Methods","/aws-connections/setup-methods","08.aws-connections/3.setup-methods","i-lucide-wrench",{"title":251,"path":252,"stem":253,"icon":254},"Managing Connections","/aws-connections/managing-connections","08.aws-connections/4.managing-connections","i-lucide-settings",{"title":256,"path":257,"stem":258,"icon":259},"Security Best Practices","/aws-connections/security-best-practices","08.aws-connections/5.security-best-practices","i-lucide-lock",{"title":261,"path":262,"stem":263,"icon":229},"Troubleshooting","/aws-connections/troubleshooting","08.aws-connections/6.troubleshooting",{"title":265,"path":266,"stem":267,"children":268,"icon":270},"Cloud Connections","/cloud-connections","09.cloud-connections/1.index",[269,271,276,281,286,291],{"title":265,"path":266,"stem":267,"icon":270},"i-lucide-cable",{"title":272,"path":273,"stem":274,"icon":275},"Google Cloud (GCP)","/cloud-connections/gcp","09.cloud-connections/2.gcp","i-simple-icons-googlecloud",{"title":277,"path":278,"stem":279,"icon":280},"Microsoft Azure","/cloud-connections/azure","09.cloud-connections/3.azure","i-simple-icons-microsoftazure",{"title":282,"path":283,"stem":284,"icon":285},"Magalu Cloud","/cloud-connections/magalu","09.cloud-connections/4.magalu","i-lucide-cloud",{"title":287,"path":288,"stem":289,"icon":290},"Kubernetes","/cloud-connections/kubernetes","09.cloud-connections/5.kubernetes","i-simple-icons-kubernetes",{"title":292,"path":293,"stem":294,"icon":208},"TypeSafe","/cloud-connections/typesafe","09.cloud-connections/6.typesafe",{"title":296,"path":297,"stem":298,"children":299,"icon":136},"DNS Providers","/dns-providers","10.dns-providers/1.index",[300,302,305,308,311,315],{"title":301,"path":297,"stem":298,"icon":136},"DNS Provider Connections",{"title":23,"path":303,"stem":304,"icon":29},"/dns-providers/getting-started","10.dns-providers/2.getting-started",{"title":246,"path":306,"stem":307,"icon":249},"/dns-providers/setup-methods","10.dns-providers/3.setup-methods",{"title":251,"path":309,"stem":310,"icon":254},"/dns-providers/managing-connections","10.dns-providers/4.managing-connections",{"title":312,"path":313,"stem":314,"icon":39},"Zones and Records","/dns-providers/zones-and-records","10.dns-providers/5.zones-and-records",{"title":261,"path":316,"stem":317,"icon":229},"/dns-providers/troubleshooting","10.dns-providers/6.troubleshooting",{"title":319,"path":320,"stem":321,"children":322,"icon":29},"Cloud Deploy","/cloud-deploy","11.cloud-deploy/01.index",[323,324,327,332,336,341,345,349,354,358],{"title":319,"path":320,"stem":321,"icon":29},{"title":23,"path":325,"stem":326,"icon":29},"/cloud-deploy/getting-started","11.cloud-deploy/02.getting-started",{"title":328,"path":329,"stem":330,"icon":331},"Creating a Site","/cloud-deploy/creating-a-site","11.cloud-deploy/03.creating-a-site","i-lucide-plus-circle",{"title":333,"path":334,"stem":335,"icon":34},"Site Overview and Deployments","/cloud-deploy/site-overview","11.cloud-deploy/04.site-overview",{"title":337,"path":338,"stem":339,"icon":340},"Deployment Progress and Success","/cloud-deploy/deployment-progress","11.cloud-deploy/05.deployment-progress","i-lucide-loader",{"title":342,"path":343,"stem":344,"icon":254},"Settings","/cloud-deploy/settings","11.cloud-deploy/06.settings",{"title":346,"path":347,"stem":348,"icon":109},"Custom Domains","/cloud-deploy/custom-domains","11.cloud-deploy/07.custom-domains",{"title":350,"path":351,"stem":352,"icon":353},"Resources, Releases, and Danger Zone","/cloud-deploy/resources-releases","11.cloud-deploy/08.resources-releases","i-lucide-package",{"title":355,"path":356,"stem":357,"icon":141},"Admin Dashboard","/cloud-deploy/admin-dashboard","11.cloud-deploy/09.admin-dashboard",{"title":261,"path":359,"stem":360,"icon":229},"/cloud-deploy/troubleshooting","11.cloud-deploy/10.troubleshooting",{"title":362,"path":363,"stem":364,"children":365,"icon":368},"User Onboarding","/user-onboarding","12.user-onboarding/1.index",[366,369,372,377,382,386],{"title":367,"path":363,"stem":364,"icon":368},"User Creation and Onboarding","i-lucide-user-plus",{"title":23,"path":370,"stem":371,"icon":29},"/user-onboarding/getting-started","12.user-onboarding/2.getting-started",{"title":373,"path":374,"stem":375,"icon":376},"Creating Your Organization","/user-onboarding/onboarding","12.user-onboarding/3.onboarding","i-lucide-building-2",{"title":378,"path":379,"stem":380,"icon":381},"Invitations","/user-onboarding/invitations","12.user-onboarding/4.invitations","i-lucide-mail",{"title":383,"path":384,"stem":385,"icon":254},"Managing Your Account","/user-onboarding/managing-account","12.user-onboarding/5.managing-account",{"title":261,"path":387,"stem":388,"icon":229},"/user-onboarding/troubleshooting","12.user-onboarding/6.troubleshooting",{"title":342,"path":390,"stem":391,"children":392,"icon":394},"/settings","13.settings/1.index",[393,395,400,404,409,413],{"title":342,"path":390,"stem":391,"icon":394},"i-lucide-sliders-horizontal",{"title":396,"path":397,"stem":398,"icon":399},"General Settings","/settings/general","13.settings/2.general","i-lucide-user",{"title":401,"path":402,"stem":403,"icon":85},"Members Settings","/settings/members","13.settings/3.members",{"title":405,"path":406,"stem":407,"icon":408},"Notifications Settings","/settings/notifications","13.settings/4.notifications","i-lucide-bell",{"title":410,"path":411,"stem":412,"icon":141},"Security Settings","/settings/security","13.settings/5.security",{"title":414,"path":415,"stem":416,"icon":417},"Signing Keys","/settings/keys","13.settings/6.keys","i-lucide-key-round",{"title":419,"path":420,"stem":421,"children":422,"icon":29},"App Enablement","/app-enablement","14.app-enablement/1.index",[423,424,428,432],{"title":419,"path":420,"stem":421,"icon":29},{"title":425,"path":426,"stem":427,"icon":417},"Sign in with Orkestia","/app-enablement/sign-in-with-orkestia","14.app-enablement/2.sign-in-with-orkestia",{"title":429,"path":430,"stem":431,"icon":95},"End-user data","/app-enablement/end-user-data","14.app-enablement/3.end-user-data",{"title":433,"path":434,"stem":435,"icon":131},"Compositions — use, invoke, share","/app-enablement/compositions","14.app-enablement/4.compositions",{"title":437,"path":438,"stem":439,"children":440,"icon":80},"Lumen","/lumen","15.lumen/1.index",[441,442,447,452,457,461,465],{"title":437,"path":438,"stem":439,"icon":80},{"title":443,"path":444,"stem":445,"icon":446},"Enable Lumen","/lumen/enable","15.lumen/2.enable","i-lucide-power",{"title":448,"path":449,"stem":450,"icon":451},"Send data","/lumen/send-data","15.lumen/3.send-data","i-lucide-upload",{"title":453,"path":454,"stem":455,"icon":456},"Collector","/lumen/collector","15.lumen/4.collector","i-lucide-container",{"title":458,"path":459,"stem":460,"icon":34},"Use Lumen","/lumen/observe","15.lumen/5.observe",{"title":462,"path":463,"stem":464,"icon":44},"Lumen MCP","/lumen/mcp","15.lumen/6.mcp",{"title":466,"path":467,"stem":468,"icon":469},"Query API","/lumen/query-api","15.lumen/7.query-api","i-lucide-search",{"title":471,"path":472,"stem":473,"children":474,"icon":476},"SDKs","/sdks","16.sdks/1.index",[475,477,482,487],{"title":471,"path":472,"stem":473,"icon":476},"i-lucide-code",{"title":478,"path":479,"stem":480,"icon":481},"Workflows SDK — Node / TypeScript","/sdks/workflows-nodejs","16.sdks/2.workflows-nodejs","i-lucide-file-ts",{"title":483,"path":484,"stem":485,"icon":486},"Workflows SDK — Python","/sdks/workflows-python","16.sdks/3.workflows-python","i-simple-icons-python",{"title":488,"path":489,"stem":490,"icon":417},"Auth SDK — Sign in with Orkestia","/sdks/auth","16.sdks/4.auth",{"title":92,"path":492,"stem":493,"children":494,"icon":95},"/appdata","17.appdata/1.index",[495,496,501,506,510,515,520,525,530],{"title":92,"path":492,"stem":493,"icon":95},{"title":497,"path":498,"stem":499,"icon":500},"Declare structures","/appdata/declare","17.appdata/2.declare","i-lucide-table",{"title":502,"path":503,"stem":504,"icon":505},"Records & Data API","/appdata/data-api","17.appdata/3.data-api","i-lucide-rows-3",{"title":507,"path":508,"stem":509,"icon":376},"Ownership & workspaces","/appdata/ownership","17.appdata/4.ownership",{"title":511,"path":512,"stem":513,"icon":514},"Expose App Data to end-users","/appdata/expose","17.appdata/5.expose","i-lucide-app-window",{"title":516,"path":517,"stem":518,"icon":519},"PostgREST HTTP","/appdata/postgrest","17.appdata/6.postgrest","i-lucide-unplug",{"title":521,"path":522,"stem":523,"icon":524},"Ordered append","/appdata/append","17.appdata/7.append","i-lucide-list-ordered",{"title":526,"path":527,"stem":528,"icon":529},"Databases and instances","/appdata/instances","17.appdata/8.instances","i-lucide-hard-drive",{"title":531,"path":532,"stem":533,"icon":104},"Query console and SQL","/appdata/query","17.appdata/9.query",{"title":97,"path":535,"stem":536,"children":537,"icon":61},"/engram","18.engram/1.index",[538,539,543],{"title":97,"path":535,"stem":536,"icon":61},{"title":540,"path":541,"stem":542,"icon":155},"Write & recall","/engram/write-recall","18.engram/2.write-recall",{"title":544,"path":545,"stem":546,"icon":547},"Field & feed","/engram/agent-memory","18.engram/3.agent-memory","i-lucide-radio",{"title":101,"path":549,"stem":550,"children":551,"icon":104},"/devkit","19.devkit/1.index",[552,553,558,562,567],{"title":101,"path":549,"stem":550,"icon":104},{"title":554,"path":555,"stem":556,"icon":557},"Install DevKit","/devkit/install","19.devkit/2.install","i-lucide-download",{"title":559,"path":560,"stem":561,"icon":519},"Hook redirect","/devkit/hooks","19.devkit/3.hooks",{"title":563,"path":564,"stem":565,"icon":566},"Local coding runner","/devkit/local-runner","19.devkit/4.local-runner","i-lucide-cpu",{"title":568,"path":569,"stem":570,"icon":131},"Compositions from DevKit","/devkit/compositions","19.devkit/5.compositions",{"title":572,"path":573,"stem":574,"children":575,"icon":44},"Staff & Agents","/staff-and-agents","20.staff-and-agents/01.index",[576,577,582,586,590,594,598,602,606,611,615,620,625,629],{"title":572,"path":573,"stem":574,"icon":44},{"title":578,"path":579,"stem":580,"icon":581},"Prerequisites","/staff-and-agents/prerequisites","20.staff-and-agents/02.prerequisites","i-lucide-list-checks",{"title":583,"path":584,"stem":585,"icon":368},"Hire an actor","/staff-and-agents/hire-an-actor","20.staff-and-agents/03.hire-an-actor",{"title":587,"path":588,"stem":589,"icon":34},"Console","/staff-and-agents/console","20.staff-and-agents/04.console",{"title":591,"path":592,"stem":593,"icon":11},"Configs, skills, and MCP","/staff-and-agents/configs-skills-mcp","20.staff-and-agents/05.configs-skills-mcp",{"title":595,"path":596,"stem":597,"icon":136},"Agent runner groups","/staff-and-agents/runner-groups","20.staff-and-agents/06.runner-groups",{"title":599,"path":600,"stem":601,"icon":16},"Governance","/staff-and-agents/governance","20.staff-and-agents/07.governance",{"title":603,"path":604,"stem":605,"icon":417},"Identity and tokens","/staff-and-agents/identity","20.staff-and-agents/08.identity",{"title":607,"path":608,"stem":609,"icon":610},"Memory and cost","/staff-and-agents/memory-and-cost","20.staff-and-agents/09.memory-and-cost","i-lucide-wallet",{"title":612,"path":613,"stem":614,"icon":155},"Coding agents","/staff-and-agents/coding-agents","20.staff-and-agents/10.coding-agents",{"title":616,"path":617,"stem":618,"icon":619},"Wire a repository for coding agents","/staff-and-agents/wire-a-repository","20.staff-and-agents/11.wire-a-repository","i-lucide-link",{"title":621,"path":622,"stem":623,"icon":624},"Run a ticket end to end","/staff-and-agents/run-a-ticket","20.staff-and-agents/12.run-a-ticket","i-lucide-play",{"title":626,"path":627,"stem":628,"icon":66},"Build a product team of actors","/staff-and-agents/build-a-product-team","20.staff-and-agents/13.build-a-product-team",{"title":261,"path":630,"stem":631,"icon":249},"/staff-and-agents/troubleshooting","20.staff-and-agents/14.troubleshooting",{"title":106,"path":633,"stem":634,"children":635,"icon":109},"/app-host","21.app-host/1.index",[636,637,641,644,649,653,658,662,666],{"title":106,"path":633,"stem":634,"icon":109},{"title":638,"path":639,"stem":640,"icon":514},"Your app and site","/app-host/your-app","21.app-host/2.your-app",{"title":92,"path":642,"stem":643,"icon":95},"/app-host/app-data","21.app-host/3.app-data",{"title":645,"path":646,"stem":647,"icon":648},"Website and process","/app-host/hosting","21.app-host/4.hosting","i-lucide-cloud-upload",{"title":650,"path":651,"stem":652,"icon":547},"Buzz","/app-host/buzz","21.app-host/5.buzz",{"title":654,"path":655,"stem":656,"icon":657},"Files","/app-host/files","21.app-host/6.files","i-lucide-folder",{"title":659,"path":660,"stem":661,"icon":109},"Your own domain","/app-host/your-domain","21.app-host/7.your-domain",{"title":663,"path":664,"stem":665,"icon":229},"Troubleshooting App Host","/app-host/troubleshooting","21.app-host/8.troubleshooting",{"title":667,"path":668,"stem":669,"icon":417},"Signing keys","/app-host/signing-keys","21.app-host/9.signing-keys",{"title":111,"path":671,"stem":672,"children":673,"icon":114},"/agent-exchange","22.agent-exchange/01.index",[674,675,678,682,686,690],{"title":111,"path":671,"stem":672,"icon":114},{"title":583,"path":676,"stem":677,"icon":368},"/agent-exchange/hire","22.agent-exchange/02.hire",{"title":679,"path":680,"stem":681,"icon":208},"List an actor","/agent-exchange/list","22.agent-exchange/03.list",{"title":683,"path":684,"stem":685,"icon":104},"Invoke & leases","/agent-exchange/invoke","22.agent-exchange/04.invoke",{"title":687,"path":688,"stem":689,"icon":141},"Settlement & trust","/agent-exchange/settlement","22.agent-exchange/05.settlement",{"title":53,"path":691,"stem":692,"icon":56},"/agent-exchange/workflows","22.agent-exchange/06.workflows",{"title":694,"path":695,"stem":696,"children":697,"icon":75},"Runners","/runners","23.runners/1.index",[698,700,704,709,713,717,721,726,730,734,738,741,745,749,753],{"title":699,"path":695,"stem":696,"icon":75},"Runner groups",{"title":701,"path":702,"stem":703,"icon":275},"Cloud Run","/runners/cloud-run","23.runners/10.cloud-run",{"title":705,"path":706,"stem":707,"icon":708},"DigitalOcean App Job","/runners/do-app-job","23.runners/11.do-app-job","i-simple-icons-digitalocean",{"title":710,"path":711,"stem":712,"icon":708},"DigitalOcean Droplet","/runners/do-droplet","23.runners/12.do-droplet",{"title":714,"path":715,"stem":716,"icon":285},"Magalu Cloud VM","/runners/magalu-vm","23.runners/13.magalu-vm",{"title":101,"path":718,"stem":719,"icon":720},"/runners/devkit","23.runners/14.devkit","i-lucide-laptop",{"title":722,"path":723,"stem":724,"icon":725},"Purposes & integrations","/runners/purposes","23.runners/16.purposes","i-lucide-layers",{"title":727,"path":728,"stem":729,"icon":241},"Fargate","/runners/fargate","23.runners/2.fargate",{"title":731,"path":732,"stem":733,"icon":241},"EC2 Auto Scaling","/runners/ec2-auto-scaling","23.runners/3.ec2-auto-scaling",{"title":735,"path":736,"stem":737,"icon":241},"EC2 VM","/runners/ec2-vm","23.runners/4.ec2-vm",{"title":287,"path":739,"stem":740,"icon":290},"/runners/kubernetes","23.runners/5.kubernetes",{"title":742,"path":743,"stem":744,"icon":280},"Azure Container Apps","/runners/azure-container-apps","23.runners/6.azure-container-apps",{"title":746,"path":747,"stem":748,"icon":280},"Azure VMSS","/runners/azure-vmss","23.runners/7.azure-vmss",{"title":750,"path":751,"stem":752,"icon":280},"Azure VM","/runners/azure-vm","23.runners/8.azure-vm",{"title":754,"path":755,"stem":756,"icon":275},"GCE","/runners/gce","23.runners/9.gce",{"title":758,"path":759,"stem":760,"children":761,"icon":763},"Chat","/chat","24.chat/01.index",[762,764,768,773,777,782,787,791,796,800,805,810,814,819,824,828,832,836,840,845],{"title":758,"path":759,"stem":760,"icon":763},"i-lucide-messages-square",{"title":765,"path":766,"stem":767,"icon":446},"Enable and publish","/chat/enable-and-publish","24.chat/02.enable-and-publish",{"title":769,"path":770,"stem":771,"icon":772},"Theme and customization","/chat/theme-and-customization","24.chat/03.theme-and-customization","i-lucide-palette",{"title":774,"path":775,"stem":776,"icon":85},"Members and moderation","/chat/members-and-moderation","24.chat/04.members-and-moderation",{"title":778,"path":779,"stem":780,"icon":781},"Channels","/chat/channels","24.chat/05.channels","i-lucide-hash",{"title":783,"path":784,"stem":785,"icon":786},"Using the chat","/chat/using-the-chat","24.chat/06.using-the-chat","i-lucide-message-circle",{"title":788,"path":789,"stem":790,"icon":44},"Actors in chat","/chat/actors-in-chat","24.chat/07.actors-in-chat",{"title":792,"path":793,"stem":794,"icon":795},"Internal support actor","/chat/internal-support-actor","24.chat/08.internal-support-actor","i-lucide-life-buoy",{"title":797,"path":798,"stem":799,"icon":104},"API and console","/chat/api-and-console","24.chat/09.api-and-console",{"title":801,"path":802,"stem":803,"icon":804},"Limits","/chat/limits","24.chat/10.limits","i-lucide-triangle-alert",{"title":806,"path":807,"stem":808,"icon":809},"Structured chat with DGI","/chat/structured-chat","24.chat/11.structured-chat","i-lucide-layout-list",{"title":811,"path":812,"stem":813,"icon":109},"Option A: hosted chat with DGI","/chat/option-a-hosted-chat","24.chat/12.option-a-hosted-chat",{"title":815,"path":816,"stem":817,"icon":818},"Option B: embed the chat component","/chat/option-b-embed-component","24.chat/13.option-b-embed-component","i-lucide-component",{"title":820,"path":821,"stem":822,"icon":823},"Option C: custom client (wire contract)","/chat/option-c-custom-client","24.chat/14.option-c-custom-client","i-lucide-braces",{"title":825,"path":826,"stem":827,"icon":394},"Responder configuration reference","/chat/responder-reference","24.chat/15.responder-reference",{"title":829,"path":830,"stem":831,"icon":547},"Cards, live updates and proactive posts","/chat/cards-live-and-proactive","24.chat/16.cards-live-and-proactive",{"title":833,"path":834,"stem":835,"icon":16},"Structured chat security model","/chat/structured-chat-security","24.chat/17.structured-chat-security",{"title":837,"path":838,"stem":839,"icon":181},"Option D: any app or API (dgi.chat)","/chat/option-d-chat-api","24.chat/18.option-d-chat-api",{"title":841,"path":842,"stem":843,"icon":844},"Card catalog","/chat/card-catalog","24.chat/19.card-catalog","i-lucide-layout-grid",{"title":846,"path":847,"stem":848,"icon":849},"Living Surfaces","/chat/living-surfaces","24.chat/20.living-surfaces","i-lucide-sprout",{"title":851,"path":852,"stem":853,"children":854,"icon":61},"DGI","/dgi","25.dgi/1.index",[855,857,862,866,870,874],{"title":856,"path":852,"stem":853,"icon":61},"What is DGI",{"title":858,"path":859,"stem":860,"icon":861},"How DGI works","/dgi/how-it-works","25.dgi/2.how-it-works","i-lucide-cog",{"title":863,"path":864,"stem":865,"icon":844},"Interfaces","/dgi/interfaces","25.dgi/3.interfaces",{"title":867,"path":868,"stem":869,"icon":29},"Quickstart","/dgi/quickstart","25.dgi/4.quickstart",{"title":871,"path":872,"stem":873,"icon":16},"Trust and safety","/dgi/trust-and-safety","25.dgi/5.trust-and-safety",{"title":875,"path":876,"stem":877,"icon":878},"FAQ","/dgi/faq","25.dgi/6.faq","i-lucide-circle-help",{"id":880,"title":133,"body":881,"description":2461,"extension":2462,"links":2463,"meta":2464,"navigation":2465,"path":134,"seo":2466,"stem":135,"__hash__":2467},"docs/04.guides/5.runner-management.md",{"type":882,"value":883,"toc":2445},"minimark",[884,919,930,950,955,958,1010,1021,1027,1030,1033,1067,1080,1084,1119,1318,1336,1349,1353,1360,1363,1728,1751,1754,1793,1800,1804,1807,1863,1873,1887,1892,1917,1936,1946,1955,1959,1962,1993,2071,2077,2089,2093,2099,2195,2202,2213,2227,2231,2316,2320,2335,2339,2346,2350,2401,2405,2441],[885,886,887,888,892,893,896,897,901,902,906,907,906,910,913,914,918],"p",{},"This guide walks through the full operational lifecycle of an Orkestia ",[889,890,891],"strong",{},"runner group"," — from picking a ",[889,894,895],{},"kind"," and provisioning compute, through warm-pool capacity tuning and health monitoring, to clean decommissioning. For the conceptual overview, start with ",[898,899,900],"a",{"href":73},"Runners concepts",". For the catalog of every ",[903,904,905],"code",{},"backend_type"," / ",[903,908,909],{},"purpose",[903,911,912],{},"integration_type",", see ",[889,915,916],{},[898,917,699],{"href":695},".",[885,920,921,922,925,926,929],{},"The defining property to keep in mind throughout: ",[889,923,924],{},"the runner compute always lives in your cloud account."," Orkestia is the control plane — it provisions, registers, scales, and reaps runners — but it never hosts the compute and never sees your job contents. The runner binary phones home to GitHub directly; Orkestia mints short-lived registration tokens and observes. This is the ",[898,927,928],{"href":47},"Zero Code Custody"," posture applied to CI: your builds run on infrastructure you own and pay for.",[931,932,933],"note",{},[885,934,935,936,939,940,943,944,918],{},"Runners is ",[889,937,938],{},"GA end-to-end for AWS",", and ",[889,941,942],{},"Azure and Kubernetes groups run production fleets today"," (they carry Orkestia's own agents). GCP, DigitalOcean, and Magalu Cloud are progressively maturing through their provider-specific workflow libraries — treat those as beta. Per-provider coverage is tracked in the ",[898,945,949],{"href":946,"rel":947},"https://reference.orkestia.dev",[948],"nofollow","workflow reference",[951,952,954],"h2",{"id":953},"mental-model-two-object-families","Mental model: two object families",[885,956,957],{},"Everything in Runner Management reduces to two first-class entities:",[959,960,961,977],"table",{},[962,963,964],"thead",{},[965,966,967,971,974],"tr",{},[968,969,970],"th",{},"Entity",[968,972,973],{},"What it is",[968,975,976],{},"Lifecycle",[978,979,980,997],"tbody",{},[965,981,982,989,992],{},[983,984,985,988],"td",{},[889,986,987],{},"Runner group"," (environment)",[983,990,991],{},"The provisioned compute substrate — a Kubernetes namespace, an ECS/Fargate or EC2 group, etc. — bound to one GitHub org, one target cloud, a scaling policy, and a network placement",[983,993,994],{},[903,995,996],{},"draft → provisioning → active → scaling → archived",[965,998,999,1004,1007],{},[983,1000,1001],{},[889,1002,1003],{},"Runner execution",[983,1005,1006],{},"A single launched runner process serving jobs on a group",[983,1008,1009],{},"launched → serving → drained / reaped",[885,1011,1012,1013,1016,1017,1020],{},"The control loop you operate is: ",[889,1014,1015],{},"provision environment → register runners with GitHub → launch executions → serve jobs → scale → drift-repair → deregister."," Each arrow is a ",[903,1018,1019],{},"runner.*"," workflow on the Orkestia engine; you rarely call them by hand (the Runners UI and SDK do), but understanding the chain is what makes monitoring and recovery legible.",[1022,1023],"dag-diagram",{":edges":1024,":nodes":1025,"direction":1026},"[{\"from\":\"D\",\"to\":\"P\",\"label\":\"provision DAG\"},{\"from\":\"P\",\"to\":\"A\",\"label\":\"runners register with GitHub\"},{\"from\":\"A\",\"to\":\"S\",\"label\":\"workflow_job events\"},{\"from\":\"S\",\"to\":\"A\"},{\"from\":\"A\",\"to\":\"X\",\"label\":\"drain + teardown\"}]","[{\"id\":\"D\",\"label\":\"draft\",\"sub\":\"config only\",\"kind\":\"start\"},{\"id\":\"P\",\"label\":\"provisioning\",\"kind\":\"cloud\"},{\"id\":\"A\",\"label\":\"active\",\"kind\":\"engine\"},{\"id\":\"S\",\"label\":\"scaling\",\"kind\":\"engine\"},{\"id\":\"X\",\"label\":\"archived\",\"kind\":\"terminal\"}]","LR",[951,1028,578],{"id":1029},"prerequisites",[885,1031,1032],{},"Before you can provision a group you need:",[1034,1035,1036,1043,1054,1061],"card-group",{},[1037,1038,1040],"card",{"icon":285,"title":1039,"to":237},"A cloud connection",[885,1041,1042],{},"Runner compute lands in your cloud, so Orkestia needs a scoped connection to it. AWS is the GA path — see AWS Connections. Other providers connect through the same connection model.",[1037,1044,1047],{"icon":1045,"title":1046,"to":266},"i-simple-icons-github","A GitHub connection (App)",[885,1048,1049,1050,1053],{},"Orkestia uses a GitHub App to mint short-lived runner registration tokens and to receive ",[903,1051,1052],{},"workflow_job"," events. One connection per GitHub org.",[1037,1055,1058],{"icon":1056,"title":1057,"to":390},"i-lucide-network","A network profile",[885,1059,1060],{},"A profile selects the VPC, subnets, and security groups your runners live in. Required for VPC/region-constrained placement.",[1037,1062,1064],{"icon":456,"title":1063,"to":158},"A runner image source",[885,1065,1066],{},"Runner containers are pulled from your Aggregated Registry. The provider must be able to pull the image at scale-up time.",[1068,1069,1070],"tip",{},[885,1071,1072,1073,1076,1077,918],{},"Connections are the canonical \"prerequisite\" in Orkestia. If you provision through the MCP or SDK and a workflow reports ",[903,1074,1075],{},"has_prerequisites: true",", fetch the setup guide first — it returns Orkestia's own cloud principal pre-filled so you can grant exactly the trust needed and nothing more. See ",[898,1078,1079],{"href":139},"Security & compliance",[951,1081,1083],{"id":1082},"step-1-choose-a-kind","Step 1 — Choose a kind",[885,1085,1086,1087,1090,1091,1093,1094,906,1097,906,1100,906,1103,1106,1107,906,1110,906,1113,1116,1117,918],{},"The create wizard’s ",[889,1088,1089],{},"Runner type"," step is not “pick a cloud.” It is ",[903,1092,905],{},", filtered by the connection you selected. Purpose (",[903,1095,1096],{},"github_actions",[903,1098,1099],{},"gitlab_runner",[903,1101,1102],{},"agent",[903,1104,1105],{},"generic",") and integration (",[903,1108,1109],{},"github",[903,1111,1112],{},"gitlab",[903,1114,1115],{},"none",") are a separate choice — ",[898,1118,722],{"href":723},[959,1120,1121,1140],{},[962,1122,1123],{},[965,1124,1125,1128,1134,1137],{},[968,1126,1127],{},"Cloud",[968,1129,1130,1131,1133],{},"Kinds (",[903,1132,905],{},")",[968,1135,1136],{},"Status",[968,1138,1139],{},"When to choose",[978,1141,1142,1175,1207,1231,1256,1280,1298],{},[965,1143,1144,1149,1167,1172],{},[983,1145,1146],{},[889,1147,1148],{},"AWS",[983,1150,1151,1156,1157,1156,1162],{},[898,1152,1153],{"href":728},[903,1154,1155],{},"fargate",", ",[898,1158,1159],{"href":732},[903,1160,1161],{},"ec2_auto_scaling",[898,1163,1164],{"href":736},[903,1165,1166],{},"ec2_vm",[983,1168,1169],{},[889,1170,1171],{},"GA",[983,1173,1174],{},"Production CI; tightest drift repair on Fargate / EC2 VM",[965,1176,1177,1182,1199,1204],{},[983,1178,1179],{},[889,1180,1181],{},"Azure",[983,1183,1184,1156,1189,1156,1194],{},[898,1185,1186],{"href":743},[903,1187,1188],{},"azure_container_apps_job",[898,1190,1191],{"href":747},[903,1192,1193],{},"azure_vmss",[898,1195,1196],{"href":751},[903,1197,1198],{},"azure_vm",[983,1200,1201],{},[889,1202,1203],{},"Production",[983,1205,1206],{},"Azure-resident orgs",[965,1208,1209,1213,1220,1224],{},[983,1210,1211],{},[889,1212,287],{},[983,1214,1215],{},[898,1216,1217],{"href":739},[903,1218,1219],{},"kubernetes",[983,1221,1222],{},[889,1223,1203],{},[983,1225,1226,1227,1230],{},"Any conformant cluster (including EKS). Do not create ",[903,1228,1229],{},"eks"," groups",[965,1232,1233,1238,1250,1253],{},[983,1234,1235],{},[889,1236,1237],{},"GCP",[983,1239,1240,1156,1245],{},[898,1241,1242],{"href":702},[903,1243,1244],{},"cloud_run",[898,1246,1247],{"href":755},[903,1248,1249],{},"gce",[983,1251,1252],{},"Beta",[983,1254,1255],{},"Workloads already on GCP",[965,1257,1258,1263,1275,1277],{},[983,1259,1260],{},[889,1261,1262],{},"DigitalOcean",[983,1264,1265,1156,1270],{},[898,1266,1267],{"href":706},[903,1268,1269],{},"do_app_job",[898,1271,1272],{"href":711},[903,1273,1274],{},"do_droplet",[983,1276,1252],{},[983,1278,1279],{},"Lightweight / cost-sensitive setups",[965,1281,1282,1286,1293,1295],{},[983,1283,1284],{},[889,1285,282],{},[983,1287,1288],{},[898,1289,1290],{"href":715},[903,1291,1292],{},"mgc_vm",[983,1294,1252],{},[983,1296,1297],{},"Brazil-region data-residency",[965,1299,1300,1305,1312,1315],{},[983,1301,1302],{},[889,1303,1304],{},"None",[983,1306,1307],{},[898,1308,1309],{"href":718},[903,1310,1311],{},"devkit",[983,1313,1314],{},"Production (coding)",[983,1316,1317],{},"Laptop / hosted provider-blind coding broker",[1319,1320,1321],"warning",{},[885,1322,1323,1324,1327,1328,1331,1332,1335],{},"For GCP, DigitalOcean, and Magalu, end-to-end provisioning, reconcile-loop scaling, multi-region, and health-check auto-reap have ",[889,1325,1326],{},"partial coverage"," in the provider libraries. Verify current per-kind capability in the ",[898,1329,949],{"href":946,"rel":1330},[948]," and the ",[898,1333,1334],{"href":695},"kind pages"," before committing a production pipeline to a beta kind.",[885,1337,1338,1339,1342,1343,1345,1346,918],{},"A group binds to ",[889,1340,1341],{},"one"," kind and ",[889,1344,1341],{}," connection. There is no cross-cloud pool — a job cannot transparently spill from AWS to GCP within a single group. Multi-cloud orgs run multiple groups from the one control plane. Required config keys per kind come from ",[903,1347,1348],{},"data.runner.list-provider-config-specs",[951,1350,1352],{"id":1351},"step-2-create-a-runner-group","Step 2 — Create a runner group",[885,1354,1355,1356,1359],{},"The fastest path is the Runners command center UI (the dedicated console at ",[903,1357,1358],{},"runners.orkestia.dev","), which walks you through GitHub org → cloud target → scaling policy → network placement and submits the provisioning DAG for you. The same provisioning is available programmatically — useful for IaC-driven group creation.",[885,1361,1362],{},"A provisioning request describes the GitHub binding, the cloud target, the scaling policy, and the labels GitHub will route jobs by:",[1364,1365,1370],"pre",{"className":1366,"code":1367,"language":1368,"meta":1369,"style":1369},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"workflow\": \"runner.environment-provision-kubernetes\",\n  \"input\": {\n    \"organization_id\": \"org_01HXZ...\",\n    \"github_connection_id\": \"cn_gh_main\",\n    \"github_org\": \"myorg\",\n    \"target\": {\n      \"provider\": \"kubernetes\",\n      \"env\": \"in-cluster\",\n      \"connection_id\": \"cn_k8s_prod\",\n      \"namespace\": \"ci-runners\",\n      \"network_profile_id\": \"np_01HXZ...\"\n    },\n    \"scale\": { \"min\": 0, \"max\": 10, \"idle_timeout_s\": 300 },\n    \"labels\": [\"self-hosted\", \"orkestia\", \"prod-builds\"]\n  }\n}\n","json","",[903,1371,1372,1381,1409,1424,1447,1468,1489,1503,1525,1546,1567,1588,1608,1614,1673,1716,1722],{"__ignoreMap":1369},[1373,1374,1377],"span",{"class":1375,"line":1376},"line",1,[1373,1378,1380],{"class":1379},"sMK4o","{\n",[1373,1382,1384,1387,1391,1394,1397,1400,1404,1406],{"class":1375,"line":1383},2,[1373,1385,1386],{"class":1379},"  \"",[1373,1388,1390],{"class":1389},"spNyl","workflow",[1373,1392,1393],{"class":1379},"\"",[1373,1395,1396],{"class":1379},":",[1373,1398,1399],{"class":1379}," \"",[1373,1401,1403],{"class":1402},"sfazB","runner.environment-provision-kubernetes",[1373,1405,1393],{"class":1379},[1373,1407,1408],{"class":1379},",\n",[1373,1410,1412,1414,1417,1419,1421],{"class":1375,"line":1411},3,[1373,1413,1386],{"class":1379},[1373,1415,1416],{"class":1389},"input",[1373,1418,1393],{"class":1379},[1373,1420,1396],{"class":1379},[1373,1422,1423],{"class":1379}," {\n",[1373,1425,1427,1430,1434,1436,1438,1440,1443,1445],{"class":1375,"line":1426},4,[1373,1428,1429],{"class":1379},"    \"",[1373,1431,1433],{"class":1432},"sBMFI","organization_id",[1373,1435,1393],{"class":1379},[1373,1437,1396],{"class":1379},[1373,1439,1399],{"class":1379},[1373,1441,1442],{"class":1402},"org_01HXZ...",[1373,1444,1393],{"class":1379},[1373,1446,1408],{"class":1379},[1373,1448,1450,1452,1455,1457,1459,1461,1464,1466],{"class":1375,"line":1449},5,[1373,1451,1429],{"class":1379},[1373,1453,1454],{"class":1432},"github_connection_id",[1373,1456,1393],{"class":1379},[1373,1458,1396],{"class":1379},[1373,1460,1399],{"class":1379},[1373,1462,1463],{"class":1402},"cn_gh_main",[1373,1465,1393],{"class":1379},[1373,1467,1408],{"class":1379},[1373,1469,1471,1473,1476,1478,1480,1482,1485,1487],{"class":1375,"line":1470},6,[1373,1472,1429],{"class":1379},[1373,1474,1475],{"class":1432},"github_org",[1373,1477,1393],{"class":1379},[1373,1479,1396],{"class":1379},[1373,1481,1399],{"class":1379},[1373,1483,1484],{"class":1402},"myorg",[1373,1486,1393],{"class":1379},[1373,1488,1408],{"class":1379},[1373,1490,1492,1494,1497,1499,1501],{"class":1375,"line":1491},7,[1373,1493,1429],{"class":1379},[1373,1495,1496],{"class":1432},"target",[1373,1498,1393],{"class":1379},[1373,1500,1396],{"class":1379},[1373,1502,1423],{"class":1379},[1373,1504,1506,1509,1513,1515,1517,1519,1521,1523],{"class":1375,"line":1505},8,[1373,1507,1508],{"class":1379},"      \"",[1373,1510,1512],{"class":1511},"sbssI","provider",[1373,1514,1393],{"class":1379},[1373,1516,1396],{"class":1379},[1373,1518,1399],{"class":1379},[1373,1520,1219],{"class":1402},[1373,1522,1393],{"class":1379},[1373,1524,1408],{"class":1379},[1373,1526,1528,1530,1533,1535,1537,1539,1542,1544],{"class":1375,"line":1527},9,[1373,1529,1508],{"class":1379},[1373,1531,1532],{"class":1511},"env",[1373,1534,1393],{"class":1379},[1373,1536,1396],{"class":1379},[1373,1538,1399],{"class":1379},[1373,1540,1541],{"class":1402},"in-cluster",[1373,1543,1393],{"class":1379},[1373,1545,1408],{"class":1379},[1373,1547,1549,1551,1554,1556,1558,1560,1563,1565],{"class":1375,"line":1548},10,[1373,1550,1508],{"class":1379},[1373,1552,1553],{"class":1511},"connection_id",[1373,1555,1393],{"class":1379},[1373,1557,1396],{"class":1379},[1373,1559,1399],{"class":1379},[1373,1561,1562],{"class":1402},"cn_k8s_prod",[1373,1564,1393],{"class":1379},[1373,1566,1408],{"class":1379},[1373,1568,1570,1572,1575,1577,1579,1581,1584,1586],{"class":1375,"line":1569},11,[1373,1571,1508],{"class":1379},[1373,1573,1574],{"class":1511},"namespace",[1373,1576,1393],{"class":1379},[1373,1578,1396],{"class":1379},[1373,1580,1399],{"class":1379},[1373,1582,1583],{"class":1402},"ci-runners",[1373,1585,1393],{"class":1379},[1373,1587,1408],{"class":1379},[1373,1589,1591,1593,1596,1598,1600,1602,1605],{"class":1375,"line":1590},12,[1373,1592,1508],{"class":1379},[1373,1594,1595],{"class":1511},"network_profile_id",[1373,1597,1393],{"class":1379},[1373,1599,1396],{"class":1379},[1373,1601,1399],{"class":1379},[1373,1603,1604],{"class":1402},"np_01HXZ...",[1373,1606,1607],{"class":1379},"\"\n",[1373,1609,1611],{"class":1375,"line":1610},13,[1373,1612,1613],{"class":1379},"    },\n",[1373,1615,1617,1619,1622,1624,1626,1629,1631,1634,1636,1638,1641,1644,1646,1649,1651,1653,1656,1658,1660,1663,1665,1667,1670],{"class":1375,"line":1616},14,[1373,1618,1429],{"class":1379},[1373,1620,1621],{"class":1432},"scale",[1373,1623,1393],{"class":1379},[1373,1625,1396],{"class":1379},[1373,1627,1628],{"class":1379}," {",[1373,1630,1399],{"class":1379},[1373,1632,1633],{"class":1511},"min",[1373,1635,1393],{"class":1379},[1373,1637,1396],{"class":1379},[1373,1639,1640],{"class":1511}," 0",[1373,1642,1643],{"class":1379},",",[1373,1645,1399],{"class":1379},[1373,1647,1648],{"class":1511},"max",[1373,1650,1393],{"class":1379},[1373,1652,1396],{"class":1379},[1373,1654,1655],{"class":1511}," 10",[1373,1657,1643],{"class":1379},[1373,1659,1399],{"class":1379},[1373,1661,1662],{"class":1511},"idle_timeout_s",[1373,1664,1393],{"class":1379},[1373,1666,1396],{"class":1379},[1373,1668,1669],{"class":1511}," 300",[1373,1671,1672],{"class":1379}," },\n",[1373,1674,1676,1678,1681,1683,1685,1688,1690,1693,1695,1697,1699,1702,1704,1706,1708,1711,1713],{"class":1375,"line":1675},15,[1373,1677,1429],{"class":1379},[1373,1679,1680],{"class":1432},"labels",[1373,1682,1393],{"class":1379},[1373,1684,1396],{"class":1379},[1373,1686,1687],{"class":1379}," [",[1373,1689,1393],{"class":1379},[1373,1691,1692],{"class":1402},"self-hosted",[1373,1694,1393],{"class":1379},[1373,1696,1643],{"class":1379},[1373,1698,1399],{"class":1379},[1373,1700,1701],{"class":1402},"orkestia",[1373,1703,1393],{"class":1379},[1373,1705,1643],{"class":1379},[1373,1707,1399],{"class":1379},[1373,1709,1710],{"class":1402},"prod-builds",[1373,1712,1393],{"class":1379},[1373,1714,1715],{"class":1379},"]\n",[1373,1717,1719],{"class":1375,"line":1718},16,[1373,1720,1721],{"class":1379},"  }\n",[1373,1723,1725],{"class":1375,"line":1724},17,[1373,1726,1727],{"class":1379},"}\n",[931,1729,1730],{},[885,1731,1732,1733,1735,1736,1738,1739,1742,1743,1746,1747,1750],{},"Exact workflow names, input field names, and provider ",[903,1734,1532],{}," values are owned by the live registry, not this guide. Discover the current ",[903,1737,1019],{}," catalog and its schemas via the MCP (",[903,1740,1741],{},"list_workflow_types(prefix=\"runner.\")"," → ",[903,1744,1745],{},"get_workflow_schema(...)",") or the ",[898,1748,1749],{"href":165},"workflow types registry",", and treat the JSON above as a shape, not a contract.",[885,1752,1753],{},"What happens after you submit:",[1755,1756,1757,1772,1779,1786],"ol",{},[1758,1759,1760,1761,1764,1765,906,1768,1771],"li",{},"The group enters ",[889,1762,1763],{},"provisioning"," — the provider's environment DAG runs (",[903,1766,1767],{},"runner.group-creation",[903,1769,1770],{},"runner.environment-provision-*","), standing up the ECS service / EC2 group / namespace inside your cloud.",[1758,1773,1774,1775,1778],{},"Orkestia mints a ",[889,1776,1777],{},"short-lived registration token"," via the GitHub App.",[1758,1780,1781,1782,1785],{},"Runner executions launch and ",[889,1783,1784],{},"register themselves with GitHub",", labelled per the group config.",[1758,1787,1788,1789,1792],{},"The group goes ",[889,1790,1791],{},"active"," and starts picking up jobs that match its labels.",[885,1794,1795,1796,1799],{},"Registration is ",[889,1797,1798],{},"pull, not push",": Orkestia never pushes runners onto GitHub. It hands each runner binary a short-lived token and the runner calls GitHub itself — so no long-lived secret sits on disk.",[951,1801,1803],{"id":1802},"step-3-configure-warm-pools-capacity","Step 3 — Configure warm pools & capacity",[885,1805,1806],{},"Capacity is governed by the group's scaling policy. The two knobs that matter most:",[959,1808,1809,1822],{},[962,1810,1811],{},[965,1812,1813,1816,1819],{},[968,1814,1815],{},"Setting",[968,1817,1818],{},"Effect",[968,1820,1821],{},"Trade-off",[978,1823,1824,1839,1851],{},[965,1825,1826,1830,1833],{},[983,1827,1828],{},[903,1829,1633],{},[983,1831,1832],{},"Warm pool — runners kept ready even when idle",[983,1834,1835,1836,1838],{},"Higher ",[903,1837,1633],{}," = faster pickup, higher idle cost",[965,1840,1841,1845,1848],{},[983,1842,1843],{},[903,1844,1648],{},[983,1846,1847],{},"Hard ceiling on concurrent runners",[983,1849,1850],{},"Protects your cloud bill; queue waits rather than overspending",[965,1852,1853,1857,1860],{},[983,1854,1855],{},[903,1856,1662],{},[983,1858,1859],{},"How long an idle runner lives before being reaped",[983,1861,1862],{},"Lower = cheaper; higher = fewer cold starts under bursty load",[885,1864,1865,1866,1869,1870,1872],{},"Set ",[903,1867,1868],{},"min: 0"," for spiky, cost-sensitive pipelines (every runner is on-demand, accepting a cold-start delay). Set ",[903,1871,1633],{}," to your steady-state concurrency for latency-sensitive CI where developers wait on builds.",[1319,1874,1875],{},[885,1876,1877,1880,1881,1883,1884,1886],{},[889,1878,1879],{},"Scaling is bounded by group policy — always."," Orkestia will not exceed ",[903,1882,1648],{}," even when the queue grows. This is deliberate: protecting your cloud spend is an explicit guarantee, not best-effort. If jobs are queuing, raise ",[903,1885,1648],{}," rather than expecting auto-burst.",[1888,1889,1891],"h3",{"id":1890},"how-scaling-actually-fires","How scaling actually fires",[885,1893,1894,1895,1898,1899,1901,1902,1904,1905,1908,1909,1911,1912,1916],{},"Scaling is ",[889,1896,1897],{},"driven by a reconciliation loop, not by webhooks."," A per-group controller continuously converges the live pool toward your ",[903,1900,1633],{},"/",[903,1903,1648],{}," — the same reconcile model Orkestia uses for ",[898,1906,1907],{"href":201},"drift & self-healing",". GitHub ",[903,1910,1052],{}," webhooks are a best-effort ",[1913,1914,1915],"em",{},"nudge"," that triggers an immediate reconcile, never the source of truth:",[1918,1919,1920,1928],"ul",{},[1758,1921,1922,1925,1926,1133],{},[903,1923,1924],{},"workflow_job.queued"," → nudge: reconcile may scale up (bounded by ",[903,1927,1648],{},[1758,1929,1930,1933,1934,1133],{},[903,1931,1932],{},"workflow_job.completed"," / idle timeout → nudge: reconcile may scale down (bounded by ",[903,1935,1633],{},[885,1937,1938,1939,1941,1942,1945],{},"Because the loop — not the webhook — is authoritative, a missed or delayed ",[903,1940,1052],{}," event never strands a group: the next reconcile pass converges it anyway. All long-running provisioning, scale, and drain steps run asynchronously over the platform's Kafka bus (",[903,1943,1944],{},"workflow.transition","), so a scale event never blocks an API call.",[931,1947,1948],{},[885,1949,1950,1951,1954],{},"Operations on the ",[889,1952,1953],{},"same group"," (provision, scale, teardown) are serialized by a Postgres advisory lock keyed on the group ID, so they can't race. Different groups scale fully in parallel.",[951,1956,1958],{"id":1957},"step-4-register-the-buildrunner-app","Step 4 — Register the build/runner app",[885,1960,1961],{},"Two registrations connect a group to your CI:",[1755,1963,1964,1980],{},[1758,1965,1966,1969,1970,906,1972,1975,1976,1979],{},[889,1967,1968],{},"The GitHub App"," (done once per org, at connection time) authorizes Orkestia to mint registration tokens and subscribe to ",[903,1971,1052],{},[903,1973,1974],{},"workflow_run"," events. This is set up when you create the GitHub connection (see ",[898,1977,1978],{"href":266},"Cloud connections",").",[1758,1981,1982,1985,1986,1156,1988,1156,1990,1992],{},[889,1983,1984],{},"The job labels."," Orkestia registers each runner with the labels you set on the group (e.g. ",[903,1987,1692],{},[903,1989,1701],{},[903,1991,1710],{},"). To route a job to the group, target those labels in your workflow YAML:",[1364,1994,1998],{"className":1995,"code":1996,"language":1997,"meta":1369,"style":1369},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","jobs:\n  build:\n    runs-on: [self-hosted, orkestia, prod-builds]\n    steps:\n      - uses: actions/checkout@v4\n      - run: make build\n","yaml",[903,1999,2000,2009,2016,2039,2046,2059],{"__ignoreMap":1369},[1373,2001,2002,2006],{"class":1375,"line":1376},[1373,2003,2005],{"class":2004},"swJcz","jobs",[1373,2007,2008],{"class":1379},":\n",[1373,2010,2011,2014],{"class":1375,"line":1383},[1373,2012,2013],{"class":2004},"  build",[1373,2015,2008],{"class":1379},[1373,2017,2018,2021,2023,2025,2027,2029,2032,2034,2037],{"class":1375,"line":1411},[1373,2019,2020],{"class":2004},"    runs-on",[1373,2022,1396],{"class":1379},[1373,2024,1687],{"class":1379},[1373,2026,1692],{"class":1402},[1373,2028,1643],{"class":1379},[1373,2030,2031],{"class":1402}," orkestia",[1373,2033,1643],{"class":1379},[1373,2035,2036],{"class":1402}," prod-builds",[1373,2038,1715],{"class":1379},[1373,2040,2041,2044],{"class":1375,"line":1426},[1373,2042,2043],{"class":2004},"    steps",[1373,2045,2008],{"class":1379},[1373,2047,2048,2051,2054,2056],{"class":1375,"line":1449},[1373,2049,2050],{"class":1379},"      -",[1373,2052,2053],{"class":2004}," uses",[1373,2055,1396],{"class":1379},[1373,2057,2058],{"class":1402}," actions/checkout@v4\n",[1373,2060,2061,2063,2066,2068],{"class":1375,"line":1470},[1373,2062,2050],{"class":1379},[1373,2064,2065],{"class":2004}," run",[1373,2067,1396],{"class":1379},[1373,2069,2070],{"class":1402}," make build\n",[885,2072,2073,2074,2076],{},"When a matching job is queued, GitHub emits ",[903,2075,1924],{},", Orkestia (via the dispatch/scaling workflows) decides whether a new runner is needed, and an execution picks the job up. No runner endpoint is exposed to you — the binding is entirely through GitHub labels.",[1068,2078,2079],{},[885,2080,2081,2082,2084,2085,2088],{},"In local development, GitHub ",[903,2083,1052],{}," events reach your machine through the DevKit CLI's hook redirect (see ",[898,2086,2087],{"href":184},"hooks in Platform Services",") rather than a public webhook URL, so you can exercise scaling against a real org without a public endpoint.",[951,2090,2092],{"id":2091},"step-5-monitor-health","Step 5 — Monitor health",[885,2094,2095,2096,2098],{},"Runner activity is surfaced as ",[903,2097,1944],{}," events on the same Kafka bus as the rest of the platform — there is no runners-specific log silo. The signals you watch:",[959,2100,2101,2114],{},[962,2102,2103],{},[965,2104,2105,2108,2111],{},[968,2106,2107],{},"Signal",[968,2109,2110],{},"Kind",[968,2112,2113],{},"Fires when",[978,2115,2116,2131,2147,2159,2171,2183],{},[965,2117,2118,2123,2126],{},[983,2119,2120],{},[903,2121,2122],{},"runner.group.provisioned",[983,2124,2125],{},"event",[983,2127,2128,2129],{},"Group reaches ",[889,2130,1791],{},[965,2132,2133,2141,2144],{},[983,2134,2135,906,2138],{},[903,2136,2137],{},"runner.group.scaled_up",[903,2139,2140],{},"scaled_down",[983,2142,2143],{},"event + metric",[983,2145,2146],{},"A scale DAG completes",[965,2148,2149,2154,2156],{},[983,2150,2151],{},[903,2152,2153],{},"runner.group.unhealthy",[983,2155,2125],{},[983,2157,2158],{},"A health check fails for the group",[965,2160,2161,2166,2168],{},[983,2162,2163],{},[903,2164,2165],{},"runner.job.picked_up",[983,2167,2125],{},[983,2169,2170],{},"A group runner starts a job (pickup-latency metric)",[965,2172,2173,2178,2180],{},[983,2174,2175],{},[903,2176,2177],{},"runner.job.completed",[983,2179,2125],{},[983,2181,2182],{},"A job finishes (utilization metric)",[965,2184,2185,2190,2192],{},[983,2186,2187],{},[903,2188,2189],{},"runner.group.archived",[983,2191,2125],{},[983,2193,2194],{},"Teardown completes",[885,2196,2197,2198,2201],{},"Health checks are periodic liveness probes. When a runner fails one, Orkestia ",[889,2199,2200],{},"deregisters it from GitHub and reaps the compute",", so a dead runner never sits in the pool starving the queue.",[885,2203,2204,2205,2208,2209,2212],{},"These signals are first-class in ",[898,2206,2207],{"href":78},"Lumen observability"," — pickup latency, utilization (% of time runners are busy), scale-event counts, and failure rate by environment all roll up there. See the ",[898,2210,2211],{"href":459},"observability guide"," for building runner dashboards and alerts.",[1034,2214,2215,2221],{},[1037,2216,2218],{"icon":16,"title":2217,"to":201},"Drift detection & self-healing",[885,2219,2220],{},"Orkestia continuously reconciles the desired group state against what actually exists in your cloud. Orphaned runners (compute gone but GitHub still shows them, or vice versa) are swept on the next health check. Read the deep dive for how reconciliation and self-healing work.",[1037,2222,2224],{"icon":198,"title":2223,"to":196},"Hybrid execution model",[885,2225,2226],{},"Runner provisioning and scaling are deterministic compiled workflows. Understand how Orkestia compiles DAGs and runs them efficiently.",[1888,2228,2230],{"id":2229},"common-failure-modes-what-to-do","Common failure modes & what to do",[959,2232,2233,2246],{},[962,2234,2235],{},[965,2236,2237,2240,2243],{},[968,2238,2239],{},"Symptom",[968,2241,2242],{},"Likely cause",[968,2244,2245],{},"Action",[978,2247,2248,2259,2270,2281,2294,2305],{},[965,2249,2250,2253,2256],{},[983,2251,2252],{},"New runners can't join, existing ones keep working",[983,2254,2255],{},"GitHub App token expired/revoked",[983,2257,2258],{},"Re-check the GitHub connection; re-authorize the App",[965,2260,2261,2264,2267],{},[983,2262,2263],{},"Scale-up DAG fails with a quota error",[983,2265,2266],{},"Provider quota hit (ECS tasks, EC2 instances, Cloud Run max-instances)",[983,2268,2269],{},"Raise the cloud quota; existing runners are unaffected",[965,2271,2272,2275,2278],{},[983,2273,2274],{},"GitHub shows zombie offline runners",[983,2276,2277],{},"Teardown failed after destroying compute but before deregistration",[983,2279,2280],{},"Wait for the reconciler sweep on next health check, or re-run teardown",[965,2282,2283,2286,2291],{},[983,2284,2285],{},"A scale decision didn't happen",[983,2287,2288,2290],{},[903,2289,1052],{}," webhook lost (network blip)",[983,2292,2293],{},"The reconcile loop converges the group on its next pass — a lost webhook self-heals, not a stuck group",[965,2295,2296,2299,2302],{},[983,2297,2298],{},"Provisioning fails at placement",[983,2300,2301],{},"Network profile references a deleted VPC/subnet",[983,2303,2304],{},"Fix the network profile; active groups are unaffected",[965,2306,2307,2310,2313],{},[983,2308,2309],{},"Scale-up fails at image pull",[983,2311,2312],{},"Provider can't reach the runner image",[983,2314,2315],{},"Check Aggregated Registry reachability; retryable",[951,2317,2319],{"id":2318},"step-6-decommission-a-group","Step 6 — Decommission a group",[885,2321,2322,2323,2326,2327,2330,2331,2334],{},"When you no longer need a group, archive it. Teardown ",[889,2324,2325],{},"drains"," in-flight jobs, ",[889,2328,2329],{},"revokes"," the GitHub registrations, and ",[889,2332,2333],{},"reaps"," the cloud resources — leaving no orphaned compute and no zombie runners on GitHub.",[1022,2336],{":edges":2337,":nodes":2338,"direction":1026},"[{\"from\":\"A\",\"to\":\"DR\",\"label\":\"stop accepting new jobs\"},{\"from\":\"DR\",\"to\":\"TD\",\"label\":\"in-flight jobs complete\"},{\"from\":\"TD\",\"to\":\"X\",\"label\":\"GitHub regs revoked, compute reaped\"}]","[{\"id\":\"A\",\"label\":\"active\",\"kind\":\"start\"},{\"id\":\"DR\",\"label\":\"draining\",\"kind\":\"engine\"},{\"id\":\"TD\",\"label\":\"teardown\",\"kind\":\"cloud\"},{\"id\":\"X\",\"label\":\"archived\",\"kind\":\"terminal\"}]",[885,2340,2341,2342,2345],{},"Because teardown is serialized per group by the advisory lock, you can safely archive one group while others keep serving. If teardown is interrupted mid-flight, the ",[898,2343,2344],{"href":201},"self-healing reconciler"," detects the partial state and completes the cleanup on the next sweep.",[951,2347,2349],{"id":2348},"limits-constraints","Limits & constraints",[1918,2351,2352,2368,2374,2380,2386,2395],{},[1758,2353,2354,2357,2358,2360,2361,2364,2365,918],{},[889,2355,2356],{},"GitHub Actions is the GA job source."," GitLab is a first-class ",[903,2359,912],{}," in the create wizard (",[903,2362,2363],{},"purpose=gitlab_runner","); Bitbucket and Jenkins are not in scope. See ",[898,2366,2367],{"href":723},"Purposes",[1758,2369,2370,2373],{},[889,2371,2372],{},"One GitHub org per group"," — cross-org runner sharing isn't modeled; multi-org users create multiple groups.",[1758,2375,2376,2379],{},[889,2377,2378],{},"Compute stays in your cloud"," — a broken cloud connection means a broken group, not an Orkestia fallback. You pay the provider directly.",[1758,2381,2382,2385],{},[889,2383,2384],{},"No cross-cloud pool"," — a group targets exactly one environment.",[1758,2387,2388,2391,2392,2394],{},[889,2389,2390],{},"Scaling is bounded by group policy"," — Orkestia never exceeds ",[903,2393,1648],{},", even under queue pressure.",[1758,2396,2397,2400],{},[889,2398,2399],{},"Not a millisecond-burst replacement"," — self-hosted runners scale in seconds-to-minutes, not the instant elasticity of GitHub-hosted ephemeral runners.",[951,2402,2404],{"id":2403},"where-to-go-next","Where to go next",[1034,2406,2407,2412,2421,2430,2436],{},[1037,2408,2409],{"icon":51,"title":900,"to":73},[885,2410,2411],{},"The conceptual model: groups, executions, and the control-plane posture.",[1037,2413,2415],{"icon":186,"title":2414,"to":695},"Runner group kinds",[885,2416,2417,2418,2420],{},"Every ",[903,2419,905],{},", required config, and purpose pairing.",[1037,2422,2424],{"icon":39,"title":2423,"to":165},"Runner reference",[885,2425,2426,2427,2429],{},"Browse the live ",[903,2428,1019],{}," workflow catalog and per-provider capability detail.",[1037,2431,2433],{"icon":80,"title":2432,"to":459},"Observability with Lumen",[885,2434,2435],{},"Build dashboards and alerts on runner pickup latency and utilization.",[1037,2437,2438],{"icon":259,"title":1079,"to":139},[885,2439,2440],{},"How Zero Code Custody and scoped connections apply to runner compute.",[2442,2443,2444],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":1369,"searchDepth":1376,"depth":1383,"links":2446},[2447,2448,2449,2450,2451,2454,2455,2458,2459,2460],{"id":953,"depth":1383,"text":954},{"id":1029,"depth":1383,"text":578},{"id":1082,"depth":1383,"text":1083},{"id":1351,"depth":1383,"text":1352},{"id":1802,"depth":1383,"text":1803,"children":2452},[2453],{"id":1890,"depth":1411,"text":1891},{"id":1957,"depth":1383,"text":1958},{"id":2091,"depth":1383,"text":2092,"children":2456},[2457],{"id":2229,"depth":1411,"text":2230},{"id":2318,"depth":1383,"text":2319},{"id":2348,"depth":1383,"text":2349},{"id":2403,"depth":1383,"text":2404},"Provision, scale, monitor, and decommission self-hosted GitHub Actions runners that live entirely in your own cloud","md",null,{},{"icon":136},{"title":133,"description":2461},"EdpHQJP895W6I-VfxY7ddjupMfmvDj3tzcAEH0rPwlg",[2469,2471],{"title":128,"path":129,"stem":130,"description":2470,"icon":131,"children":-1},"Compose existing workflows into a validated, versioned virtual workflow and expose it to your app's end-users through App Enablement",{"title":138,"path":139,"stem":140,"description":2472,"icon":141,"children":-1},"How Orkestia keeps customer code and data out of its custody, isolates every tenant by construction, and gives evaluators an audit trail they can hand to a reviewer",1790354042099]