Releases: Blackcat-Informatics/purrdf
Release list
purrdf 1.1.0
The first release after 1.0.0. Two reported bugs, the release fallout 1.0.0 left
behind, and a data-conflation bug in the GTS carrier found while coordinating
with the upstream wire-format freeze.
Additive: no published API changes shape. A TermRow widening that would have
forced a major bump was reworked into a parallel column before release — RDF 1.2
base direction is now purrdf_rdf::gts_view::term_directions() and a
directions key on the Python projection dict, so every 1.0.0 caller keeps
working.
Bug Fixes
- shacl:
sh:messagetemplates are substituted on thesh:sparqlpath.
{$path}/{$value}shipped as literal braces because the constraint's
message was resolved once and cloned into every result row; it is now rendered
per solution, from that solution's own bindings. Both{?var}and{$var}
spellings, and{$this}whether or not the SELECT projects it. An unbound
placeholder is still left verbatim rather than blanked. - cli:
purrdf validateresolves a shapes graph'sowl:importsfrom
--import IRI=FILE, transitively and cycle-safely. Previously they were
ignored in silence, so a shapes graph whose shapes lived in its imports
reportedconforms trueagainst no shapes at all. PurRDF fetches nothing: an
unresolved import with no--importgiven is reported on stderr, and with a
table given is refused by name. - gts: RDF 1.2 literal base direction is part of a term's identity in the
snapshot composer. It was absent from the intern key, so"Cat"@en--ltrand
"Cat"@en--rtlmerged into ONE term and every quad was repointed at the
survivor — a different graph, not a missing column. Emitted bytes are
unchanged for any input without directional literals. - release: The crates.io bootstrap script packages and publishes its PLAN
rather than the whole ledger; a deferred crate no longer reachescargo package. Its self-test asserts the arguments handed to the irreversible step,
and the arm that had been failing since the ledger emptied is fixed — that arm
runs beforecargo testinmake check, so it had been failing the gate for
every contributor.
Features
- python:
gts_to_sqlite,gts_to_duckdbandgts_to_parquetare
implemented. They previously raised unconditionally. Five tables in the
projection's own row order, so the same container exports to the same content
twice. SQLite needs only the standard library; the other two take the
[duckdb]/[parquet]extras. - rdf:
gts_view::term_directions()exposes RDF 1.2 base direction from the
relational projection, which previously dropped it. - entail:
entails::imports::imported_iris()is public, so a consumer can
read a document'sowl:importswithout re-deriving which objects count.
Documentation
- pack: The pack identity digest is no longer captioned "RDFC-1.0". It is
computed through thepurrdf-rdfc12profile, which agrees with RDFC-1.0 byte
for byte only on the RDF 1.1 subset. Labelling only — no digest bytes change.
Build
- ci: Benchmarks moved off the per-push path to a weekly schedule plus
workflow_dispatch, and itsuvinstaller is pinned. - make:
make doctorreports which build pins the local machine actually
enforces, and the wasm gate distinguishes "rustup absent" from "target not
installed" instead of printing the same line for both. - python:
bench = falseon the binding lib, socargo bench --workspace
links.
purrdf 1.0.0
The first release under full semantic versioning. The tree is the 0.13.0 tree:
0.13.0 was published only to create the crates.io records for purrdf-cdt,
purrdf-geo and purrdf-text — Trusted Publishing cannot create a crate that
does not exist — and 1.0.0 is the same code republished through Trusted
Publishing across all 21 crates, PyPI and npm. There is no functional change
between the two.
Documentation
- release: From 1.0.0 a breaking change bumps the major version, a minor
bump is additive, and a patch bump is bugfix-only; the changelog's
BREAKING markers name each one. The C ABI (purrdf.h,
PURRDF_ABI_MAJOR.PURRDF_ABI_MINOR= 0.7) is versioned separately and
remains 0.x. The changelog header, itscliff.tomltemplate and the release
docs now state that policy instead of the pre-1.0 one. - release:
make bumpnow regeneratespurrdf.h, because cbindgen derives
PURRDF_MINORfrom the crate version and the 0.13.0 bump left the committed
header one integer behind, failingcapi-checkin CI.
purrdf 0.12.0
Bug Fixes
- BREAKING canon: Reserve the overlay's namespace by refusal, not by assertion
Features
- BREAKING Let a new enum variant stop being a breaking change
- errors: Let the standard chain reach the failure underneath
- canon: Name and version the canonicalization profile, with a frozen vector corpus
Performance
- datalog: Keep the join's binding frame off the heap
- sparql-eval: Reject a candidate before paying to copy the row
- rdf: Write the text serializers into one buffer instead of many
- rdf: Write TriG in place, blocks and all
- rdf: Sort the canonical order through a comparator, not through keys
- rdf: Cut allocations on the hot paths; fix(canon)!: collision-safe RDF 1.2 canonicalization profile
Refactor
- BREAKING rdf: The codec's serializer takes the caller's buffer
Testing
- datalog: Give the semi-naive join a bench of its own
- conformance: Put the canonicalization profile on the scoreboard
purrdf 0.11.0
Bug Fixes
- entail: Make the survey's three-way early exit reachable
- docs: Hold the xfail sentence to the count the matrix generates
- wasm: Assert an error names a term, do not compile the term into a pattern
- BREAKING entail:
?namein any position, including the one it was refused in - entail: A boundary that meant two things, and two claims about rule heads that were false
- python: Give each newline one way to match, not two
- wasm: Assert a refusal names a term exactly, by neither of the two wrong ways
- wasm: Pin the whole refusal, so the IRI reaches no matcher at all
- BREAKING entail: A variable is not a datatype IRI, and a withheld predicate is not a smaller question
- BREAKING entail: One IRI is one answer, and one variable name is one variable
- gates: Two gates that could not fail, and two guards that could not see
- docs: Derive which documents the overclaim ban sweeps, from the ban itself
- docs: Make the derived sweep total, rather than saying it is
- docs: Let the gate's own guards be mutated, and refuse the mutations
- docs: Compose the ban patterns around their markers, rather than checking they contain one
- BREAKING entail: A deep input must be an error, not a dead process
- BREAKING rdf: Bound term nesting where it is parsed, and survey every position the merge writes
- entail: Five reviewer findings — a lossy diagnostic, a split precedence, and three claims nothing checked
Documentation
- entail: The doc gate is not
make check, and it found six broken links - rdf: The XML-literal walk adds no bound; something in front of it does
Features
- entail: A conclusion-directed entailment service over the RL chase
- entail: Close the negative-conclusion lane by refutation over the chase
- entail: Decide a schema axiom by freezing its body and chasing the head
- entail: Comprehend the anonymous class expressions a conclusion names
- entail: Read a reflexive property's self-loops off the conclusion, not the closure
- BREAKING entail: Decide an rdfs:range axiom by datatype containment
- entail: Vendor the document the last unreached premise names
- BREAKING entail: Return the run that answered, not the verdict alone
- entail: The conclusion-directed surface reaches all four hosts
- conformance: Print the split an empty ledger makes trivially true
- BREAKING entail: A conclusion graph is a conjunction, and entailment is monotone over one
- BREAKING entail: A lane not run is a limit, not a silence
- BREAKING entail: The import map is the caller's, on every host that has the service
- cli: The binary can ask the question, not only compute the closure
- conformance: Print what the twenty-three negative agreements are made of
- BREAKING entail: Close the 16 ledgered W3C OWL 2 RL entailment-corpus gaps
purrdf 0.10.0
Bug Fixes
- BREAKING datalog: Carry the predicate as data so meta-rules are expressible
- entail: Stop fabricating rdfs:Resource for a derived triple term
- entail: Drop the tableau's unique name assumption for nominals
- Accept D from the CLI, close the umbrella gap, correct shipped strings
- release,docs: Refuse a half-publish, and make documented numbers checkable
- entail: Make the certificate real, and grade the rules against W3C
- entail: Make the overclaim state unrepresentable, and surface the certificate everywhere
- entail: Derive the DL certificate's completeness instead of storing it
- wasm: Reach every reasoner service from the npm package root
- docs: Unbreak the rustdoc gate and name the Python suite row for what it runs
- bindings: Make the shipped type stub match the extension, and gate what published numbers claim
- docs: Gate the numbers that recurred, and stop promising a component this workspace does not have
- Make three gates inspect what they claimed to, and cover a tableau clash nothing reached
- docs: Correct eight published figures and gate the surfaces that carried them
- docs: Close three ways this pass's own gates could be satisfied without checking anything
- entail: Refuse explain-conclusion per conclusion, not per regime
- BREAKING docs: Name the DL fragment SHOIQ(D), date the exclusion emitters, and correct three provenance claims
- docs: A concept ledger over repo-wide facts, and twenty corrected figures
- BREAKING entail: Refuse the unrepresentable cardinality, bound the counting search, and state what the blocking evidence shows
- BREAKING entail: Make the combined approach reachable, sound on every result form, and honest about its fragment
- docs: The figure sweep — thirty corrected claims, three gate holes closed
- hygiene: The issue-reference ban could not see string literals or SPARQL
- playground: The console offered seven codecs while the engine registers nine
- entail: The counting/inverse limit keyed on spelling, not on meaning
- python:
uv run mypychecked nothing and exited on a usage error - wasm: The session handle needs Debug and Self, as the lint table requires
- hygiene: The wasm export gate read the export block and not the imports
- datalog: Make the SLG budget bound the work, not just the output
- datalog: Keep freshen_clause's doc on freshen_clause, and collapse the filter's ifs
CI & Build
- wasm: Record the session's 8,882 bytes
Documentation
- entail: Generate the rule inventory and correct every stale claim
- Fix two intra-doc links that failed the rustdoc gate
- conformance: Grade the rules against W3C, and gate every number
- Date the DL exclusion tally, which is a recorded measurement rather than a live one
- provenance: Record the cutover as it stands, the slme port, and the revision reachability
- Published text carried internal program codes
- The session's three Python tests and its bytes reach the recorded figures
- conformance: The prose scoreboard row lagged the generated block
- provenance: Say which generated projections this repo can actually regenerate
- Say why the backward resolver has no caller, and stop claiming it has one
- State the backward check's boundary as the cost it is, with numbers that reproduce
- validate: The skip test's own doc still told the story the code disproved
Features
- BREAKING datalog: Add the purrdf-datalog crate and wire every release gate
- datalog: Port the physical primitives — branded ids, arena, bitset, binding patterns
- datalog: Port the relation store, cursors, and index-selection planner
- datalog: Port the semi-naive evaluator with analytic goldens and hard budgets
- datalog: Replace the provisional rule IR with the DL-clause IR
- entail: Add the machine-readable rule inventory
- datalog: Add checkable proof terms and a contract hash
- BREAKING entail: Return a reasoning certificate from every materialize call
- validate: Add the shared entailment-regime string boundary
- entail: Seed the finite axiomatic triples and add four RDFS rules
- python: Expose entailment regimes as purrdf.entail
- entail: Add RDF-list materialization and the prp, cax and scm rules
- wasm,capi: Expose entailment regimes to WebAssembly and the C ABI
- entail: Complete OWL 2 RL — all 78 rules, and make D materializable
- entail: Stop dropping OWL axioms silently, and add the existential chase
- entail: Expose the DL reasoner services behind a certified facade
- entail: Dataset semantics, reifier interactions, and explanations
- entail: Reach every reasoner service from every host
- entail: Close the last W3C entailment gap, wire the plan cache, report termination
- entail: Bind the extension inventory on every host and gate its disclosure
- BREAKING entail: Decide OWL 2 data ranges, and check the tableau against a model-enumeration oracle
- xsd: Decide the rational-decimal identity exactly, and write the gmeow cutover guide
- BREAKING entail: Certain answers by the combined approach, over a ported SLG-WFS resolver
- BREAKING entail: A clause-based hypertableau is the OWL-Direct decision core
- entail: The nominal/inverse/counting limit is a named boundary, not buried prose
- validate: A reasoning session, so asking twice costs one parse
- python: Expose the reasoning session as
entail.Reasoner - wasm: Expose the reasoning session as
Reasoner - capi: Expose the reasoning session as
PurrdfReasoner - purrdf: Surface the reasoning session on the Rust facade, and gate all four hosts
- entail: Cross-check every chase explanation against backward resolution
- entail: Re-derive every chase explanation backward, and report the outcome
- BREAKING entail: Complete the entailment surface — 78/78 OWL 2 RL, certified runs, four language hosts
Other
- Revert "feat(entail): cross-check every chase explanation against backward resolution"
Performance
- BREAKING entail: Classify by one saturation instead of a tableau run per class pair
- datalog: Reject impossible clause/call pairs before freshening them
Refactor
- BREAKING entail: Run the declared clause program instead of a hand-written chase
- entail: Split the calculus into one module per rule family
- BREAKING entail: Make materialization total over every regime
Testing
- entail: Capture the chase's behaviour as a golden oracle
- conformance: Vendor the W3C OWL 2 suite and give entailment its own row
- entail: Check the OWL 2 RL closure against an independent second implementation
- entail: Assert the tableau is not over-permissive where that is decidable
- entail: Pin the owlrl divergence triples, and cover the value class that separates two language-tagged values
- entail: Pin the divergence triple count so a regeneration cannot absorb a regression
- Carry the per-conclusion explain contract to the remaining two hosts
purrdf 0.9.0
Bug Fixes
- gts: Use neutral fixtures, drop an unreachable guard, surface breaking changes
CI & Build
- changelog: Mark a breaking release when the squash duplicates a subject
Documentation
- gts: Name the real undicted plan in the frozen-vector test
Features
- BREAKING gts: Pin caller-supplied in-band dictionary bytes in a compaction plan
Testing
- gts: Say what the mixed-plan header assertion can actually observe
purrdf 0.8.5
Bug Fixes
- slice: Scope ownership by declared term namespaces, not the framework ns
- slice: Never mistake a Turtle comment for the sliceDependsOn block
- docs: Repair public GTS links
- gts: Harden dictionary append invariants
Documentation
- gts: Register zstd-rsyncable level?/dct? and the dict-vector corpus
Features
- gts: Multi-dictionary packs, rsyncable dict priming, and a declared zstd level
- gts: Support multi-dictionary rsyncable packs
Testing
- gts: Freeze dictionary vector fold oracles
purrdf 0.8.3
Bug Fixes
- rdf: Make JSON-LD byte budgets target independent
- rdf: Harden JSON-LD size arithmetic
- capi: Refresh generated package version
- rdf: Complete JSON-LD portability audit
- rdf: Make JSON-LD byte budgets portable
CI & Build
- release: Gate coordinated tags on full checks
- release: Validate every published surface
Other
- shapes: Restore canonical formatting
Testing
- rdf: Use inclusive multiplicity range
purrdf 0.8.1
Bug Fixes
- wasm: Align npm package size budgets
CI & Build
- wasm: Budget shared SHACL membership view
Documentation
- wasm: Record optimized membership artifact
- conformance: Record subclass corpus case
Features
- shapes: Add subclass membership view
- shapes: Unify subclass membership semantics
Other
- Unify SHACL subclass membership across native and SPARQL validation
Performance
- shapes: Benchmark subclass membership hot path
- shapes: Prune inactive membership rows
Testing
- shapes: Freeze subclass membership semantics
- shapes: Freeze subclass corpus hashes
purrdf 0.8.0
Bug Fixes
- Harden purremb contracts and lookups
- shapes: Standardize schema input blanks apart
- shapes: Return typed schema key errors
- shapes: Admit identifier-only ontology ranges
- shapes: Retain custom datatype ranges
- shapes: Bound propagated schema facts
- shapes: Lower unsafe LinkML slots deterministically
- shapes: Bound schema parsing during construction
- shapes: Reject initializer module components
- jsonld: Preserve active-context option semantics
- jsonld: Preserve compact carrier round trips
- jsonld: Bound derived context validation
- cli: Bound JSON-LD options input
- python: Isolate generated namespace bindings
- playground: Route configured JSON-LD formats
- capi: Update projection example scope
- wasm: Update projection scope fixtures
- csvw: Preserve W3C RDF conversion
- capi: Refresh generated projection header
- build: Measure OKF wasm package growth
- capi: Close smoke fixture on seek failure
- build: Make Cargo target fallback safe
- capi: Honor active smoke-test profile
- build: Harden Cargo target discovery
- release: Deduplicate generated changelog entries
- capi: Regenerate header for 0.8.0
CI & Build
- wasm: Rebaseline scoped projection budgets
Documentation
- rdf-core: Specify the PURREMB v1 format
- shapes: Expose ontology schema workflow
- shapes: Publish LinkML slot migration contract
- shapes: Document rich Pydantic package emission
- shapes: Qualify flat byte compatibility
- jsonld: Document deterministic context compaction
- conformance: Refresh compatibility count
- conformance: Refresh Python parity count
- csvw: Guide curated terms projection
- cli: Enumerate liftable profiles
- wasm: Refresh optimized size measurement
- cli: Explain OKF lift rejection
- conformance: Account for attached parity test
Features
- rdf-core: Add deterministic PURREMB writing
- rdf-core: Add borrowed PURREMB reading
- rdf-core: Add PURREMB binding verification
- rdf-core: Add deterministic .purremb companion format
- sssom: Model set-level document comments
- sssom: Retain parsed document envelopes
- sssom: Serialize typed document envelopes
- shapes: Define ontology schema compilation contract
- shapes: Derive deterministic ontology schema surface
- shapes: Emit ontology-complete schema carriers
- shapes: Define LinkML slot naming contract
- shapes: Verify LinkML slot reports on import
- shapes: Define deterministic Pydantic package topology
- shapes: Emit routed rich Pydantic packages
- rdf: Compile JSON-LD active contexts
- rdf: Compact JSON-LD through a typed carrier
- rdf: Derive deterministic JSON-LD contexts
- cli: Expose configured JSON-LD serialization
- bindings: Expose compiled JSON-LD contexts
- lpg: Require explicit projection scope
- lpg: Stream projection artifacts
- lpg: Expose scoped streaming hosts
- csvw: Define curated terms profile
- csvw: Project scoped curated term tables
- projection: Expose curated CSVW terms
- rdf: Define OKF terms projection contract
- rdf: Generate deterministic OKF term bundles
- rdf: Expose OKF terms across hosts
- rdf: Add attached RO-Crate assets
- bindings: Expose attached RO-Crate packaging
Other
- Compile ontology-complete developer schema surfaces
- Make LinkML slot lowering deterministic and reversible
- Emit deterministic rich Pydantic packages
- jsonld: Document scoped lint exceptions
- Add deterministic context compaction
- Preserve typed SSSOM set comments
- Add scoped streaming LPG projections
- Add caller-configured curated CSVW projections
- Add deterministic caller-configured OKF term bundles
- Add deterministic attached RO-Crate payload packages
- Add native DCAT and VoID dataset descriptions
- Benchmark whole-bundle SHACL focus execution
- Optimize SHACL focus validation invariants
- Parallelize SHACL focus evaluation deterministically
- Prepare bounded SHACL validation for realtime use
- Eliminate SHACL canonical sort key allocations
- Preserve interned IDs through recursive SHACL checks
- Prove deterministic SHACL parallel execution
- Document realtime SHACL validation operations
- Optimize realtime and whole-bundle SHACL validation
Performance
- rdf-core: Benchmark PURREMB access paths
- sssom: Streamline column selection
- shapes: Cache ontology row sort keys
- shapes: Borrow unchanged LinkML slot locals
- shapes: Reuse Pydantic path buffers
- shapes: Avoid duplicate schema limit traversal
- shapes: Index routed definition owners
- jsonld: Remove carrier hot-path allocation
- lpg: Measure scoped streaming carriers
- projection: Coalesce artifact sink writes
- csvw: Reuse URI expansion allocations
- csvw: Remove curated selection temporaries
- csvw: Borrow curated table memberships
- rdf: Remove OKF classifier scratch allocations
- rdf: Remove attached crate loop allocations
Refactor
- shapes: Clarify routed name guard
- jsonld: Unify context processing
Testing
- rdf-core: Harden PURREMB conformance coverage
- shapes: Prove ontology surface across emitters
- shapes: Keep namespace fixture vocabulary neutral
- shapes: Prove emitter-specific ownership
- shapes: Harden LinkML slot lowering
- shapes: Exercise routed Pydantic packages
- jsonld: Freeze expanded codec baseline
- rdf: Pin OKF terms cross-host parity
- rdf: Freeze attached crate host parity