Peter,
That's an excellent question about the structure of cloud data persistence. It gets to the core of how Wolfram Cloud organizes user content.
The answer is that CloudExpression names do NOT have to be globally unique, but they must be unique within their cloud folder location.
Uniqueness Requirement (Local)
When you use the simple form of CreateCloudExpression["test"], it is automatically placed in your home directory (cloud:///) by default. If you try to create another one named "test" in that exact same location, you will get an error because the full cloud path to the resource must be unique:
cloud:///test (Already exists)
cloud:///test (Fails)
However, you can successfully create a second expression named "test" if you place it in a different directory:
CreateDirectory["cloud:///data/"];
CreateCloudExpression["cloud:///data/test"]; (* Success! *)
The full unique identifiers are:
CloudExpression["cloud:///test"]
CloudExpression["cloud:///data/test"]
Allowed Characters
It is perfectly okay to have spaces and non-alphanumeric characters in CloudExpression names.
The Wolfram Cloud system handles these characters correctly, often by encoding them automatically.
However, as a best practice, using mostly alphanumeric characters (A-Z, a-z, 0-9) and hyphens or underscores (-, _) is generally recommended for cloud objects (including CloudExpression names) because it makes them easier to reference in URLs, APIFunction calls, and WolframScript executions.
Example of a Valid Name
CreateCloudExpression["My Project Data (April)"];
Hope this helps...Go Thundering Herd!