A numeric profile id (DB row id or falsy sentinel) handed to
normalize_profile_name() was silently str()'d into a real profile name:
`0` → `profiles/0/` bootstrap with no config.yaml (phantom profile
created on desktop first launch, #88842).
normalize_profile_name now raises ValueError for non-string input;
callers holding a numeric id must resolve it to an actual profile name
first. A literal "0" typed by a user remains a legal explicit name.