Skip to content

NLnet Project Status

zelph receives financial support from NLnet via the NGI0 Commons Fund, under project identifier 2026-04-5a4, titled "Auditable Reasoning over Linked Open Data" (NLnet project page). This page adheres to the project plan agreed with NLnet: a framework comprising six main tasks with 36 subtasks in total. For every subtask, it specifies whether activity related to it is open, in progress, or done, and provides the corresponding evidence.

A subtask counts as done once its outcome has been made publicly available and can be used by anyone, effectively meaning that a release contains it. Each such release is announced below.

Updates

Updates are shared here no less than once every two months, and with each release that completes subtasks. Detailed descriptions of every release can be found in the release notes on GitHub.

  • 29 September 2026 · The status page has been published. No subtask is complete yet. Work on proof reconstruction since 8 August 2026 is documented under task 2.

Tasks and Subtasks

From the project plan:

Every task has one published result that a stranger can find, read and use; nothing counts as done until that result exists. The order is free: no task depends on another being finished first, except where the description says so.

1. RDF and JSON-LD import

  • 1a (open): A specification of the mapping between RDF terms and zelph nodes, published as a documentation page: IRIs, blank nodes, plain literals, language-tagged literals and datatype IRIs, with the round-trip properties each one has and the ones it does not.
  • 1b (open): A streaming N-Triples and N-Quads reader, reading gzip and zstd input directly, with the memory behaviour of the existing Wikidata importer: constant memory over an input of arbitrary size.
  • 1c (open): A Turtle reader: prefixes, base resolution, collections, nested blank node syntax, and the abbreviations Turtle allows for predicates and objects.
  • 1d (open): Blank nodes as a first-class anonymous node pool, scoped per document, with deterministic identifiers so that importing the same file twice produces the same graph.
  • 1e (open): Literals as terms rather than as names: language tags and datatype IRIs preserved and queryable, and an IRI distinguishable from a string that happens to look like one.
  • 1f (open): A JSON-LD reader with context resolution, expansion and graph construction. This includes the general JSON reader the engine currently does not have.
  • 1g (open): A conformance report over the W3C RDF test suites, generated by continuous integration and published as a page that states which cases pass, which fail and which are outside the profile.

2. Proof export as Linked Data

Since 8 August 2026, the proof reconstruction behind .explain has been extended and corrected. None of this currently generates the outcomes specified by the subtasks below, thus they remain open; the effort is documented because the subtasks build on it.

  • 2026-08-08 · 56dae24 · Reconstruct a derivation whose premise was walked
  • 2026-08-12 · 60b436d · Say that a proof cannot cross a neural premise
  • 2026-08-27 · cdd868d · Record a contradiction in the graph, so it is reported once
  • 2026-08-28 · e28b1fd · Say how many contradictions a run met but did not announce
  • 2026-08-28 · 31fc99d · Mark a proof tree that is one of several justifications
  • 2026-08-28 · cc89af2 · State what the derivation export writes, and withdraw an unmeasured timing
  • 2026-08-31 · 2123c45 · Correct counts, refusals and explanations that were not true
  • 2026-08-31 · 78906d0 · updated documentation and help, fixed ambiguous explain output, minor fix in sparql.zph
  • 2026-09-01 · 0213ad0 · Split the engines by subject, and name what a statement lacks
  • 2026-09-01 · 4b37cc5 · moved #include directives to fix windows and macos build; workaround for windows’s io.h clash
  • 2026-09-01 · 1f38e1e · fixed formatting
  • 2026-09-02 · e689af6 · Rework the documentation entry points and structure
  • 2026-09-04 · 8ea77f7 · Pin the instruction set floor and the install-time test selection
  • 2026-09-05 · ac7f7ca · Run a command-line script as a session, and report what went wrong

  • 2a (open): A serialiser for the proof graph, with stable identity per record, so that the steps of a derivation join into the chain they came from instead of having to be matched by rendered text.

  • 2b (open): The rule that fired and the bindings that matched, recorded in the export. The proposal promises both; neither is emitted today.
  • 2c (open): A JSON-LD serialisation with a published, dereferenceable context, and an identifier scheme that gives every node and every derivation an IRI.
  • 2d (open): Shared references: a node table with back-references, so that a proof reusing an intermediate fact names it once instead of repeating every label it carries in every language.
  • 2e (open): Depth-limited and subtree export, so that a proof over a large graph can be published in the part somebody asked for rather than in full.
  • 2f (open): An independent checker that re-verifies an exported proof without linking any zelph code, so that a conclusion can be confirmed by a party who does not trust the tool that produced it.
  • 2g (open): Proof export and proof reconstruction reachable through the C interface and from the embedded scripting layer, so that other programs can ask for them.
  • 2h (open): A published corpus of proofs as Linked Data, drawn from the Wikidata consistency run, with the documentation a consumer needs to read it.

3. Constraint rule library

  • 3a (open): A reusable constraint module in the standard library with neutral vocabulary: symmetry, transitivity, inverse properties, domain and range, sub-property and sub-class, disjointness. Importable, documented, and tested through the module rather than through pasted rules.
  • 3b (open): Functional properties and cardinality. Both need counting over a set of matches, which the rule engine does not currently do, so this includes the engine work that makes such a condition expressible.
  • 3c (open): Constraint generators for the Wikidata types that are registered but unimplemented: symmetric, inverse, subject type and value type. The last two rest on the transitive class closure, which is where a whole-graph reasoner says something a per-statement check cannot.
  • 3d (open): Constraints that emit corrections rather than complaints: where an inverse statement is missing, the same rule that reports the asymmetry derives the statement that would fix it, exported as a list of edits.
  • 3e (open): The library run against a second Linked Open Data dataset imported through task 1, with a published report of what it found and what the run cost.
  • 3f (open): Negation over a group of conditions. Several natural constraint formulations need it, and it is refused today; the work is not the search but the stratification, which has to defer a negated group exactly as it defers a negated pattern, including when the group's own conditions are negated.
  • 3g (open): Qualifier-dependent constraint checking, so that a constraint whose parameters live in the statement layer can be read from the graph instead of from a file beside it.

4. Proof explorer

  • 4a (open): A data path for the browser build: the serialised network format and its decompression available in WebAssembly, which they are not today.
  • 4b (open): A browser transport for published slices, fetching byte ranges over HTTP in place of the external process the native build uses, with the same cache semantics.
  • 4c (open): The explorer: a proof tree that expands one branch at a time, search over the nodes a proof mentions, and filtering by rule, by predicate and by the status of a step.
  • 4d (open): Verification in the reader's browser: each step re-checked against the evidence shipped with it, so that the page does not ask to be trusted.
  • 4e (open): Addressable proofs: a link that names a derivation and reopens it, so that a finding can be cited in a bug report or a discussion.
  • 4f (open): A name search index published beside a slice, so that a reader can find the entity they care about without downloading the graph.
  • 4g (open): A deployed instance over the published proof corpus, served as static files, with the build that produces it documented so anybody can host their own.
  • 4h (open): Accessibility work on the explorer against the Web Content Accessibility Guidelines, including keyboard navigation of the proof tree and a non-visual reading of a derivation.

5. Documentation and integration tests

  • 5a (open): An end-to-end tutorial that starts from a published Linked Open Data file and ends at an inspected proof, runnable by a reader with no prior knowledge of the engine.
  • 5b (open): Integration tests covering the whole pipeline in continuous integration: import, reason, export, verify.
  • 5c (open): Reference documentation for the three formats this project defines: the RDF mapping, the proof export, and the constraint library's vocabulary.
  • 5d (open): Reproducible artefacts: a manifest beside every published file recording the source it was built from and the digest of each part, so that a third party can rebuild what was published and confirm it matches.

6. Security and accessibility review follow-up

  • 6a (open): The findings of the security review addressed, with the changes documented.
  • 6b (open): The findings of the accessibility audit addressed, with the conformance statement updated.

Funding

This project was funded through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101135429. Additional funding is made available by the Swiss State Secretariat for Education, Research and Innovation (SERI).