# Where the HQDM inputs came from HQDM is published as two files that disagree about what HQDM is. The figure draws both, under the same checks, and every count in it is recomputed from these inputs by `tests/hqdm_audit_asset_test.rs`. ## `asserted.tsv`: the RDFS rendering `hqdmTop/hqdmFramework`, path `rdf/hqdm-0.0.1-alpha.ttl`, 79,623 bytes. MagmaCore vendors the same file at `examples/src/test/resources/hqdm-0.0.1-alpha.ttl`. The two are **byte identical**, verified with `cmp`, so the audit is of upstream HQDM and not of something MagmaCore changed. `asserted.tsv` is that file with its three prefixes expanded and one triple per line, subject, predicate, object, tab separated. Nothing is added, removed or reordered: 1,094 triples in, 1,094 out. It parses as a flat `S P O .` grammar because the source uses no blank nodes, no lists and no literals. Its whole predicate inventory is `rdf:type` 210, `rdfs:subClassOf` 372, `rdfs:domain` 257, `rdfs:range` 255. It contains no `owl:` term and no disjointness axiom, so no named class in it can be unsatisfiable and a coherence check on it returns zero however carefully it is run. ## `hqdm.owl` and `owl-rows.tsv`: the OWL rendering `gchq/HQDM`, file `hqdm.owl`, RDF/XML, 366,581 bytes, Apache-2.0, Crown Copyright. sha256 `be27ee353e2fefe7…47caff8`, the same file the OM 2026 paper measured. It is vendored here unchanged so the test below can reason over it. `owl-rows.tsv` is that file read by rdflib 7.6.0 and written one triple per line in the same tab-separated form: 3,127 triples in, 3,127 out. Blank nodes are written `_:label` and literals in double quotes; the well-formedness checks only read rows whose subject and object are IRIs, so neither matters to them. It carries 234 `owl:Class` declarations (229 named, the rest anonymous), 14 `owl:disjointWith` axioms and 268 qualified cardinality restrictions. ## `owl-dl.json`: this engine's run over `hqdm.owl` open-ontologies batch --data-dir <<'B' load docs/assets/hqdm/hqdm.owl reason owl-dl B with `/config.toml` raising the per-phase budget: [reasoner] tableaux_test_timeout_ms = 120000 classify_timeout_ms = 900000 The SHIQ tableaux checks 229 named classes, finds **190 satisfiable** and **39 unsatisfiable**, and leaves **none undetermined**, in 91 ms. `complete` is `false` and `search_finished` is `true`: the file has 23 restrictions on datatype properties, which this engine reads only approximately, and the run names them under `constructs_not_modelled`. The file keeps the fields the figure reads and drops the inferred subsumptions. `the_reasoner_still_gives_the_committed_verdicts` in the test recomputes this run in-process and requires the same two sets. Regenerated on 2026-10-13. The run committed before that checked 234 classes, found 195 satisfiable, refuted none and left these 39 undetermined on the tableaux's expansion cap. Two changes account for the difference. Five of the 234 were anonymous `owl:Class` nodes taken for named classes, which is why the count is now 229 and the satisfiable count 190. And absorption, backjumping and the absorption of `owl:disjointWith` as `A ⊓ B ⊑ ⊥` let the search finish on the 39. ## `hermit-unsatisfiable.txt`: the oracle's list The 39 classes HermiT reports as unsatisfiable in `hqdm.owl`, as recorded by the OM 2026 crosswalk's reasoning run (`hqdm_prerepair_results.json`, `deleted_classes`). HermiT is an external reasoner and, in this repository's vocabulary, an opinion: nothing checks its proof. The figure does not repeat the paper's 39; it intersects this list with the engine's undetermined set and prints the size of the intersection with the engine's own unsatisfiable set, which is all 39: the engine and the oracle name the same classes. ## What the checks find Three things a coherence check cannot see, recomputed from the rows: 1. **Terms used as a class and never declared** `rdf:type rdfs:Class` or `owl:Class`, as a subject or object of `rdfs:subClassOf`, or as the object of `rdfs:domain` or `rdfs:range`. A datatype in range position (`xsd:*`, `rdfs:Literal`) is correct RDFS and is not counted. RDFS rendering: 23 (`hqdm:thing` *is* declared, at line 1067 of the source, so this is not a parsing artefact). OWL rendering: 0. 2. **`rdfs:range` declarations naming a relation**: terms that are never declared a class and never appear in the subclass hierarchy in either position, so they are relation names standing where RDFS requires a class. RDFS rendering: 12, at `hqdm:part_of` (9) and `hqdm:participant_in` (3). OWL rendering: 0. 3. **Pairs of names one trailing underscore apart.** RDFS rendering: 13, ten sharing a domain and differing in range, and three, `contract_process_consists_of`, `offer_and_acceptance_for_goods_consists_of` and `sale_of_goods_consists_of`, identical in domain **and** range. OWL rendering: 6, none identical. And one thing only a reasoner can see, on the file that has enough axioms to carry it: the 39 classes above.