As you can see, this is a long topic, and it comes up a lot.
There is no correct answer either.
When a host application sends data to Speckle using our Connectors, the Speckle ID is a hash of that’s objects content. This registers that version of the object uniquely in the database. Change the source object in the host application, and a subsequent send will produce a new entry in the Speckle DB.
To track that the element is a new version of an existing one, the Connector apply the internal ID from the host application as applicationId
. This is used alongside the Connector cache to see what is new, deleted or updated (within the same host application)
If that data is received in a different application, then the conversion of Speckle to Native produces a brand new object in the target application. By default, this application will have its internal db for objects and their IDs - using the source application_id
may work, or it may not.
If that object is now native in the target application and is sent to Speckle, it will have a new speckle_id
and quite possibly a new application_id
. This will almost certainly be seen as a newly created element in the original host application.
A user’s experience in all of this will vary between a single user and a multiplayer experience depending on whether caches are present on a machine or a source file.
What has come up before and is a source of significant continuing debates in the Speckle team, and what is, I think, insinuated by your post is a need for Yet Another ID (YAID)? Upon first publishing to Speckle, a unique canonical ID is generated and maintained on all those paths into and out of Connectors and the Speckle DB.
You correctly state that IFC elements have a unique ID separate from the source applications. In your experience, is this retained as an immutable ID on Interop? My experience is that it isn’t always, or at least inconsistently and cannot be 100% relied upon.
As I said, there is no correct answer, and we have many opinions internally on the best solution, which frankly doesn’t reliably exist outside of the Speckle ecosystem either for multiplayer and/or roundtrip interop workflows.