Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
3d21b04
docs: bring skills and crate READMEs back in line with main
claude Oct 8, 2026
aba0db9
Merge remote-tracking branch 'origin/main' into docs/skills-readme-dr…
claude Oct 8, 2026
05e80ff
ci(notation3tests): save rust-cache only on main
claude Oct 8, 2026
a06049c
Merge remote-tracking branch 'origin/main' into docs/skills-readme-dr…
claude Oct 8, 2026
49f4bd9
docs: one git source for collaborating crates in EL/QL and Arrow recipes
claude Oct 8, 2026
b3a362f
docs: strict SERVICE egress in the quickstart; strip model tags
claude Oct 8, 2026
be07d9f
docs: redo the model-tag strip without touching code syntax
claude Oct 8, 2026
c02cb90
docs: restore academic-paper fence; vendored spargebra in the PROV re…
claude Oct 8, 2026
2b97581
docs: fix markdownlint hits left by the model-tag strip
claude Oct 8, 2026
1a7daf6
Merge remote-tracking branch 'origin/main' into docs/skills-readme-dr…
claude Oct 8, 2026
3cf3d7e
docs: PROV recipes declare sparq-core/oxrdf; router CLI and JSON-LD s…
claude Oct 8, 2026
10190e8
Merge remote-tracking branch 'origin/main' into docs/skills-readme-dr…
claude Oct 8, 2026
d293d35
docs(zk): verify_manifest API line lists all ten parameters
claude Oct 8, 2026
b1b68f2
docs(skills): router entries are each skill's own frontmatter descrip…
claude Oct 8, 2026
e54329b
docs(jsonld): CLI dump has --context only; framing is planned
claude Oct 8, 2026
3c10a81
Merge remote-tracking branch 'origin/main' into docs/skills-readme-dr…
claude Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions crates/sparq-algos/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ let order = topological_sort(&g)?; // Err(CycleError) on
- **Degree centrality** — In / Out / Total, raw counts or normalised to `[0, 1]`, plus a
deterministic `top_k`.
- **Extended centrality** — with the default-OFF `centrality-extended` feature, exact
unweighted Brandes betweenness and normalised harmonic closeness. Both treat each directed
unweighted Brandes betweenness, normalised harmonic closeness, and `core_number`
(k-core decomposition, O(V + E)). All three treat each directed
edge as an undirected connection; reciprocal edges and self-loops do not multiply paths.
Harmonic closeness assigns unreachable nodes a zero contribution, so disconnected graphs
have finite scores.
Expand All @@ -73,7 +74,7 @@ let order = topological_sort(&g)?; // Err(CycleError) on
strongly connected components, their count accessor, and a canonical topological sort.
SCC ids are densified by ascending node index; topological-sort ties choose the smallest
ready node and cycles, including self-loops, return `CycleError`; `is_acyclic` exposes the
same check as a boolean. [GPT-5.6] sq-awq7n.
same check as a boolean. sq-awq7n.
- **Opt-in & lean** — consumes only sparq-core's public read API; the only dependencies
are `sparq-core`, `oxrdf`, and `rustc-hash`. The heavier all-pairs algorithms are behind
`centrality-extended`, and directed topology is behind `topology`; both features are OFF
Expand Down
18 changes: 9 additions & 9 deletions crates/sparq-arrow/README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# sparq-arrow

> 🤖 **SPARQ agent** [OPUS-4.8] — opt-in **Apache Arrow** columnar export for sparq.
> 🤖 **SPARQ agent** — opt-in **Apache Arrow** columnar export for sparq.
> Projects a SPARQL `SELECT` result (`sparq_engine::QueryResult`) into an Arrow
> `RecordBatch` so query results flow into the dataframe / analytics / ML ecosystem
> (Polars, DuckDB, pandas) without a CSV round-trip. Issue #910, bead `sq-v78l4`.
>
> [GPT-5.6] Bead `sq-lsp7k.16` adds the checked inverse, `from_record_batch`.
> [GPT-5.6] Bead `sq-lsp7k.21` adds Parquet byte serialization over that same schema.
> [GPT-5.6] Beads `sq-r3cab` and `sq-ksxa2` add Arrow IPC bytes and schema-only readers.
> [GPT-5.6] Bead `sq-kix7x` adds a metadata-only Parquet row-count reader.
> [FABLE-5] Bead `sq-lsp7k` adds flattened CSV bytes (hand-rolled RFC 4180, zero new deps).
> Bead `sq-lsp7k.16` adds the checked inverse, `from_record_batch`.
> Bead `sq-lsp7k.21` adds Parquet byte serialization over that same schema.
> Beads `sq-r3cab` and `sq-ksxa2` add Arrow IPC bytes and schema-only readers.
> Bead `sq-kix7x` adds a metadata-only Parquet row-count reader.
> Bead `sq-lsp7k` adds flattened CSV bytes (hand-rolled RFC 4180, zero new deps).

**Opt-in / lean-core by construction.** This is a separate leaf crate, and Arrow
import/export sits behind the `arrow` feature (OFF by default). The `arrow-*` dependency
Expand Down Expand Up @@ -39,8 +39,8 @@ assert_eq!(restored.rows, result.rows);
# Ok::<(), Box<dyn std::error::Error>>(())
```

`cargo add sparq-arrow --features arrow` (or, in this workspace,
`cargo build -p sparq-arrow --features arrow`).
`cargo add sparq-arrow --git https://github.com/sparq-org/sparq --features arrow`, with `sparq-core` and
`sparq-engine` from the same git source so `QueryResult` types match (in-workspace: `cargo build -p sparq-arrow --features arrow`).

To serialize the same term-struct batch as an in-memory Parquet file, enable the
default-OFF `parquet` feature:
Expand All @@ -60,7 +60,7 @@ assert_eq!(restored.rows, result.rows);
# Ok::<(), Box<dyn std::error::Error>>(())
```

Use `cargo add sparq-arrow --features parquet` (or
Use `cargo add sparq-arrow --git https://github.com/sparq-org/sparq --features parquet` (or
`cargo build -p sparq-arrow --features parquet`); `parquet` implies `arrow`.

For an Arrow IPC stream instead, enable the default-OFF `ipc` feature and call
Expand Down
2 changes: 1 addition & 1 deletion crates/sparq-bench/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!-- [OPUS-4.8] sq-4kr5: internal-stub README for a publish=false crate. -->
<!-- sq-4kr5: internal-stub README for a publish=false crate. -->
# sparq-bench

The **benchmark + differential harness** for [sparq](../../README.md): it runs
Expand Down
7 changes: 3 additions & 4 deletions crates/sparq-canon/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ signing, diffing, deduplication, and content-addressing.

[RDF Dataset Canonicalization]: https://www.w3.org/TR/rdf-canon/

> Model: Opus 4.8 (Fable unavailable — flag for re-review when Fable returns).
> Surfaced from `sparq-zk::canon` per bead sq-0qip.

## 🚀 Quickstart
Expand Down Expand Up @@ -101,9 +100,9 @@ is **not** independent of RDFC-1.0 itself.

### Opt-in, single-sourced

`publish = false`, and nothing in sparq's default dependency graph or the wasm
artifact depends on this crate, so both are byte-identical with or without it and
`sparq-core` stays lean. The RDFC-1.0 **algorithm** is the maintained zkp-ld
`publish = false`; no published sparq crate nor the default wasm artifact depends on it
(it builds by default only as a `sparq-bench` dependency; `sparq-wasm` pulls it behind
its opt-in `canon` feature), so `sparq-core` stays lean. The RDFC-1.0 **algorithm** is the maintained zkp-ld
[`rdf-canon`](https://crates.io/crates/rdf-canon) crate (oxrdf 0.2); this crate
owns the single canonical-N-Quads-text bridge from sparq's oxrdf 0.3, so the
bridge lives in exactly one place. `sparq-zk` depends on it (its `canon` module
Expand Down
20 changes: 10 additions & 10 deletions crates/sparq-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ cargo run --release -p sparq-cli -- query data.ttl turtle 'SELECT * WHERE { ?s ?
`turtle`/`trig` straight to stdout (byte-identical, no whole-document `String`); a broken pipe
(`dump … | head`) exits quietly instead of panicking.
- **`to-hdt <file> <in-fmt> <out.hdt[.gz|.zst|.bz2]>`** *(opt-in `hdt-write` feature, which
implies `hdt`; [FABLE-5] sq-8ju74)* — export a loaded document (any ingestible format, HDT
implies `hdt`; sq-8ju74)* — export a loaded document (any ingestible format, HDT
itself included) as a standard-layout **HDT v1.0 archive** via `sparq-hdt`'s direct in-memory
encoder; the output container is chosen by the output extension. HDT holds a single default
graph: named graphs are dropped **loudly** (a stderr warning with the dropped counts).
- **JSON-LD I/O is default-on** ([OPUS-4.8] sq-oy1f.4, user-prioritised epic sq-oy1f) — the
- **JSON-LD I/O is default-on** (sq-oy1f.4, user-prioritised epic sq-oy1f) — the
default CLI **reads** a JSON-LD document (`<in-fmt>` ∈ `jsonld` / `json-ld` / `application/ld+json`;
`@graph` named graphs are preserved as a dataset) AND **writes** one (the `jsonld*` out-formats
above), out of the box. This is a deliberate maintainer-directed exception to sparq's
Expand All @@ -59,10 +59,10 @@ cargo run --release -p sparq-cli -- query data.ttl turtle 'SELECT * WHERE { ?s ?
JSON-LD **parse + serialise + full 1.1 Compaction/Framing**; full conneg-conformance ratcheting
is on the [sq-oy1f](https://github.com/sparq-org/sparq/issues/757) roadmap.
- **`--reason <rdfs|owl-rl|n3>`** — opt-in forward-chaining materialization before query.
- **`--reason datalog:<rules.dlog>`** *(opt-in `datalog`; [SONNET-4.6] sq-p4zci)* — run a **stratified Datalog** program
- **`--reason datalog:<rules.dlog>`** *(opt-in `datalog`; sq-p4zci)* — run a **stratified Datalog** program
over the parsed triples, then query the closure: negation as failure + `AGGREGATE`/`FILTER`, which monotone RDFS/OWL-RL
cannot express. Loud exit-1 outside the fragment or on a `NOT`/`AGGREGATE` cycle; exit 2, no fall-back, when off.
- **`classify <file> <format> [out.nt]` / `--reason el`** *(opt-in `el` feature; [OPUS-5] sq-2ch27)* —
- **`classify <file> <format> [out.nt]` / `--reason el`** *(opt-in `el` feature; sq-2ch27)* —
run the **OWL 2 EL** consequence-based classifier (`sparq-reason-el`, pulled with its `rbox` role
automaton) and materialize the class-subsumption lattice as `rdfs:subClassOf` triples (plus the
role-inclusion closure as `rdfs:subPropertyOf`) — complete for the **E1+E2 fragment** (CR1–CR6
Expand All @@ -75,27 +75,27 @@ cargo run --release -p sparq-cli -- query data.ttl turtle 'SELECT * WHERE { ?s ?
`el`, not `--reason owl`, when you need the EL class hierarchy. Honest incompleteness (skipped
axioms, a non-regular RBox, unsatisfiable classes) is reported on stderr, never swallowed;
without the feature `--reason el` exits 2 naming it rather than silently downgrading to RL.
- **`tabular <csv[.gz|.zst|.bz2]> …`** *(opt-in `tabular` feature; [FABLE-5] sq-lsp7k.8)* —
- **`tabular <csv[.gz|.zst|.bz2]> …`** *(opt-in `tabular` feature; sq-lsp7k.8)* —
**materializing tabular→RDF import**: stream CSV rows through a direct mapping (subject IRI
template `{col}`/`{_row}` via `--template`, per-column predicates, `xsd` datatype inference,
per-row `rdf:type`) or an **R2RML mapping** (`--mapping <r2rml.ttl>`, CSV logical tables bound
by `rr:tableName` = file stem) into a loaded graph (`--query` runs SPARQL in the same shot) or
an N-Triples stream (`--out out.nt[.gz|.zst]`). Streaming end-to-end (no whole-file buffering).
[OPUS-5] (sq-u1z86) adds cross-CSV **joins** (`rr:parentTriplesMap` + `rr:joinCondition`, run as
(sq-u1z86) adds cross-CSV **joins** (`rr:parentTriplesMap` + `rr:joinCondition`, run as
a keyed hash join over a one-pass parent index), **named-graph** output (`rr:graphMap`/`rr:graph`
→ N-Quads + a dataset load, so `GRAPH ?g { … }` works) and `--row-provenance`
(`prov:wasDerivedFrom` the source row). SQL-connection R2RML stays out of scope (`rr:sqlQuery`,
`rr:sqlVersion`, `rr:inverseExpression` fail loudly — sparq materializes, it does not virtualize).
- **`terse <query | ->`** *(opt-in `terse` feature; [OPUS-4.8] sq-vczh2)* — transpile a terse query
- **`terse <query | ->`** *(opt-in `terse` feature; sq-vczh2)* — transpile a terse query
(the `K:<name>` keyword layer over canonical SPARQL) into the **canonical SPARQL** it expands to,
printing the verifiable JSON `{ canonical_sparql, keywords, resolutions, warnings, legendVersion }`
(the same contract the server's `POST /terse/transpile` returns). It never executes the query —
pipe `canonical_sparql` into `query`. Loud-fails (exit 2) on an unknown keyword or a `V(...)`
construct rather than guessing. Lean build — depends only on `spargebra`. `--features terse`.
construct rather than guessing. Lean build — depends only on `spargebra`. `--features terse`. (`terse` and `el` reach unpublished crates, so the crates.io package omits both; build from git.)
- **Engine features the default CLI build lights** — the CLI's `sparq-engine` dependency enables
`dp-planner` (DPccp cost-optimal join ordering, sq-7d3dj.30.5) and `algebra-rewrite` (the
result-equivalent pre-execution rewrite of #1735 — `FILTER(?v = <iri>)` constant folding +
`!bound` anti-join; [FABLE-5] sq-7d3dj.30.13), so the shipped binary and every canonical
`!bound` anti-join; sq-7d3dj.30.13), so the shipped binary and every canonical
benchmark run the same plans. The engine **library** defaults stay lean (both OFF there).
- **Transparent decompression** — `.gz` / `.bz2` / `.zst` inputs detected by content.
The gzip path defaults to the pure-Rust `miniz_oxide` backend; the opt-in, native-only
Expand All @@ -108,7 +108,7 @@ cargo run --release -p sparq-cli -- query data.ttl turtle 'SELECT * WHERE { ?s ?

- **How-to** — [`skills/cli/SKILL.md`](../../skills/cli/SKILL.md) (full subcommand reference)
and [`skills/inference/SKILL.md`](../../skills/inference/SKILL.md) (reasoning).
- **API reference** — run `cargo run -p sparq-cli -- --help`; rustdoc at
- **API reference** — run `cargo run -p sparq-cli` with no arguments for the usage block; rustdoc at
[docs.rs/sparq-cli](https://docs.rs/sparq-cli).
- **Design** — [`research/ARCHITECTURE.md`](../../research/ARCHITECTURE.md).
- **Performance** — see the [benchmarks dashboard](https://sparq.jeswr.org/dev/bench);
Expand Down
38 changes: 19 additions & 19 deletions crates/sparq-conformance/README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
<!-- [OPUS-4.8] sq-4kr5: internal-stub README for a publish=false crate. -->
<!-- sq-4kr5: internal-stub README for a publish=false crate. -->
# sparq-conformance

The **W3C conformance harness** for [sparq](../../README.md): it runs the official
test suites against the engine and reports a per-suite pass/fail/skip scoreboard,
gated in CI by pass-count ratchets. Three binaries share manifest-walking /
result-comparison machinery: `sparq-conformance` (W3C SPARQL query/update/syntax),
`sparq-inference-conformance` (RDF Semantics, OWL 2 RL, N3, entailment regimes via
`sparq-reason`), and `sparq-conformance-scoreboard` (a consolidated index of every
ratchet — SPARQL, inference, SHACL, GeoSPARQL, Solid WAC + ACP, JSON-LD 1.1,
SolidLab ODRL — plus eight `sparq extension` rows, HONESTLY labelled NOT standards
claims and tallied separately). Floors are MEASURED and guarded textually; the
The **W3C conformance harness** for [sparq](../../README.md): it runs the official test suites against
the engine and reports a per-suite pass/fail/skip scoreboard, gated by pass-count ratchets (the W3C
SPARQL one per PR in `ci-fast.yml`, the rest nightly / on dispatch in `ci.yml`). Three binaries share
manifest-walking / result-comparison machinery: `sparq-conformance` (W3C SPARQL query/update/syntax),
`sparq-inference-conformance` (RDF Semantics, OWL 2 RL, N3, entailment regimes via `sparq-reason`), and
`sparq-conformance-scoreboard` (a consolidated index of every ratchet — SPARQL, RDF syntax, inference,
RIF, SHACL, GeoSPARQL, Solid WAC + ACP, JSON-LD 1.1, SolidLab ODRL — plus eleven `sparq extension` rows,
HONESTLY labelled NOT standards claims and tallied separately). Plus: `served-conformance-report`
(served-surface SPARQL Protocol JSON report) and `sparq-notation3tests` (the ADVISORY community
notation3tests runner, `notation3tests.yml`). Floors are MEASURED and guarded textually; the
`scoreboard` rustdoc has the full per-lane provenance and divergence sets.

The registry also has a **machine-readable export** (sq-gum8.14):
`scoreboard::scoreboard_json()` renders the same rows + floors as deterministic JSON,
committed as `bench/conformance-scoreboard.generated.json` and drift-guarded by
`tests/scoreboard_export.rs` — so paper-evidence bindings can reference suite rows /
floors by json-pointer without the mirror silently drifting. Several crate-local
`cargo test` lanes sit behind **opt-in features** (OFF by default) — `jsonld-suite`,
`service`, `http-protocol`, `federation-descriptors`, and the inference/geo/syntax
The registry also has a **machine-readable export** (sq-gum8.14): `scoreboard::scoreboard_json()`
renders the same rows + floors as deterministic JSON, committed as
`bench/conformance-scoreboard.generated.json` and drift-guarded by `tests/scoreboard_export.rs` — so
paper-evidence bindings can reference suite rows / floors by json-pointer without the mirror silently
drifting. Several crate-local `cargo test` lanes sit behind **opt-in features** (OFF by default) —
`jsonld-suite`, `service`, `http-protocol`, `federation-descriptors`, and the inference/geo/syntax
lanes; the `scoreboard` rustdoc documents each lane's scope, floor and divergences.

> **Internal dev-only harness — not published** (`publish = false`). Test data is
> fetched by `scripts/fetch-conformance.sh` + the sibling `fetch-jsonld*` /
> `fetch-odrl-suite.sh` scripts. Contributing: [`AGENTS.md`](../../AGENTS.md).
> fetched by `scripts/fetch-conformance.sh` + the sibling `fetch-inference-suites.sh`
> / `fetch-jsonld*` / `fetch-odrl-suite.sh` scripts. Contributing: [`AGENTS.md`](../../AGENTS.md).

## License

Expand Down
4 changes: 2 additions & 2 deletions crates/sparq-core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ assert_eq!(count, 1);
- **Incremental updates** — start from `Graph::new()` / `Graph::default()` (an empty graph) and
`insert_triple(s, p, o)` / `remove_triple(s, p, o)` a single triple from `oxrdf` terms, or apply
a whole batch with `apply_delta` — in place, with an optional write-ahead log.
- **Experimental deletion projections** — [GPT-6 Astra] enable the default-off
- **Experimental deletion projections** — enable the default-off
`overlay-deleted-projections` Cargo feature on `sparq-core` to cache sorted
tombstone projections for repeated range counts. The default uses the original
linear deletion scan and carries no deletion projection slots. Each requested
Expand All @@ -69,7 +69,7 @@ assert_eq!(count, 1);
point lookups for an id that is ABSENT from the permutation (result-equivalent, never
serialised; for a PRESENT id the zone map already narrows the candidate window to about one
block, so there is little left to skip).
[GPT-6] Persisted predicate statistics have deterministic record order across builds and
Persisted predicate statistics have deterministic record order across builds and
re-saves; older unordered statistics files remain readable.
- **Compressed-seek column codecs (prototype)** — the opt-in `elias-fano` feature adds
Elias-Fano and Partitioned-Elias-Fano codecs whose `next_geq(target)` answers a successor
Expand Down
2 changes: 1 addition & 1 deletion crates/sparq-crdt/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# sparq-crdt

<!-- [FABLE-5] sq-tag1q.7.2: internal-stub README for a publish = false crate. -->
<!-- sq-tag1q.7.2: internal-stub README for a publish = false crate. -->

Opt-in SPARQL-CRDT replication primitives for sparq (epic `sq-tag1q.7`): the
bounded **canonical delta-envelope codec**, **causal summaries** (version-vector
Expand Down
5 changes: 3 additions & 2 deletions crates/sparq-difftest/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!-- [OPUS-4.8] sq-qcnn.4: internal-stub README for a publish=false crate. -->
<!-- sq-qcnn.4: internal-stub README for a publish=false crate. -->
# sparq-difftest

The **engine-independent value-normalisation** library for [sparq](../../README.md)'s
Expand All @@ -11,7 +11,8 @@ equality (simple-literal ≡ `xsd:string`, case-insensitive language tags);
arbitrary-precision integer/decimal value equality and `xsd:double` `INF`/`NaN`;
`dateTime`/`date`/`duration` comparison with timezone normalisation and the ±14h
indeterminate window; a SPARQL-Results-JSON reader; the multiset + `ORDER BY`
equivalence-class comparators; and RDFC-1.0 canonical labelling for blank-node results,
equivalence-class comparators; an admission-decision (allow/deny set) comparator with a
fail-closed-asymmetry check (`decision`); and RDFC-1.0 canonical labelling for blank-node results,
which are comparable only up to a bijection. Full API detail is in the rustdoc.

**Load-bearing constraint:** it depends on **no sparq crate** — only third-party exact
Expand Down
2 changes: 1 addition & 1 deletion crates/sparq-e2ee-ng/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!-- [OPUS-4.8] sq-tag1q.9: internal-stub README for a publish=false crate; full posture + public-API surface live in skills/e2ee-ng/SKILL.md and the design record. -->
<!-- sq-tag1q.9: internal-stub README for a publish=false crate; full posture + public-API surface live in skills/e2ee-ng/SKILL.md and the design record. -->
# sparq-e2ee-ng

Opt-in **E2EE-NG profile primitives** for sparq: the *capability / envelope /
Expand Down
9 changes: 4 additions & 5 deletions crates/sparq-engine-serialize/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@ The RDF **writer matrix** for [`sparq-engine`] — Turtle, TriG, N-Quads, and JS

> **Internal, unstable crate.** This is seam 1 of the staged `sparq-engine` facade split
> (RFC `research/engine-split-rfc.md` §4 Option A / §7 Phase A1, bead `sq-6vshe.4`). It is
> `publish = false` and has **no stability guarantee of its own**. Depend on the
> published to crates.io only to satisfy `sparq-engine`'s dependency closure and has
> **no stability guarantee of its own**. Depend on the
> re-export **`sparq_engine::serialize`** — its public API and the `serialize-rdf` /
> `streaming-serialization` feature names are unchanged by the split.
>
> Model: Opus 4.8 ([OPUS-4.8], Fable unavailable). Flag for re-review when Fable returns.

[`sparq-engine`]: ../sparq-engine

Expand Down Expand Up @@ -48,8 +47,8 @@ assert!(jsonld.starts_with('['));
builds of `sparq-engine` are byte-identical to before the split.
- **`streaming-serialization`** *(feature, implies `serialize-rdf`)* — adds
`write_turtle_streaming` / `write_trig_streaming` that render one subject block at a
time into a `std::io::Write`, for chunked CONSTRUCT/DESCRIBE responses without
materialising the whole rendered string. Byte-identical to the buffered output.
time into a `std::io::Write` without materialising the whole rendered string (what
`sparq-cli dump … turtle|trig` uses under its `streaming-serialization` feature). Byte-identical to the buffered output.

### Opt-in by construction

Expand Down
Loading
Loading