[ 'rounds_per_run' => 100, 'command' => 'php tests/agent_100_round_regression.php', ], 'llm' => [ 'rounds_per_run' => 100, 'command' => 'php tests/llm_100_round_regression.php', ], ]; $root = dirname(__DIR__); $exitCode = 0; $runCommand = static function (string $command, string $workingDir): array { $descriptorSpec = [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['redirect', 1], ]; $process = proc_open($command, $descriptorSpec, $pipes, $workingDir); if (!is_resource($process)) { throw new RuntimeException('Unable to start command: ' . $command); } fclose($pipes[0]); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $status = proc_close($process); return [ 'stdout' => $stdout === false ? '' : $stdout, 'status' => $status, ]; }; $runFixedSuite = static function (string $name, int $targetRounds, array $config) use ($root, $runCommand): int { $completed = 0; $runIndex = 0; while ($completed < $targetRounds) { $runIndex++; $result = $runCommand($config['command'], $root); $output = trim($result['stdout']); if ($output !== '') { echo $output . PHP_EOL; } if ((int) $result['status'] !== 0) { throw new RuntimeException(sprintf( '%s suite failed on batch %d after %d rounds', strtoupper($name), $runIndex, $completed )); } $completed += (int) $config['rounds_per_run']; printf( "%s PROGRESS %d/%d rounds\n", strtoupper($name), min($completed, $targetRounds), $targetRounds ); } return $completed; }; $runImageSuite = static function (int $targetRounds) use ($root, $runCommand): int { $bestRegressionCount = null; $bestIntegrationCount = null; for ($regressionCount = intdiv($targetRounds, 79); $regressionCount >= 0; $regressionCount--) { $remaining = $targetRounds - ($regressionCount * 79); if ($remaining < 0 || $remaining % 2 !== 0) { continue; } $bestRegressionCount = $regressionCount; $bestIntegrationCount = intdiv($remaining, 2); break; } if ($bestRegressionCount === null || $bestIntegrationCount === null) { throw new RuntimeException('Unable to build an image-suite plan for ' . $targetRounds . ' rounds'); } $completed = 0; for ($index = 1; $index <= $bestRegressionCount; $index++) { $result = $runCommand('php tests/comfy_image_edit_regression.php', $root); $output = trim($result['stdout']); if ($output !== '') { echo $output . PHP_EOL; } if ((int) $result['status'] !== 0) { throw new RuntimeException(sprintf( 'IMAGE regression batch %d failed after %d rounds', $index, $completed )); } $completed += 79; printf("IMAGE PROGRESS %d/%d rounds\n", min($completed, $targetRounds), $targetRounds); } for ($index = 1; $index <= $bestIntegrationCount; $index++) { $result = $runCommand('php tests/comfy_image_edit_integration.php', $root); $output = trim($result['stdout']); if ($output !== '') { echo $output . PHP_EOL; } if ((int) $result['status'] !== 0) { throw new RuntimeException(sprintf( 'IMAGE integration batch %d failed after %d rounds', $index, $completed )); } $completed += 2; printf("IMAGE PROGRESS %d/%d rounds\n", min($completed, $targetRounds), $targetRounds); } return $completed; }; $targets = $suite === 'all' ? ['agent', 'image', 'llm'] : [$suite]; $summary = []; foreach ($targets as $target) { try { if ($target === 'image') { $completed = $runImageSuite($rounds); } else { $completed = $runFixedSuite($target, $rounds, $scripts[$target]); } $summary[$target] = ['completed' => $completed, 'failed' => false]; } catch (Throwable $exception) { $summary[$target] = [ 'completed' => $summary[$target]['completed'] ?? 0, 'failed' => true, 'message' => $exception->getMessage(), ]; fwrite(STDERR, strtoupper($target) . ' FAILURE: ' . $exception->getMessage() . PHP_EOL); $exitCode = 1; break; } } foreach ($summary as $name => $item) { printf( "%s RESULT completed=%d failed=%s%s\n", strtoupper($name), (int) ($item['completed'] ?? 0), ($item['failed'] ?? false) ? 'true' : 'false', !empty($item['message']) ? ' message=' . $item['message'] : '' ); } exit($exitCode);