Mutation should fail but instead creates fake UIDs

It is wrong.

The explantion is that every mutation, every entity needs a existing UID.

It works. dgraph.type is part of the Type System. But if you query the exact predicates with the exact UID. You gonna see the data there. But yes, you need dgraph.type and also define that entity type in the schema.
See https://dgraph.io/docs/query-language/type-system/#sidebar