While verifying #3407 I found three sources of process-level nondeterminism that survive canonicalize_rdf_graph because they're upstream of it. Not blockers for #3407 — pre-existing on main, just newly visible.
-
SHACL — _build_ignored_properties (shaclgen.py:476) emits a Python set() as an rdf:first/rdf:rest list, so element order varies with PYTHONHASHSEED. The graphs are not RDF-isomorphic across runs, so RDFC-1.0 can't normalize them. Fix is one-line: sort before emitting.
-
RDFGen — injects linkml:generation_date timestamp; JSON-LD parse step also picks up dict-ordering noise.
-
Metamodel OWL — bibo:status testing annotations serialize to scheme-less <testing> IRIs. pyoxigraph rejects → canonicalize_rdf_graph falls back to rdflib (non-deterministic). 32 such triples in the metamodel.
Each reproduces by running the relevant generator 3× in fresh processes and diffing.
While verifying #3407 I found three sources of process-level nondeterminism that survive
canonicalize_rdf_graphbecause they're upstream of it. Not blockers for #3407 — pre-existing onmain, just newly visible.SHACL —
_build_ignored_properties(shaclgen.py:476) emits a Pythonset()as anrdf:first/rdf:restlist, so element order varies withPYTHONHASHSEED. The graphs are not RDF-isomorphic across runs, so RDFC-1.0 can't normalize them. Fix is one-line: sort before emitting.RDFGen — injects
linkml:generation_datetimestamp; JSON-LD parse step also picks up dict-ordering noise.Metamodel OWL —
bibo:status testingannotations serialize to scheme-less<testing>IRIs. pyoxigraph rejects →canonicalize_rdf_graphfalls back to rdflib (non-deterministic). 32 such triples in the metamodel.Each reproduces by running the relevant generator 3× in fresh processes and diffing.