Define the checks each qualifying server must pass.

Manual promotion
{#if choosingPreset}
{#each builtInPlans as preset, index (preset.name)} {/each}
{#if savedPresets.length} {/if} {/if} {#if message}
{message}
{/if} {#if error}{/if} {#if issues.length}{/if}
Your active plan

{matchingPreset?.name ?? 'Custom plan'}

{plan.requirements.length} requirement{plan.requirements.length === 1 ? '' : 's'}
Must pass on
{coverageSummary(plan)}
Testing window
{plan.timeoutHours} hours from opening
If a check fails
{failureSummary}

Every requirement below must pass on each qualifying server. You can edit any check.

{#if plan.requirements.some(needsGameTelemetry)}

Gameplay progress comes from game start, round change, and game end reports.

{/if}
{#each plan.requirements as r, index (r.id)}
{String(index + 1).padStart(2, '0')}
{requirementCategory(r)}
{requirementSummary(r)}
Edit requirement {requirementLabels[r.kind]}
{#if r.kind !== 'manual'} {/if} {#if ['round', 'matches', 'populated-minutes', 'player-hours', 'sustained-population'].includes(r.kind)} {/if} {#if r.kind === 'matches'} {/if} {#if r.kind === 'matches'} {/if}
{#if needsGameTelemetry(r)}

Uses game events reported by this server automatically.

{:else if r.kind === 'recovery'}

After the other requirements pass, restart when empty and repeat them. Every cycle requires fresh evidence and checklist sign-off.

{:else if r.kind === 'failure-budget'}

Counts transitions from healthy to unhealthy. Missing or stale monitoring resets continuous healthy time.

{:else if r.kind === 'manual'}

A tester records their name and observation on the beta detail page.

{/if}
{:else}
No requirements yet

Choose a preset above or add your first check below. A beta needs at least one requirement.

{/each}
Coverage & waves{coverageSummary(plan)} · {waveSummary}Configure
{#if plan.scope === 'quorum'}{/if}

Each wave must fully pass before files reach the next wave. Coverage rules apply after all selected servers have started testing. Restarts always wait for empty servers.

Deadline & failure handling{plan.timeoutHours}-hour window · {failureSummary}Configure

Waiting for empty servers uses this window. Pausing and retrying do not extend it. Missing evidence at the deadline is inconclusive. Health checks continue until you manually promote.

Save this plan as a presetReuse your requirements and settings on future betas.Save