EDIT - using Balder's solution I came up with the following that seems to do the trick, I couldn't get it to work the way it was described I could only get one message to show up for one duplicate not all of them but modifying my original approach to use the message tool and the test tool I get all the messages to come up and the workflow to stop on the error. The rest of the flow you would build off the Unique branch of the duplicate check.
I can't get you all the way there as I'm just a newbie myself, but you could put a Summary Tool in the flow and group by the Reference field, and count by the reference tool then feed the result into a test tool that looks at if the count of reference is less than 2 and if it isn't the test produces an error. If you save that as an application and run it you even get a popup telling you it's an error. In the interface tools there's probably a more elegant solution to this but at least this is a start for ideas.
If you look in the workflow I provided you'll see an extra little bit of code in the expression required to make the [Reference] show up. Since in your example the [Reference] is a numeric value Alteryx reads it as a number and you can't add a number to text. If you add the TOSTRING([Reference]) to your expression you should find the reference gets pulled in because it forces the value in [Reference] into a string format and then it will add to your expression. You might also want to add a space to the end of your first text block and to the beginning of the second block so your reference doesn't mash into your text.
"The reference: " + TOSTRING([Reference]) + " is duplicated"
Let me know if my solution worked for you and if so don't forget to mark it as solved so others can benefit when they search for something along the same lines they'll be able to quickly go to the solution.