Points and shapes are not required to have an unique .index. On the other hand the instance_key obs column of a table requires unique values, and usually shapes (more rarely also points) are annotated by a table. So effectively the uniqueness constraint of the instance_key obs column is transferred to the .index of the shapes or points dataframe.
This can create confusion (one could understand that the index of points and shapes is always unique). For instance this bug #1105 is related to non-uniqueness of Xenium transcripts.
When the new design for inter-element relationships lands (see https://github.com/BiocCodingCollaborations/VeniceHackathon2026/tree/main/interoperability/relationships), this case should be clarified. Also validators will be added to detect/ensure uniqueness when expected.
CC @timtreis
Points and shapes are not required to have an unique
.index. On the other hand theinstance_keyobs column of a table requires unique values, and usually shapes (more rarely also points) are annotated by a table. So effectively the uniqueness constraint of theinstance_keyobs column is transferred to the.indexof the shapes or points dataframe.This can create confusion (one could understand that the index of points and shapes is always unique). For instance this bug #1105 is related to non-uniqueness of Xenium transcripts.
When the new design for inter-element relationships lands (see https://github.com/BiocCodingCollaborations/VeniceHackathon2026/tree/main/interoperability/relationships), this case should be clarified. Also validators will be added to detect/ensure uniqueness when expected.
CC @timtreis