Support multi-game betas with automatic server selection

This commit is contained in:
2026-10-07 09:41:17 -04:00
parent a6dee8c5e2
commit c6352d86b4
17 changed files with 881 additions and 173 deletions
+9 -1
View File
@@ -158,8 +158,16 @@ async function advancePlan(stored: StoredPlan): Promise<void> {
}
const registry = db().prepare('SELECT server AS name, game, map FROM beta_test_coverage WHERE beta_id = ?').all(id) as Array<{ name: string; game: string | null; map: string | null }>;
// All waves must be activated, even when the final coverage rule is a quorum.
// A passing server proves only its assigned files. A quorum or coverage
// group must not pass an unrelated game/map's untested bundle member.
const ready = !queued.length && updated.every(s => !!currentRun(id, s.server)?.observing_at)
&& coveragePassed(plan, updated.map(s => ({ ...registry.find(r => r.name === s.server)!, passed: s.stage === 'ready' })));
&& coveragePassed(plan, updated.map(s => ({ ...registry.find(r => r.name === s.server)!, passed: s.stage === 'ready' })))
&& !db().prepare(`SELECT 1 FROM beta_scripts files WHERE files.beta_id = ? AND NOT EXISTS (
SELECT 1 FROM beta_server_scripts members JOIN beta_servers servers
ON servers.beta_id = members.beta_id AND servers.server = members.server
WHERE members.beta_id = files.beta_id AND members.script_id = files.script_id
AND servers.server_deleted_at IS NULL AND servers.stage = 'ready'
) LIMIT 1`).get(id);
betaState(id, ready);
setOutcome(id, ready ? 'passed' : 'active', null);
}