Repository navigation
SHACL part 2a: commit-time gating under a shapes binding, incremental validation (v0.1.0-preview.12) - #140
SHACL part 2a: commit-time gating under a shapes binding, incremental validation (v0.1.0-preview.12)#140Hafeok wants to merge 31 commits into
Conversation
Commit-time gating under a shapes binding (0169), the binding vocabulary (0170), which shapes are incrementally maintainable (0171), Varve.Derivation at layer 2 (0172), and the validation report on the commit as a reference and a digest (0173), as decided on the part 2 plan in #13 with the maintainer's changes: reject refuses new violations only, and NOW(), RAND(), UUID(), STRUUID() and BNODE() reaching a result are refused. Dated amendments to 0003, 0017, 0058, 0119, 0150, 0152, 0154 and 0155. Every ruling is filed unaccepted. Refs #138 Refs #13 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
The dependency graph with polarities, its strongly connected components numbered dependencies first and the cycles that refuse a stratification; regular paths compiled by Thompson's construction and searched forwards, backwards and from a changed edge for its anchors; and propagation of affected keys to the least fixpoint, semi-naively (ADR 0172). Generic over the caller's node and label, referencing Varve.Rdf only. Properties against naive oracles, 3,000 cases each: paths against a relational oracle over graphs with cycles, the preimage, anchors that find every start whose image an edge changes, boundedness, components by reachability, refused cycles, and propagation as the least fixpoint. A sabotaged anchor search fails the anchor property. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
Stratification builds Varve.Derivation's dependency graph from the shapes' references and sh:targetWhere, and takes its components and refused cycles from it (ADR 0150 amended); a SHACL path compiles once to a regular-path automaton, and the data graph is the graph it walks, with a backward search for the anchors to come (ADR 0152 amended). The semantics is unchanged: Varve.Shacl's 21 tests, the path differential against the evaluator, and the W3C SHACL suites (622 of 650 pass, the 28 failures are the existing exemptions) all hold. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
IncrementalValidation.Compare finds the (shape, focus node) pairs a delta affects by each changed triple's anchors per ADR 0171's table, propagated along the shapes' dependency graph to the least fixpoint through Varve.Derivation, with the nodes the delta may move into or out of each shape's targets; every search runs before and after the delta. It validates those pairs before and after, and reports the results it introduces: an identity new among the affected pairs is checked up the sh:property chains against the pairs it did not affect (ADR 0169's R1). ShapesGraph.Classify gives each shape incremental, scoped or full, with the constructs and sections that decide it. Extension constraints may state their footprint through IShaclFootprint; one that does not is full. The report is restricted to affected pairs (ADR 0154 amended), and a union data graph no longer repeats a triple held in two graphs for sh:closed. The property: over generated shapes graphs using every classified construct (targets of each kind, paths with closures, inverse, sequence and alternative, the value, cardinality, string, pair, logical, shape-based, list, closed, root-class and unique-values components, positive recursion, a property shape shared by several node shapes) and generated histories of commits with retractions, the whole report before a commit without the comparison's results before and with its results after equals a full validation after it, byte for byte, and the results it introduces are exactly the full reports' new identities. 500 histories on the land gate; 1,686 histories and 7,697 positions in the long setting, no counterexample. Removing the path anchors, the propagation's transfer, or the provenance check each fails it. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
A SPARQL-based constraint or component states its footprint (ADR 0171 §4): the join graph of its algebra, its variables the vertices and its triple patterns and paths the edges, wherever they stand (OPTIONAL, MINUS, EXISTS, NOT EXISTS, sub-selects, whose unprojected variables are their own). When every edge is joined to $this, or to $value in an ASK validator, a changed triple's anchors are found by evaluating the join path from the patterns it matches back to the root, filters dropped; otherwise the constraint is full. A GRAPH block, a negated property set and an unjoined pattern make it full. ShaclOptions.RefuseNonDeterministicFunctions, which a shapes binding sets, refuses at load a query calling NOW(), RAND(), UUID() or STRUUID(), or BNODE() whose value can reach a result (ADR 0169); the extension sees it on its shapes graph context. The property: SPARQL-based constraints from nine templates, analysable and not, an ASK-validated component and a $PATH query, over generated histories of commits: the whole report before a commit, less the comparison's results before, plus its results after, has a full validation's results after it. 300 histories on the land gate, 3,000 in the long setting, no counterexample once ?value was taken as a root only where it is pre-bound (the property found that). Emptying the anchors fails it. The W3C SHACL suites hold: 622 pass, the 28 failures are the existing exemptions. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
Varve.Shacl.Store, layer 5 (ADR 0169): ShapesGate implements the pre-commit validator contract over Varve.Shacl and Varve.Shacl.Sparql. Each binding's shapes graph is a named graph of the dataset, read as of the overlay and kept between commits until a delta touches it; its data graph is the union of the bound graphs without the shapes graph and the varve: graphs. Under reject, a commit is refused when its affected focus nodes gain a sh:Violation result the pinned position does not have, as shapes-violated with each finding by focus node and path; a shapes change is never refused for existing data, and its data is compared under the new shapes; a reject binding whose shapes are full without varve:allowFullEvaluation refuses as binding-not-incremental, at apply time through Check and failing closed at commit time; a shapes graph that does not load, or calls a non-deterministic function, is shapes-invalid. Every accepted commit under report or reject records one attachment per binding, in the order of their IRIs: the binding, varve:affectedReport, and the SHA-256 of the affected report's canonical N-Quads (ADR 0173). Bulk commits are gated alike and carry no attachment (ADR 0081). Varve.Store: ValidationVerdict.Accept takes a list, and Attachments gives it; the sequencer and the bulk path record each one. Tests: a reject binding against a full-validation oracle over generated shapes and commits that replace the shapes, alone or with data — refused exactly when the full report gains a violation under the commit's shapes (150 histories on the land gate, 1,500 in the long setting; the sticky rule the maintainer rejected fails it) — the attachment's digest reproduced from the log after the commit, with a blank node the commit creates, and each rule on its own. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
shapes-violated, binding-not-incremental and shapes-invalid, each 422, catalogued with their members and a page, and validator types: a gate's two-term report is answered as its own type (ADR 0119 amended, ADR 0169). The catalogue test triggers all three over HTTP through a gate whose shapes graph is a writable graph and whose data graph is the default graph; Varve.Protocol's 108 tests pass. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
The conflicts were additive: ADRs 0017 and 0058 keep the Management plane's 2026-10-19 amendment and this branch's 2026-10-20 one, in that order; the validator problem types are the union; the public API baselines take both sides' lines. The solution builds clean but for the unaccepted rulings. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
ADR 0170 in Varve.Management, by a dated amendment of ADR 0166: a varve:ShapesBinding carries its data graphs in the grant vocabulary's graph-set terms on its own node, a varve:validationMode of varve:Reject, varve:Report or varve:Off, and varve:allowFullEvaluation and varve:subClassOfInShapesGraph. The code validator refuses one without a mode or a graph set, with a graph template, or naming its own shapes graph. The plan's separate varve:validates node is not a term: the code validator refuses blank nodes, so the binding node carries the set as a grant does; ADR 0170 says so. docs/vocabulary.md gains the terms and varve:affectedReport. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
A data write's validators at its pinned management position now carry
the dataset's shapes gate beside the order of positions (ADRs 0165,
0169): the bindings are the ones declared at the position the write was
authorised under, and the gate is kept per dataset while they stay the
same, so its shapes stay loaded. Before a management commit, the apply
path checks each binding it declares against its dataset where this
instance holds it (R4), and answers binding-not-incremental or
shapes-invalid; a dataset held elsewhere fails closed at its writer
(R6). GET /manage/datasets/{name}/bindings/{binding} serves a binding at
the applied position with its shapes' classification (ADR 0171).
IManagementPlane gains CheckBindings and DescribeBinding with defaults,
and Varve.Protocol references Varve.Shacl for the classification it
serves. Server tests: a reject binding refusing a new violation over
HTTP, accepting a conforming write, refusing a shapes commit that makes
its shapes full, and described; a reject binding over full shapes
refused at apply time and accepted with varve:allowFullEvaluation. The
server's 105 tests pass, 11 needing CI's services skipped.
Refs #138
Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
ADR 0170 puts the graph-set terms on the binding node. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
Under SHACL 1.2 Core §6.4's parameter every validation run walked rdfs:subClassOf in the shapes graph again, a scan of an in-memory dataset per step. The shapes graph does not change once loaded, so its steps are kept on the source. With REC 4.1.0 bound at S, the gate's time per commit falls from 13.2 ms to 4.5 ms. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
Part 2a's early signal for the REC gate: Brick's three SPARQL constraints name prefixes no file declares, so the shapes graph is refused as it stands; without them nothing is classed full, and the S portfolio's head violates only rec:leasor's minimum on its leases. The full validation runs under VARVE_LONG_PROPERTIES. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
REC S or M on the file backend, the history but its last 240 commits loaded with REC 4.1.0's shapes, then those commits under a reject binding or none; --shapes-gate-affected gives the gate's time per commit and per affected focus node. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
…nd part 2a's state Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
README names preview.11 and the two new packages; the roadmap splits SHACL part 2 into 2a (#138) and 2b (#13), records part 2a's gate, and marks incremental SHACL resolved by ADR 0171. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
… S and M The run's log is its console output, the CS0618 warnings of the build left out; its exported reports were lost to a cleanup and are not reconstructed. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
5,000 under VARVE_LONG_PROPERTIES. The project runs in 17 s on Linux, REC's shapes loaded once in it. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
The descriptor names #138, the first half of SHACL's part 2, with storage-format 1, delta-format 1 and ADRs 0169-0173. #13 is named in the summary, not the basis: part 2b closes it. CHANGELOG.md is its projection, and the README's Status names it, with the image tags at preview.11. preview.10's tag is not yet cut, so release --check counts from preview.9 and lists #134's ADRs 0163-0166 and 0168 as first shipped here; they clear when preview.10 is tagged. If another release lands first, this renumbers at landing (ADR 0102). Closes #138 Refs #13 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
The opening message, the brief, the plan and the approval verbatim; what shipped by ADR, where it departed from the plan, the REC findings, the properties with their counts, durations, benchmarks and the API. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
REC requires rec:leasor on a rec:Lease (sh:minCount 1, sh:class rec:Agent), and the generator never wrote it, so the S head had 141 violations. Each site now gets an owner, a rec:Company made with the site, and every lease names it as its leasor. No random draw changes, so the history is the same commits with these quads added. RecPortfolio.Version names the output, 2, and the pinned hashes move: S 66218df6…, M fb544c09…, L c004a342…. The S head conforms to REC's shapes, and the long REC tests now refuse a violation made by an explicit mutation (a lease's leasor retracted) and accept the generator's next commit, never relying on a generator defect. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
0155's amendment names the single IncrementalValidation.Compare and what it returns, in place of the plan's two members, with FootprintContext and the context's refusal flag; 0170 records that the graph-set terms on the binding node were accepted on #140. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
|
Draft for the maintainer to file with REC upstream (RealEstateCore, Title: REC 4.1.0's SHACL release: Brick's SPARQL constraints use prefixes the shapes graph never declares, and implicit class targets need Files: the SHACL release files of v4.1.0:
1. Undeclared SPARQL prefixes. SHACL-SPARQL (SHACL 1.0 §5.2.1; SHACL 1.2 SPARQL, "Prefix declarations") resolves a query's prefixes only from the Three Two of the queries also use a prefix they don't even list:
Suggested fix. Two parts:
Brick's own build declares these prefixes; the merged 2. Implicit class targets. About 1,445 Brick shapes are typed both How this was found. Varve's SHACL 1.2 processor loaded the three files as one shapes graph, an RDF merge with each file's blank nodes kept apart. It reported three failures: Without those three constraints, and with the What happens in Varve meanwhile:
Generated by Claude Code |
…ion 2 Version 2's head conforms to REC's shapes, so no held commit is refused; the version-1 run's log goes, and the version-2 run replaces its numbers. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
|
CI on the current head: every job that builds the solution fails at the build step, and only on
Nothing else needs fixing in this pull request. The test jobs, and with them the Windows and macOS durations of the new test projects, run once the decisions are accepted. I'll report those durations here then. Generated by Claude Code |
…sion behind each REC number No commit refused at S or M. Under the gate 7.62 ms per commit at S and 11.86 ms at M, against 0.51 and 0.86 ms without, on a slower run than the first; 2.6 affected focus nodes per commit at both sizes. The README states that the Object storage section's REC numbers (#92) were taken on version 1, that #110 has none yet, and that this section's are version 2's. The run's log and exported reports are kept. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
The maintainer's answer verbatim, the generator's version 2, the mutation test, the benchmarks on version 2 and the upstream draft. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
…SHACL part 2a Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
|
Locally, all six of these pass: What remains red is the build's Generated by Claude Code |
…art 2a #135 took preview.11, so this part's descriptor is renumbered to v0.1.0-preview.12 and the changelog re-projected. README Status names preview.12 first, with preview.11 and preview.10 behind it, and the image tags at preview.12; AGENTS.md's State keeps part 2a first, then Extent maintenance. The benchmarks README keeps #110's section before this part's, and states that #110's REC runs were taken on generator output version 1 too. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
|
Renumbered to What the merge changed:
Gates: locally, What remains red is Generated by Claude Code |
|
approve cb46087 |
|
The merged code's tests pass too: Protocol 113, Shacl.Store 13, Server 106 and Store 277, with none failing. The only thing keeping CI red is Generated by Claude Code |
Accepts the decision sets of SHACL, part 2a: commit-time gating under a shapes binding (0169), the shapes binding vocabulary (0170), which shapes are incrementally maintainable (0171), Varve.Derivation (0172), and the validation report on the commit (0173). Refs #138 Signed-off-by: Emil Okkels Klein <emil@okkels-klein.dk>
|
approve 0bb0d34 |
pack (NU5019) needs a README for every packed project; Varve.Shacl.Store had none. It states the binding, the three modes, what is validated, and where bindings come from on a server. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
… the pack fix The new test projects' durations from CI's run at 0bb0d34 on Ubuntu and Windows (CI runs no macOS test job); preview.12 after #135; the decisions accepted; the README pack required; and the declined request of a session hook to rewrite the commit identity. Refs #138 Signed-off-by: Emil Okkels Klein <hannibal.okkels@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA
|
CI after the acceptance ( Durations of the new test projects, from that run (#126). CI runs these projects on Ubuntu and Windows only; the macOS job runs the durability suite alone, so there's no macOS figure.
The new head Generated by Claude Code |
|
approve 3dbffa7 |
|
The W3C ratchet itself is clean: 6,141 in the baseline, 40 exempt, 0 regressed, 0 newly passing. What failed is a single property, Why it isn't this PR's. The property exercises only What it is. A real counterexample to the claim in
As far as I can tell, No fix exists yet. It belongs in its own change, not this PR:
I'll re-run the failed job once, after Generated by Claude Code |
|
I tried to re-run the failed job, but the session's token isn't allowed to ( Generated by Claude Code |
SHACL part 2a, under milestone 8 (#13). Its issue is #138, and its release is
v0.1.0-preview.11. This is the first of the two PRs the plan proposed and the maintainer approved. ADRs 0169–0173 are filed unaccepted, so CI is red only onCS0618. The full report isdocs/traceability/2026-10-20-issue-138-shacl-part-2a.md.What this changes, and why
A shapes binding can now gate a dataset's commits.
varve:ShapesBinding, ADR 0170). It names a shapes graph of the same dataset, the graphs to validate (in the grant vocabulary's graph-set terms), and a mode.How the gate behaves.
Varve.Shacl.Store(layer 5, ADR 0169) is a dataset validator.rejectrefuses a commit whose affected focus nodes have a violation not present at the pinned position. So violations never grow, and a conforming dataset stays conforming. This follows the approved change to R1.reportaccepts the commit and attaches<<( binding varve:affectedReport "sha256:…" )>>(ADR 0173).offruns nothing.reject. Such a binding is refused at apply time unless it declaresvarve:allowFullEvaluation(R4). If its shapes become full later, it fails closed (R6).NOW(),RAND(),UUID()andSTRUUID()are refused, and so is aBNODE()whose value can reach a result.shapes-violated,binding-not-incrementalandshapes-invalid.GET /manage/datasets/{name}/bindings/{binding}serves a binding with its classification.Only the focus nodes a commit affects are validated (
Varve.Shacl, ADR 0171).Varve.Derivation(layer 2, ADR 0172, approved with ADR 0003's amendment) holds the dependency graphs and stratification, regular paths as automata, and semi-naive propagation. SHACL uses it now, and Inference will later.The REC generator's output version 2. The generator's leases now carry
rec:leasor.Departures from the approved plan. The record has all of them. The visible ones, both accepted on this PR and stated in ADRs 0170 and 0155:
varve:validatesnode. ADR 0166's code validator refuses blank nodes in management graphs, so the graph-set terms sit on the binding node itself, as on a grant.Validate(…, FocusSelection)andAffectedBybecameIncrementalValidation.Compare, because the gate needs the affected set, both reports and the introduced results together.What was measured
Properties, with no counterexample at the stated counts. Each count is per CI run, then the long run under
VARVE_LONG_PROPERTIES:Varve.Derivation's paths and stratificationThree sabotages of the engine each failed the incremental property:
Commit latency on the file backend. BenchmarkDotNet 0.15.8, Xeon @ 2.80 GHz, 4 cores, a cloud container. The setup:
rec:leasor.No commit was refused. Slower rows first:
rejectrejectThe number of affected focus nodes per commit is the same at both sizes. The gate's cost is theirs, not the dataset's:
The machine was slower during this run than during the first one, on generator version 1. That run measured 8.24 ms gated at both sizes, and the README has both runs.
The benchmark also led to a fix: the shapes graph's subclass steps are now remembered. That cut the time in the gate from 13.2 ms to 4.5 ms per commit at S.
Test durations on Linux (CI's other operating systems to follow, per #126):
Varve.Derivation.Tests(new)Varve.Shacl.Store.Tests(new)The W3C SHACL suites are unchanged: 628 pass, and the same 28 are exempt.
What was found
sh:prefixeswith nosh:declarein any of the three files. Two of them also use a prefix they don't list:owl:andbrick:. A strict processor refuses the whole shapes graph.RecStandaloneTestspins this, with no exemption. Part 2b's REC gate will add the declarations and theowl:Classtriple, and ADR 0176 will record the exact triples.rec:leasor, giving 141 violations at S.rejecttests get their violations from an explicit mutation (a lease's leasor retracted), never from the generator.What is left
validation-behind, and the lag reported on readiness without affecting it;docs/operator/shapes.md.releasegate fails here only becausev0.1.0-preview.10is not tagged. With two proposed descriptors, the checker gives Management plane, part 1: the fleet system dataset, grants as code, varve apply (v0.1.0-preview.10) #134's ADRs to this release and this part's to preview.10. It clears once preview.10 is cut.Public API baseline (additive; nothing removed). The lines added to each
PublicAPI.Unshipped.txtVarve.Derivation(new; 69 lines):(abbreviated by the session for reading; the file has every line verbatim)
Varve.Shacl.Store(new; 26 lines):(abbreviated the same way)
Varve.Shacl(+43):Varve.Store(+2):Varve.Management(+12):Varve.Protocol(+23):Checklist
Refs #138(issue-refspasses); the descriptor commit carries the closing trailerPublicAPI.Unshipped.txtonly, as aboveSigned-off-by:dotnet run eng/ci.cspasses locally: everything butrelease(preview.10's missing tag, above) andCS0618🤖 Generated with Claude Code
https://claude.ai/code/session_01RFtkE4cRmAMRARHDu5Y9ZA