Found it — the plugin header itself is fine, but the zip’s folder structure is the problem. WordPress scans only the top level of the uploaded zip for a PHP file with a valid plugin header. Here, ticket-plugin.php is buried two levels deep at ticket-plugin-fixed/ready/ticket-plugin.php, so WordPress never finds it and reports “No valid plugins were found.”
Let me repackage it correctly — the folder structure needs to be plugin-folder/ticket-plugin.php at the top.
The plugin code itself was fine — the header, files, and code were all in order. The problem was purely the zip’s folder layout: it was nested as ticket-plugin-fixed/ready/ticket-plugin.php, and WordPress only scans the top level of an uploaded zip for a file with a valid plugin header, so it saw nothing to install.
I repackaged it with ticket-plugin.php sitting directly inside a single top-level event-ticket-manager folder (nothing else changed) — that should install cleanly now.