Speech Route signing was the worst part of being new to macOS. Four strings had to agree. I wrote the model in Certificates, Identifiers, and Provisioning Profiles. This is the identifier in the middle of that model.
One name
Xcode, the Developer portal, the provisioning profile, and the app record. If one is different, upload fails in a language that does not say "bundle ID."
Empty Connect made it worse
There was no app record to match against. Every signing error looked local. It was not only local.
What I set first
Decide the bundle ID. Create the record. Generate the profile for that ID. Then write features. Hangar used that order and passed first time.