The API for (3) is getPayload, where the proposer sends the signed blinded beacon block to the relay, at which point the block will be proposed by the relay.
The builder running the Builder API is expected to respond with the full execution payload upon seeing the blinded block proposal. This allows the validator to create a “signed” Beacon block, which they propagate throughout the network.
A validator using the Builder API is still expected to build a block locally in case the block builder fails to respond promptly, so they don’t miss out on block proposal rewards. However, validator cannot create another block using either the now-revealed transactions or another set, as it would amount to equivocation (signing two blocks within the same slot), which is a slashable offense.
I initially thought that the “sign” by the proposer simply involved signing the header with a private key and then sending that signed data to the builder.
However, after looking at ethereum.org, I’ve come to understand that the signed block header is created within the consensus client, and that data is then transmitted.