Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased¶
Added¶
- Release CI: Publish WASM module to Wasmer Registry as
eddiethedean/ontologos(WASMER_TOKEN,.github/scripts/publish-wasmer.sh) - CI: Manual
Publish Wasmerworkflow (workflow_dispatch) to build and publish WASM without a full release - Docs: Wasmer badge and install links for
eddiethedean/ontologosacross README and docs - Release CI: Publish npm packages
ontologos(multi-platform N-API) and@ontologos/wasm(NPM_TOKEN) - CI: Manual
Publish npmworkflow (workflow_dispatch) for on-demand npm publishes - Docs: npm install channels and badges for Node/WASM
- npm: Published
ontologos@1.1.4and@ontologos/wasm@1.1.4; fix WASM pack to shippkg/(remove wasm-packpkg/.gitignorebefore publish)
1.1.4 - 2026-07-13¶
Fixed¶
- Conformance nightly: Soft-skip deferred WG cases under
cargo test -- --ignored; convert Consistent-but-all-unsat regressions into active honesty tests; Keys-002 sample for guard/full agreement nightly - Catalog: Honor
deferred_wg_ids.txtacross activate-from-disk so HermiT catalog drift stays green - CI: Retry flaky corpus downloads (
curlexit 35); bumpcheck-1.0-release-gates.shworkspace pin to 1.1.4
Changed¶
- Drop-in patch over v1.1.3 — bump all
ontologos-*pins together
1.1.3 - 2026-07-12¶
Fixed¶
- Conformance: Remove weak
consistent_but_all_unsatIRI-shape entailment guard; deferConsistent-but-all-unsat(status=deferred) until DL proves named-class ⊥ - Tests: Replace tautological / floor-only assertions (facade, contract, profile, EL, Python) with oracle-backed expectations
- Docs: Track shared
benchmarks/data/semantic-fixtures.jsonfor cross-language binding parity
Changed¶
- Tests: Demote dump-only DL triage tests behind
#[ignore]; add EL negative subsumption, contract MUST-NOT, parser mapping oracle, catalog honesty, and maintainer oracle policy
1.1.2 - 2026-07-06¶
Fixed¶
- Docs: Restore
v1.0.x-to-v1.1.0migration guide links broken in the v1.1.1 version bump (MkDocs strict build) - Includes all v1.1.1 fixes when upgrading from v1.1.0 (parser, DL, SWRL, RL, bindings) — see 1.1.1 below
1.1.1 - 2026-07-06¶
Fixed¶
- Parser: Lenient import merge skips supplement axioms after non-punnable entity kind conflicts (#21)
- Parser:
validate_loaded_ontology_lightrejects dangling DL class/data expression references (#23) - DL: Malformed XSD numeric literals no longer silently coerce to
0.0(#25) - SWRL: Forward chaining propagates EL classify failures when rule bodies need class-variable subsumption;
classify_for_swrlignores SWRL rules for EL profile checks (#28) - DL store:
from_json_with_limitsvalidates viavalidate_with_limits(#29) - RL:
MaterializationReportrecords sameAs/differentFrom clashes (#27) - Parser: Partial intersection decomposition fix (#20)
- Bindings: Python/JS
query()callsrewrite_query; QL handlesowl:Nothing/unsat (#19) - EL:
Profile::Autoincremental classification routes through EL engine (#17)
1.1.0 - 2026-07-04¶
Added¶
ontologos-ffi: shared stable C ABI for native language bindings (ontology, builder, reasoner, error handling)- Java bindings: JNI cdylib (
ontologos-jni) + Maven project (dev.ontologos:ontologos) - .NET bindings: P/Invoke cdylib (
ontologos-dotnet) + C# API withDllImportResolver - C/C++ bindings:
ontologos-ccdylib withontologos.h/ontologos.hpp, CMake smoke tests - CI:
scripts/ci-bindings.sh(Java, .NET, C/C++ + ontologos-js),scripts/ci-node.sh(Node + WASM); consolidated GitHub Actions bindings job - Docs: guides for Java, .NET, C/C++; security sections for new bindings
Changed¶
- Workspace and binding package versions bump to 1.1.0
- Node, WASM, Java, .NET, and C bindings delegate through
ontologos-js(same architecture as Python) - WASM
classify()JSON round-trip returns plain JS objects (matches Node/Python semantics) - Local CI (
run-ci-local.sh) includes bindings and node jobs
Fixed¶
- Clippy: FFI pointer-deref lint,
constthread-local inontologos-ffi, testmutcleanup
1.0.1 - 2026-07-03¶
SUPERSEDED: Patch release notes retained for history; 1.1.0 is the current workspace target.
Fixed¶
- Parser: map self-inverse RDF properties (
P owl:inverseOf P) toSymmetricObjectPropertyso IYOUITagent.owlloads under strict parse - ALC role queries: merge asserted RBox
SubObjectPropertyOfedges intogetSubObjectProperties(OWLLink Bobknows20 / 101) - DL bounded cancel is per-operation so one timed-out case no longer poisons concurrent conformance scans
- Promoted WG hygiene scan uses modest parallelism (4 threads) so 30s budgets are not starved on CI
- Conformance guard unit tests:
consistent_but_all_unsatandcomplex_conceptassert production paths; serialize tableau env mutations - Optional profile-corpora tests skip cleanly when
galen.owl/go-subset.owlare absent (nightly--ignored) - Tier C HermiT JAR cross-check: disable incomplete
pizza.owlDL taxonomy check (tracked as post-1.0 work)
Changed¶
- Workspace and PyPI package bump to 1.0.1
1.0.0 - 2026-07-02¶
Added¶
- HermiT conformance: auto-promotion pipeline (
promote_catalog,promoted_axiom_ids.txt,promote-hermit-catalog.sh) - DL engine: datatype-aware profile detection, ⊤/⊥ seeding in clausification, consistency-only axiom checks
- RL/RDFS: inverse-functional and irreflexive property characteristics; bottom object property chain detection
- Metrics: DL OFN pass-rate report; conformance coverage by catalog status
- Production DL integration guide:
budget_secs,check_consistency, conformance env warnings - Security docs:
max_literal_bytes, horned-owl parser mutex contract, conformance harness env vars #[non_exhaustive]onClassifyOutcomefor forward-compatible facade matches- Python:
ontologos.typesTypedDict exports; profile-awareReasonerstubs; Pyright CI onpython+tests
Changed¶
- Workspace and PyPI package bump to 1.0.0
- Active HermiT conformance tests: 1048 (100% catalog parity; 0 generated catalog ignores)
- JSON snapshot format version 3 (readers accept v2/v3)
- Tier C strict HermiT identity gate (
compare-tier-c-strict-family.sh) permanently informational — 26 extra subsumptions onfamily.owlwaived until 2.0 - Doc/code alignment: entailment cap 192 named classes;
ParseLimits::merge_importsdefault false SECURITY.mdsupported versions updated for 1.0.x- Removed workspace crates:
ontologos-rdfs,ontologos-abox,ontologos-query(empty shims — useontologos-rl/ontologos-ql);ontologos-watch(unused orphan) - Python:
__init__.pyraises on missing native extension instead of exportingNoneplaceholders
Fixed¶
- 32 verified bugs across ALC, facade, SWRL, parser, bridge, Python, and CLI (B-01–B-32)
- Removed stale ignored
dl650_and_dl910_should_be_inconsistenttriage test (covered byphase4_remaining_consistency_cases_fast)
Documentation¶
- Release status and install pins updated for 1.0.0
- Documentation adoption audit: facade-first examples, evaluator scope page, query/QL reference rewrite, channel banners, parity metric reconciliation, doc snippet CI
- Reconciled conformance metrics (1048 active / 1 ignored; 0 generated catalog ignores) in release status and evaluator scope
- Updated removed-crate references (
ontologos-rdfs,ontologos-abox) in choosing-an-api, dependency-first ADR, and tests README - Documented reasonable
sameAs/differentFromclash reporting gap in reasonable-limits reference
0.9.0 - 2026-06-13¶
Added¶
- Python:
OntologyandOntologyBuilderfor in-memory construction (JSON v2 dict or fluent builder) - Python:
Reasoner(path=...)orReasoner(ontology=...);explain()proof graph dict - Python: multi-pass incremental mutations (
add_subclass_of,remove_subclass_of,add_axiom_json) - Python: optional
subsumptions_to_pandas/subsumptions_to_polarsexport helpers - CI: Pizza EL golden pytest; macOS Python job; corpora download before Python tests
Documentation¶
- Site-wide version sync to 0.9.0; new Explain/Query/Reasonable-limits reference pages; migration landing page
- See docs/migration/v0.8.x-to-v0.9.0.md
Changed¶
- Workspace and PyPI package bump to 0.9.0
- Python guide documents explain trace limits and full v0.9 API
0.8.0 - 2026-06-13¶
Added¶
- Core: axiom-level dirty tracking (
OntologyRevision,DirtySet),remove_axiom,ReasonerSessionslot onReasoner - Core: asserted vs inferred axiom provenance (
add_inferred_axiom,strip_inferred_axioms) for correct RL/RDFS removal rematerialization - EL: incremental classification via partition overdelete-rederive on
CompletionGraph(ElSession,ReasonerConfig::incremental) - RL/RDFS:
ReasonableSessionwrapper over reasonable incrementalreason()/set_base_triples ontologos-watch: library file-watch + ontology reload hook for Ontocode (not published)- CLI / Python:
--incrementalflag andReasoner(..., incremental=True)(library multi-pass workflows) - Benchmarks: incremental edit suite,
incremental_correctnesstests, optionalbench-el-incremental.shperf gate - Tests: bridge
reasonable_session, RL/RDFS incremental removal,ontologos-watchintegration tests
Changed¶
- Workspace and published crates bump to 0.8.0
- Incremental engines validate session revision, restore sessions on merge failure, and skip no-op passes when ontology is clean
Fixed¶
- RL/RDFS: stale inferred axioms after
remove_axiom— strip inferred set before rematerialize - RL/RDFS: removal path uses cold
ReasonableReasonerreset with correctfull_rebuildflag - EL:
overdelete_signaturerebuilds domains and clears traces; revision mismatch forces full classify - Bridge: empty incremental delta clears dirty state;
ReasonableSessionstores RL vs RDFS profile - Perf gate:
bench-el-incremental.shruns with--ignored; bench uses unique deltas per iteration
0.7.0 - 2026-06-13¶
Changed¶
- Semver: release 0.7.0 aligns crate versions with ROADMAP v0.7 (dependency-first adapters); no public API changes from 0.6.1
- Documentation and install examples updated to
0.7.0
Fixed¶
- EL validation:
validate_el_profileusesel_classification_forbidden_in(complex TBox constructs the completion engine cannot handle) - EL completion: multiple
ObjectPropertyDomainaxioms per property are all applied - Parser: horned-owl panics on malformed RDF/XML (e.g. duplicate
rdf:ID) converted toError::Parse - CLI: materialization reports include
clashesin text and JSON output - Conformance:
sub_and_super_rolesuses direct subproperty assertion; manifest marks reasonable upstream gaps asignored - Bridge: optional
MergeLimits::max_axiomscap during RL/RDFS merge - Security: expanded
security_regressionstests for JSON limits documented indocs/security.md
0.6.1 - 2026-06-13¶
Changed¶
- EL engine: restore in-house ELK-style completion in
ontologos-el; remove gitwhelkdependency ontologos-bridge: horned-owl/oxrdf/reasonable adapters only (no whelk)- Pizza EL golden baseline regenerated from in-house EL (
84direct subsumptions) - All library crates publishable to crates.io again (full publish order restored)
Fixed¶
ontologos-query: removedontologos-eldev-dependency so the crate publishes cleanlyontologos-explain:ProofGraph::is_acyclicuses the same validator asbuild_proof_graph
0.6.0 - 2026-06-12¶
Note: The
v0.6.0tag shipped a brief whelk EL delegation experiment and partial crates.io publish (core, parser, profile, query only). v0.6.1 is the corrected public release: in-house EL restored, full library publish. See 0.6.1 below.
Added¶
ontologos-explain:ProofGraph,build_proof_graph,explain_with_profile,explain_rdfs/explain_rl/explain_elontologos-bridge: core ↔ horned-owl/oxrdf/whelk/reasonable adapters (workspace-only until whelk is on crates.io)InferenceTrace/TraceStepinontologos-corefor engine-agnostic explanation traces- Query APIs:
explain_subsumption,explain_unsatisfiablewith EL-first HST pruning - Human-readable
render_textformatter for proof graphs - CLI
ontologos explain --profile auto|el|rl|rdfs(JSON + text output) - Conformance:
explain_benchmarks.rs; Pizza EL golden vs in-house EL (compare-pizza-el-golden.sh); Family RL triple closure vs reasonable (compare-reasonable.sh) - petgraph taxonomy views in
ontologos-queryand proof-graph acyclic checks inontologos-explain - RDFS
MaterializationReport::clashesforwarded from reasonable diagnostics
Changed¶
- Dependency-first adapters:
ontologos-el→ whelk;ontologos-rdfs/ontologos-rl→ reasonable; parsing remains horned-owl - Custom in-tree EL completion, RDFS/RL rule engines, and RL
TripleIndexremoved; public facade crate names unchanged - RDFS/RL
MaterializationReport.tracesrenamed to.trace(InferenceTrace) ReasonerConfig::explanationshonored on classify routes (traces empty until upstream exposes rule diagnostics)- Pizza EL golden baseline regenerated from whelk; HermiT RL/RDFS tests document reasonable upstream gaps via
#[ignore]
Fixed¶
- Bridge merge:
owl:sameAs,owl:disjointWith, andowl:differentFromno longer mis-map as property assertions - Bridge merge: existential blank-node IDs include filler; restriction triples reconstruct
SubClassOfExistential - Bridge export:
DisjointClassesandDifferentIndividualsmapped to horned-owl (no longer silently dropped) - Reflexive
sameAstriples from reasonable skipped on merge (avoids invalidSameIndividualaxioms) - RL report previously dropped RDFS inference traces during saturation (pre-adapter)
Documentation¶
- Dependency-first ADR
- Migration v0.5.x → v0.6.0
- Updated architecture, comparison, ROADMAP, and Python guide for adapter stack
Breaking¶
- Per-rule
MaterializationReport::inferred_by_rulecounts are empty when using the reasonable adapter (upstream does not expose rule-level diagnostics yet) - EL classification returns
Taxonomywithout mutating the ontology; RL/RDFS saturation merges inferred axioms into core
0.5.0 - 2026-06-12¶
Added¶
ontologos-el: OWL EL completion classifier (ElClassifier,classify_reasoner,classify_with_profile)ontologos-query: taxonomy query API (direct_subclasses,is_subsumed,equivalent_classes,unsatisfiable_classes)Taxonomytype inontologos-core(subsumptions, equivalences, unsatisfiable)- CLI
--profile el|rl|rdfs|autoonclassify; taxonomy JSON/text output for EL - Python
profile="el"/"auto";classify()returns taxonomy or materialization dict - Parser: decompose
SubClassOf(C, ObjectIntersectionOf(...))into EL axioms - HermiT
ClassificationTestpizza harness with vendored fixtures (benchmarks/data/hermit/) - Pizza EL golden conformance (
pizza-el-golden.json,compare-pizza-el-golden.shin CI) - Vendored
go-subset.owlEL performance gate (< 10s)
Changed¶
- Breaking: CLI
classifydefaults to--profile auto(EL/RL routing), not RDFS-only — usematerializeor--profile rdfsfor RDFS - Python package version aligned to 0.5.0
Fixed¶
- RL soundness: replace unsound upward existential
subClassOfpropagation with downward scm-spo1 - RL existential subsumption: compare asserted existentials only (avoids spurious inferences from property weakening)
- EL completion graph: seed
EquivalentObjectPropertiesat graph build time
Documentation¶
- OWL EL classification
- Migration v0.4.x → v0.5.0
- v0.5 capability matrix, architecture, conformance, and Python guide updates
0.4.0 - 2026-06-12¶
Added¶
- ABox in
ontologos-core:ClassAssertion,ObjectPropertyAssertion,SameIndividual,DifferentIndividuals,EquivalentObjectProperties,AsymmetricObjectProperty - Axiom indexes for individuals, property assertions,
sameAs, and equivalent properties - JSON snapshot v2 round-trip for new axiom variants;
OntologyBuilderABox helpers - Parser mapping for named ABox axioms and
AsymmetricObjectProperty/EquivalentObjectProperties ontologos-rl: OWL RL forward-chaining (RlEngine::saturate) on top of RDFS materializationontologos_rl::classify_reasoner/materialize_reasonerforProfile::Rl- HermiT Tier-A ports:
testSubsumption2/testSubsumption3(inlined existential encoding) - Family RL corpus test; optional
compare-reasonable.shharness for external diff
Changed¶
- Profile detection: mapped ABox constructs are allowed under OWL RL (family corpus → RL)
- Python
profile="rl"routes throughontologos_rl::classify_reasoner Reasoner::classify()withProfile::Rlreturns delegate hint (useontologos_rl)- CLI
classifyprints stderr note that it runs RDFS only;explainhidden from--helpuntil v0.6
Documentation¶
- Read the Docs site with adoption-focused guides (crates.io quick start, RDFS tutorial, capability matrix, glossary, performance, production integration)
- FAQ and onboarding fixes; README slimmed for evaluators
- MkDocs strict build enforced in CI
Published¶
- ontologos-core 0.4.0
- ontologos-parser 0.4.0
- ontologos-profile 0.4.0
- ontologos-rdfs 0.4.0
- ontologos-rl 0.4.0
0.3.1 - 2026-06-12¶
Changed¶
ontologos classifyemits the same inference report asmaterialize(status: classified, axiom counts, per-rule breakdown)- Clarified
Reasoner::classifydocumentation: CLI/Python useontologos_rdfsforProfile::Rdfs
Fixed¶
Reasoner::classify()withProfile::Rdfsreturns a delegate hint instead of genericNotImplemented- FAQ, load guide, and CLI reference updated for Pizza → DL profile detection
- Documented OWL import non-resolution, RDFS materialization scope, and batch fixed-point engine (vs worklist)
Published¶
- ontologos-core 0.3.1
- ontologos-parser 0.3.1
- ontologos-profile 0.3.1
- ontologos-rdfs 0.3.1
0.3.0 - 2026-06-12¶
Added¶
ontologos-rdfs: TBox RDFS materialization (subClassOf/subPropertyOfclosure, domain/range inheritance)MaterializationReportwith per-rule inference counts and optional tracesmaterialize_reasoner(&mut Reasoner)andclassify_reasoner(&mut Reasoner)forProfile::RdfsReasoner::ontology_mut()for in-place materializationOntologyBuilder::property_domain/property_rangehelpers- RDFS unit tests (including long transitive chains) and Family/Pizza corpus conformance tests
ontologos materializeCLI with text and JSON report output- DL profile diagnostics explaining mapped constructs that rule out EL/RL
- Python
Reasoner(path, profile="rdfs")for RDFS materialization viaclassify() ontologos-conformanceworkspace harness with HermiT Tier-A RDFS test ports (tests/hermit/)- HermiT replacement strategy doc (docs/internal/research/hermit-replacement.md)
Changed¶
RdfsEngine::materializenow takes&mut Ontologyand returns a structured reportReasoner::classifynow takes&mut self(delegates toontologos-rdfsfrom CLI/Python forProfile::Rdfs)ontologos classifyruns RDFS materialization (OWL EL/RL classification remains v0.5)- Workspace version bumped to 0.3.0
Fixed¶
- Parser path sandbox: reject prefix-bypass paths (
uploads_basevsuploads_base_evil) - Parser mapping: allow axioms at entity limit;
DeclareDatatypeno longer blocks class with same IRI - RDFS inference traces now record premise axiom ids
- Profile detection docs and Pizza corpus expectations aligned with DL classification (658 mapped axioms)
Published¶
- ontologos-core 0.3.0
- ontologos-parser 0.3.0
- ontologos-profile 0.3.0
- ontologos-rdfs 0.3.0 (new crate)
0.2.0 - 2026-06-11¶
Added¶
ontologos-parser: OWL/XML, RDF/XML, OWL Functional Syntax, and Turtle loading via horned-owl;ParseLimits;ParseMetaon loaded ontologiesontologos-profile: EL / RL / QL / DL profile detection with diagnostics- New axiom variants:
SubClassOfExistential,SymmetricObjectProperty,ReflexiveObjectProperty,FunctionalObjectProperty - Parser fixtures and manifest-driven integration tests (Pizza, Family)
benchmarks/scripts/download.shfor benchmark corpus download
Changed¶
ontologos profileloads OWL files and reports detected profileontologos_parser::load_ontologyis the supported file-load API (Ontology::from_fileremains a stub onontologos-core)- Pizza/Family benchmark corpora: Family ontology vendored in-repo; Pizza downloaded from owlcs/pizza-ontology
Published¶
- ontologos-parser and ontologos-profile on crates.io
0.1.0 - 2026-06-11¶
First release. Publishes ontologos-core to crates.io only; engine crates remain workspace-internal until implemented.
Added¶
- Adoption documentation: CONTRIBUTING, FAQ, docs index, JSON v2 schema, security guide, error reference, comparison guide, runnable
pizza_builderexample - Research notes under
docs/internal/research/(OWL 2, HermiT, ELK, RDFox) - Benchmark ontology manifest at
benchmarks/manifest.toml ontologos-corein-memory ontology model:InternPool/IriIdfor deduplicated absolute IRIsEntityRegistrywith kind validation- Structured
Axiomenum with validation AxiomStoreandAxiomIndexfor engine-ready lookupsOntologyfacade withOntologyBuilder- Versioned JSON serialization (
to_json/from_json) - Integration tests with
pizza_minimalfixture - Criterion benchmark for 10k-axiom serialize/deserialize
Changed¶
- JSON snapshot format bumped to version 2 (IRI-keyed entities and axioms; v1 rejected for untrusted input)
- Hardened deserialization: resource limits,
deny_unknown_fields, duplicate entity/axiom handling - IRI validation: allowlist (
http,https,urn), reject control characters and dangerous schemes detect_profilereturnsErr(NotImplemented)instead of empty success- CLI: propagate emit errors, human-readable
--format text, removed--format yaml - File loading routed through
ontologos-parser::load_ontologywith path validation - Hardened test suite: semantic JSON round-trip,
add_axiomindex wiring, axiom/IRI/entity edge cases, parser format detection, CLI smoke test Ontology::from_filenow returnsError::ParseNotAvailable(parsing lands in v0.2)- Breaking:
AxiomKindreplaced by structuredAxiomwith entity references