Skip to content

v1.4.0 — 61 checks, engine 0.2.0, and the query under review

Choose a tag to compare

@pwin pwin released this 04 Sep 05:20
· 25 commits to main since this release

All three toolchains moved several minor versions. Every figure re-measured rather than re-quoted.

📄 SemOps-Manual-v1.4.0-A4.pdf — 97 pages, A4
📓 SemOps-Manual-v1.4.0-notebooks.zip — the three runnable notebooks

Measured against: suite 0.14.0, engine 0.2.0, extension 0.13.4.

The registry grew from 50 checks to 61

Ten categories now, not eight. TQL-* (five checks that review the transformation query itself) and VOC-* are new; QUA, REA and DAT each gained members.

That moves every headline number in Chapter 9 without the fixture changing a line — which is now the point the chapter makes:

Run was now
unscoped 301 479
--exclude-imports 9 27 (still exactly 4 of them false)
--own-namespace 5 23 (still all genuine)

A registry upgrade changes your findings while your ontology sits still. Pin the suite version, and read a jump in the count as "the rules moved" before "the model got worse".

Eighteen of the 23 are QUA-009/QUA-010 firing once each on all nine Acme terms. Chapter 9 now reads that correctly: a check that fires on every term is reporting a policy you have not adopted, not nine separate mistakes.

New: the transformation query is checked (Chapter 10)

TQL-001..005 review the query rather than the graph it produces. TQL-004 repays reading twice — SPARQL's CONCAT returns a string and TARQL does not coerce it, so a ?person_IRI built by CONCAT and never wrapped in IRI() produces string literals where the model says IRIs. The data loads, the counts look right, and every join against those subjects silently finds nothing.

The stage also writes bind-facts.ttl, publishing the query's own BIND structure as a graph so it can be queried with the same tools as everything else.

Engine 0.2.0: a reorder worth a major bump

The JavaScript one-shot took (shapes, data) and now takes (data, shapes), matching every other surface. The reason is the failure it removes: a transposed call compiled the data as a shapes graph, a data graph declares no shapes, and validating against no shapes conforms — so the caller was told their graph was valid when nothing had been checked. Both one-shots now refuse a shapes graph that declares nothing. Verified both ways.

Two lessons generalise, and Chapter 11 states them as such:

  • An empty rule set must not report success. Same failure as a check that matches nothing, and a filter that matches nothing. Whenever "nothing to do" and "all clear" produce the same output, the tool is unsafe exactly when it matters.
  • Reordering a published signature is only safe if getting it wrong is loud.

A defect found while checking

sketch crashes on a CONSTRUCT template with no trailing . before its closing brace — which is legal SPARQL. It copies the template into the sketch.ttl it writes without a terminator, then fails parsing its own output (BadSyntax: EOF found after object). Verified minimally in both directions; the Part III fixture happens to write the dot, which is why its examples run. Recorded in Chapter 14 with the mitigation.

Also

  • VOC-001 moved from editor-only into the shared registry, so only MDL-001/002/003 remain extension-specific. Chapter 7 names the pattern: a check earns its way from advice into enforcement once it has proved it does not produce false positives.
  • Chapter 10 re-measured: sketch 35 → 38 Info, data 372 → 550 unscoped, 36/37 → 54/55 scoped.
  • Chapter 7 gains a table of the versions this edition was measured against.
  • "Vendored" removed throughout in favour of plain wording.
  • All three notebooks re-verified against 0.14.0 and 0.2.0: zero errors.

Full changelog: v1.3.0...v1.4.0