### CI Link

https://gradle-enterprise.elastic.co/s/ym6b3yayxtusy/tests/:x-pack:plugin:async-search:internalClusterTest/org.elasticsearch.xpack.search.AsyncSearchActionIT/testCCSCheckCompatibility

### Repro line

./gradlew ':x-pack:plugin:async-search:internalClusterTest' --tests "org.elasticsearch.xpack.search.AsyncSearchActionIT.testCCSCheckCompatibility"

### Does it reproduce?

Yes

### Applicable branches

main

### Failure history

_No response_

### Failure excerpt

In `AsyncSearchActionIT.testCCSCheckCompatibility` and `TransportTermsEnumActionTests.TransportTermsEnumActionTests` the code assumes that it can send a request that uses the current transport version (see `DummyQueryBuilder` / `VersionedNamedWriteable` ) and that will always be incompatible with the `MINIMUM_CCS_VERSION`

However since the move to `TransportVersion` it is no longer the case that a node on the next node version will be incompatible with the previous node version (which is what `MINIMUM_CCS_VERSION` tracks). In fact, immediately after a version number they will be identical - that is, `TransportVersion.current()` will be the same version as `TransportVersion.MINIMUM_CCS_VERSION`

This causes these tests to fail until the transport version is bumped.

- https://github.com/elastic/elasticsearch/blob/6420924e314c9e154617055f1c91fa9d5f084049/x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchActionIT.java#L534
- https://github.com/elastic/elasticsearch/blob/4d3fb8d9938236dd7d6de2cae614fa8a34f66862/server/src/main/java/org/elasticsearch/TransportVersion.java#L224
 
For the test to work within the current assumptions it would need to get a `TransportVersion` that is after `MINIMUM_CCS_VERSION`, but `TransportVersionUtils` doesn't offer a way to create such a version on the fly (it has to already exist).

server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java
DiscoveryNode remoteSeedNode = remoteSeedTransport.getLocalDiscoNode();
            knownNodes.add(remoteSeedNode);
            nodes[i] = remoteSeedNode;
            settingsBuilder.put("cluster.remote.remote" + i + ".seeds", remoteSeedNode.getAddress().toString());
            remoteIndices.put("remote" + i, new OriginalIndices(new String[] { "index" }, IndicesOptions.lenientExpandOpen()));
        }
        return mockTransportServices;
    }
    private static SearchResponse emptySearchResponse() {
        InternalSearchResponse response = new InternalSearchResponse(
            new SearchHits(new SearchHit[0], new TotalHits(0, TotalHits.Relation.EQUAL_TO), Float.NaN),
            InternalAggregations.EMPTY,
            null,
            null,
            false,
            null,
            1
        );
        return new SearchResponse(response, null, 1, 1, 0, 100, ShardSearchFailure.EMPTY_ARRAY, SearchResponse.Clusters.EMPTY, null);
    }
    public void testCCSRemoteReduceMergeFails() throws Exception {
        int numClusters = randomIntBetween(2, 10);
        DiscoveryNode[] nodes = new DiscoveryNode[numClusters];
        Map<String, OriginalIndices> remoteIndicesByCluster = new HashMap<>();
        Settings.Builder builder = Settings.builder();
        MockTransportService[] mockTransportServices = startTransport(numClusters, nodes, remoteIndicesByCluster, builder);
        Settings settings = builder.build();
        boolean local = randomBoolean();
        OriginalIndices localIndices = local ? new OriginalIndices(new String[] { "index" }, SearchRequest.DEFAULT_INDICES_OPTIONS) : null;
        TransportSearchAction.SearchTimeProvider timeProvider = new TransportSearchAction.SearchTimeProvider(0, 0, () -> 0);