Skip to content

Releases: Blackcat-Informatics/purrdf

purrdf 1.1.0

Choose a tag to compare

@github-actions github-actions released this 04 Sep 05:21
Immutable release. Only release title and notes can be modified.
051ff9c

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:message templates are substituted on the sh:sparql path.
    {$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 validate resolves a shapes graph's owl:imports from
    --import IRI=FILE, transitively and cycle-safely. Previously they were
    ignored in silence, so a shapes graph whose shapes lived in its imports
    reported conforms true against no shapes at all. PurRDF fetches nothing: an
    unresolved import with no --import given 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--ltr and
    "Cat"@en--rtl merged 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 reaches cargo 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 before cargo test in make check, so it had been failing the gate for
    every contributor.

Features

  • python: gts_to_sqlite, gts_to_duckdb and gts_to_parquet are
    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's owl:imports without re-deriving which objects count.

Documentation

  • pack: The pack identity digest is no longer captioned "RDFC-1.0". It is
    computed through the purrdf-rdfc12 profile, 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 its uv installer is pinned.
  • make: make doctor reports 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 = false on the binding lib, so cargo bench --workspace
    links.

purrdf 1.0.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 15:29
Immutable release. Only release title and notes can be modified.
8a58cad

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, its cliff.toml template and the release
    docs now state that policy instead of the pre-1.0 one.
  • release: make bump now regenerates purrdf.h, because cbindgen derives
    PURRDF_MINOR from the crate version and the 0.13.0 bump left the committed
    header one integer behind, failing capi-check in CI.

purrdf 0.12.0

Choose a tag to compare

@github-actions github-actions released this 02 Aug 21:37
Immutable release. Only release title and notes can be modified.
dfb1df7

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

Choose a tag to compare

@github-actions github-actions released this 02 Aug 07:26
Immutable release. Only release title and notes can be modified.
296300d

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: ?name in 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

Choose a tag to compare

@github-actions github-actions released this 31 Jul 09:53
Immutable release. Only release title and notes can be modified.
f9f3f84

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 mypy checked 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

Choose a tag to compare

@github-actions github-actions released this 28 Jul 18:08
Immutable release. Only release title and notes can be modified.
f355b54

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

Choose a tag to compare

@github-actions github-actions released this 26 Jul 13:27
Immutable release. Only release title and notes can be modified.
59c31dc

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

Choose a tag to compare

@github-actions github-actions released this 23 Jul 22:45
Immutable release. Only release title and notes can be modified.
64dda6c

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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 04:59
Immutable release. Only release title and notes can be modified.
a3bb1f6

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

Choose a tag to compare

@github-actions github-actions released this 20 Jul 09:38
Immutable release. Only release title and notes can be modified.
3a6dfe7

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