getRealPath(); if (! is_string($path)) { continue; } // Skip the catalog itself to avoid tautology. if (str_ends_with($path, '/Support/OperationCatalog.php')) { continue; } $contents = File::get($path); // Capture common patterns where operation type strings are produced in code. // Example: ensureRun(type: 'inventory.sync', ...) if (preg_match_all("/(?:\btype\s*:\s*|\btype\b\s*=>\s*)'([a-z0-9_]+(?:\.[a-z0-9_]+)+)'/i", $contents, $matches)) { foreach ($matches[1] as $type) { $discoveredTypes[] = $type; } } // Example: if ($run->type === 'inventory.sync') if (preg_match_all("/\btype\s*(?:===|!==|==|!=)\s*'([a-z0-9_]+(?:\.[a-z0-9_]+)+)'/i", $contents, $matches)) { foreach ($matches[1] as $type) { $discoveredTypes[] = $type; } } // Example: in_array($run->type, ['a.b', 'c.d'], true) if (preg_match_all("/\bin_array\([^\)]*\[([^\]]+)\]/i", $contents, $matches)) { foreach ($matches[1] as $list) { if (preg_match_all("/'([a-z0-9_]+(?:\.[a-z0-9_]+)+)'/i", $list, $inner)) { foreach ($inner[1] as $type) { $discoveredTypes[] = $type; } } } } } $discoveredTypes = array_values(array_unique($discoveredTypes)); $unknownTypes = array_values(array_diff($discoveredTypes, $knownTypes)); expect($unknownTypes) ->toBeEmpty(); })->group('ops-ux');