We pass `null` for the class name here:

https://github.com/elastic/elasticsearch/blob/f086dd18ddc705bf84a1ff99d35196ec2498fd52/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java#L261

However the class name is mandatory for the transport protocol today:

https://github.com/elastic/elasticsearch/blob/f086dd18ddc705bf84a1ff99d35196ec2498fd52/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java#L156

This prevents various APIs from working in a cluster with stable plugins installed.
server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java
private final boolean isModular;
    private final boolean isStable;
    /**
     * Construct plugin info.
     *
     * @param name                 the name of the plugin
     * @param description          a description of the plugin
     * @param version              an opaque version identifier for the plugin
     * @param elasticsearchVersion the version of Elasticsearch the plugin was built for
     * @param javaVersion          the version of Java the plugin was built with
     * @param classname            the entry point to the plugin
     * @param moduleName           the module name to load the plugin class from, or null if not in a module
     * @param extendedPlugins      other plugins this plugin extends through SPI
     * @param hasNativeController  whether or not the plugin has a native controller
     * @param isLicensed           whether is this a licensed plugin
     * @param isModular            whether this plugin should be loaded in a module layer
     */
    public PluginDescriptor(
        String name,
        String description,
        String version,
        Version elasticsearchVersion,
        String javaVersion,
        String classname,
        String moduleName,
        List<String> extendedPlugins,
        boolean hasNativeController,
        boolean isLicensed,
        boolean isModular,
        boolean isStable