{ confirmEnable = false toggleChecked = enabled }} onConfirmed={async () => { confirmEnable = false await setIsolation(true) }} >

{#if workspaces === undefined} Every dev workspace and fork {:else} {pluralize(devWorkspaces.length, 'dev workspace or fork', 'dev workspaces and forks')} {/if} will have their jobs queued until a worker group serves them.

{#if flaggedGroups.length === 0} No worker group is flagged as serving dev workspaces yet. {:else} The worker groups serving dev workspaces ({flaggedGroups.map((g) => g.name).join(', ')}) have no live worker. {/if} Jobs never fall back to the other worker groups: they wait in the queue and run as soon as a serving worker is up.

{#if unflaggedGroupNames.length > 0 && flaggedGroups.length === 0}
{/if}
{ confirmDisable = false toggleChecked = enabled }} onConfirmed={async () => { confirmDisable = false await setIsolation(false) }} >

New jobs of dev workspaces and forks will run on the same worker groups as root workspaces again. Jobs already queued on a {effectiveSuffix} tag keep it, and the worker groups serving dev workspaces still run them.

{#snippet isolationToggle()} onToggle(e.detail)} disabled={!canEdit || !$enterpriseLicense || saving || suffix === undefined} options={{ right: 'Run dev workspaces and forks on separate workers' }} size="xs" /> {/snippet}
{#snippet action()} {@render isolationToggle()} {/snippet} {#snippet badge()} {@render isolationToggle()} {/snippet}
Root workspaces Worker groups not serving dev workspaces, on their usual tags: python3, gpu Dev workspaces and forks {#if enabled} Worker groups serving dev workspaces, on tags suffixed with {effectiveSuffix}: {:else} Once on, worker groups serving dev workspaces, on suffixed tags: {/if} {withDevSuffix('python3', effectiveSuffix)}, {withDevSuffix('gpu', effectiveSuffix)}

A workspace with a parent, and every fork (including a fork whose parent was deleted), counts as a dev workspace, unless forks of non-dev workspaces are left out below. Every job is covered: runs, previews, schedules, triggers, flow steps, AI agent tools and dependency jobs, and inline runs are refused on workers not serving dev workspaces. A job whose tag no serving worker listens to stays queued: it never falls back to the other worker groups. Dedicated workers keep their own tags.

setSkipNonDevForks(e.detail)} disabled={!canEdit || !$enterpriseLicense || saving || suffix === undefined} options={{ right: "Don't isolate forks of non-dev workspaces" }} size="xs" /> A fork with no dev workspace above it, like a fork of a production workspace or a fork of that fork, runs on the same workers as that production workspace. Dev workspaces and their forks stay isolated. Restrict who can create such forks with the Disable workspace forking protection rule of each such workspace and fork. {#if skipNonDevForks && workspaces !== undefined} {pluralize(nonDevForkCount, 'fork')} currently {nonDevForkCount === 1 ? 'runs' : 'run'} outside isolation. {/if} {#if skipNonDevForks && forkableRoots && forkableRoots.length > 0} Anyone who can fork {#each forkableRoots.slice(0, 5) as id, i (id)} {i > 0 ? ', ' : ''}{workspaceNames[id] ?? id} {/each}{forkableRoots.length > 5 ? ` and ${forkableRoots.length - 5} more` : ''} can run jobs on {forkableRoots.length === 1 ? 'its' : 'their'} workers. Add a Disable workspace forking protection rule to {forkableRoots.length === 1 ? 'it' : 'them'}, bypassed by the people allowed to fork, or isolate these forks again. {/if}
Worker groups serving dev workspaces {#if flaggedGroups.length > 0}
{#each flaggedGroups as g (g.name)} {/each}
{:else} None yet. {/if} {#if canEdit && unflaggedGroupNames.length > 0}