### Description

This is a followup to #85926.

As part of the ingest processing pipeline, we call `CollectionUtils.ensureNoSelfReferences(...)` to ensure that a script processor didn't accidentally introduce a circular object. However, this check is only necessary if we know there was the potential for a circular option, which can only happen with either a custom processor (a plugin where we have no control), or a script processor. We should be able to only call this sanity check if we know we need it, rather than for every document.
server/src/main/java/org/elasticsearch/action/index/IndexRequest.java
super(shardId, in);
        if (in.getVersion().before(Version.V_8_0_0)) {
            String type = in.readOptionalString();
            assert MapperService.SINGLE_MAPPING_NAME.equals(type) : "Expected [_doc] but received [" + type + "]";
        }
        id = in.readOptionalString();
        routing = in.readOptionalString();
        source = in.readBytesReference();
        opType = OpType.fromId(in.readByte());
        version = in.readLong();
        versionType = VersionType.fromValue(in.readByte());
        pipeline = in.readOptionalString();
        if (in.getVersion().onOrAfter(Version.V_7_5_0)) {
            finalPipeline = in.readOptionalString();
        }
        if (in.getVersion().onOrAfter(Version.V_7_5_0)) {
            isPipelineResolved = in.readBoolean();
        }
        isRetry = in.readBoolean();
        autoGeneratedTimestamp = in.readLong();
        if (in.readBoolean()) {
            contentType = in.readEnum(XContentType.class);
        } else {
            contentType = null;
        }
        ifSeqNo = in.readZLong();
        ifPrimaryTerm = in.readVLong();
        if (in.getVersion().onOrAfter(Version.V_7_10_0)) {
            requireAlias = in.readBoolean();
        } else {