{ if (event.key === 'Escape' && menuOpen) { menuOpen = false; menuElement?.querySelector('button')?.focus(); } }} />

{title}

{view.policy.mode === 'off' ? 'Paused' : 'Enabled'}
{#if canOperate}
{#if menuOpen}
{#if view.unsettled.length}

Pause this policy and wait for outstanding jobs to finish before deleting it.

{/if}
{/if}
{/if}

{view.policy.mapSlug === '*' ? 'Per map: ' : ''}Min {view.policy.minimum} · Max {view.policy.maximum} · Spare target {view.policy.spares} · Remove after {view.policy.emptyMinutes} minutes empty

{view.snapshot.keyPool.available} / {view.snapshot.keyPool.total} game keys available · Shared across {view.policy.game.toUpperCase()}

{#if !view.unsettled.length || globallyPaused || view.policy.mode === 'off' || view.policy.pausedReason}
{healthyCoverage ?? status.label} {#if status.reason}{status.reason}{/if}
{/if} {#each view.unsettled as operation (operation.id)} {@const member = view.snapshot.members.find(member => member.operationId === operation.id)} {@const needsAttention = ['failed', 'interrupted', 'manual', 'unknown', 'cancelled', 'warning'].includes(operation.state)}
{needsAttention ? 'Review' : operation.action === 'destroy' ? 'Removing' : 'Creating'} {member ? lobbyLabel(member.name) : 'lobby'}{needsAttention ? ' job' : ''}

{operation.stage || 'Waiting for the next provisioning update.'}

{/each}
{#if tab === 'lobbies' && view.policy.mapSlug === '*' && !healthyCoverage}{covered} / {mapCount} maps meet spare target{/if}
{#if tab === 'lobbies'}
{#each groups as group (group.slug)} {#each group.members as member, index (member.name)} {@const pending = member.state === 'creating' || member.state === 'removing'} {@const number = parseServerName(member.name)?.lobby} {:else} {/each} {/each}
Map / lobbyStatePlayersLatest observation
{#if member.blocker && !activeIds.has(member.operationId ?? '')}{scalingReason(member.blocker)}{/if} {memberStatus(member.state)}{#if member.operationId}View job{/if} {member.players ?? '—'} {#if member.observedAt !== null}{:else}{pending ? 'Awaiting first observation' : 'No recent observation'}{/if}
{group.label}{#if group.target}0 / {group.target} spares{/if}
No lobbies yet
{#each view.snapshot.blockers.filter(blocker => scalingReason(blocker) !== status.reason && blocker !== 'Autoscaling is globally paused.') as blocker}

{scalingReason(blocker)}

{/each} {:else if tab === 'activity'}

Recent decision changes · Provisioning updates are grouped by job.

    {#each activity as item (item.id)}
  1. {item.action === 'create' ? 'Creation requested' : item.action === 'destroy' ? 'Removal requested' : item.operationId ? 'Provisioning in progress' : 'Scaling evaluated'}{item.server ? ` · ${lobbyLabel(item.server)}` : ''}{#if item.operationState}{/if}
    {#if !item.operationId || !activeIds.has(item.operationId)}

    {item.reason}

    {/if}
    {#if item.evaluations > 1}{item.evaluations} decision changes{/if}{#if item.operationId}View job{/if}
  2. {:else}
  3. No scaling activity yet.
  4. {/each}
{:else}

Last 31 days · {view.totals.observedMinutes.toFixed(1)} minutes observed

{#if view.operations.readinessSamples}

Request to verified readiness: {view.operations.readinessMeanSeconds?.toFixed(0)}s average · {view.operations.readinessMaxSeconds?.toFixed(0)}s maximum · {view.operations.readinessSamples} completed creates

{/if}

Observation gaps are excluded. Readiness includes queue time and does not confirm server browser visibility or successful joins.

{/if}
Checks every 15 seconds · Last evaluated: {view.lastEvaluatedAt ? dates(view.lastEvaluatedAt) : 'Not evaluated yet'}