The newExternalWorkflowStub method ensures Workflows remain deterministic how?

In the How to Send Signals section of the “Signalling Your Workflows” chapter of the “Interacting with Workflow with Java” course, is this paragraph:

Another reason we use the newExternalWorkflowStub method is to ensure that Workflows remain deterministic. Recall that one aspect of deterministic Workflows means not directly making network calls from the Workflow. This means that developers cannot use a Temporal Client directly within the Workflow code to send Signals or start other Workflows. Instead, to communicate between Workflows, we use newExternalWorkflowStub to both ensure that Workflows remain deterministic and also that these interactions are recorded as Events in the Workflow’s Event History.

I understand the part about recording Events, but I do not understand the rest. I know what “deterministic” means, but how does using newExternalWorkflowStub ensure that Workflows remain deterministic? How does the alternative fail to do so?

The client makes gRPC requests to the Temporal service, so it is not different from any other API that performs external IO. External IO is not deterministic, as it can return different results for the same requests. This happens even for read-only immutable data, as requests can sometimes return failures instead of data.

The external stub generates commands that are sent to the Temporal Service as part of the workflow task completion.